From 774b9ae12d43542caeafdfd181fdf4dbe44c21c0 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sat, 19 Dec 2020 00:49:36 -0600 Subject: [PATCH 001/412] Added thumbnail task and database table --- .gitignore | 1 + cps.py | 4 ++ cps/constants.py | 1 + cps/helper.py | 9 ++- cps/tasks/thumbnail.py | 154 +++++++++++++++++++++++++++++++++++++++++ cps/thumbnails.py | 63 +++++++++++++++++ cps/ub.py | 36 +++++++++- 7 files changed, 264 insertions(+), 4 deletions(-) create mode 100644 cps/tasks/thumbnail.py create mode 100644 cps/thumbnails.py diff --git a/.gitignore b/.gitignore index f06dcd446..cef580949 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ vendor/ # calibre-web *.db *.log +cps/cache .idea/ *.bak diff --git a/cps.py b/cps.py index 50ab00763..e90a38d9c 100755 --- a/cps.py +++ b/cps.py @@ -43,6 +43,7 @@ from cps.gdrive import gdrive from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.error_handler import init_errorhandler +from cps.thumbnails import generate_thumbnails try: from cps.kobo import kobo, get_kobo_activated @@ -78,6 +79,9 @@ def main(): app.register_blueprint(kobo_auth) if oauth_available: app.register_blueprint(oauth) + + generate_thumbnails() + success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/constants.py b/cps/constants.py index c1bcbe592..0a9f9cd59 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -33,6 +33,7 @@ else: STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static') TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates') TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations') +CACHE_DIR = os.path.join(BASE_DIR, 'cps', 'cache') if HOME_CONFIG: home_dir = os.path.join(os.path.expanduser("~"),".calibre-web") diff --git a/cps/helper.py b/cps/helper.py index da5ea2b32..6fc6b02a4 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -551,6 +551,11 @@ def get_book_cover_with_uuid(book_uuid, def get_book_cover_internal(book, use_generic_cover_on_failure): if book and book.has_cover: + # if thumbnails.cover_thumbnail_exists_for_book(book): + # thumbnail = ub.session.query(ub.Thumbnail).filter(ub.Thumbnail.book_id == book.id).first() + # return send_from_directory(thumbnails.get_thumbnail_cache_dir(), thumbnail.filename) + # else: + # WorkerThread.add(None, TaskThumbnail(book, _(u'Generating cover thumbnail for: ' + book.title))) if config.config_use_google_drive: try: if not gd.is_gdrive_ready(): @@ -561,8 +566,8 @@ def get_book_cover_internal(book, use_generic_cover_on_failure): else: log.error('%s/cover.jpg not found on Google Drive', book.path) return get_cover_on_failure(use_generic_cover_on_failure) - except Exception as e: - log.debug_or_exception(e) + except Exception as ex: + log.debug_or_exception(ex) return get_cover_on_failure(use_generic_cover_on_failure) else: cover_file_path = os.path.join(config.config_calibre_dir, book.path) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py new file mode 100644 index 000000000..c452ab41c --- /dev/null +++ b/cps/tasks/thumbnail.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +import os + +from cps import config, db, gdriveutils, logger, ub +from cps.constants import CACHE_DIR as _CACHE_DIR +from cps.services.worker import CalibreTask +from datetime import datetime, timedelta +from sqlalchemy import func + +try: + from wand.image import Image + use_IM = True +except (ImportError, RuntimeError) as e: + use_IM = False + +THUMBNAIL_RESOLUTION_1X = 1.0 +THUMBNAIL_RESOLUTION_2X = 2.0 + + +class TaskThumbnail(CalibreTask): + def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): + super(TaskThumbnail, self).__init__(task_message) + self.limit = limit + self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() + self.worker_db = db.CalibreDB(expire_on_commit=False) + + def run(self, worker_thread): + if self.worker_db.session and use_IM: + thumbnails = self.get_thumbnail_book_ids() + thumbnail_book_ids = list(map(lambda t: t.book_id, thumbnails)) + self.log.info(','.join([str(elem) for elem in thumbnail_book_ids])) + self.log.info(len(thumbnail_book_ids)) + + books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) + + count = len(books_without_thumbnails) + for i, book in enumerate(books_without_thumbnails): + thumbnails = self.get_thumbnails_for_book(thumbnails, book) + if thumbnails: + for thumbnail in thumbnails: + self.update_book_thumbnail(book, thumbnail) + + else: + self.create_book_thumbnail(book, THUMBNAIL_RESOLUTION_1X) + self.create_book_thumbnail(book, THUMBNAIL_RESOLUTION_2X) + + self.progress = (1.0 / count) * i + + self._handleSuccess() + self.app_db_session.close() + + def get_thumbnail_book_ids(self): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .group_by(ub.Thumbnail.book_id)\ + .having(func.min(ub.Thumbnail.expiration) > datetime.utcnow())\ + .all() + + def get_books_without_thumbnails(self, thumbnail_book_ids): + return self.worker_db.session\ + .query(db.Books)\ + .filter(db.Books.has_cover == 1)\ + .filter(db.Books.id.notin_(thumbnail_book_ids))\ + .limit(self.limit)\ + .all() + + def get_thumbnails_for_book(self, thumbnails, book): + results = list() + for thumbnail in thumbnails: + if thumbnail.book_id == book.id: + results.append(thumbnail) + + return results + + def update_book_thumbnail(self, book, thumbnail): + thumbnail.expiration = datetime.utcnow() + timedelta(days=30) + + try: + self.app_db_session.commit() + self.generate_book_thumbnail(book, thumbnail) + except Exception as ex: + self._handleError(u'Error updating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def create_book_thumbnail(self, book, resolution): + thumbnail = ub.Thumbnail() + thumbnail.book_id = book.id + thumbnail.resolution = resolution + + self.app_db_session.add(thumbnail) + try: + self.app_db_session.commit() + self.generate_book_thumbnail(book, thumbnail) + except Exception as ex: + self._handleError(u'Error creating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def generate_book_thumbnail(self, book, thumbnail): + if book and thumbnail: + if config.config_use_google_drive: + self.log.info('google drive thumbnail') + else: + book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') + if os.path.isfile(book_cover_filepath): + with Image(filename=book_cover_filepath) as img: + height = self.get_thumbnail_height(thumbnail) + if img.height > height: + width = self.get_thumbnail_width(height, img) + img.resize(width=width, height=height, filter='lanczos') + img.save(filename=self.get_thumbnail_cache_path(thumbnail)) + + def get_thumbnail_height(self, thumbnail): + return int(225 * thumbnail.resolution) + + def get_thumbnail_width(self, height, img): + percent = (height / float(img.height)) + return int((float(img.width) * float(percent))) + + def get_thumbnail_cache_dir(self): + if not os.path.isdir(_CACHE_DIR): + os.makedirs(_CACHE_DIR) + + if not os.path.isdir(os.path.join(_CACHE_DIR, 'thumbnails')): + os.makedirs(os.path.join(_CACHE_DIR, 'thumbnails')) + + return os.path.join(_CACHE_DIR, 'thumbnails') + + def get_thumbnail_cache_path(self, thumbnail): + if thumbnail: + return os.path.join(self.get_thumbnail_cache_dir(), thumbnail.filename) + return None + + @property + def name(self): + return "Thumbnail" diff --git a/cps/thumbnails.py b/cps/thumbnails.py new file mode 100644 index 000000000..6ccff56f6 --- /dev/null +++ b/cps/thumbnails.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +import os + +from . import logger, ub +from .constants import CACHE_DIR as _CACHE_DIR +from .services.worker import WorkerThread +from .tasks.thumbnail import TaskThumbnail + +from datetime import datetime + +THUMBNAIL_RESOLUTION_1X = 1.0 +THUMBNAIL_RESOLUTION_2X = 2.0 + +log = logger.create() + + +def get_thumbnail_cache_dir(): + if not os.path.isdir(_CACHE_DIR): + os.makedirs(_CACHE_DIR) + + if not os.path.isdir(os.path.join(_CACHE_DIR, 'thumbnails')): + os.makedirs(os.path.join(_CACHE_DIR, 'thumbnails')) + + return os.path.join(_CACHE_DIR, 'thumbnails') + + +def get_thumbnail_cache_path(thumbnail): + if thumbnail: + return os.path.join(get_thumbnail_cache_dir(), thumbnail.filename) + + return None + + +def cover_thumbnail_exists_for_book(book): + if book and book.has_cover: + thumbnail = ub.session.query(ub.Thumbnail).filter(ub.Thumbnail.book_id == book.id).first() + if thumbnail and thumbnail.expiration > datetime.utcnow(): + thumbnail_path = get_thumbnail_cache_path(thumbnail) + return thumbnail_path and os.path.isfile(thumbnail_path) + + return False + + +def generate_thumbnails(): + WorkerThread.add(None, TaskThumbnail()) diff --git a/cps/ub.py b/cps/ub.py index dbc3b4190..4500160f2 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -40,13 +40,14 @@ except ImportError: oauth_support = False from sqlalchemy import create_engine, exc, exists, event from sqlalchemy import Column, ForeignKey -from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, JSON +from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, JSON, Numeric from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.orm import backref, relationship, sessionmaker, Session, scoped_session from werkzeug.security import generate_password_hash -from . import constants +from . import cli, constants session = None @@ -434,6 +435,28 @@ class RemoteAuthToken(Base): return '' % self.id +class Thumbnail(Base): + __tablename__ = 'thumbnail' + + id = Column(Integer, primary_key=True) + book_id = Column(Integer) + uuid = Column(String, default=lambda: str(uuid.uuid4()), unique=True) + format = Column(String, default='jpeg') + resolution = Column(Numeric(precision=2, scale=1, asdecimal=False), default=1.0) + expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30)) + + @hybrid_property + def extension(self): + if self.format == 'jpeg': + return 'jpg' + else: + return self.format + + @hybrid_property + def filename(self): + return self.uuid + '.' + self.extension + + # Migrate database to current version, has to be updated after every database change. Currently migration from # everywhere to current should work. Migration is done by checking if relevant columns are existing, and than adding # rows with SQL commands @@ -451,6 +474,8 @@ def migrate_Database(session): KoboStatistics.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "archived_book"): ArchivedBook.__table__.create(bind=engine) + if not engine.dialect.has_table(engine.connect(), "thumbnail"): + Thumbnail.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "registration"): ReadBook.__table__.create(bind=engine) with engine.connect() as conn: @@ -676,6 +701,13 @@ def init_db(app_db_path): create_anonymous_user(session) +def get_new_session_instance(): + new_engine = create_engine(u'sqlite:///{0}'.format(cli.settingspath), echo=False) + new_session = scoped_session(sessionmaker()) + new_session.configure(bind=new_engine) + return new_session + + def dispose(): global session From 21fce9a5b5b004c1fcf16aa74e96d27f7e4bde0f Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sat, 19 Dec 2020 02:58:40 -0600 Subject: [PATCH 002/412] Added background scheduler and scheduled thumbnail generation job --- cps.py | 4 --- cps/__init__.py | 9 ++++- cps/services/background_scheduler.py | 52 ++++++++++++++++++++++++++++ cps/tasks/thumbnail.py | 12 +++---- cps/thumbnails.py | 4 --- requirements.txt | 1 + 6 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 cps/services/background_scheduler.py diff --git a/cps.py b/cps.py index e90a38d9c..50ab00763 100755 --- a/cps.py +++ b/cps.py @@ -43,7 +43,6 @@ from cps.gdrive import gdrive from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.error_handler import init_errorhandler -from cps.thumbnails import generate_thumbnails try: from cps.kobo import kobo, get_kobo_activated @@ -79,9 +78,6 @@ def main(): app.register_blueprint(kobo_auth) if oauth_available: app.register_blueprint(oauth) - - generate_thumbnails() - success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/__init__.py b/cps/__init__.py index 1a7dc8683..fa85e15c5 100644 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -36,6 +36,8 @@ from flask_principal import Principal from . import config_sql, logger, cache_buster, cli, ub, db from .reverseproxy import ReverseProxied from .server import WebServer +from .services.background_scheduler import BackgroundScheduler +from .tasks.thumbnail import TaskThumbnail mimetypes.init() @@ -95,7 +97,7 @@ def create_app(): app.instance_path = app.instance_path.decode('utf-8') if os.environ.get('FLASK_DEBUG'): - cache_buster.init_cache_busting(app) + cache_buster.init_cache_busting(app) log.info('Starting Calibre Web...') Principal(app) @@ -115,8 +117,13 @@ def create_app(): config.config_goodreads_api_secret, config.config_use_goodreads) + scheduler = BackgroundScheduler() + # Generate 100 book cover thumbnails every 5 minutes + scheduler.add_task(user=None, task=lambda: TaskThumbnail(config=config, limit=100), trigger='interval', minutes=5) + return app + @babel.localeselector def get_locale(): # if a user is logged in, use the locale from the user settings diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py new file mode 100644 index 000000000..efa573799 --- /dev/null +++ b/cps/services/background_scheduler.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +import atexit + +from .. import logger +from .worker import WorkerThread +from apscheduler.schedulers.background import BackgroundScheduler as BScheduler + + +class BackgroundScheduler: + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(BackgroundScheduler, cls).__new__(cls) + + scheduler = BScheduler() + atexit.register(lambda: scheduler.shutdown()) + + cls.log = logger.create() + cls.scheduler = scheduler + cls.scheduler.start() + + return cls._instance + + def add(self, func, trigger, **trigger_args): + self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) + + def add_task(self, user, task, trigger, **trigger_args): + def scheduled_task(): + worker_task = task() + self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) + WorkerThread.add(user, worker_task) + + self.add(func=scheduled_task, trigger=trigger, **trigger_args) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index c452ab41c..378b688e0 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -19,7 +19,7 @@ from __future__ import division, print_function, unicode_literals import os -from cps import config, db, gdriveutils, logger, ub +from cps import db, logger, ub from cps.constants import CACHE_DIR as _CACHE_DIR from cps.services.worker import CalibreTask from datetime import datetime, timedelta @@ -36,8 +36,9 @@ THUMBNAIL_RESOLUTION_2X = 2.0 class TaskThumbnail(CalibreTask): - def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): + def __init__(self, config, limit=100, task_message=u'Generating cover thumbnails'): super(TaskThumbnail, self).__init__(task_message) + self.config = config self.limit = limit self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -47,9 +48,6 @@ class TaskThumbnail(CalibreTask): if self.worker_db.session and use_IM: thumbnails = self.get_thumbnail_book_ids() thumbnail_book_ids = list(map(lambda t: t.book_id, thumbnails)) - self.log.info(','.join([str(elem) for elem in thumbnail_book_ids])) - self.log.info(len(thumbnail_book_ids)) - books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) count = len(books_without_thumbnails) @@ -116,10 +114,10 @@ class TaskThumbnail(CalibreTask): def generate_book_thumbnail(self, book, thumbnail): if book and thumbnail: - if config.config_use_google_drive: + if self.config.config_use_google_drive: self.log.info('google drive thumbnail') else: - book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') + book_cover_filepath = os.path.join(self.config.config_calibre_dir, book.path, 'cover.jpg') if os.path.isfile(book_cover_filepath): with Image(filename=book_cover_filepath) as img: height = self.get_thumbnail_height(thumbnail) diff --git a/cps/thumbnails.py b/cps/thumbnails.py index 6ccff56f6..89e68f505 100644 --- a/cps/thumbnails.py +++ b/cps/thumbnails.py @@ -57,7 +57,3 @@ def cover_thumbnail_exists_for_book(book): return thumbnail_path and os.path.isfile(thumbnail_path) return False - - -def generate_thumbnails(): - WorkerThread.add(None, TaskThumbnail()) diff --git a/requirements.txt b/requirements.txt index f154dd5b9..9d0a86541 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +APScheduler==3.6.3 Babel>=1.3, <2.9 Flask-Babel>=0.11.1,<2.1.0 Flask-Login>=0.3.2,<0.5.1 From e48bdf9d5a038d169046c0e5352d3c9d074769c6 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sun, 20 Dec 2020 03:11:21 -0600 Subject: [PATCH 003/412] Display thumbnails on the frontend, generate thumbnails from google drive --- cps.py | 5 ++++ cps/__init__.py | 6 ----- cps/helper.py | 37 ++++++++++++++++++++--------- cps/schedule.py | 34 +++++++++++++++++++++++++++ cps/tasks/thumbnail.py | 44 +++++++++++++++++++++++++---------- cps/templates/author.html | 2 +- cps/templates/book_cover.html | 8 +++++++ cps/templates/book_edit.html | 4 +++- cps/templates/detail.html | 3 ++- cps/templates/discover.html | 3 ++- cps/templates/fragment.html | 1 + cps/templates/grid.html | 3 ++- cps/templates/index.html | 5 ++-- cps/templates/layout.html | 1 + cps/templates/search.html | 3 ++- cps/templates/shelf.html | 3 ++- cps/thumbnails.py | 9 ++----- cps/ub.py | 4 ++-- cps/web.py | 11 ++++----- 19 files changed, 133 insertions(+), 53 deletions(-) create mode 100644 cps/schedule.py create mode 100644 cps/templates/book_cover.html diff --git a/cps.py b/cps.py index 50ab00763..d63771eb7 100755 --- a/cps.py +++ b/cps.py @@ -43,6 +43,7 @@ from cps.gdrive import gdrive from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.error_handler import init_errorhandler +from cps.schedule import register_jobs try: from cps.kobo import kobo, get_kobo_activated @@ -78,6 +79,10 @@ def main(): app.register_blueprint(kobo_auth) if oauth_available: app.register_blueprint(oauth) + + # Register scheduled jobs + register_jobs() + success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/__init__.py b/cps/__init__.py index fa85e15c5..6a6d361a6 100644 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -36,8 +36,6 @@ from flask_principal import Principal from . import config_sql, logger, cache_buster, cli, ub, db from .reverseproxy import ReverseProxied from .server import WebServer -from .services.background_scheduler import BackgroundScheduler -from .tasks.thumbnail import TaskThumbnail mimetypes.init() @@ -117,10 +115,6 @@ def create_app(): config.config_goodreads_api_secret, config.config_use_goodreads) - scheduler = BackgroundScheduler() - # Generate 100 book cover thumbnails every 5 minutes - scheduler.add_task(user=None, task=lambda: TaskThumbnail(config=config, limit=100), trigger='interval', minutes=5) - return app diff --git a/cps/helper.py b/cps/helper.py index 6fc6b02a4..d3420a11a 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -52,7 +52,7 @@ except ImportError: from . import calibre_db from .tasks.convert import TaskConvert -from . import logger, config, get_locale, db, ub +from . import logger, config, get_locale, db, thumbnails, ub from . import gdriveutils as gd from .constants import STATIC_DIR as _STATIC_DIR from .subproc_wrapper import process_wait @@ -538,24 +538,27 @@ def get_cover_on_failure(use_generic_cover): return None -def get_book_cover(book_id): +def get_book_cover(book_id, resolution=1): book = calibre_db.get_filtered_book(book_id, allow_show_archived=True) - return get_book_cover_internal(book, use_generic_cover_on_failure=True) + return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) -def get_book_cover_with_uuid(book_uuid, - use_generic_cover_on_failure=True): +def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): book = calibre_db.get_book_by_uuid(book_uuid) return get_book_cover_internal(book, use_generic_cover_on_failure) -def get_book_cover_internal(book, use_generic_cover_on_failure): +def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=1, disable_thumbnail=False): if book and book.has_cover: - # if thumbnails.cover_thumbnail_exists_for_book(book): - # thumbnail = ub.session.query(ub.Thumbnail).filter(ub.Thumbnail.book_id == book.id).first() - # return send_from_directory(thumbnails.get_thumbnail_cache_dir(), thumbnail.filename) - # else: - # WorkerThread.add(None, TaskThumbnail(book, _(u'Generating cover thumbnail for: ' + book.title))) + + # Send the book cover thumbnail if it exists in cache + if not disable_thumbnail: + thumbnail = get_book_cover_thumbnail(book, resolution) + if thumbnail: + if os.path.isfile(thumbnails.get_thumbnail_cache_path(thumbnail)): + return send_from_directory(thumbnails.get_thumbnail_cache_dir(), thumbnail.filename) + + # Send the book cover from Google Drive if configured if config.config_use_google_drive: try: if not gd.is_gdrive_ready(): @@ -569,6 +572,8 @@ def get_book_cover_internal(book, use_generic_cover_on_failure): except Exception as ex: log.debug_or_exception(ex) return get_cover_on_failure(use_generic_cover_on_failure) + + # Send the book cover from the Calibre directory else: cover_file_path = os.path.join(config.config_calibre_dir, book.path) if os.path.isfile(os.path.join(cover_file_path, "cover.jpg")): @@ -579,6 +584,16 @@ def get_book_cover_internal(book, use_generic_cover_on_failure): return get_cover_on_failure(use_generic_cover_on_failure) +def get_book_cover_thumbnail(book, resolution=1): + if book and book.has_cover: + return ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id == book.id)\ + .filter(ub.Thumbnail.resolution == resolution)\ + .filter(ub.Thumbnail.expiration > datetime.utcnow())\ + .first() + + # saves book cover from url def save_cover_from_url(url, book_path): try: diff --git a/cps/schedule.py b/cps/schedule.py new file mode 100644 index 000000000..5d2c94b95 --- /dev/null +++ b/cps/schedule.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals + +from . import logger +from .services.background_scheduler import BackgroundScheduler +from .tasks.thumbnail import TaskThumbnail + +log = logger.create() + + +def register_jobs(): + scheduler = BackgroundScheduler() + + # Generate 100 book cover thumbnails every 5 minutes + scheduler.add_task(user=None, task=lambda: TaskThumbnail(limit=100), trigger='interval', minutes=5) + + # TODO: validate thumbnail scheduled task diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 378b688e0..4e0c6db4c 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -19,11 +19,13 @@ from __future__ import division, print_function, unicode_literals import os -from cps import db, logger, ub +from cps import config, db, gdriveutils, logger, ub from cps.constants import CACHE_DIR as _CACHE_DIR from cps.services.worker import CalibreTask +from cps.thumbnails import THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X from datetime import datetime, timedelta from sqlalchemy import func +from urllib.request import urlopen try: from wand.image import Image @@ -31,14 +33,10 @@ try: except (ImportError, RuntimeError) as e: use_IM = False -THUMBNAIL_RESOLUTION_1X = 1.0 -THUMBNAIL_RESOLUTION_2X = 2.0 - class TaskThumbnail(CalibreTask): - def __init__(self, config, limit=100, task_message=u'Generating cover thumbnails'): + def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): super(TaskThumbnail, self).__init__(task_message) - self.config = config self.limit = limit self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -114,17 +112,39 @@ class TaskThumbnail(CalibreTask): def generate_book_thumbnail(self, book, thumbnail): if book and thumbnail: - if self.config.config_use_google_drive: - self.log.info('google drive thumbnail') - else: - book_cover_filepath = os.path.join(self.config.config_calibre_dir, book.path, 'cover.jpg') - if os.path.isfile(book_cover_filepath): - with Image(filename=book_cover_filepath) as img: + if config.config_use_google_drive: + if not gdriveutils.is_gdrive_ready(): + raise Exception('Google Drive is configured but not ready') + + web_content_link = gdriveutils.get_cover_via_gdrive(book.path) + if not web_content_link: + raise Exception('Google Drive cover url not found') + + stream = None + try: + stream = urlopen(web_content_link) + with Image(file=stream) as img: height = self.get_thumbnail_height(thumbnail) if img.height > height: width = self.get_thumbnail_width(height, img) img.resize(width=width, height=height, filter='lanczos') img.save(filename=self.get_thumbnail_cache_path(thumbnail)) + except Exception as ex: + # Bubble exception to calling function + raise ex + finally: + stream.close() + else: + book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') + if not os.path.isfile(book_cover_filepath): + raise Exception('Book cover file not found') + + with Image(filename=book_cover_filepath) as img: + height = self.get_thumbnail_height(thumbnail) + if img.height > height: + width = self.get_thumbnail_width(height, img) + img.resize(width=width, height=height, filter='lanczos') + img.save(filename=self.get_thumbnail_cache_path(thumbnail)) def get_thumbnail_height(self, thumbnail): return int(225 * thumbnail.resolution) diff --git a/cps/templates/author.html b/cps/templates/author.html index 7887aa4a8..24ce876a8 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -36,7 +36,7 @@
diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html new file mode 100644 index 000000000..878c14a8c --- /dev/null +++ b/cps/templates/book_cover.html @@ -0,0 +1,8 @@ +{% macro book_cover_image(book_id, book_title) -%} + {{ book_title }} +{%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 003b33f9c..881fa8ffb 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,9 +1,11 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %} {% if book %}
- {{ book.title }} + {{ book_cover_image(book.id, book.title) }} +
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 503d1dbd4..d3615563c 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,7 +4,8 @@
- {{ entry.title }} + {{ book_cover_image(entry.id, entry.title) }} +
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index 3c858feb1..33bafbbec 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -8,7 +9,7 @@
{% if entry.has_cover is defined %} - {{ entry.title }} + {{ book_cover_image(entry.id, entry.title) }} {% endif %}
diff --git a/cps/templates/fragment.html b/cps/templates/fragment.html index 1421ea6af..901dd1931 100644 --- a/cps/templates/fragment.html +++ b/cps/templates/fragment.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %}
{% block body %}{% endblock %}
diff --git a/cps/templates/grid.html b/cps/templates/grid.html index ce2c05ac9..bc3ca4a2a 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}

{{_(title)}}

@@ -28,7 +29,7 @@
diff --git a/cps/templates/index.html b/cps/templates/index.html index 1db73c89b..c536884f3 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %} {% if g.user.show_detail_random() %} @@ -8,7 +9,7 @@
@@ -82,7 +83,7 @@
diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 3b89a7cea..5df471a92 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -1,4 +1,5 @@ {% from 'modal_dialogs.html' import restrict_modal, delete_book, filechooser_modal %} +{% from 'book_cover.html' import book_cover_image %} diff --git a/cps/templates/search.html b/cps/templates/search.html index aedb6f45c..56b12154e 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -43,7 +44,7 @@
{% if entry.has_cover is defined %} - {{ entry.title }} + {{ book_cover_image(entry.id, entry.title) }} {% endif %}
diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index f7e3c1aeb..7a678ea63 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -30,7 +31,7 @@
diff --git a/cps/thumbnails.py b/cps/thumbnails.py index 89e68f505..ea7aac866 100644 --- a/cps/thumbnails.py +++ b/cps/thumbnails.py @@ -21,13 +21,11 @@ import os from . import logger, ub from .constants import CACHE_DIR as _CACHE_DIR -from .services.worker import WorkerThread -from .tasks.thumbnail import TaskThumbnail from datetime import datetime -THUMBNAIL_RESOLUTION_1X = 1.0 -THUMBNAIL_RESOLUTION_2X = 2.0 +THUMBNAIL_RESOLUTION_1X = 1 +THUMBNAIL_RESOLUTION_2X = 2 log = logger.create() @@ -35,17 +33,14 @@ log = logger.create() def get_thumbnail_cache_dir(): if not os.path.isdir(_CACHE_DIR): os.makedirs(_CACHE_DIR) - if not os.path.isdir(os.path.join(_CACHE_DIR, 'thumbnails')): os.makedirs(os.path.join(_CACHE_DIR, 'thumbnails')) - return os.path.join(_CACHE_DIR, 'thumbnails') def get_thumbnail_cache_path(thumbnail): if thumbnail: return os.path.join(get_thumbnail_cache_dir(), thumbnail.filename) - return None diff --git a/cps/ub.py b/cps/ub.py index 4500160f2..0b5a65e77 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -40,7 +40,7 @@ except ImportError: oauth_support = False from sqlalchemy import create_engine, exc, exists, event from sqlalchemy import Column, ForeignKey -from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, JSON, Numeric +from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, JSON from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm.attributes import flag_modified @@ -442,7 +442,7 @@ class Thumbnail(Base): book_id = Column(Integer) uuid = Column(String, default=lambda: str(uuid.uuid4()), unique=True) format = Column(String, default='jpeg') - resolution = Column(Numeric(precision=2, scale=1, asdecimal=False), default=1.0) + resolution = Column(SmallInteger, default=1) expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30)) @hybrid_property diff --git a/cps/web.py b/cps/web.py index 4baf82cbd..27a5849b1 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1171,14 +1171,17 @@ def advanced_search_form(): @web.route("/cover/") +@web.route("/cover//") @login_required_if_no_ano -def get_cover(book_id): - return get_book_cover(book_id) +def get_cover(book_id, resolution=1): + return get_book_cover(book_id, resolution) + @web.route("/robots.txt") def get_robots(): return send_from_directory(constants.STATIC_DIR, "robots.txt") + @web.route("/show//", defaults={'anyname': 'None'}) @web.route("/show///") @login_required_if_no_ano @@ -1205,7 +1208,6 @@ def serve_book(book_id, book_format, anyname): return send_from_directory(os.path.join(config.config_calibre_dir, book.path), data.name + "." + book_format) - @web.route("/download//", defaults={'anyname': 'None'}) @web.route("/download///") @login_required_if_no_ano @@ -1387,9 +1389,6 @@ def logout(): return redirect(url_for('web.login')) - - - # ################################### Users own configuration ######################################################### From 541fc7e14ebe3716fce58593a2ff3f5b23403e3d Mon Sep 17 00:00:00 2001 From: mmonkey Date: Tue, 22 Dec 2020 17:49:21 -0600 Subject: [PATCH 004/412] fixed thumbnail generate tasks, added thumbnail cleanup task, added reconnect db scheduled job --- cps/fs.py | 61 ++++++++++++++ cps/helper.py | 7 +- cps/schedule.py | 18 ++++- cps/services/worker.py | 17 +++- cps/tasks/thumbnail.py | 177 +++++++++++++++++++++++++++++++---------- cps/thumbnails.py | 54 ------------- cps/ub.py | 28 ++++--- 7 files changed, 245 insertions(+), 117 deletions(-) create mode 100644 cps/fs.py delete mode 100644 cps/thumbnails.py diff --git a/cps/fs.py b/cps/fs.py new file mode 100644 index 000000000..699d59912 --- /dev/null +++ b/cps/fs.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +from .constants import CACHE_DIR +from os import listdir, makedirs, remove +from os.path import isdir, isfile, join +from shutil import rmtree + +CACHE_TYPE_THUMBNAILS = 'thumbnails' + + +class FileSystem: + _instance = None + _cache_dir = CACHE_DIR + + def __new__(cls): + if cls._instance is None: + cls._instance = super(FileSystem, cls).__new__(cls) + return cls._instance + + def get_cache_dir(self, cache_type=None): + if not isdir(self._cache_dir): + makedirs(self._cache_dir) + + if cache_type and not isdir(join(self._cache_dir, cache_type)): + makedirs(join(self._cache_dir, cache_type)) + + return join(self._cache_dir, cache_type) if cache_type else self._cache_dir + + def get_cache_file_path(self, filename, cache_type=None): + return join(self.get_cache_dir(cache_type), filename) if filename else None + + def list_cache_files(self, cache_type=None): + path = self.get_cache_dir(cache_type) + return [file for file in listdir(path) if isfile(join(path, file))] + + def delete_cache_dir(self, cache_type=None): + if not cache_type and isdir(self._cache_dir): + rmtree(self._cache_dir) + if cache_type and isdir(join(self._cache_dir, cache_type)): + rmtree(join(self._cache_dir, cache_type)) + + def delete_cache_file(self, filename, cache_type=None): + if isfile(join(self.get_cache_dir(cache_type), filename)): + remove(join(self.get_cache_dir(cache_type), filename)) diff --git a/cps/helper.py b/cps/helper.py index d3420a11a..271ab3e96 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -52,7 +52,7 @@ except ImportError: from . import calibre_db from .tasks.convert import TaskConvert -from . import logger, config, get_locale, db, thumbnails, ub +from . import logger, config, get_locale, db, fs, ub from . import gdriveutils as gd from .constants import STATIC_DIR as _STATIC_DIR from .subproc_wrapper import process_wait @@ -555,8 +555,9 @@ def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=1, di if not disable_thumbnail: thumbnail = get_book_cover_thumbnail(book, resolution) if thumbnail: - if os.path.isfile(thumbnails.get_thumbnail_cache_path(thumbnail)): - return send_from_directory(thumbnails.get_thumbnail_cache_dir(), thumbnail.filename) + cache = fs.FileSystem() + if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) # Send the book cover from Google Drive if configured if config.config_use_google_drive: diff --git a/cps/schedule.py b/cps/schedule.py index 5d2c94b95..5c658e412 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -18,9 +18,9 @@ from __future__ import division, print_function, unicode_literals -from . import logger +from . import config, db, logger, ub from .services.background_scheduler import BackgroundScheduler -from .tasks.thumbnail import TaskThumbnail +from .tasks.thumbnail import TaskCleanupCoverThumbnailCache, TaskGenerateCoverThumbnails log = logger.create() @@ -29,6 +29,16 @@ def register_jobs(): scheduler = BackgroundScheduler() # Generate 100 book cover thumbnails every 5 minutes - scheduler.add_task(user=None, task=lambda: TaskThumbnail(limit=100), trigger='interval', minutes=5) + scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=100), trigger='interval', minutes=5) - # TODO: validate thumbnail scheduled task + # Cleanup book cover cache every day at 4am + scheduler.add_task(user=None, task=lambda: TaskCleanupCoverThumbnailCache(), trigger='cron', hour=4) + + # Reconnect metadata.db every 4 hours + scheduler.add(func=reconnect_db_job, trigger='interval', hours=4) + + +def reconnect_db_job(): + log.info('Running background task: reconnect to calibre database') + calibre_db = db.CalibreDB() + calibre_db.reconnect_db(config, ub.app_DB_path) diff --git a/cps/services/worker.py b/cps/services/worker.py index 072674a04..2b6816db5 100644 --- a/cps/services/worker.py +++ b/cps/services/worker.py @@ -35,7 +35,6 @@ def _get_main_thread(): raise Exception("main thread not found?!") - class ImprovedQueue(queue.Queue): def to_list(self): """ @@ -45,7 +44,8 @@ class ImprovedQueue(queue.Queue): with self.mutex: return list(self.queue) -#Class for all worker tasks in the background + +# Class for all worker tasks in the background class WorkerThread(threading.Thread): _instance = None @@ -127,6 +127,10 @@ class WorkerThread(threading.Thread): # CalibreTask.start() should wrap all exceptions in it's own error handling item.task.start(self) + # remove self_cleanup tasks from list + if item.task.self_cleanup: + self.dequeued.remove(item) + self.queue.task_done() @@ -141,6 +145,7 @@ class CalibreTask: self.end_time = None self.message = message self.id = uuid.uuid4() + self.self_cleanup = False @abc.abstractmethod def run(self, worker_thread): @@ -209,6 +214,14 @@ class CalibreTask: # todo: throw error if outside of [0,1] self._progress = x + @property + def self_cleanup(self): + return self._self_cleanup + + @self_cleanup.setter + def self_cleanup(self, is_self_cleanup): + self._self_cleanup = is_self_cleanup + def _handleError(self, error_message): self.stat = STAT_FAIL self.progress = 1 diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 4e0c6db4c..f61eb4a78 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -19,13 +19,15 @@ from __future__ import division, print_function, unicode_literals import os -from cps import config, db, gdriveutils, logger, ub -from cps.constants import CACHE_DIR as _CACHE_DIR +from cps import config, db, fs, gdriveutils, logger, ub from cps.services.worker import CalibreTask -from cps.thumbnails import THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X from datetime import datetime, timedelta from sqlalchemy import func -from urllib.request import urlopen + +try: + from urllib.request import urlopen +except ImportError as e: + from urllib2 import urlopen try: from wand.image import Image @@ -33,73 +35,92 @@ try: except (ImportError, RuntimeError) as e: use_IM = False +THUMBNAIL_RESOLUTION_1X = 1 +THUMBNAIL_RESOLUTION_2X = 2 -class TaskThumbnail(CalibreTask): + +class TaskGenerateCoverThumbnails(CalibreTask): def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): - super(TaskThumbnail, self).__init__(task_message) + super(TaskGenerateCoverThumbnails, self).__init__(task_message) + self.self_cleanup = True self.limit = limit self.log = logger.create() self.app_db_session = ub.get_new_session_instance() - self.worker_db = db.CalibreDB(expire_on_commit=False) + self.calibre_db = db.CalibreDB(expire_on_commit=False) + self.cache = fs.FileSystem() + self.resolutions = [ + THUMBNAIL_RESOLUTION_1X, + THUMBNAIL_RESOLUTION_2X + ] def run(self, worker_thread): - if self.worker_db.session and use_IM: - thumbnails = self.get_thumbnail_book_ids() - thumbnail_book_ids = list(map(lambda t: t.book_id, thumbnails)) + if self.calibre_db.session and use_IM: + expired_thumbnails = self.get_expired_thumbnails() + thumbnail_book_ids = self.get_thumbnail_book_ids() books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) count = len(books_without_thumbnails) for i, book in enumerate(books_without_thumbnails): - thumbnails = self.get_thumbnails_for_book(thumbnails, book) - if thumbnails: - for thumbnail in thumbnails: - self.update_book_thumbnail(book, thumbnail) - - else: - self.create_book_thumbnail(book, THUMBNAIL_RESOLUTION_1X) - self.create_book_thumbnail(book, THUMBNAIL_RESOLUTION_2X) + for resolution in self.resolutions: + expired_thumbnail = self.get_expired_thumbnail_for_book_and_resolution( + book, + resolution, + expired_thumbnails + ) + if expired_thumbnail: + self.update_book_thumbnail(book, expired_thumbnail) + else: + self.create_book_thumbnail(book, resolution) self.progress = (1.0 / count) * i self._handleSuccess() - self.app_db_session.close() + self.app_db_session.remove() + + def get_expired_thumbnails(self): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.expiration < datetime.utcnow())\ + .all() def get_thumbnail_book_ids(self): return self.app_db_session\ - .query(ub.Thumbnail)\ + .query(ub.Thumbnail.book_id)\ .group_by(ub.Thumbnail.book_id)\ .having(func.min(ub.Thumbnail.expiration) > datetime.utcnow())\ - .all() + .distinct() def get_books_without_thumbnails(self, thumbnail_book_ids): - return self.worker_db.session\ + return self.calibre_db.session\ .query(db.Books)\ .filter(db.Books.has_cover == 1)\ .filter(db.Books.id.notin_(thumbnail_book_ids))\ .limit(self.limit)\ .all() - def get_thumbnails_for_book(self, thumbnails, book): - results = list() - for thumbnail in thumbnails: - if thumbnail.book_id == book.id: - results.append(thumbnail) + def get_expired_thumbnail_for_book_and_resolution(self, book, resolution, expired_thumbnails): + for thumbnail in expired_thumbnails: + if thumbnail.book_id == book.id and thumbnail.resolution == resolution: + return thumbnail - return results + return None def update_book_thumbnail(self, book, thumbnail): + thumbnail.generated_at = datetime.utcnow() thumbnail.expiration = datetime.utcnow() + timedelta(days=30) try: self.app_db_session.commit() self.generate_book_thumbnail(book, thumbnail) except Exception as ex: + self.log.info(u'Error updating book thumbnail: ' + str(ex)) self._handleError(u'Error updating book thumbnail: ' + str(ex)) self.app_db_session.rollback() def create_book_thumbnail(self, book, resolution): thumbnail = ub.Thumbnail() thumbnail.book_id = book.id + thumbnail.format = 'jpeg' thumbnail.resolution = resolution self.app_db_session.add(thumbnail) @@ -107,6 +128,7 @@ class TaskThumbnail(CalibreTask): self.app_db_session.commit() self.generate_book_thumbnail(book, thumbnail) except Exception as ex: + self.log.info(u'Error creating book thumbnail: ' + str(ex)) self._handleError(u'Error creating book thumbnail: ' + str(ex)) self.app_db_session.rollback() @@ -128,9 +150,12 @@ class TaskThumbnail(CalibreTask): if img.height > height: width = self.get_thumbnail_width(height, img) img.resize(width=width, height=height, filter='lanczos') - img.save(filename=self.get_thumbnail_cache_path(thumbnail)) + img.format = thumbnail.format + filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + img.save(filename=filename) except Exception as ex: # Bubble exception to calling function + self.log.info(u'Error generating thumbnail file: ' + str(ex)) raise ex finally: stream.close() @@ -144,7 +169,9 @@ class TaskThumbnail(CalibreTask): if img.height > height: width = self.get_thumbnail_width(height, img) img.resize(width=width, height=height, filter='lanczos') - img.save(filename=self.get_thumbnail_cache_path(thumbnail)) + img.format = thumbnail.format + filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + img.save(filename=filename) def get_thumbnail_height(self, thumbnail): return int(225 * thumbnail.resolution) @@ -153,20 +180,88 @@ class TaskThumbnail(CalibreTask): percent = (height / float(img.height)) return int((float(img.width) * float(percent))) - def get_thumbnail_cache_dir(self): - if not os.path.isdir(_CACHE_DIR): - os.makedirs(_CACHE_DIR) + @property + def name(self): + return "GenerateCoverThumbnails" - if not os.path.isdir(os.path.join(_CACHE_DIR, 'thumbnails')): - os.makedirs(os.path.join(_CACHE_DIR, 'thumbnails')) - return os.path.join(_CACHE_DIR, 'thumbnails') +class TaskCleanupCoverThumbnailCache(CalibreTask): + def __init__(self, task_message=u'Validating cover thumbnail cache'): + super(TaskCleanupCoverThumbnailCache, self).__init__(task_message) + self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() + self.calibre_db = db.CalibreDB(expire_on_commit=False) + self.cache = fs.FileSystem() - def get_thumbnail_cache_path(self, thumbnail): - if thumbnail: - return os.path.join(self.get_thumbnail_cache_dir(), thumbnail.filename) - return None + def run(self, worker_thread): + cached_thumbnail_files = self.cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) + + # Expire thumbnails in the database if the cached file is missing + # This case will happen if a user deletes the cache dir or cached files + if self.app_db_session: + self.expire_missing_thumbnails(cached_thumbnail_files) + self.progress = 0.33 + + # Delete thumbnails in the database if the book has been removed + # This case will happen if a book is removed in Calibre and the metadata.db file is updated in the filesystem + if self.app_db_session and self.calibre_db: + book_ids = self.get_book_ids() + self.delete_thumbnails_for_missing_books(book_ids) + self.progress = 0.66 + + # Delete extraneous cached thumbnail files + # This case will happen if a book was deleted and the thumbnail OR the metadata.db file was changed externally + if self.app_db_session: + db_thumbnail_files = self.get_thumbnail_filenames() + self.delete_extraneous_thumbnail_files(cached_thumbnail_files, db_thumbnail_files) + + self._handleSuccess() + self.app_db_session.remove() + + def expire_missing_thumbnails(self, filenames): + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.filename.notin_(filenames))\ + .update({"expiration": datetime.utcnow()}, synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(u'Error expiring thumbnails for missing cache files: ' + str(ex)) + self._handleError(u'Error expiring thumbnails for missing cache files: ' + str(ex)) + self.app_db_session.rollback() + + def get_book_ids(self): + results = self.calibre_db.session\ + .query(db.Books.id)\ + .filter(db.Books.has_cover == 1)\ + .distinct() + + return [value for value, in results] + + def delete_thumbnails_for_missing_books(self, book_ids): + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.notin_(book_ids))\ + .delete(synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(str(ex)) + self._handleError(u'Error deleting thumbnails for missing books: ' + str(ex)) + self.app_db_session.rollback() + + def get_thumbnail_filenames(self): + results = self.app_db_session\ + .query(ub.Thumbnail.filename)\ + .all() + + return [thumbnail for thumbnail, in results] + + def delete_extraneous_thumbnail_files(self, cached_thumbnail_files, db_thumbnail_files): + extraneous_files = list(set(cached_thumbnail_files).difference(db_thumbnail_files)) + for file in extraneous_files: + self.cache.delete_cache_file(file, fs.CACHE_TYPE_THUMBNAILS) @property def name(self): - return "Thumbnail" + return "CleanupCoverThumbnailCache" diff --git a/cps/thumbnails.py b/cps/thumbnails.py deleted file mode 100644 index ea7aac866..000000000 --- a/cps/thumbnails.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- - -# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) -# Copyright (C) 2020 mmonkey -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from __future__ import division, print_function, unicode_literals -import os - -from . import logger, ub -from .constants import CACHE_DIR as _CACHE_DIR - -from datetime import datetime - -THUMBNAIL_RESOLUTION_1X = 1 -THUMBNAIL_RESOLUTION_2X = 2 - -log = logger.create() - - -def get_thumbnail_cache_dir(): - if not os.path.isdir(_CACHE_DIR): - os.makedirs(_CACHE_DIR) - if not os.path.isdir(os.path.join(_CACHE_DIR, 'thumbnails')): - os.makedirs(os.path.join(_CACHE_DIR, 'thumbnails')) - return os.path.join(_CACHE_DIR, 'thumbnails') - - -def get_thumbnail_cache_path(thumbnail): - if thumbnail: - return os.path.join(get_thumbnail_cache_dir(), thumbnail.filename) - return None - - -def cover_thumbnail_exists_for_book(book): - if book and book.has_cover: - thumbnail = ub.session.query(ub.Thumbnail).filter(ub.Thumbnail.book_id == book.id).first() - if thumbnail and thumbnail.expiration > datetime.utcnow(): - thumbnail_path = get_thumbnail_cache_path(thumbnail) - return thumbnail_path and os.path.isfile(thumbnail_path) - - return False diff --git a/cps/ub.py b/cps/ub.py index 0b5a65e77..30abd728d 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -18,6 +18,7 @@ # along with this program. If not, see . from __future__ import division, print_function, unicode_literals +import atexit import os import sys import datetime @@ -42,12 +43,11 @@ from sqlalchemy import create_engine, exc, exists, event from sqlalchemy import Column, ForeignKey from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, JSON from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.orm import backref, relationship, sessionmaker, Session, scoped_session from werkzeug.security import generate_password_hash -from . import cli, constants +from . import cli, constants, logger session = None @@ -435,6 +435,14 @@ class RemoteAuthToken(Base): return '' % self.id +def filename(context): + file_format = context.get_current_parameters()['format'] + if file_format == 'jpeg': + return context.get_current_parameters()['uuid'] + '.jpg' + else: + return context.get_current_parameters()['uuid'] + '.' + file_format + + class Thumbnail(Base): __tablename__ = 'thumbnail' @@ -443,19 +451,10 @@ class Thumbnail(Base): uuid = Column(String, default=lambda: str(uuid.uuid4()), unique=True) format = Column(String, default='jpeg') resolution = Column(SmallInteger, default=1) + filename = Column(String, default=filename) + generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30)) - @hybrid_property - def extension(self): - if self.format == 'jpeg': - return 'jpg' - else: - return self.format - - @hybrid_property - def filename(self): - return self.uuid + '.' + self.extension - # Migrate database to current version, has to be updated after every database change. Currently migration from # everywhere to current should work. Migration is done by checking if relevant columns are existing, and than adding @@ -705,6 +704,9 @@ def get_new_session_instance(): new_engine = create_engine(u'sqlite:///{0}'.format(cli.settingspath), echo=False) new_session = scoped_session(sessionmaker()) new_session.configure(bind=new_engine) + + atexit.register(lambda: new_session.remove() if new_session else True) + return new_session From 626051e4892ef42d65e16f01932ae8ce48342c22 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Wed, 23 Dec 2020 03:25:25 -0600 Subject: [PATCH 005/412] Added clear cache button to admin settings, updated cache busting for book cover images --- cps/admin.py | 19 +++++++- cps/editbooks.py | 2 + cps/helper.py | 23 +++++++--- cps/jinjia.py | 6 +++ cps/schedule.py | 12 +---- cps/static/css/caliBlur.css | 82 ++++++++++++++++++++++++++++------- cps/static/js/main.js | 12 +++++ cps/tasks/database.py | 49 +++++++++++++++++++++ cps/tasks/thumbnail.py | 58 ++++++++++++++++++++++++- cps/templates/admin.html | 36 +++++++++++---- cps/templates/author.html | 2 +- cps/templates/book_cover.html | 8 ++-- cps/templates/book_edit.html | 3 +- cps/templates/detail.html | 3 +- cps/templates/discover.html | 2 +- cps/templates/grid.html | 2 +- cps/templates/index.html | 4 +- cps/templates/search.html | 2 +- cps/templates/shelf.html | 2 +- cps/web.py | 8 +++- 20 files changed, 278 insertions(+), 57 deletions(-) create mode 100644 cps/tasks/database.py diff --git a/cps/admin.py b/cps/admin.py index 8b3ca247a..dbc1b7084 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -38,7 +38,7 @@ from sqlalchemy import and_ from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_ -from . import constants, logger, helper, services +from . import constants, logger, helper, services, fs from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash from .gdriveutils import is_gdrive_ready, gdrive_support @@ -157,6 +157,23 @@ def shutdown(): return json.dumps(showtext), 400 +@admi.route("/clear-cache") +@login_required +@admin_required +def clear_cache(): + cache_type = request.args.get('cache_type'.strip()) + showtext = {} + + if cache_type == fs.CACHE_TYPE_THUMBNAILS: + log.info('clearing cover thumbnail cache') + showtext['text'] = _(u'Cleared cover thumbnail cache') + helper.clear_cover_thumbnail_cache() + return json.dumps(showtext) + + showtext['text'] = _(u'Unknown command') + return json.dumps(showtext) + + @admi.route("/admin/view") @login_required @admin_required diff --git a/cps/editbooks.py b/cps/editbooks.py index 08ee93b13..6d26ebca2 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -595,6 +595,7 @@ def upload_cover(request, book): abort(403) ret, message = helper.save_cover(requested_file, book.path) if ret is True: + helper.clear_cover_thumbnail_cache(book.id) return True else: flash(message, category="error") @@ -684,6 +685,7 @@ def edit_book(book_id): if result is True: book.has_cover = 1 modif_date = True + helper.clear_cover_thumbnail_cache(book.id) else: flash(error, category="error") diff --git a/cps/helper.py b/cps/helper.py index 271ab3e96..0b0c675f2 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -58,6 +58,7 @@ from .constants import STATIC_DIR as _STATIC_DIR from .subproc_wrapper import process_wait from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS from .tasks.mail import TaskEmail +from .tasks.thumbnail import TaskClearCoverThumbnailCache log = logger.create() @@ -525,6 +526,7 @@ def update_dir_stucture(book_id, calibrepath, first_author=None, orignal_filepat def delete_book(book, calibrepath, book_format): + clear_cover_thumbnail_cache(book.id) if config.config_use_google_drive: return delete_book_gdrive(book, book_format) else: @@ -538,9 +540,9 @@ def get_cover_on_failure(use_generic_cover): return None -def get_book_cover(book_id, resolution=1): +def get_book_cover(book_id): book = calibre_db.get_filtered_book(book_id, allow_show_archived=True) - return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) + return get_book_cover_internal(book, use_generic_cover_on_failure=True) def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): @@ -548,11 +550,19 @@ def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): return get_book_cover_internal(book, use_generic_cover_on_failure) -def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=1, disable_thumbnail=False): +def get_cached_book_cover(cache_id): + parts = cache_id.split('_') + book_uuid = parts[0] if len(parts) else None + resolution = parts[2] if len(parts) > 2 else None + book = calibre_db.get_book_by_uuid(book_uuid) if book_uuid else None + return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) + + +def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None): if book and book.has_cover: # Send the book cover thumbnail if it exists in cache - if not disable_thumbnail: + if resolution: thumbnail = get_book_cover_thumbnail(book, resolution) if thumbnail: cache = fs.FileSystem() @@ -585,7 +595,7 @@ def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=1, di return get_cover_on_failure(use_generic_cover_on_failure) -def get_book_cover_thumbnail(book, resolution=1): +def get_book_cover_thumbnail(book, resolution): if book and book.has_cover: return ub.session\ .query(ub.Thumbnail)\ @@ -846,3 +856,6 @@ def get_download_link(book_id, book_format, client): else: abort(404) + +def clear_cover_thumbnail_cache(book_id=None): + WorkerThread.add(None, TaskClearCoverThumbnailCache(book_id)) diff --git a/cps/jinjia.py b/cps/jinjia.py index 688d1fbad..bf81c059d 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -128,8 +128,14 @@ def formatseriesindex_filter(series_index): return series_index return 0 + @jinjia.app_template_filter('uuidfilter') def uuidfilter(var): return uuid4() +@jinjia.app_template_filter('book_cover_cache_id') +def book_cover_cache_id(book, resolution=None): + timestamp = int(book.last_modified.timestamp() * 1000) + cache_bust = str(book.uuid) + '_' + str(timestamp) + return cache_bust if not resolution else cache_bust + '_' + str(resolution) diff --git a/cps/schedule.py b/cps/schedule.py index 5c658e412..f349a231d 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -18,12 +18,10 @@ from __future__ import division, print_function, unicode_literals -from . import config, db, logger, ub from .services.background_scheduler import BackgroundScheduler +from .tasks.database import TaskReconnectDatabase from .tasks.thumbnail import TaskCleanupCoverThumbnailCache, TaskGenerateCoverThumbnails -log = logger.create() - def register_jobs(): scheduler = BackgroundScheduler() @@ -35,10 +33,4 @@ def register_jobs(): scheduler.add_task(user=None, task=lambda: TaskCleanupCoverThumbnailCache(), trigger='cron', hour=4) # Reconnect metadata.db every 4 hours - scheduler.add(func=reconnect_db_job, trigger='interval', hours=4) - - -def reconnect_db_job(): - log.info('Running background task: reconnect to calibre database') - calibre_db = db.CalibreDB() - calibre_db.reconnect_db(config, ub.app_DB_path) + scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='interval', hours=4) diff --git a/cps/static/css/caliBlur.css b/cps/static/css/caliBlur.css index d085608d3..da5d29338 100644 --- a/cps/static/css/caliBlur.css +++ b/cps/static/css/caliBlur.css @@ -5167,7 +5167,7 @@ body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-head pointer-events: none } -#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #deleteButton, #deleteModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { +#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #ClearCacheDialog:hover:before, #deleteButton, #deleteModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { cursor: pointer } @@ -5254,7 +5254,7 @@ body.admin > div.container-fluid > div > div.col-sm-10 > div.container-fluid > d margin-bottom: 20px } -body.admin:not(.modal-open) .btn-default { +body.admin .btn-default { margin-bottom: 10px } @@ -5485,7 +5485,7 @@ body.admin.modal-open .navbar { z-index: 0 !important } -#RestartDialog, #ShutdownDialog, #StatusDialog, #deleteModal { +#RestartDialog, #ShutdownDialog, #StatusDialog, #ClearCacheDialog, #deleteModal { top: 0; overflow: hidden; padding-top: 70px; @@ -5495,7 +5495,7 @@ body.admin.modal-open .navbar { background: rgba(0, 0, 0, .5) } -#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #deleteModal:before { +#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #ClearCacheDialog:before, #deleteModal:before { content: "\E208"; padding-right: 10px; display: block; @@ -5517,18 +5517,18 @@ body.admin.modal-open .navbar { z-index: 99 } -#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before { +#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0) } -#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog { +#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { width: 450px; margin: auto } -#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { +#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { max-height: calc(100% - 90px); -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); @@ -5539,7 +5539,7 @@ body.admin.modal-open .navbar { width: 450px } -#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header { +#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header { padding: 15px 20px; border-radius: 3px 3px 0 0; line-height: 1.71428571; @@ -5552,7 +5552,7 @@ body.admin.modal-open .navbar { text-align: left } -#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before { +#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before { padding-right: 10px; font-size: 18px; color: #999; @@ -5576,6 +5576,11 @@ body.admin.modal-open .navbar { font-family: plex-icons-new, serif } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before { + content: "\EA15"; + font-family: plex-icons-new, serif +} + #deleteModal > .modal-dialog > .modal-content > .modal-header:before { content: "\EA6D"; font-family: plex-icons-new, serif @@ -5599,6 +5604,12 @@ body.admin.modal-open .navbar { font-size: 20px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:after { + content: "Clear Cover Thumbnail Cache"; + display: inline-block; + font-size: 20px +} + #deleteModal > .modal-dialog > .modal-content > .modal-header:after { content: "Delete Book"; display: inline-block; @@ -5629,7 +5640,17 @@ body.admin.modal-open .navbar { text-align: left } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p { +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body { + padding: 20px 20px 10px; + font-size: 16px; + line-height: 1.6em; + font-family: Open Sans Regular, Helvetica Neue, Helvetica, Arial, sans-serif; + color: #eee; + background: #282828; + text-align: left +} + +#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p { padding: 20px 20px 0 0; font-size: 16px; line-height: 1.6em; @@ -5638,7 +5659,7 @@ body.admin.modal-open .navbar { background: #282828 } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { float: right; z-index: 9; position: relative; @@ -5674,6 +5695,18 @@ body.admin.modal-open .navbar { border-radius: 3px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > #clear_cache { + float: right; + z-index: 9; + position: relative; + margin: 25px 0 0 10px; + min-width: 80px; + padding: 10px 18px; + font-size: 16px; + line-height: 1.33; + border-radius: 3px +} + #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-danger { float: right; z-index: 9; @@ -5694,11 +5727,15 @@ body.admin.modal-open .navbar { margin: 55px 0 0 10px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache) { + margin: 25px 0 0 10px +} + #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { margin: 0 0 0 10px } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { background-color: hsla(0, 0%, 100%, .3) } @@ -5732,6 +5769,21 @@ body.admin.modal-open .navbar { box-shadow: 0 5px 15px rgba(0, 0, 0, .5) } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body:after { + content: ''; + position: absolute; + width: 100%; + height: 72px; + background-color: #323232; + border-radius: 0 0 3px 3px; + left: 0; + margin-top: 10px; + z-index: 0; + border-top: 1px solid #222; + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5) +} + #deleteButton { position: fixed; top: 60px; @@ -7322,11 +7374,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. background-color: transparent !important } - #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog { + #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { max-width: calc(100vw - 40px) } - #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { + #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { max-width: calc(100vw - 40px); left: 0 } @@ -7476,7 +7528,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. padding: 30px 15px } - #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before { + #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { left: auto; right: 34px } diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 3fbaed881..d8c1863f3 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -405,6 +405,18 @@ $(function() { } }); }); + $("#clear_cache").click(function () { + $("#spinner3").show(); + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../clear-cache", + data: {"cache_type":"thumbnails"}, + success: function(data) { + $("#spinner3").hide(); + $("#ClearCacheDialog").modal("hide"); + } + }); + }); // Init all data control handlers to default $("input[data-control]").trigger("change"); diff --git a/cps/tasks/database.py b/cps/tasks/database.py new file mode 100644 index 000000000..11f0186d4 --- /dev/null +++ b/cps/tasks/database.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals + +from cps import config, logger +from cps.services.worker import CalibreTask + +try: + from urllib.request import urlopen +except ImportError as e: + from urllib2 import urlopen + + +class TaskReconnectDatabase(CalibreTask): + def __init__(self, task_message=u'Reconnecting Calibre database'): + super(TaskReconnectDatabase, self).__init__(task_message) + self.log = logger.create() + self.listen_address = config.get_config_ipaddress() + self.listen_port = config.config_port + + def run(self, worker_thread): + address = self.listen_address if self.listen_address else 'localhost' + port = self.listen_port if self.listen_port else 8083 + + try: + urlopen('http://' + address + ':' + str(port) + '/reconnect') + self._handleSuccess() + except Exception as ex: + self._handleError(u'Unable to reconnect Calibre database: ' + str(ex)) + + @property + def name(self): + return "Reconnect Database" diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index f61eb4a78..b541bc707 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -42,7 +42,6 @@ THUMBNAIL_RESOLUTION_2X = 2 class TaskGenerateCoverThumbnails(CalibreTask): def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): super(TaskGenerateCoverThumbnails, self).__init__(task_message) - self.self_cleanup = True self.limit = limit self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -186,7 +185,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): class TaskCleanupCoverThumbnailCache(CalibreTask): - def __init__(self, task_message=u'Validating cover thumbnail cache'): + def __init__(self, task_message=u'Cleaning up cover thumbnail cache'): super(TaskCleanupCoverThumbnailCache, self).__init__(task_message) self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -265,3 +264,58 @@ class TaskCleanupCoverThumbnailCache(CalibreTask): @property def name(self): return "CleanupCoverThumbnailCache" + + +class TaskClearCoverThumbnailCache(CalibreTask): + def __init__(self, book_id=None, task_message=u'Clearing cover thumbnail cache'): + super(TaskClearCoverThumbnailCache, self).__init__(task_message) + self.log = logger.create() + self.book_id = book_id + self.app_db_session = ub.get_new_session_instance() + self.cache = fs.FileSystem() + + def run(self, worker_thread): + if self.app_db_session: + if self.book_id: + thumbnails = self.get_thumbnails_for_book(self.book_id) + for thumbnail in thumbnails: + self.expire_and_delete_thumbnail(thumbnail) + else: + self.expire_and_delete_all_thumbnails() + + self._handleSuccess() + self.app_db_session.remove() + + def get_thumbnails_for_book(self, book_id): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id == book_id)\ + .all() + + def expire_and_delete_thumbnail(self, thumbnail): + thumbnail.expiration = datetime.utcnow() + + try: + self.app_db_session.commit() + self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + except Exception as ex: + self.log.info(u'Error expiring book thumbnail: ' + str(ex)) + self._handleError(u'Error expiring book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def expire_and_delete_all_thumbnails(self): + self.app_db_session\ + .query(ub.Thumbnail)\ + .update({'expiration': datetime.utcnow()}) + + try: + self.app_db_session.commit() + self.cache.delete_cache_dir(fs.CACHE_TYPE_THUMBNAILS) + except Exception as ex: + self.log.info(u'Error expiring book thumbnails: ' + str(ex)) + self._handleError(u'Error expiring book thumbnails: ' + str(ex)) + self.app_db_session.rollback() + + @property + def name(self): + return "ClearCoverThumbnailCache" diff --git a/cps/templates/admin.html b/cps/templates/admin.html index 1ef641575..e3d20db3e 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -139,15 +139,18 @@
-
+

{{_('Administration')}}

- - -
-
-
{{_('Reconnect Calibre Database')}}
-
{{_('Restart')}}
-
{{_('Shutdown')}}
+ + +
+
+
{{_('Reconnect Calibre Database')}}
+
{{_('Clear Cover Thumbnail Cache')}}
+
+
+
{{_('Restart')}}
+
{{_('Shutdown')}}
@@ -226,4 +229,21 @@
+ {% endblock %} diff --git a/cps/templates/author.html b/cps/templates/author.html index 24ce876a8..3cf3fb4be 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -36,7 +36,7 @@
diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html index 878c14a8c..3f0ed1542 100644 --- a/cps/templates/book_cover.html +++ b/cps/templates/book_cover.html @@ -1,8 +1,8 @@ -{% macro book_cover_image(book_id, book_title) -%} +{% macro book_cover_image(book, book_title) -%} {{ book_title }} {%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 881fa8ffb..369b8d052 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -4,8 +4,7 @@ {% if book %}
- {{ book_cover_image(book.id, book.title) }} - + {{ book_cover_image(book, book.title) }}
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index d3615563c..cdf6ab2b7 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,8 +4,7 @@
- {{ book_cover_image(entry.id, entry.title) }} - + {{ book_cover_image(entry, entry.title) }}
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index 33bafbbec..5d4666f6d 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -9,7 +9,7 @@ diff --git a/cps/templates/grid.html b/cps/templates/grid.html index bc3ca4a2a..67594b4e5 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -29,7 +29,7 @@
diff --git a/cps/templates/index.html b/cps/templates/index.html index c536884f3..531a535c1 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -9,7 +9,7 @@
@@ -83,7 +83,7 @@
diff --git a/cps/templates/search.html b/cps/templates/search.html index 56b12154e..8e0cf6688 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -44,7 +44,7 @@ diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index 7a678ea63..bebc0b1f5 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -31,7 +31,7 @@
diff --git a/cps/web.py b/cps/web.py index 27a5849b1..16c14fcf2 100644 --- a/cps/web.py +++ b/cps/web.py @@ -50,7 +50,7 @@ from . import babel, db, ub, config, get_locale, app from . import calibre_db, shelf from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download from .helper import check_valid_domain, render_task_status, \ - get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \ + get_cc_columns, get_book_cover, get_cached_book_cover, get_download_link, send_mail, generate_random_password, \ send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password from .pagination import Pagination from .redirect import redirect_back @@ -1177,6 +1177,12 @@ def get_cover(book_id, resolution=1): return get_book_cover(book_id, resolution) +@web.route("/cached-cover/") +@login_required_if_no_ano +def get_cached_cover(cache_id): + return get_cached_book_cover(cache_id) + + @web.route("/robots.txt") def get_robots(): return send_from_directory(constants.STATIC_DIR, "robots.txt") From 242a2767a1e374a938de2f1b3fdb7cb2175c5fd1 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Thu, 24 Dec 2020 02:35:32 -0600 Subject: [PATCH 006/412] Added thumbnail urls to book cover srcsets with cache busting ids --- cps/db.py | 3 +- cps/helper.py | 38 +++++++++++++++ cps/jinjia.py | 16 +++++++ cps/schedule.py | 10 ++-- cps/tasks/thumbnail.py | 61 ++++++++++++++++++++---- cps/templates/author.html | 2 +- cps/templates/book_cover.html | 19 +++++--- cps/templates/book_edit.html | 2 +- cps/templates/detail.html | 2 +- cps/templates/discover.html | 2 +- cps/templates/grid.html | 2 +- cps/templates/index.html | 4 +- cps/templates/search.html | 2 +- cps/templates/shelf.html | 2 +- cps/web.py | 89 +++++++++++++++++++++++++---------- 15 files changed, 199 insertions(+), 55 deletions(-) diff --git a/cps/db.py b/cps/db.py index 2e428f725..8b8db10a0 100644 --- a/cps/db.py +++ b/cps/db.py @@ -609,7 +609,8 @@ class CalibreDB(): randm = self.session.query(Books) \ .filter(self.common_filters(allow_show_archived)) \ .order_by(func.random()) \ - .limit(self.config.config_random_books) + .limit(self.config.config_random_books) \ + .all() else: randm = false() off = int(int(pagesize) * (page - 1)) diff --git a/cps/helper.py b/cps/helper.py index 0b0c675f2..c33a69e1e 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -533,6 +533,21 @@ def delete_book(book, calibrepath, book_format): return delete_book_file(book, calibrepath, book_format) +def get_thumbnails_for_books(books): + books_with_covers = list(filter(lambda b: b.has_cover, books)) + book_ids = list(map(lambda b: b.id, books_with_covers)) + return ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.in_(book_ids))\ + .filter(ub.Thumbnail.expiration > datetime.utcnow())\ + .all() + + +def get_thumbnails_for_book_series(series): + books = list(map(lambda s: s[0], series)) + return get_thumbnails_for_books(books) + + def get_cover_on_failure(use_generic_cover): if use_generic_cover: return send_from_directory(_STATIC_DIR, "generic_cover.jpg") @@ -558,6 +573,29 @@ def get_cached_book_cover(cache_id): return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) +def get_cached_book_cover_thumbnail(cache_id): + parts = cache_id.split('_') + thumbnail_uuid = parts[0] if len(parts) else None + thumbnail = None + if thumbnail_uuid: + thumbnail = ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.uuid == thumbnail_uuid)\ + .first() + + if thumbnail and thumbnail.expiration > datetime.utcnow(): + cache = fs.FileSystem() + if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) + + elif thumbnail: + book = calibre_db.get_book(thumbnail.book_id) + return get_book_cover_internal(book, use_generic_cover_on_failure=True) + + else: + return get_cover_on_failure(True) + + def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None): if book and book.has_cover: diff --git a/cps/jinjia.py b/cps/jinjia.py index bf81c059d..b2479adca 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -139,3 +139,19 @@ def book_cover_cache_id(book, resolution=None): timestamp = int(book.last_modified.timestamp() * 1000) cache_bust = str(book.uuid) + '_' + str(timestamp) return cache_bust if not resolution else cache_bust + '_' + str(resolution) + + +@jinjia.app_template_filter('get_book_thumbnails') +def get_book_thumbnails(book_id, thumbnails=None): + return list(filter(lambda t: t.book_id == book_id, thumbnails)) if book_id > -1 and thumbnails else list() + + +@jinjia.app_template_filter('get_book_thumbnail_srcset') +def get_book_thumbnail_srcset(thumbnails): + srcset = list() + for thumbnail in thumbnails: + timestamp = int(thumbnail.generated_at.timestamp() * 1000) + cache_id = str(thumbnail.uuid) + '_' + str(timestamp) + url = url_for('web.get_cached_cover_thumbnail', cache_id=cache_id) + srcset.append(url + ' ' + str(thumbnail.resolution) + 'x') + return ', '.join(srcset) diff --git a/cps/schedule.py b/cps/schedule.py index f349a231d..7ee434102 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -20,17 +20,17 @@ from __future__ import division, print_function, unicode_literals from .services.background_scheduler import BackgroundScheduler from .tasks.database import TaskReconnectDatabase -from .tasks.thumbnail import TaskCleanupCoverThumbnailCache, TaskGenerateCoverThumbnails +from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumbnails def register_jobs(): scheduler = BackgroundScheduler() # Generate 100 book cover thumbnails every 5 minutes - scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=100), trigger='interval', minutes=5) + scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=100), trigger='cron', minute='*/5') - # Cleanup book cover cache every day at 4am - scheduler.add_task(user=None, task=lambda: TaskCleanupCoverThumbnailCache(), trigger='cron', hour=4) + # Cleanup book cover cache every 6 hours + scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', minute='15', hour='*/6') # Reconnect metadata.db every 4 hours - scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='interval', hours=4) + scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', minute='5', hour='*/4') diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index b541bc707..e9df170e1 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -59,6 +59,10 @@ class TaskGenerateCoverThumbnails(CalibreTask): books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) count = len(books_without_thumbnails) + if count == 0: + # Do not display this task on the frontend if there are no covers to update + self.self_cleanup = True + for i, book in enumerate(books_without_thumbnails): for resolution in self.resolutions: expired_thumbnail = self.get_expired_thumbnail_for_book_and_resolution( @@ -71,6 +75,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): else: self.create_book_thumbnail(book, resolution) + self.message(u'Generating cover thumbnail {0} of {1}'.format(i, count)) self.progress = (1.0 / count) * i self._handleSuccess() @@ -181,12 +186,12 @@ class TaskGenerateCoverThumbnails(CalibreTask): @property def name(self): - return "GenerateCoverThumbnails" + return "ThumbnailsGenerate" -class TaskCleanupCoverThumbnailCache(CalibreTask): - def __init__(self, task_message=u'Cleaning up cover thumbnail cache'): - super(TaskCleanupCoverThumbnailCache, self).__init__(task_message) +class TaskSyncCoverThumbnailCache(CalibreTask): + def __init__(self, task_message=u'Syncing cover thumbnail cache'): + super(TaskSyncCoverThumbnailCache, self).__init__(task_message) self.log = logger.create() self.app_db_session = ub.get_new_session_instance() self.calibre_db = db.CalibreDB(expire_on_commit=False) @@ -199,14 +204,23 @@ class TaskCleanupCoverThumbnailCache(CalibreTask): # This case will happen if a user deletes the cache dir or cached files if self.app_db_session: self.expire_missing_thumbnails(cached_thumbnail_files) - self.progress = 0.33 + self.progress = 0.25 # Delete thumbnails in the database if the book has been removed # This case will happen if a book is removed in Calibre and the metadata.db file is updated in the filesystem if self.app_db_session and self.calibre_db: book_ids = self.get_book_ids() self.delete_thumbnails_for_missing_books(book_ids) - self.progress = 0.66 + self.progress = 0.50 + + # Expire thumbnails in the database if their corresponding book has been updated since they were generated + # This case will happen if the book was updated externally + if self.app_db_session and self.cache: + books = self.get_books_updated_in_the_last_day() + book_ids = list(map(lambda b: b.id, books)) + thumbnails = self.get_thumbnails_for_updated_books(book_ids) + self.expire_thumbnails_for_updated_book(books, thumbnails) + self.progress = 0.75 # Delete extraneous cached thumbnail files # This case will happen if a book was deleted and the thumbnail OR the metadata.db file was changed externally @@ -261,9 +275,40 @@ class TaskCleanupCoverThumbnailCache(CalibreTask): for file in extraneous_files: self.cache.delete_cache_file(file, fs.CACHE_TYPE_THUMBNAILS) + def get_books_updated_in_the_last_day(self): + return self.calibre_db.session\ + .query(db.Books)\ + .filter(db.Books.has_cover == 1)\ + .filter(db.Books.last_modified > datetime.utcnow() - timedelta(days=1, hours=1))\ + .all() + + def get_thumbnails_for_updated_books(self, book_ids): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.in_(book_ids))\ + .all() + + def expire_thumbnails_for_updated_book(self, books, thumbnails): + thumbnail_ids = list() + for book in books: + for thumbnail in thumbnails: + if thumbnail.book_id == book.id and thumbnail.generated_at < book.last_modified: + thumbnail_ids.append(thumbnail.id) + + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.id.in_(thumbnail_ids)) \ + .update({"expiration": datetime.utcnow()}, synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(u'Error expiring thumbnails for updated books: ' + str(ex)) + self._handleError(u'Error expiring thumbnails for updated books: ' + str(ex)) + self.app_db_session.rollback() + @property def name(self): - return "CleanupCoverThumbnailCache" + return "ThumbnailsSync" class TaskClearCoverThumbnailCache(CalibreTask): @@ -318,4 +363,4 @@ class TaskClearCoverThumbnailCache(CalibreTask): @property def name(self): - return "ClearCoverThumbnailCache" + return "ThumbnailsClear" diff --git a/cps/templates/author.html b/cps/templates/author.html index 3cf3fb4be..e5acdd2ff 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -36,7 +36,7 @@
diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html index 3f0ed1542..c52817976 100644 --- a/cps/templates/book_cover.html +++ b/cps/templates/book_cover.html @@ -1,8 +1,13 @@ -{% macro book_cover_image(book, book_title) -%} - {{ book_title }} +{% macro book_cover_image(book, thumbnails) -%} + {%- set book_title = book.title if book.title else book.name -%} + {% set srcset = thumbnails|get_book_thumbnail_srcset if thumbnails|length else '' %} + {%- if srcset|length -%} + {{ book_title }} + {%- else -%} + {{ book_title }} + {%- endif -%} {%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 369b8d052..c538d5ca3 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -4,7 +4,7 @@ {% if book %}
- {{ book_cover_image(book, book.title) }} + {{ book_cover_image(book, book.id|get_book_thumbnails(thumbnails)) }}
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index cdf6ab2b7..671186c75 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,7 +4,7 @@
- {{ book_cover_image(entry, entry.title) }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }}
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index 5d4666f6d..c5c12db20 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -9,7 +9,7 @@ diff --git a/cps/templates/grid.html b/cps/templates/grid.html index 67594b4e5..0f669d51b 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -29,7 +29,7 @@
diff --git a/cps/templates/index.html b/cps/templates/index.html index 531a535c1..2be15ba70 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -9,7 +9,7 @@
@@ -83,7 +83,7 @@
diff --git a/cps/templates/search.html b/cps/templates/search.html index 8e0cf6688..a5871afba 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -44,7 +44,7 @@ diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index bebc0b1f5..cb55c50cb 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -31,7 +31,7 @@
diff --git a/cps/web.py b/cps/web.py index 16c14fcf2..c400b96e5 100644 --- a/cps/web.py +++ b/cps/web.py @@ -49,9 +49,10 @@ from . import constants, logger, isoLanguages, services from . import babel, db, ub, config, get_locale, app from . import calibre_db, shelf from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download -from .helper import check_valid_domain, render_task_status, \ - get_cc_columns, get_book_cover, get_cached_book_cover, get_download_link, send_mail, generate_random_password, \ - send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password +from .helper import check_valid_domain, render_task_status, get_cc_columns, get_book_cover, get_cached_book_cover, \ + get_cached_book_cover_thumbnail, get_thumbnails_for_books, get_thumbnails_for_book_series, get_download_link, \ + send_mail, generate_random_password, send_registration_mail, check_send_to_kindle, check_read_formats, \ + tags_filters, reset_password from .pagination import Pagination from .redirect import redirect_back from .usermanagement import login_required_if_no_ano @@ -386,16 +387,18 @@ def render_books_list(data, sort, book_id, page): db.Books, db.Books.ratings.any(db.Ratings.rating > 9), order) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - id=book_id, title=_(u"Top Rated Books"), page="rated") + id=book_id, title=_(u"Top Rated Books"), page="rated", thumbnails=thumbnails) else: abort(404) elif data == "discover": if current_user.check_visibility(constants.SIDEBAR_RANDOM): entries, __, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, [func.randomblob(2)]) pagination = Pagination(1, config.config_books_per_page, config.config_books_per_page) + thumbnails = get_thumbnails_for_books(entries) return render_title_template('discover.html', entries=entries, pagination=pagination, id=book_id, - title=_(u"Discover (Random Books)"), page="discover") + title=_(u"Discover (Random Books)"), page="discover", thumbnails=thumbnails) else: abort(404) elif data == "unread": @@ -433,8 +436,9 @@ def render_books_list(data, sort, book_id, page): else: website = data or "newest" entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, order) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Books"), page=website) + title=_(u"Books"), page=website, thumbnails=thumbnails) def render_hot_books(page): @@ -458,8 +462,9 @@ def render_hot_books(page): ub.delete_download(book.Downloads.book_id) numBooks = entries.__len__() pagination = Pagination(page, config.config_books_per_page, numBooks) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Hot Books (Most Downloaded)"), page="hot") + title=_(u"Hot Books (Most Downloaded)"), page="hot", thumbnails=thumbnails) else: abort(404) @@ -490,12 +495,14 @@ def render_downloaded_books(page, order): .filter(db.Books.id == book.id).first(): ub.delete_download(book.id) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=_(u"Downloaded books by %(user)s",user=current_user.nickname), - page="download") + page="download", + thumbnails=thumbnails) else: abort(404) @@ -521,9 +528,10 @@ def render_author_books(page, author_id, order): author_info = services.goodreads_support.get_author_info(author_name) other_books = services.goodreads_support.get_other_books(author_info, entries) + thumbnails = get_thumbnails_for_books(entries) return render_title_template('author.html', entries=entries, pagination=pagination, id=author_id, title=_(u"Author: %(name)s", name=author_name), author=author_info, - other_books=other_books, page="author") + other_books=other_books, page="author", thumbnails=thumbnails) def render_publisher_books(page, book_id, order): @@ -535,8 +543,10 @@ def render_publisher_books(page, book_id, order): [db.Series.name, order[0], db.Books.series_index], db.books_series_link, db.Series) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher") + title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher", + thumbnails=thumbnails) else: abort(404) @@ -548,8 +558,10 @@ def render_series_books(page, book_id, order): db.Books, db.Books.series.any(db.Series.id == book_id), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Series: %(serie)s", serie=name.name), page="series") + title=_(u"Series: %(serie)s", serie=name.name), page="series", + thumbnails=thumbnails) else: abort(404) @@ -561,8 +573,10 @@ def render_ratings_books(page, book_id, order): db.Books.ratings.any(db.Ratings.id == book_id), [order[0]]) if name and name.rating <= 10: + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings") + title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings", + thumbnails=thumbnails) else: abort(404) @@ -574,8 +588,10 @@ def render_formats_books(page, book_id, order): db.Books, db.Books.data.any(db.Data.format == book_id.upper()), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"File format: %(format)s", format=name.format), page="formats") + title=_(u"File format: %(format)s", format=name.format), page="formats", + thumbnails=thumbnails) else: abort(404) @@ -588,8 +604,10 @@ def render_category_books(page, book_id, order): db.Books.tags.any(db.Tags.id == book_id), [order[0], db.Series.name, db.Books.series_index], db.books_series_link, db.Series) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Category: %(name)s", name=name.name), page="category") + title=_(u"Category: %(name)s", name=name.name), page="category", + thumbnails=thumbnails) else: abort(404) @@ -607,8 +625,9 @@ def render_language_books(page, name, order): db.Books, db.Books.languages.any(db.Languages.lang_code == name), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=name, - title=_(u"Language: %(name)s", name=lang_name), page="language") + title=_(u"Language: %(name)s", name=lang_name), page="language", thumbnails=thumbnails) def render_read_books(page, are_read, as_xml=False, order=None): @@ -652,8 +671,10 @@ def render_read_books(page, are_read, as_xml=False, order=None): else: name = _(u'Unread Books') + ' (' + str(pagination.total_count) + ')' pagename = "unread" + + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename) + title=name, page=pagename, thumbnails=thumbnails) def render_archived_books(page, order): @@ -676,8 +697,9 @@ def render_archived_books(page, order): name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename) + title=name, page=pagename, thumbnails=thumbnails) def render_prepare_search_form(cc): @@ -710,6 +732,7 @@ def render_prepare_search_form(cc): def render_search_results(term, offset=None, order=None, limit=None): entries, result_count, pagination = calibre_db.get_search_results(term, offset, order, limit) + thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', searchterm=term, pagination=pagination, @@ -718,7 +741,8 @@ def render_search_results(term, offset=None, order=None, limit=None): entries=entries, result_count=result_count, title=_(u"Search"), - page="search") + page="search", + thumbnails=thumbnails) # ################################### View Books list ################################################################## @@ -748,6 +772,7 @@ def books_table(): return render_title_template('book_table.html', title=_(u"Books List"), page="book_table", visiblility=visibility) + @web.route("/ajax/listbooks") @login_required def list_books(): @@ -780,6 +805,7 @@ def list_books(): response.headers["Content-Type"] = "application/json; charset=utf-8" return response + @web.route("/ajax/table_settings", methods=['POST']) @login_required def update_table_settings(): @@ -834,6 +860,7 @@ def publisher_list(): charlist = calibre_db.session.query(func.upper(func.substr(db.Publishers.name, 1, 1)).label('char')) \ .join(db.books_publishers_link).join(db.Books).filter(calibre_db.common_filters()) \ .group_by(func.upper(func.substr(db.Publishers.name, 1, 1))).all() + return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, title=_(u"Publishers"), page="publisherlist", data="publisher") else: @@ -865,8 +892,10 @@ def series_list(): .join(db.books_series_link).join(db.Books).filter(calibre_db.common_filters()) \ .group_by(func.upper(func.substr(db.Series.sort, 1, 1))).all() + thumbnails = get_thumbnails_for_book_series(entries) return render_title_template('grid.html', entries=entries, folder='web.books_list', charlist=charlist, - title=_(u"Series"), page="serieslist", data="series", bodyClass="grid-view") + title=_(u"Series"), page="serieslist", data="series", bodyClass="grid-view", + thumbnails=thumbnails) else: abort(404) @@ -1150,13 +1179,16 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): else: offset = 0 limit_all = result_count + + thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', adv_searchterm=searchterm, pagination=pagination, entries=q[offset:limit_all], result_count=result_count, - title=_(u"Advanced Search"), page="advsearch") - + title=_(u"Advanced Search"), + page="advsearch", + thumbnails=thumbnails) @web.route("/advsearch", methods=['GET']) @@ -1171,10 +1203,9 @@ def advanced_search_form(): @web.route("/cover/") -@web.route("/cover//") @login_required_if_no_ano -def get_cover(book_id, resolution=1): - return get_book_cover(book_id, resolution) +def get_cover(book_id): + return get_book_cover(book_id) @web.route("/cached-cover/") @@ -1183,6 +1214,12 @@ def get_cached_cover(cache_id): return get_cached_book_cover(cache_id) +@web.route("/cached-cover-thumbnail/") +@login_required_if_no_ano +def get_cached_cover_thumbnail(cache_id): + return get_cached_book_cover_thumbnail(cache_id) + + @web.route("/robots.txt") def get_robots(): return send_from_directory(constants.STATIC_DIR, "robots.txt") @@ -1591,6 +1628,7 @@ def show_book(book_id): if media_format.format.lower() in constants.EXTENSIONS_AUDIO: audioentries.append(media_format.format.lower()) + thumbnails = get_thumbnails_for_books([entries]) return render_title_template('detail.html', entry=entries, audioentries=audioentries, @@ -1602,7 +1640,8 @@ def show_book(book_id): is_archived=is_archived, kindle_list=kindle_list, reader_list=reader_list, - page="book") + page="book", + thumbnails=thumbnails) else: log.debug(u"Error opening eBook. File does not exist or file is not accessible") flash(_(u"Error opening eBook. File does not exist or file is not accessible"), category="error") From eef21759cd56c28560ee2007726fab18c8595df5 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Thu, 24 Dec 2020 03:00:26 -0600 Subject: [PATCH 007/412] Fix generate thumbnail task messages, don't load thumbnails when the cache file has been deleted --- cps/helper.py | 4 ++++ cps/tasks/thumbnail.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cps/helper.py b/cps/helper.py index c33a69e1e..add1b067c 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -536,9 +536,13 @@ def delete_book(book, calibrepath, book_format): def get_thumbnails_for_books(books): books_with_covers = list(filter(lambda b: b.has_cover, books)) book_ids = list(map(lambda b: b.id, books_with_covers)) + cache = fs.FileSystem() + thumbnail_files = cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) + return ub.session\ .query(ub.Thumbnail)\ .filter(ub.Thumbnail.book_id.in_(book_ids))\ + .filter(ub.Thumbnail.filename.in_(thumbnail_files))\ .filter(ub.Thumbnail.expiration > datetime.utcnow())\ .all() diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index e9df170e1..70ddc06bd 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -75,7 +75,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): else: self.create_book_thumbnail(book, resolution) - self.message(u'Generating cover thumbnail {0} of {1}'.format(i, count)) + self.message = u'Generating cover thumbnail {0} of {1}'.format(i + 1, count) self.progress = (1.0 / count) * i self._handleSuccess() From 8cc06683df25684793d1d6154a74a3b11408d980 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Mon, 4 Jan 2021 12:28:05 -0600 Subject: [PATCH 008/412] only python3 supported now --- cps/tasks/database.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cps/tasks/database.py b/cps/tasks/database.py index 11f0186d4..62208c0c1 100644 --- a/cps/tasks/database.py +++ b/cps/tasks/database.py @@ -20,11 +20,7 @@ from __future__ import division, print_function, unicode_literals from cps import config, logger from cps.services.worker import CalibreTask - -try: - from urllib.request import urlopen -except ImportError as e: - from urllib2 import urlopen +from urllib.request import urlopen class TaskReconnectDatabase(CalibreTask): From 2c8d055ca4e9b92842615516834bb2472348b15e Mon Sep 17 00:00:00 2001 From: mmonkey Date: Mon, 4 Jan 2021 12:36:40 -0600 Subject: [PATCH 009/412] support python2.7 for the mean time --- cps/tasks/database.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cps/tasks/database.py b/cps/tasks/database.py index 62208c0c1..11f0186d4 100644 --- a/cps/tasks/database.py +++ b/cps/tasks/database.py @@ -20,7 +20,11 @@ from __future__ import division, print_function, unicode_literals from cps import config, logger from cps.services.worker import CalibreTask -from urllib.request import urlopen + +try: + from urllib.request import urlopen +except ImportError as e: + from urllib2 import urlopen class TaskReconnectDatabase(CalibreTask): From dd30ac4fbdc9699dc4462b1a9a7efeddb53ffe3a Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 20 Mar 2021 11:32:50 +0100 Subject: [PATCH 010/412] Added thumbnails Merge remote-tracking branch 'cover/thumbnails' into development # Conflicts: # cps/admin.py # cps/templates/layout.html # cps/ub.py # cps/web.py Update join for sqlalchemy 1.4 --- .gitignore | 1 + cps.py | 5 + cps/__init__.py | 3 +- cps/admin.py | 19 +- cps/constants.py | 1 + cps/db.py | 13 +- cps/editbooks.py | 2 + cps/fs.py | 61 +++++ cps/helper.py | 89 ++++++- cps/jinjia.py | 22 ++ cps/schedule.py | 36 +++ cps/services/background_scheduler.py | 52 ++++ cps/services/worker.py | 17 +- cps/shelf.py | 2 +- cps/static/css/caliBlur.css | 82 ++++-- cps/static/js/main.js | 12 + cps/tasks/database.py | 49 ++++ cps/tasks/thumbnail.py | 366 +++++++++++++++++++++++++++ cps/templates/admin.html | 36 ++- cps/templates/author.html | 2 +- cps/templates/book_cover.html | 13 + cps/templates/book_edit.html | 3 +- cps/templates/detail.html | 2 +- cps/templates/discover.html | 3 +- cps/templates/fragment.html | 1 + cps/templates/grid.html | 3 +- cps/templates/index.html | 5 +- cps/templates/layout.html | 1 + cps/templates/search.html | 3 +- cps/templates/shelf.html | 3 +- cps/ub.py | 34 +++ cps/web.py | 96 +++++-- requirements.txt | 1 + 33 files changed, 965 insertions(+), 73 deletions(-) create mode 100644 cps/fs.py create mode 100644 cps/schedule.py create mode 100644 cps/services/background_scheduler.py create mode 100644 cps/tasks/database.py create mode 100644 cps/tasks/thumbnail.py create mode 100644 cps/templates/book_cover.html diff --git a/.gitignore b/.gitignore index 109de4efe..903cfd363 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ vendor/ # calibre-web *.db *.log +cps/cache .idea/ *.bak diff --git a/cps.py b/cps.py index 737b0d97d..19ca89b88 100755 --- a/cps.py +++ b/cps.py @@ -43,6 +43,7 @@ from cps.gdrive import gdrive from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.error_handler import init_errorhandler +from cps.schedule import register_jobs try: from cps.kobo import kobo, get_kobo_activated @@ -78,6 +79,10 @@ def main(): app.register_blueprint(kobo_auth) if oauth_available: app.register_blueprint(oauth) + + # Register scheduled jobs + register_jobs() + success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/__init__.py b/cps/__init__.py index 627cca0b1..30029428a 100644 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -96,7 +96,7 @@ def create_app(): app.instance_path = app.instance_path.decode('utf-8') if os.environ.get('FLASK_DEBUG'): - cache_buster.init_cache_busting(app) + cache_buster.init_cache_busting(app) log.info('Starting Calibre Web...') if sys.version_info < (3, 0): @@ -121,6 +121,7 @@ def create_app(): return app + @babel.localeselector def get_locale(): # if a user is logged in, use the locale from the user settings diff --git a/cps/admin.py b/cps/admin.py index 78cfebf13..cd548bfbd 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -40,7 +40,7 @@ from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_ -from . import constants, logger, helper, services, isoLanguages +from . import constants, logger, helper, services, isoLanguages, fs from .cli import filepicker from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash @@ -164,6 +164,23 @@ def shutdown(): return json.dumps(showtext), 400 +@admi.route("/clear-cache") +@login_required +@admin_required +def clear_cache(): + cache_type = request.args.get('cache_type'.strip()) + showtext = {} + + if cache_type == fs.CACHE_TYPE_THUMBNAILS: + log.info('clearing cover thumbnail cache') + showtext['text'] = _(u'Cleared cover thumbnail cache') + helper.clear_cover_thumbnail_cache() + return json.dumps(showtext) + + showtext['text'] = _(u'Unknown command') + return json.dumps(showtext) + + @admi.route("/admin/view") @login_required @admin_required diff --git a/cps/constants.py b/cps/constants.py index e9c26cb16..0eb947097 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -37,6 +37,7 @@ else: STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static') TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates') TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations') +CACHE_DIR = os.path.join(BASE_DIR, 'cps', 'cache') if HOME_CONFIG: home_dir = os.path.join(os.path.expanduser("~"),".calibre-web") diff --git a/cps/db.py b/cps/db.py index ac59ac2b1..f43cc8114 100644 --- a/cps/db.py +++ b/cps/db.py @@ -620,15 +620,18 @@ class CalibreDB(): randm = self.session.query(Books) \ .filter(self.common_filters(allow_show_archived)) \ .order_by(func.random()) \ - .limit(self.config.config_random_books) + .limit(self.config.config_random_books) \ + .all() else: randm = false() off = int(int(pagesize) * (page - 1)) - query = self.session.query(database) \ - .filter(db_filter) \ + query = self.session.query(database) + if len(join) == 3: + query = query.join(join[0], join[1]).join(join[2], isouter=True) + elif len(join) == 2: + query = query.join(join[0], join[1], isouter=True) + query = query.filter(db_filter)\ .filter(self.common_filters(allow_show_archived)) - if len(join): - query = query.join(*join, isouter=True) entries = list() pagination = list() try: diff --git a/cps/editbooks.py b/cps/editbooks.py index 28cad5c5a..b7f496d0b 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -614,6 +614,7 @@ def upload_cover(request, book): abort(403) ret, message = helper.save_cover(requested_file, book.path) if ret is True: + helper.clear_cover_thumbnail_cache(book.id) return True else: flash(message, category="error") @@ -710,6 +711,7 @@ def edit_book(book_id): if result is True: book.has_cover = 1 modif_date = True + helper.clear_cover_thumbnail_cache(book.id) else: flash(error, category="error") diff --git a/cps/fs.py b/cps/fs.py new file mode 100644 index 000000000..699d59912 --- /dev/null +++ b/cps/fs.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +from .constants import CACHE_DIR +from os import listdir, makedirs, remove +from os.path import isdir, isfile, join +from shutil import rmtree + +CACHE_TYPE_THUMBNAILS = 'thumbnails' + + +class FileSystem: + _instance = None + _cache_dir = CACHE_DIR + + def __new__(cls): + if cls._instance is None: + cls._instance = super(FileSystem, cls).__new__(cls) + return cls._instance + + def get_cache_dir(self, cache_type=None): + if not isdir(self._cache_dir): + makedirs(self._cache_dir) + + if cache_type and not isdir(join(self._cache_dir, cache_type)): + makedirs(join(self._cache_dir, cache_type)) + + return join(self._cache_dir, cache_type) if cache_type else self._cache_dir + + def get_cache_file_path(self, filename, cache_type=None): + return join(self.get_cache_dir(cache_type), filename) if filename else None + + def list_cache_files(self, cache_type=None): + path = self.get_cache_dir(cache_type) + return [file for file in listdir(path) if isfile(join(path, file))] + + def delete_cache_dir(self, cache_type=None): + if not cache_type and isdir(self._cache_dir): + rmtree(self._cache_dir) + if cache_type and isdir(join(self._cache_dir, cache_type)): + rmtree(join(self._cache_dir, cache_type)) + + def delete_cache_file(self, filename, cache_type=None): + if isfile(join(self.get_cache_dir(cache_type), filename)): + remove(join(self.get_cache_dir(cache_type), filename)) diff --git a/cps/helper.py b/cps/helper.py index e18ae33b0..e3c79dea8 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -52,12 +52,13 @@ except ImportError: from . import calibre_db from .tasks.convert import TaskConvert -from . import logger, config, get_locale, db, ub +from . import logger, config, get_locale, db, fs, ub from . import gdriveutils as gd from .constants import STATIC_DIR as _STATIC_DIR from .subproc_wrapper import process_wait from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS from .tasks.mail import TaskEmail +from .tasks.thumbnail import TaskClearCoverThumbnailCache log = logger.create() @@ -514,12 +515,32 @@ def update_dir_stucture(book_id, calibrepath, first_author=None, orignal_filepat def delete_book(book, calibrepath, book_format): + clear_cover_thumbnail_cache(book.id) if config.config_use_google_drive: return delete_book_gdrive(book, book_format) else: return delete_book_file(book, calibrepath, book_format) +def get_thumbnails_for_books(books): + books_with_covers = list(filter(lambda b: b.has_cover, books)) + book_ids = list(map(lambda b: b.id, books_with_covers)) + cache = fs.FileSystem() + thumbnail_files = cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) + + return ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.in_(book_ids))\ + .filter(ub.Thumbnail.filename.in_(thumbnail_files))\ + .filter(ub.Thumbnail.expiration > datetime.utcnow())\ + .all() + + +def get_thumbnails_for_book_series(series): + books = list(map(lambda s: s[0], series)) + return get_thumbnails_for_books(books) + + def get_cover_on_failure(use_generic_cover): if use_generic_cover: return send_from_directory(_STATIC_DIR, "generic_cover.jpg") @@ -532,14 +553,54 @@ def get_book_cover(book_id): return get_book_cover_internal(book, use_generic_cover_on_failure=True) -def get_book_cover_with_uuid(book_uuid, - use_generic_cover_on_failure=True): +def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): book = calibre_db.get_book_by_uuid(book_uuid) return get_book_cover_internal(book, use_generic_cover_on_failure) -def get_book_cover_internal(book, use_generic_cover_on_failure): +def get_cached_book_cover(cache_id): + parts = cache_id.split('_') + book_uuid = parts[0] if len(parts) else None + resolution = parts[2] if len(parts) > 2 else None + book = calibre_db.get_book_by_uuid(book_uuid) if book_uuid else None + return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) + + +def get_cached_book_cover_thumbnail(cache_id): + parts = cache_id.split('_') + thumbnail_uuid = parts[0] if len(parts) else None + thumbnail = None + if thumbnail_uuid: + thumbnail = ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.uuid == thumbnail_uuid)\ + .first() + + if thumbnail and thumbnail.expiration > datetime.utcnow(): + cache = fs.FileSystem() + if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) + + elif thumbnail: + book = calibre_db.get_book(thumbnail.book_id) + return get_book_cover_internal(book, use_generic_cover_on_failure=True) + + else: + return get_cover_on_failure(True) + + +def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None): if book and book.has_cover: + + # Send the book cover thumbnail if it exists in cache + if resolution: + thumbnail = get_book_cover_thumbnail(book, resolution) + if thumbnail: + cache = fs.FileSystem() + if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) + + # Send the book cover from Google Drive if configured if config.config_use_google_drive: try: if not gd.is_gdrive_ready(): @@ -550,9 +611,11 @@ def get_book_cover_internal(book, use_generic_cover_on_failure): else: log.error('%s/cover.jpg not found on Google Drive', book.path) return get_cover_on_failure(use_generic_cover_on_failure) - except Exception as e: - log.debug_or_exception(e) + except Exception as ex: + log.debug_or_exception(ex) return get_cover_on_failure(use_generic_cover_on_failure) + + # Send the book cover from the Calibre directory else: cover_file_path = os.path.join(config.config_calibre_dir, book.path) if os.path.isfile(os.path.join(cover_file_path, "cover.jpg")): @@ -563,6 +626,16 @@ def get_book_cover_internal(book, use_generic_cover_on_failure): return get_cover_on_failure(use_generic_cover_on_failure) +def get_book_cover_thumbnail(book, resolution): + if book and book.has_cover: + return ub.session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id == book.id)\ + .filter(ub.Thumbnail.resolution == resolution)\ + .filter(ub.Thumbnail.expiration > datetime.utcnow())\ + .first() + + # saves book cover from url def save_cover_from_url(url, book_path): try: @@ -820,3 +893,7 @@ def get_download_link(book_id, book_format, client): return do_download_file(book, book_format, client, data1, headers) else: abort(404) + + +def clear_cover_thumbnail_cache(book_id=None): + WorkerThread.add(None, TaskClearCoverThumbnailCache(book_id)) diff --git a/cps/jinjia.py b/cps/jinjia.py index 688d1fbad..b2479adca 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -128,8 +128,30 @@ def formatseriesindex_filter(series_index): return series_index return 0 + @jinjia.app_template_filter('uuidfilter') def uuidfilter(var): return uuid4() +@jinjia.app_template_filter('book_cover_cache_id') +def book_cover_cache_id(book, resolution=None): + timestamp = int(book.last_modified.timestamp() * 1000) + cache_bust = str(book.uuid) + '_' + str(timestamp) + return cache_bust if not resolution else cache_bust + '_' + str(resolution) + + +@jinjia.app_template_filter('get_book_thumbnails') +def get_book_thumbnails(book_id, thumbnails=None): + return list(filter(lambda t: t.book_id == book_id, thumbnails)) if book_id > -1 and thumbnails else list() + + +@jinjia.app_template_filter('get_book_thumbnail_srcset') +def get_book_thumbnail_srcset(thumbnails): + srcset = list() + for thumbnail in thumbnails: + timestamp = int(thumbnail.generated_at.timestamp() * 1000) + cache_id = str(thumbnail.uuid) + '_' + str(timestamp) + url = url_for('web.get_cached_cover_thumbnail', cache_id=cache_id) + srcset.append(url + ' ' + str(thumbnail.resolution) + 'x') + return ', '.join(srcset) diff --git a/cps/schedule.py b/cps/schedule.py new file mode 100644 index 000000000..7ee434102 --- /dev/null +++ b/cps/schedule.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals + +from .services.background_scheduler import BackgroundScheduler +from .tasks.database import TaskReconnectDatabase +from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumbnails + + +def register_jobs(): + scheduler = BackgroundScheduler() + + # Generate 100 book cover thumbnails every 5 minutes + scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=100), trigger='cron', minute='*/5') + + # Cleanup book cover cache every 6 hours + scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', minute='15', hour='*/6') + + # Reconnect metadata.db every 4 hours + scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', minute='5', hour='*/4') diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py new file mode 100644 index 000000000..efa573799 --- /dev/null +++ b/cps/services/background_scheduler.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +import atexit + +from .. import logger +from .worker import WorkerThread +from apscheduler.schedulers.background import BackgroundScheduler as BScheduler + + +class BackgroundScheduler: + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(BackgroundScheduler, cls).__new__(cls) + + scheduler = BScheduler() + atexit.register(lambda: scheduler.shutdown()) + + cls.log = logger.create() + cls.scheduler = scheduler + cls.scheduler.start() + + return cls._instance + + def add(self, func, trigger, **trigger_args): + self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) + + def add_task(self, user, task, trigger, **trigger_args): + def scheduled_task(): + worker_task = task() + self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) + WorkerThread.add(user, worker_task) + + self.add(func=scheduled_task, trigger=trigger, **trigger_args) diff --git a/cps/services/worker.py b/cps/services/worker.py index 072674a04..2b6816db5 100644 --- a/cps/services/worker.py +++ b/cps/services/worker.py @@ -35,7 +35,6 @@ def _get_main_thread(): raise Exception("main thread not found?!") - class ImprovedQueue(queue.Queue): def to_list(self): """ @@ -45,7 +44,8 @@ class ImprovedQueue(queue.Queue): with self.mutex: return list(self.queue) -#Class for all worker tasks in the background + +# Class for all worker tasks in the background class WorkerThread(threading.Thread): _instance = None @@ -127,6 +127,10 @@ class WorkerThread(threading.Thread): # CalibreTask.start() should wrap all exceptions in it's own error handling item.task.start(self) + # remove self_cleanup tasks from list + if item.task.self_cleanup: + self.dequeued.remove(item) + self.queue.task_done() @@ -141,6 +145,7 @@ class CalibreTask: self.end_time = None self.message = message self.id = uuid.uuid4() + self.self_cleanup = False @abc.abstractmethod def run(self, worker_thread): @@ -209,6 +214,14 @@ class CalibreTask: # todo: throw error if outside of [0,1] self._progress = x + @property + def self_cleanup(self): + return self._self_cleanup + + @self_cleanup.setter + def self_cleanup(self, is_self_cleanup): + self._self_cleanup = is_self_cleanup + def _handleError(self, error_message): self.stat = STAT_FAIL self.progress = 1 diff --git a/cps/shelf.py b/cps/shelf.py index 5c6037ac7..7b00c32b1 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -403,7 +403,7 @@ def render_show_shelf(shelf_type, shelf_id, page_no, sort_param): db.Books, ub.BookShelf.shelf == shelf_id, [ub.BookShelf.order.asc()], - ub.BookShelf,ub.BookShelf.book_id == db.Books.id) + ub.BookShelf, ub.BookShelf.book_id == db.Books.id) # delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web wrong_entries = calibre_db.session.query(ub.BookShelf)\ .join(db.Books, ub.BookShelf.book_id == db.Books.id, isouter=True)\ diff --git a/cps/static/css/caliBlur.css b/cps/static/css/caliBlur.css index 14e5c286f..aa747c0ba 100644 --- a/cps/static/css/caliBlur.css +++ b/cps/static/css/caliBlur.css @@ -5148,7 +5148,7 @@ body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-head pointer-events: none } -#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #deleteButton, #deleteModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { +#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #ClearCacheDialog:hover:before, #deleteButton, #deleteModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { cursor: pointer } @@ -5235,7 +5235,7 @@ body.admin > div.container-fluid > div > div.col-sm-10 > div.container-fluid > d margin-bottom: 20px } -body.admin:not(.modal-open) .btn-default { +body.admin .btn-default { margin-bottom: 10px } @@ -5466,7 +5466,7 @@ body.admin.modal-open .navbar { z-index: 0 !important } -#RestartDialog, #ShutdownDialog, #StatusDialog, #deleteModal { +#RestartDialog, #ShutdownDialog, #StatusDialog, #ClearCacheDialog, #deleteModal { top: 0; overflow: hidden; padding-top: 70px; @@ -5476,7 +5476,7 @@ body.admin.modal-open .navbar { background: rgba(0, 0, 0, .5) } -#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #deleteModal:before { +#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #ClearCacheDialog:before, #deleteModal:before { content: "\E208"; padding-right: 10px; display: block; @@ -5498,18 +5498,18 @@ body.admin.modal-open .navbar { z-index: 99 } -#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before { +#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0) } -#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog { +#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { width: 450px; margin: auto } -#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { +#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { max-height: calc(100% - 90px); -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); @@ -5520,7 +5520,7 @@ body.admin.modal-open .navbar { width: 450px } -#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header { +#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header { padding: 15px 20px; border-radius: 3px 3px 0 0; line-height: 1.71428571; @@ -5533,7 +5533,7 @@ body.admin.modal-open .navbar { text-align: left } -#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before { +#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before { padding-right: 10px; font-size: 18px; color: #999; @@ -5557,6 +5557,11 @@ body.admin.modal-open .navbar { font-family: plex-icons-new, serif } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before { + content: "\EA15"; + font-family: plex-icons-new, serif +} + #deleteModal > .modal-dialog > .modal-content > .modal-header:before { content: "\EA6D"; font-family: plex-icons-new, serif @@ -5580,6 +5585,12 @@ body.admin.modal-open .navbar { font-size: 20px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:after { + content: "Clear Cover Thumbnail Cache"; + display: inline-block; + font-size: 20px +} + #deleteModal > .modal-dialog > .modal-content > .modal-header:after { content: "Delete Book"; display: inline-block; @@ -5610,7 +5621,17 @@ body.admin.modal-open .navbar { text-align: left } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p { +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body { + padding: 20px 20px 10px; + font-size: 16px; + line-height: 1.6em; + font-family: Open Sans Regular, Helvetica Neue, Helvetica, Arial, sans-serif; + color: #eee; + background: #282828; + text-align: left +} + +#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p { padding: 20px 20px 0 0; font-size: 16px; line-height: 1.6em; @@ -5619,7 +5640,7 @@ body.admin.modal-open .navbar { background: #282828 } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { float: right; z-index: 9; position: relative; @@ -5655,6 +5676,18 @@ body.admin.modal-open .navbar { border-radius: 3px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > #clear_cache { + float: right; + z-index: 9; + position: relative; + margin: 25px 0 0 10px; + min-width: 80px; + padding: 10px 18px; + font-size: 16px; + line-height: 1.33; + border-radius: 3px +} + #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-danger { float: right; z-index: 9; @@ -5675,11 +5708,15 @@ body.admin.modal-open .navbar { margin: 55px 0 0 10px } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache) { + margin: 25px 0 0 10px +} + #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { margin: 0 0 0 10px } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { background-color: hsla(0, 0%, 100%, .3) } @@ -5713,6 +5750,21 @@ body.admin.modal-open .navbar { box-shadow: 0 5px 15px rgba(0, 0, 0, .5) } +#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body:after { + content: ''; + position: absolute; + width: 100%; + height: 72px; + background-color: #323232; + border-radius: 0 0 3px 3px; + left: 0; + margin-top: 10px; + z-index: 0; + border-top: 1px solid #222; + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5) +} + #deleteButton { position: fixed; top: 60px; @@ -7299,11 +7351,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. background-color: transparent !important } - #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog { + #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { max-width: calc(100vw - 40px) } - #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { + #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { max-width: calc(100vw - 40px); left: 0 } @@ -7453,7 +7505,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. padding: 30px 15px } - #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before { + #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { left: auto; right: 34px } diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 834b9b30a..51d6095d4 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -430,6 +430,18 @@ $(function() { } }); }); + $("#clear_cache").click(function () { + $("#spinner3").show(); + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../clear-cache", + data: {"cache_type":"thumbnails"}, + success: function(data) { + $("#spinner3").hide(); + $("#ClearCacheDialog").modal("hide"); + } + }); + }); // Init all data control handlers to default $("input[data-control]").trigger("change"); diff --git a/cps/tasks/database.py b/cps/tasks/database.py new file mode 100644 index 000000000..11f0186d4 --- /dev/null +++ b/cps/tasks/database.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals + +from cps import config, logger +from cps.services.worker import CalibreTask + +try: + from urllib.request import urlopen +except ImportError as e: + from urllib2 import urlopen + + +class TaskReconnectDatabase(CalibreTask): + def __init__(self, task_message=u'Reconnecting Calibre database'): + super(TaskReconnectDatabase, self).__init__(task_message) + self.log = logger.create() + self.listen_address = config.get_config_ipaddress() + self.listen_port = config.config_port + + def run(self, worker_thread): + address = self.listen_address if self.listen_address else 'localhost' + port = self.listen_port if self.listen_port else 8083 + + try: + urlopen('http://' + address + ':' + str(port) + '/reconnect') + self._handleSuccess() + except Exception as ex: + self._handleError(u'Unable to reconnect Calibre database: ' + str(ex)) + + @property + def name(self): + return "Reconnect Database" diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py new file mode 100644 index 000000000..70ddc06bd --- /dev/null +++ b/cps/tasks/thumbnail.py @@ -0,0 +1,366 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2020 mmonkey +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import division, print_function, unicode_literals +import os + +from cps import config, db, fs, gdriveutils, logger, ub +from cps.services.worker import CalibreTask +from datetime import datetime, timedelta +from sqlalchemy import func + +try: + from urllib.request import urlopen +except ImportError as e: + from urllib2 import urlopen + +try: + from wand.image import Image + use_IM = True +except (ImportError, RuntimeError) as e: + use_IM = False + +THUMBNAIL_RESOLUTION_1X = 1 +THUMBNAIL_RESOLUTION_2X = 2 + + +class TaskGenerateCoverThumbnails(CalibreTask): + def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): + super(TaskGenerateCoverThumbnails, self).__init__(task_message) + self.limit = limit + self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() + self.calibre_db = db.CalibreDB(expire_on_commit=False) + self.cache = fs.FileSystem() + self.resolutions = [ + THUMBNAIL_RESOLUTION_1X, + THUMBNAIL_RESOLUTION_2X + ] + + def run(self, worker_thread): + if self.calibre_db.session and use_IM: + expired_thumbnails = self.get_expired_thumbnails() + thumbnail_book_ids = self.get_thumbnail_book_ids() + books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) + + count = len(books_without_thumbnails) + if count == 0: + # Do not display this task on the frontend if there are no covers to update + self.self_cleanup = True + + for i, book in enumerate(books_without_thumbnails): + for resolution in self.resolutions: + expired_thumbnail = self.get_expired_thumbnail_for_book_and_resolution( + book, + resolution, + expired_thumbnails + ) + if expired_thumbnail: + self.update_book_thumbnail(book, expired_thumbnail) + else: + self.create_book_thumbnail(book, resolution) + + self.message = u'Generating cover thumbnail {0} of {1}'.format(i + 1, count) + self.progress = (1.0 / count) * i + + self._handleSuccess() + self.app_db_session.remove() + + def get_expired_thumbnails(self): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.expiration < datetime.utcnow())\ + .all() + + def get_thumbnail_book_ids(self): + return self.app_db_session\ + .query(ub.Thumbnail.book_id)\ + .group_by(ub.Thumbnail.book_id)\ + .having(func.min(ub.Thumbnail.expiration) > datetime.utcnow())\ + .distinct() + + def get_books_without_thumbnails(self, thumbnail_book_ids): + return self.calibre_db.session\ + .query(db.Books)\ + .filter(db.Books.has_cover == 1)\ + .filter(db.Books.id.notin_(thumbnail_book_ids))\ + .limit(self.limit)\ + .all() + + def get_expired_thumbnail_for_book_and_resolution(self, book, resolution, expired_thumbnails): + for thumbnail in expired_thumbnails: + if thumbnail.book_id == book.id and thumbnail.resolution == resolution: + return thumbnail + + return None + + def update_book_thumbnail(self, book, thumbnail): + thumbnail.generated_at = datetime.utcnow() + thumbnail.expiration = datetime.utcnow() + timedelta(days=30) + + try: + self.app_db_session.commit() + self.generate_book_thumbnail(book, thumbnail) + except Exception as ex: + self.log.info(u'Error updating book thumbnail: ' + str(ex)) + self._handleError(u'Error updating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def create_book_thumbnail(self, book, resolution): + thumbnail = ub.Thumbnail() + thumbnail.book_id = book.id + thumbnail.format = 'jpeg' + thumbnail.resolution = resolution + + self.app_db_session.add(thumbnail) + try: + self.app_db_session.commit() + self.generate_book_thumbnail(book, thumbnail) + except Exception as ex: + self.log.info(u'Error creating book thumbnail: ' + str(ex)) + self._handleError(u'Error creating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def generate_book_thumbnail(self, book, thumbnail): + if book and thumbnail: + if config.config_use_google_drive: + if not gdriveutils.is_gdrive_ready(): + raise Exception('Google Drive is configured but not ready') + + web_content_link = gdriveutils.get_cover_via_gdrive(book.path) + if not web_content_link: + raise Exception('Google Drive cover url not found') + + stream = None + try: + stream = urlopen(web_content_link) + with Image(file=stream) as img: + height = self.get_thumbnail_height(thumbnail) + if img.height > height: + width = self.get_thumbnail_width(height, img) + img.resize(width=width, height=height, filter='lanczos') + img.format = thumbnail.format + filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + img.save(filename=filename) + except Exception as ex: + # Bubble exception to calling function + self.log.info(u'Error generating thumbnail file: ' + str(ex)) + raise ex + finally: + stream.close() + else: + book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') + if not os.path.isfile(book_cover_filepath): + raise Exception('Book cover file not found') + + with Image(filename=book_cover_filepath) as img: + height = self.get_thumbnail_height(thumbnail) + if img.height > height: + width = self.get_thumbnail_width(height, img) + img.resize(width=width, height=height, filter='lanczos') + img.format = thumbnail.format + filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + img.save(filename=filename) + + def get_thumbnail_height(self, thumbnail): + return int(225 * thumbnail.resolution) + + def get_thumbnail_width(self, height, img): + percent = (height / float(img.height)) + return int((float(img.width) * float(percent))) + + @property + def name(self): + return "ThumbnailsGenerate" + + +class TaskSyncCoverThumbnailCache(CalibreTask): + def __init__(self, task_message=u'Syncing cover thumbnail cache'): + super(TaskSyncCoverThumbnailCache, self).__init__(task_message) + self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() + self.calibre_db = db.CalibreDB(expire_on_commit=False) + self.cache = fs.FileSystem() + + def run(self, worker_thread): + cached_thumbnail_files = self.cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) + + # Expire thumbnails in the database if the cached file is missing + # This case will happen if a user deletes the cache dir or cached files + if self.app_db_session: + self.expire_missing_thumbnails(cached_thumbnail_files) + self.progress = 0.25 + + # Delete thumbnails in the database if the book has been removed + # This case will happen if a book is removed in Calibre and the metadata.db file is updated in the filesystem + if self.app_db_session and self.calibre_db: + book_ids = self.get_book_ids() + self.delete_thumbnails_for_missing_books(book_ids) + self.progress = 0.50 + + # Expire thumbnails in the database if their corresponding book has been updated since they were generated + # This case will happen if the book was updated externally + if self.app_db_session and self.cache: + books = self.get_books_updated_in_the_last_day() + book_ids = list(map(lambda b: b.id, books)) + thumbnails = self.get_thumbnails_for_updated_books(book_ids) + self.expire_thumbnails_for_updated_book(books, thumbnails) + self.progress = 0.75 + + # Delete extraneous cached thumbnail files + # This case will happen if a book was deleted and the thumbnail OR the metadata.db file was changed externally + if self.app_db_session: + db_thumbnail_files = self.get_thumbnail_filenames() + self.delete_extraneous_thumbnail_files(cached_thumbnail_files, db_thumbnail_files) + + self._handleSuccess() + self.app_db_session.remove() + + def expire_missing_thumbnails(self, filenames): + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.filename.notin_(filenames))\ + .update({"expiration": datetime.utcnow()}, synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(u'Error expiring thumbnails for missing cache files: ' + str(ex)) + self._handleError(u'Error expiring thumbnails for missing cache files: ' + str(ex)) + self.app_db_session.rollback() + + def get_book_ids(self): + results = self.calibre_db.session\ + .query(db.Books.id)\ + .filter(db.Books.has_cover == 1)\ + .distinct() + + return [value for value, in results] + + def delete_thumbnails_for_missing_books(self, book_ids): + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.notin_(book_ids))\ + .delete(synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(str(ex)) + self._handleError(u'Error deleting thumbnails for missing books: ' + str(ex)) + self.app_db_session.rollback() + + def get_thumbnail_filenames(self): + results = self.app_db_session\ + .query(ub.Thumbnail.filename)\ + .all() + + return [thumbnail for thumbnail, in results] + + def delete_extraneous_thumbnail_files(self, cached_thumbnail_files, db_thumbnail_files): + extraneous_files = list(set(cached_thumbnail_files).difference(db_thumbnail_files)) + for file in extraneous_files: + self.cache.delete_cache_file(file, fs.CACHE_TYPE_THUMBNAILS) + + def get_books_updated_in_the_last_day(self): + return self.calibre_db.session\ + .query(db.Books)\ + .filter(db.Books.has_cover == 1)\ + .filter(db.Books.last_modified > datetime.utcnow() - timedelta(days=1, hours=1))\ + .all() + + def get_thumbnails_for_updated_books(self, book_ids): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id.in_(book_ids))\ + .all() + + def expire_thumbnails_for_updated_book(self, books, thumbnails): + thumbnail_ids = list() + for book in books: + for thumbnail in thumbnails: + if thumbnail.book_id == book.id and thumbnail.generated_at < book.last_modified: + thumbnail_ids.append(thumbnail.id) + + try: + self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.id.in_(thumbnail_ids)) \ + .update({"expiration": datetime.utcnow()}, synchronize_session=False) + self.app_db_session.commit() + except Exception as ex: + self.log.info(u'Error expiring thumbnails for updated books: ' + str(ex)) + self._handleError(u'Error expiring thumbnails for updated books: ' + str(ex)) + self.app_db_session.rollback() + + @property + def name(self): + return "ThumbnailsSync" + + +class TaskClearCoverThumbnailCache(CalibreTask): + def __init__(self, book_id=None, task_message=u'Clearing cover thumbnail cache'): + super(TaskClearCoverThumbnailCache, self).__init__(task_message) + self.log = logger.create() + self.book_id = book_id + self.app_db_session = ub.get_new_session_instance() + self.cache = fs.FileSystem() + + def run(self, worker_thread): + if self.app_db_session: + if self.book_id: + thumbnails = self.get_thumbnails_for_book(self.book_id) + for thumbnail in thumbnails: + self.expire_and_delete_thumbnail(thumbnail) + else: + self.expire_and_delete_all_thumbnails() + + self._handleSuccess() + self.app_db_session.remove() + + def get_thumbnails_for_book(self, book_id): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id == book_id)\ + .all() + + def expire_and_delete_thumbnail(self, thumbnail): + thumbnail.expiration = datetime.utcnow() + + try: + self.app_db_session.commit() + self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + except Exception as ex: + self.log.info(u'Error expiring book thumbnail: ' + str(ex)) + self._handleError(u'Error expiring book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def expire_and_delete_all_thumbnails(self): + self.app_db_session\ + .query(ub.Thumbnail)\ + .update({'expiration': datetime.utcnow()}) + + try: + self.app_db_session.commit() + self.cache.delete_cache_dir(fs.CACHE_TYPE_THUMBNAILS) + except Exception as ex: + self.log.info(u'Error expiring book thumbnails: ' + str(ex)) + self._handleError(u'Error expiring book thumbnails: ' + str(ex)) + self.app_db_session.rollback() + + @property + def name(self): + return "ThumbnailsClear" diff --git a/cps/templates/admin.html b/cps/templates/admin.html index 576652d47..20d0802c3 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -142,15 +142,18 @@
-
+

{{_('Administration')}}

- - -
-
-
{{_('Reconnect Calibre Database')}}
-
{{_('Restart')}}
-
{{_('Shutdown')}}
+ + +
+
+
{{_('Reconnect Calibre Database')}}
+
{{_('Clear Cover Thumbnail Cache')}}
+
+
+
{{_('Restart')}}
+
{{_('Shutdown')}}
@@ -231,4 +234,21 @@
+ {% endblock %} diff --git a/cps/templates/author.html b/cps/templates/author.html index 4e32db80a..990f60ad2 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -37,7 +37,7 @@
- + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html new file mode 100644 index 000000000..c52817976 --- /dev/null +++ b/cps/templates/book_cover.html @@ -0,0 +1,13 @@ +{% macro book_cover_image(book, thumbnails) -%} + {%- set book_title = book.title if book.title else book.name -%} + {% set srcset = thumbnails|get_book_thumbnail_srcset if thumbnails|length else '' %} + {%- if srcset|length -%} + {{ book_title }} + {%- else -%} + {{ book_title }} + {%- endif -%} +{%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index c0fc141ed..091beffcb 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,9 +1,10 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %} {% if book %}
- {{ book.title }} + {{ book_cover_image(book, book.id|get_book_thumbnails(thumbnails)) }}
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 342cce536..3e2b65ac7 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,7 +4,7 @@
- {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }}
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index d57994b4f..02eff6583 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -9,7 +10,7 @@ {% if entry.has_cover is defined %} - {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/fragment.html b/cps/templates/fragment.html index 1421ea6af..901dd1931 100644 --- a/cps/templates/fragment.html +++ b/cps/templates/fragment.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %}
{% block body %}{% endblock %}
diff --git a/cps/templates/grid.html b/cps/templates/grid.html index 9724e31db..2eecd6c6f 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}

{{_(title)}}

@@ -29,7 +30,7 @@
- {{ entry[0].name }} + {{ book_cover_image(entry[0], entry[0].id|get_book_thumbnails(thumbnails)) }} {{entry.count}} diff --git a/cps/templates/index.html b/cps/templates/index.html index d300fc65a..579f19f73 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %} {% if g.user.show_detail_random() %} @@ -9,7 +10,7 @@
- {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} @@ -86,7 +87,7 @@
- {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 318140faa..fef082bb5 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -1,4 +1,5 @@ {% from 'modal_dialogs.html' import restrict_modal, delete_book, filechooser_modal, delete_confirm_modal, change_confirm_modal %} +{% from 'book_cover.html' import book_cover_image %} diff --git a/cps/templates/search.html b/cps/templates/search.html index d11f3ec85..428655ead 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -44,7 +45,7 @@ {% if entry.has_cover is defined %} - {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index 1ad79dbd7..e49a008fe 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -1,3 +1,4 @@ +{% from 'book_cover.html' import book_cover_image %} {% extends "layout.html" %} {% block body %}
@@ -31,7 +32,7 @@
- {{ entry.title }} + {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/ub.py b/cps/ub.py index ecf986791..af53e4f8b 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -18,6 +18,7 @@ # along with this program. If not, see . from __future__ import division, print_function, unicode_literals +import atexit import os import sys import datetime @@ -441,6 +442,27 @@ class RemoteAuthToken(Base): return '' % self.id +def filename(context): + file_format = context.get_current_parameters()['format'] + if file_format == 'jpeg': + return context.get_current_parameters()['uuid'] + '.jpg' + else: + return context.get_current_parameters()['uuid'] + '.' + file_format + + +class Thumbnail(Base): + __tablename__ = 'thumbnail' + + id = Column(Integer, primary_key=True) + book_id = Column(Integer) + uuid = Column(String, default=lambda: str(uuid.uuid4()), unique=True) + format = Column(String, default='jpeg') + resolution = Column(SmallInteger, default=1) + filename = Column(String, default=filename) + generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) + expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30)) + + # Add missing tables during migration of database def add_missing_tables(engine, session): if not engine.dialect.has_table(engine.connect(), "book_read_link"): @@ -455,6 +477,8 @@ def add_missing_tables(engine, session): KoboStatistics.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "archived_book"): ArchivedBook.__table__.create(bind=engine) + if not engine.dialect.has_table(engine.connect(), "thumbnail"): + Thumbnail.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "registration"): Registration.__table__.create(bind=engine) with engine.connect() as conn: @@ -725,6 +749,16 @@ def init_db(app_db_path): sys.exit(3) +def get_new_session_instance(): + new_engine = create_engine(u'sqlite:///{0}'.format(cli.settingspath), echo=False) + new_session = scoped_session(sessionmaker()) + new_session.configure(bind=new_engine) + + atexit.register(lambda: new_session.remove() if new_session else True) + + return new_session + + def dispose(): global session diff --git a/cps/web.py b/cps/web.py index ad8cd5daa..5bf226abb 100644 --- a/cps/web.py +++ b/cps/web.py @@ -50,9 +50,10 @@ from . import constants, logger, isoLanguages, services from . import babel, db, ub, config, get_locale, app from . import calibre_db from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download -from .helper import check_valid_domain, render_task_status, \ - get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \ - send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password +from .helper import check_valid_domain, render_task_status, get_cc_columns, get_book_cover, get_cached_book_cover, \ + get_cached_book_cover_thumbnail, get_thumbnails_for_books, get_thumbnails_for_book_series, get_download_link, \ + send_mail, generate_random_password, send_registration_mail, check_send_to_kindle, check_read_formats, \ + tags_filters, reset_password from .pagination import Pagination from .redirect import redirect_back from .usermanagement import login_required_if_no_ano @@ -411,8 +412,9 @@ def render_books_list(data, sort, book_id, page): else: website = data or "newest" entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, order) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Books"), page=website) + title=_(u"Books"), page=website, thumbnails=thumbnails) def render_rated_books(page, book_id, order): @@ -457,8 +459,9 @@ def render_hot_books(page): ub.delete_download(book.Downloads.book_id) numBooks = entries.__len__() pagination = Pagination(page, config.config_books_per_page, numBooks) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Hot Books (Most Downloaded)"), page="hot") + title=_(u"Hot Books (Most Downloaded)"), page="hot", thumbnails=thumbnails) else: abort(404) @@ -482,12 +485,14 @@ def render_downloaded_books(page, order): .filter(db.Books.id == book.id).first(): ub.delete_download(book.id) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=_(u"Downloaded books by %(user)s",user=current_user.nickname), - page="download") + page="download", + thumbnails=thumbnails) else: abort(404) @@ -498,6 +503,7 @@ def render_author_books(page, author_id, order): db.Books.authors.any(db.Authors.id == author_id), [order[0], db.Series.name, db.Books.series_index], db.books_series_link, + db.Books.id==db.books_series_link.c.book, db.Series) if entries is None or not len(entries): flash(_(u"Oops! Selected book title is unavailable. File does not exist or is not accessible"), @@ -513,9 +519,10 @@ def render_author_books(page, author_id, order): author_info = services.goodreads_support.get_author_info(author_name) other_books = services.goodreads_support.get_other_books(author_info, entries) + thumbnails = get_thumbnails_for_books(entries) return render_title_template('author.html', entries=entries, pagination=pagination, id=author_id, title=_(u"Author: %(name)s", name=author_name), author=author_info, - other_books=other_books, page="author") + other_books=other_books, page="author", thumbnails=thumbnails) def render_publisher_books(page, book_id, order): @@ -526,9 +533,12 @@ def render_publisher_books(page, book_id, order): db.Books.publishers.any(db.Publishers.id == book_id), [db.Series.name, order[0], db.Books.series_index], db.books_series_link, + db.Books.id == db.books_series_link.c.book, db.Series) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher") + title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher", + thumbnails=thumbnails) else: abort(404) @@ -540,8 +550,10 @@ def render_series_books(page, book_id, order): db.Books, db.Books.series.any(db.Series.id == book_id), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Series: %(serie)s", serie=name.name), page="series") + title=_(u"Series: %(serie)s", serie=name.name), page="series", + thumbnails=thumbnails) else: abort(404) @@ -553,8 +565,10 @@ def render_ratings_books(page, book_id, order): db.Books.ratings.any(db.Ratings.id == book_id), [order[0]]) if name and name.rating <= 10: + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings") + title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings", + thumbnails=thumbnails) else: abort(404) @@ -566,8 +580,10 @@ def render_formats_books(page, book_id, order): db.Books, db.Books.data.any(db.Data.format == book_id.upper()), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"File format: %(format)s", format=name.format), page="formats") + title=_(u"File format: %(format)s", format=name.format), page="formats", + thumbnails=thumbnails) else: abort(404) @@ -579,9 +595,13 @@ def render_category_books(page, book_id, order): db.Books, db.Books.tags.any(db.Tags.id == book_id), [order[0], db.Series.name, db.Books.series_index], - db.books_series_link, db.Series) + db.books_series_link, + db.Books.id == db.books_series_link.c.book, + db.Series) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Category: %(name)s", name=name.name), page="category") + title=_(u"Category: %(name)s", name=name.name), page="category", + thumbnails=thumbnails) else: abort(404) @@ -599,8 +619,9 @@ def render_language_books(page, name, order): db.Books, db.Books.languages.any(db.Languages.lang_code == name), [order[0]]) + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=name, - title=_(u"Language: %(name)s", name=lang_name), page="language") + title=_(u"Language: %(name)s", name=lang_name), page="language", thumbnails=thumbnails) def render_read_books(page, are_read, as_xml=False, order=None): @@ -644,8 +665,10 @@ def render_read_books(page, are_read, as_xml=False, order=None): else: name = _(u'Unread Books') + ' (' + str(pagination.total_count) + ')' pagename = "unread" + + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename) + title=name, page=pagename, thumbnails=thumbnails) def render_archived_books(page, order): @@ -668,8 +691,9 @@ def render_archived_books(page, order): name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" + thumbnails = get_thumbnails_for_books(entries + random) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename) + title=name, page=pagename, thumbnails=thumbnails) def render_prepare_search_form(cc): @@ -702,6 +726,7 @@ def render_prepare_search_form(cc): def render_search_results(term, offset=None, order=None, limit=None): entries, result_count, pagination = calibre_db.get_search_results(term, offset, order, limit) + thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', searchterm=term, pagination=pagination, @@ -710,7 +735,8 @@ def render_search_results(term, offset=None, order=None, limit=None): entries=entries, result_count=result_count, title=_(u"Search"), - page="search") + page="search", + thumbnails=thumbnails) # ################################### View Books list ################################################################## @@ -740,6 +766,7 @@ def books_table(): return render_title_template('book_table.html', title=_(u"Books List"), page="book_table", visiblility=visibility) + @web.route("/ajax/listbooks") @login_required def list_books(): @@ -772,6 +799,7 @@ def list_books(): response.headers["Content-Type"] = "application/json; charset=utf-8" return response + @web.route("/ajax/table_settings", methods=['POST']) @login_required def update_table_settings(): @@ -826,6 +854,7 @@ def publisher_list(): charlist = calibre_db.session.query(func.upper(func.substr(db.Publishers.name, 1, 1)).label('char')) \ .join(db.books_publishers_link).join(db.Books).filter(calibre_db.common_filters()) \ .group_by(func.upper(func.substr(db.Publishers.name, 1, 1))).all() + return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=charlist, title=_(u"Publishers"), page="publisherlist", data="publisher") else: @@ -857,8 +886,10 @@ def series_list(): .join(db.books_series_link).join(db.Books).filter(calibre_db.common_filters()) \ .group_by(func.upper(func.substr(db.Series.sort, 1, 1))).all() + thumbnails = get_thumbnails_for_book_series(entries) return render_title_template('grid.html', entries=entries, folder='web.books_list', charlist=charlist, - title=_(u"Series"), page="serieslist", data="series", bodyClass="grid-view") + title=_(u"Series"), page="serieslist", data="series", bodyClass="grid-view", + thumbnails=thumbnails) else: abort(404) @@ -1235,13 +1266,16 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): else: offset = 0 limit_all = result_count + + thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', adv_searchterm=searchterm, pagination=pagination, entries=q[offset:limit_all], result_count=result_count, - title=_(u"Advanced Search"), page="advsearch") - + title=_(u"Advanced Search"), + page="advsearch", + thumbnails=thumbnails) @web.route("/advsearch", methods=['GET']) @@ -1260,10 +1294,24 @@ def advanced_search_form(): def get_cover(book_id): return get_book_cover(book_id) + +@web.route("/cached-cover/") +@login_required_if_no_ano +def get_cached_cover(cache_id): + return get_cached_book_cover(cache_id) + + +@web.route("/cached-cover-thumbnail/") +@login_required_if_no_ano +def get_cached_cover_thumbnail(cache_id): + return get_cached_book_cover_thumbnail(cache_id) + + @web.route("/robots.txt") def get_robots(): return send_from_directory(constants.STATIC_DIR, "robots.txt") + @web.route("/show//", defaults={'anyname': 'None'}) @web.route("/show///") @login_required_if_no_ano @@ -1293,7 +1341,6 @@ def serve_book(book_id, book_format, anyname): return send_from_directory(os.path.join(config.config_calibre_dir, book.path), data.name + "." + book_format) - @web.route("/download//", defaults={'anyname': 'None'}) @web.route("/download///") @login_required_if_no_ano @@ -1481,9 +1528,6 @@ def logout(): return redirect(url_for('web.login')) - - - # ################################### Users own configuration ######################################################### def change_profile_email(to_save, kobo_support, local_oauth_check, oauth_status): if "email" in to_save and to_save["email"] != current_user.email: @@ -1683,6 +1727,7 @@ def show_book(book_id): if media_format.format.lower() in constants.EXTENSIONS_AUDIO: audioentries.append(media_format.format.lower()) + thumbnails = get_thumbnails_for_books([entries]) return render_title_template('detail.html', entry=entries, audioentries=audioentries, @@ -1694,7 +1739,8 @@ def show_book(book_id): is_archived=is_archived, kindle_list=kindle_list, reader_list=reader_list, - page="book") + page="book", + thumbnails=thumbnails) else: log.debug(u"Error opening eBook. File does not exist or file is not accessible") flash(_(u"Error opening eBook. File does not exist or file is not accessible"), category="error") diff --git a/requirements.txt b/requirements.txt index ca11eff91..5a26381ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +APScheduler>=3.6.3, <3.8.0 Babel>=1.3, <2.9 Flask-Babel>=0.11.1,<2.1.0 Flask-Login>=0.3.2,<0.5.1 From 1e7a2c400ba6c6a6b661c1a086d85a95cd813806 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 20 Mar 2021 14:06:15 +0100 Subject: [PATCH 011/412] Fixed misstyping --- cps/config_sql.py | 2 +- cps/db.py | 2 +- cps/gdriveutils.py | 2 +- cps/ub.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cps/config_sql.py b/cps/config_sql.py index 17f1c613b..78e6c9c92 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -24,7 +24,7 @@ import sys from sqlalchemy import exc, Column, String, Integer, SmallInteger, Boolean, BLOB, JSON from sqlalchemy.exc import OperationalError try: - # Compability with sqlalchemy 2.0 + # Compatibility with sqlalchemy 2.0 from sqlalchemy.orm import declarative_base except ImportError: from sqlalchemy.ext.declarative import declarative_base diff --git a/cps/db.py b/cps/db.py index f43cc8114..883eec051 100644 --- a/cps/db.py +++ b/cps/db.py @@ -32,7 +32,7 @@ from sqlalchemy.orm import relationship, sessionmaker, scoped_session from sqlalchemy.orm.collections import InstrumentedList from sqlalchemy.ext.declarative import DeclarativeMeta try: - # Compability with sqlalchemy 2.0 + # Compatibility with sqlalchemy 2.0 from sqlalchemy.orm import declarative_base except ImportError: from sqlalchemy.ext.declarative import declarative_base diff --git a/cps/gdriveutils.py b/cps/gdriveutils.py index 5f9705547..c7a95ca57 100644 --- a/cps/gdriveutils.py +++ b/cps/gdriveutils.py @@ -29,7 +29,7 @@ from sqlalchemy import Column, UniqueConstraint from sqlalchemy import String, Integer from sqlalchemy.orm import sessionmaker, scoped_session try: - # Compability with sqlalchemy 2.0 + # Compatibility with sqlalchemy 2.0 from sqlalchemy.orm import declarative_base except ImportError: from sqlalchemy.ext.declarative import declarative_base diff --git a/cps/ub.py b/cps/ub.py index af53e4f8b..4a76ea490 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -45,7 +45,7 @@ from sqlalchemy import String, Integer, SmallInteger, Boolean, DateTime, Float, from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.sql.expression import func try: - # Compability with sqlalchemy 2.0 + # Compatibility with sqlalchemy 2.0 from sqlalchemy.orm import declarative_base except ImportError: from sqlalchemy.ext.declarative import declarative_base From 9a08bcd2bc0a5280cbb293d1306b7c4e2ad6d792 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Thu, 16 Sep 2021 23:20:11 -0500 Subject: [PATCH 012/412] Started addressing some PR comments --- cps/admin.py | 1 - cps/templates/book_cover.html | 3 ++- cps/updater.py | 2 +- cps/web.py | 26 ++++++++++++++------------ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cps/admin.py b/cps/admin.py index 32d66a6f1..98535320f 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -41,7 +41,6 @@ from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_, text from . import constants, logger, helper, services, isoLanguages, fs -from .cli import filepicker from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash, check_email, \ valid_email, check_username diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html index c52817976..67e7c24bc 100644 --- a/cps/templates/book_cover.html +++ b/cps/templates/book_cover.html @@ -1,5 +1,6 @@ -{% macro book_cover_image(book, thumbnails) -%} +{% macro book_cover_image(book, thumbnails, title) -%} {%- set book_title = book.title if book.title else book.name -%} + {%- set book_title = title if title else book_title -%} {% set srcset = thumbnails|get_book_thumbnail_srcset if thumbnails|length else '' %} {%- if srcset|length -%} Date: Fri, 17 Sep 2021 01:42:56 -0500 Subject: [PATCH 013/412] Review feedback fixes --- cps/helper.py | 5 +++-- cps/jinjia.py | 2 ++ cps/schedule.py | 7 +++++-- cps/services/background_scheduler.py | 4 ++-- cps/tasks/thumbnail.py | 1 + cps/templates/book_cover.html | 2 +- cps/ub.py | 2 +- cps/web.py | 22 +++++++++++----------- 8 files changed, 26 insertions(+), 19 deletions(-) diff --git a/cps/helper.py b/cps/helper.py index 758d2531b..6f22a7017 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -554,13 +554,14 @@ def get_thumbnails_for_books(books): cache = fs.FileSystem() thumbnail_files = cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) - return ub.session\ + thumbnails = ub.session\ .query(ub.Thumbnail)\ .filter(ub.Thumbnail.book_id.in_(book_ids))\ - .filter(ub.Thumbnail.filename.in_(thumbnail_files))\ .filter(ub.Thumbnail.expiration > datetime.utcnow())\ .all() + return list(filter(lambda t: t.filename in thumbnail_files, thumbnails)) + def get_thumbnails_for_book_series(series): books = list(map(lambda s: s[0], series)) diff --git a/cps/jinjia.py b/cps/jinjia.py index ac6d3d335..5f86478cd 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -129,10 +129,12 @@ def formatseriesindex_filter(series_index): return series_index return 0 + @jinjia.app_template_filter('escapedlink') def escapedlink_filter(url, text): return "{}".format(url, escape(text)) + @jinjia.app_template_filter('uuidfilter') def uuidfilter(var): return uuid4() diff --git a/cps/schedule.py b/cps/schedule.py index 7ee434102..8ab9c7328 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -18,6 +18,7 @@ from __future__ import division, print_function, unicode_literals +from datetime import datetime from .services.background_scheduler import BackgroundScheduler from .tasks.database import TaskReconnectDatabase from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumbnails @@ -26,8 +27,10 @@ from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumb def register_jobs(): scheduler = BackgroundScheduler() - # Generate 100 book cover thumbnails every 5 minutes - scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=100), trigger='cron', minute='*/5') + # Generate up to 1000 book covers daily + generate_thumbnails_task = scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=1000), + trigger='interval', days=1) + generate_thumbnails_task.modify(next_run_time=datetime.now()) # Cleanup book cover cache every 6 hours scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', minute='15', hour='*/6') diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py index efa573799..122168e8c 100644 --- a/cps/services/background_scheduler.py +++ b/cps/services/background_scheduler.py @@ -41,7 +41,7 @@ class BackgroundScheduler: return cls._instance def add(self, func, trigger, **trigger_args): - self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) + return self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) def add_task(self, user, task, trigger, **trigger_args): def scheduled_task(): @@ -49,4 +49,4 @@ class BackgroundScheduler: self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) WorkerThread.add(user, worker_task) - self.add(func=scheduled_task, trigger=trigger, **trigger_args) + return self.add(func=scheduled_task, trigger=trigger, **trigger_args) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 70ddc06bd..fed12e8ba 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -37,6 +37,7 @@ except (ImportError, RuntimeError) as e: THUMBNAIL_RESOLUTION_1X = 1 THUMBNAIL_RESOLUTION_2X = 2 +THUMBNAIL_RESOLUTION_3X = 3 class TaskGenerateCoverThumbnails(CalibreTask): diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html index 67e7c24bc..884ff4cd6 100644 --- a/cps/templates/book_cover.html +++ b/cps/templates/book_cover.html @@ -1,4 +1,4 @@ -{% macro book_cover_image(book, thumbnails, title) -%} +{% macro book_cover_image(book, thumbnails, title=None) -%} {%- set book_title = book.title if book.title else book.name -%} {%- set book_title = title if title else book_title -%} {% set srcset = thumbnails|get_book_thumbnail_srcset if thumbnails|length else '' %} diff --git a/cps/ub.py b/cps/ub.py index 9d3a5845c..e0bee4efd 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -532,7 +532,7 @@ class Thumbnail(Base): resolution = Column(SmallInteger, default=1) filename = Column(String, default=filename) generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) - expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30)) + expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=90)) # Add missing tables during migration of database diff --git a/cps/web.py b/cps/web.py index 64bdd8e4a..f43bc6ad1 100644 --- a/cps/web.py +++ b/cps/web.py @@ -416,7 +416,7 @@ def render_books_list(data, sort, book_id, page): db.Books.id == db.books_series_link.c.book, db.Series) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=_(u"Books"), page=website, thumbnails=thumbnails) @@ -467,7 +467,7 @@ def render_hot_books(page): ub.delete_download(book.Downloads.book_id) numBooks = entries.__len__() pagination = Pagination(page, config.config_books_per_page, numBooks) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=_(u"Hot Books (Most Downloaded)"), page="hot", thumbnails=thumbnails) else: @@ -498,7 +498,7 @@ def render_downloaded_books(page, order, user_id): ub.delete_download(book.id) user = ub.session.query(ub.User).filter(ub.User.id == user_id).first() - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, @@ -551,7 +551,7 @@ def render_publisher_books(page, book_id, order): db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher", thumbnails=thumbnails) @@ -566,7 +566,7 @@ def render_series_books(page, book_id, order): db.Books, db.Books.series.any(db.Series.id == book_id), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, title=_(u"Series: %(serie)s", serie=name.name), page="series", thumbnails=thumbnails) @@ -581,7 +581,7 @@ def render_ratings_books(page, book_id, order): db.Books.ratings.any(db.Ratings.id == book_id), [order[0]]) if name and name.rating <= 10: - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings", thumbnails=thumbnails) @@ -596,7 +596,7 @@ def render_formats_books(page, book_id, order): db.Books, db.Books.data.any(db.Data.format == book_id.upper()), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, title=_(u"File format: %(format)s", format=name.format), page="formats", thumbnails=thumbnails) @@ -614,7 +614,7 @@ def render_category_books(page, book_id, order): db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, title=_(u"Category: %(name)s", name=name.name), page="category", thumbnails=thumbnails) @@ -635,7 +635,7 @@ def render_language_books(page, name, order): db.Books, db.Books.languages.any(db.Languages.lang_code == name), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=name, title=_(u"Language: %(name)s", name=lang_name), page="language", thumbnails=thumbnails) @@ -688,7 +688,7 @@ def render_read_books(page, are_read, as_xml=False, order=None): name = _(u'Unread Books') + ' (' + str(pagination.total_count) + ')' pagename = "unread" - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=name, page=pagename, thumbnails=thumbnails) @@ -713,7 +713,7 @@ def render_archived_books(page, order): name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" - thumbnails = get_thumbnails_for_books(entries + random if random else entries) + thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, title=name, page=pagename, thumbnails=thumbnails) From 8bee2b9552f3ad2e0b3b04b1f3302d67e98b4614 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sun, 19 Sep 2021 22:45:19 -0500 Subject: [PATCH 014/412] Added CACHE_DIR env variable, graceful handling when APScheduler is not installed --- cps/constants.py | 5 ++++- cps/fs.py | 8 ++++++++ cps/helper.py | 2 ++ cps/schedule.py | 15 +++++++-------- cps/services/background_scheduler.py | 26 +++++++++++++++++++------- 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/cps/constants.py b/cps/constants.py index 1e44796a3..6a6b8f2bb 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -40,7 +40,10 @@ else: STATIC_DIR = os.path.join(BASE_DIR, 'cps', 'static') TEMPLATES_DIR = os.path.join(BASE_DIR, 'cps', 'templates') TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations') -CACHE_DIR = os.path.join(BASE_DIR, 'cps', 'cache') + +# Cache dir - use CACHE_DIR environment variable, otherwise use the default directory: cps/cache +DEFAULT_CACHE_DIR = os.path.join(BASE_DIR, 'cps', 'cache') +CACHE_DIR = os.environ.get("CACHE_DIR", DEFAULT_CACHE_DIR) if HOME_CONFIG: home_dir = os.path.join(os.path.expanduser("~"),".calibre-web") diff --git a/cps/fs.py b/cps/fs.py index 699d59912..8528e39c7 100644 --- a/cps/fs.py +++ b/cps/fs.py @@ -50,6 +50,14 @@ class FileSystem: path = self.get_cache_dir(cache_type) return [file for file in listdir(path) if isfile(join(path, file))] + def list_existing_cache_files(self, filenames, cache_type=None): + path = self.get_cache_dir(cache_type) + return [file for file in listdir(path) if isfile(join(path, file)) and file in filenames] + + def list_missing_cache_files(self, filenames, cache_type=None): + path = self.get_cache_dir(cache_type) + return [file for file in listdir(path) if isfile(join(path, file)) and file not in filenames] + def delete_cache_dir(self, cache_type=None): if not cache_type and isdir(self._cache_dir): rmtree(self._cache_dir) diff --git a/cps/helper.py b/cps/helper.py index 6f22a7017..688bc6150 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -405,6 +405,7 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa src=new_path, dest=new_name, error=str(ex)) return False + def update_dir_structure_gdrive(book_id, first_author): error = False book = calibre_db.get_book(book_id) @@ -505,6 +506,7 @@ def uniq(inpt): output.append(x) return output + def check_email(email): email = valid_email(email) if ub.session.query(ub.User).filter(func.lower(ub.User.email) == email.lower()).first(): diff --git a/cps/schedule.py b/cps/schedule.py index 8ab9c7328..649b65a3a 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -27,13 +27,12 @@ from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumb def register_jobs(): scheduler = BackgroundScheduler() - # Generate up to 1000 book covers daily - generate_thumbnails_task = scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(limit=1000), - trigger='interval', days=1) - generate_thumbnails_task.modify(next_run_time=datetime.now()) + if scheduler: + # Reconnect metadata.db once every 12 hours + scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='interval', hours=12) - # Cleanup book cover cache every 6 hours - scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', minute='15', hour='*/6') + # Cleanup book cover cache once every 24 hours + scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='interval', days=1) - # Reconnect metadata.db every 4 hours - scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', minute='5', hour='*/4') + # Generate all missing book cover thumbnails once every 24 hours + scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='interval', days=1) diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py index 122168e8c..f2688b7f9 100644 --- a/cps/services/background_scheduler.py +++ b/cps/services/background_scheduler.py @@ -21,13 +21,23 @@ import atexit from .. import logger from .worker import WorkerThread -from apscheduler.schedulers.background import BackgroundScheduler as BScheduler + +try: + from apscheduler.schedulers.background import BackgroundScheduler as BScheduler + use_APScheduler = True +except (ImportError, RuntimeError) as e: + use_APScheduler = False + log = logger.create() + log.info(f'APScheduler not found. Unable to schedule tasks.') class BackgroundScheduler: _instance = None def __new__(cls): + if not use_APScheduler: + return False + if cls._instance is None: cls._instance = super(BackgroundScheduler, cls).__new__(cls) @@ -41,12 +51,14 @@ class BackgroundScheduler: return cls._instance def add(self, func, trigger, **trigger_args): - return self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) + if use_APScheduler: + return self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) def add_task(self, user, task, trigger, **trigger_args): - def scheduled_task(): - worker_task = task() - self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) - WorkerThread.add(user, worker_task) + if use_APScheduler: + def scheduled_task(): + worker_task = task() + self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) + WorkerThread.add(user, worker_task) - return self.add(func=scheduled_task, trigger=trigger, **trigger_args) + return self.add(func=scheduled_task, trigger=trigger, **trigger_args) From 524ed07a6c3daf6c8e746a9b5e69f76742fe2301 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Tue, 21 Sep 2021 23:39:00 -0500 Subject: [PATCH 015/412] Handle read only access to cache dir gracefully. minor cleanup --- cps.py | 3 +- cps/fs.py | 44 ++++++++++++++++++++++------ cps/schedule.py | 12 +++++--- cps/services/background_scheduler.py | 4 +-- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/cps.py b/cps.py index 82137bbc3..fe0065519 100755 --- a/cps.py +++ b/cps.py @@ -44,7 +44,7 @@ from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.search_metadata import meta from cps.error_handler import init_errorhandler -from cps.schedule import register_jobs +from cps.schedule import register_jobs, register_startup_jobs try: from cps.kobo import kobo, get_kobo_activated @@ -83,6 +83,7 @@ def main(): # Register scheduled jobs register_jobs() + # register_startup_jobs() success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/fs.py b/cps/fs.py index 8528e39c7..4f835fa64 100644 --- a/cps/fs.py +++ b/cps/fs.py @@ -17,6 +17,7 @@ # along with this program. If not, see . from __future__ import division, print_function, unicode_literals +from . import logger from .constants import CACHE_DIR from os import listdir, makedirs, remove from os.path import isdir, isfile, join @@ -32,16 +33,26 @@ class FileSystem: def __new__(cls): if cls._instance is None: cls._instance = super(FileSystem, cls).__new__(cls) + cls.log = logger.create() return cls._instance def get_cache_dir(self, cache_type=None): if not isdir(self._cache_dir): - makedirs(self._cache_dir) + try: + makedirs(self._cache_dir) + except OSError: + self.log.info(f'Failed to create path {self._cache_dir} (Permission denied).') + return False - if cache_type and not isdir(join(self._cache_dir, cache_type)): - makedirs(join(self._cache_dir, cache_type)) + path = join(self._cache_dir, cache_type) + if cache_type and not isdir(path): + try: + makedirs(path) + except OSError: + self.log.info(f'Failed to create path {path} (Permission denied).') + return False - return join(self._cache_dir, cache_type) if cache_type else self._cache_dir + return path if cache_type else self._cache_dir def get_cache_file_path(self, filename, cache_type=None): return join(self.get_cache_dir(cache_type), filename) if filename else None @@ -60,10 +71,25 @@ class FileSystem: def delete_cache_dir(self, cache_type=None): if not cache_type and isdir(self._cache_dir): - rmtree(self._cache_dir) - if cache_type and isdir(join(self._cache_dir, cache_type)): - rmtree(join(self._cache_dir, cache_type)) + try: + rmtree(self._cache_dir) + except OSError: + self.log.info(f'Failed to delete path {self._cache_dir} (Permission denied).') + return False + + path = join(self._cache_dir, cache_type) + if cache_type and isdir(path): + try: + rmtree(path) + except OSError: + self.log.info(f'Failed to delete path {path} (Permission denied).') + return False def delete_cache_file(self, filename, cache_type=None): - if isfile(join(self.get_cache_dir(cache_type), filename)): - remove(join(self.get_cache_dir(cache_type), filename)) + path = join(self.get_cache_dir(cache_type), filename) + if isfile(path): + try: + remove(path) + except OSError: + self.log.info(f'Failed to delete path {path} (Permission denied).') + return False diff --git a/cps/schedule.py b/cps/schedule.py index 649b65a3a..d427d908d 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -18,8 +18,8 @@ from __future__ import division, print_function, unicode_literals -from datetime import datetime from .services.background_scheduler import BackgroundScheduler +from .services.worker import WorkerThread from .tasks.database import TaskReconnectDatabase from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumbnails @@ -29,10 +29,14 @@ def register_jobs(): if scheduler: # Reconnect metadata.db once every 12 hours - scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='interval', hours=12) + scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', hour='4,16') # Cleanup book cover cache once every 24 hours - scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='interval', days=1) + scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', hour=4) # Generate all missing book cover thumbnails once every 24 hours - scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='interval', days=1) + scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='cron', hour=4) + + +def register_startup_jobs(): + WorkerThread.add(None, TaskGenerateCoverThumbnails()) diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py index f2688b7f9..1b588ac20 100644 --- a/cps/services/background_scheduler.py +++ b/cps/services/background_scheduler.py @@ -28,7 +28,7 @@ try: except (ImportError, RuntimeError) as e: use_APScheduler = False log = logger.create() - log.info(f'APScheduler not found. Unable to schedule tasks.') + log.info('APScheduler not found. Unable to schedule tasks.') class BackgroundScheduler: @@ -58,7 +58,7 @@ class BackgroundScheduler: if use_APScheduler: def scheduled_task(): worker_task = task() - self.log.info('Running scheduled task in background: ' + worker_task.name + ': ' + worker_task.message) + self.log.info(f'Running scheduled task in background: {worker_task.name} - {worker_task.message}') WorkerThread.add(user, worker_task) return self.add(func=scheduled_task, trigger=trigger, **trigger_args) From be28a9131553b7f29df6c712096530bdb62ae122 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Fri, 24 Sep 2021 03:11:14 -0500 Subject: [PATCH 016/412] Simplified all of the thumbnail generation and loading. --- cps/fs.py | 14 +- cps/helper.py | 61 +-------- cps/jinjia.py | 26 ++-- cps/schedule.py | 5 +- cps/tasks/thumbnail.py | 250 +++++++--------------------------- cps/templates/author.html | 3 +- cps/templates/book_cover.html | 19 ++- cps/templates/book_edit.html | 3 +- cps/templates/detail.html | 3 +- cps/templates/discover.html | 3 +- cps/templates/grid.html | 3 +- cps/templates/index.html | 6 +- cps/templates/search.html | 3 +- cps/templates/shelf.html | 3 +- cps/ub.py | 2 +- cps/web.py | 83 +++-------- 16 files changed, 111 insertions(+), 376 deletions(-) diff --git a/cps/fs.py b/cps/fs.py index 4f835fa64..30ab552a9 100644 --- a/cps/fs.py +++ b/cps/fs.py @@ -57,17 +57,9 @@ class FileSystem: def get_cache_file_path(self, filename, cache_type=None): return join(self.get_cache_dir(cache_type), filename) if filename else None - def list_cache_files(self, cache_type=None): - path = self.get_cache_dir(cache_type) - return [file for file in listdir(path) if isfile(join(path, file))] - - def list_existing_cache_files(self, filenames, cache_type=None): - path = self.get_cache_dir(cache_type) - return [file for file in listdir(path) if isfile(join(path, file)) and file in filenames] - - def list_missing_cache_files(self, filenames, cache_type=None): - path = self.get_cache_dir(cache_type) - return [file for file in listdir(path) if isfile(join(path, file)) and file not in filenames] + def get_cache_file_exists(self, filename, cache_type=None): + path = self.get_cache_file_path(filename, cache_type) + return isfile(path) def delete_cache_dir(self, cache_type=None): if not cache_type and isdir(self._cache_dir): diff --git a/cps/helper.py b/cps/helper.py index 688bc6150..1652be236 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -35,7 +35,7 @@ from babel.units import format_unit from flask import send_from_directory, make_response, redirect, abort, url_for from flask_babel import gettext as _ from flask_login import current_user -from sqlalchemy.sql.expression import true, false, and_, text, func +from sqlalchemy.sql.expression import true, false, and_, or_, text, func from werkzeug.datastructures import Headers from werkzeug.security import generate_password_hash from markupsafe import escape @@ -550,26 +550,6 @@ def delete_book(book, calibrepath, book_format): return delete_book_file(book, calibrepath, book_format) -def get_thumbnails_for_books(books): - books_with_covers = list(filter(lambda b: b.has_cover, books)) - book_ids = list(map(lambda b: b.id, books_with_covers)) - cache = fs.FileSystem() - thumbnail_files = cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) - - thumbnails = ub.session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id.in_(book_ids))\ - .filter(ub.Thumbnail.expiration > datetime.utcnow())\ - .all() - - return list(filter(lambda t: t.filename in thumbnail_files, thumbnails)) - - -def get_thumbnails_for_book_series(series): - books = list(map(lambda s: s[0], series)) - return get_thumbnails_for_books(books) - - def get_cover_on_failure(use_generic_cover): if use_generic_cover: return send_from_directory(_STATIC_DIR, "generic_cover.jpg") @@ -577,9 +557,9 @@ def get_cover_on_failure(use_generic_cover): return None -def get_book_cover(book_id): +def get_book_cover(book_id, resolution=None): book = calibre_db.get_filtered_book(book_id, allow_show_archived=True) - return get_book_cover_internal(book, use_generic_cover_on_failure=True) + return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): @@ -587,37 +567,6 @@ def get_book_cover_with_uuid(book_uuid, use_generic_cover_on_failure=True): return get_book_cover_internal(book, use_generic_cover_on_failure) -def get_cached_book_cover(cache_id): - parts = cache_id.split('_') - book_uuid = parts[0] if len(parts) else None - resolution = parts[2] if len(parts) > 2 else None - book = calibre_db.get_book_by_uuid(book_uuid) if book_uuid else None - return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) - - -def get_cached_book_cover_thumbnail(cache_id): - parts = cache_id.split('_') - thumbnail_uuid = parts[0] if len(parts) else None - thumbnail = None - if thumbnail_uuid: - thumbnail = ub.session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.uuid == thumbnail_uuid)\ - .first() - - if thumbnail and thumbnail.expiration > datetime.utcnow(): - cache = fs.FileSystem() - if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): - return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) - - elif thumbnail: - book = calibre_db.get_book(thumbnail.book_id) - return get_book_cover_internal(book, use_generic_cover_on_failure=True) - - else: - return get_cover_on_failure(True) - - def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None): if book and book.has_cover: @@ -626,7 +575,7 @@ def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None) thumbnail = get_book_cover_thumbnail(book, resolution) if thumbnail: cache = fs.FileSystem() - if cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + if cache.get_cache_file_exists(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) # Send the book cover from Google Drive if configured @@ -661,7 +610,7 @@ def get_book_cover_thumbnail(book, resolution): .query(ub.Thumbnail)\ .filter(ub.Thumbnail.book_id == book.id)\ .filter(ub.Thumbnail.resolution == resolution)\ - .filter(ub.Thumbnail.expiration > datetime.utcnow())\ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow()))\ .first() diff --git a/cps/jinjia.py b/cps/jinjia.py index 5f86478cd..8c8b72a92 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -33,6 +33,7 @@ from flask_babel import get_locale from flask_login import current_user from markupsafe import escape from . import logger +from .tasks.thumbnail import THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X, THUMBNAIL_RESOLUTION_3X jinjia = Blueprint('jinjia', __name__) @@ -140,24 +141,17 @@ def uuidfilter(var): return uuid4() -@jinjia.app_template_filter('book_cover_cache_id') -def book_cover_cache_id(book, resolution=None): +@jinjia.app_template_filter('last_modified') +def book_cover_cache_id(book): timestamp = int(book.last_modified.timestamp() * 1000) - cache_bust = str(book.uuid) + '_' + str(timestamp) - return cache_bust if not resolution else cache_bust + '_' + str(resolution) + return str(timestamp) -@jinjia.app_template_filter('get_book_thumbnails') -def get_book_thumbnails(book_id, thumbnails=None): - return list(filter(lambda t: t.book_id == book_id, thumbnails)) if book_id > -1 and thumbnails else list() - - -@jinjia.app_template_filter('get_book_thumbnail_srcset') -def get_book_thumbnail_srcset(thumbnails): +@jinjia.app_template_filter('get_cover_srcset') +def get_cover_srcset(book): srcset = list() - for thumbnail in thumbnails: - timestamp = int(thumbnail.generated_at.timestamp() * 1000) - cache_id = str(thumbnail.uuid) + '_' + str(timestamp) - url = url_for('web.get_cached_cover_thumbnail', cache_id=cache_id) - srcset.append(url + ' ' + str(thumbnail.resolution) + 'x') + for resolution in [THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X, THUMBNAIL_RESOLUTION_3X]: + timestamp = int(book.last_modified.timestamp() * 1000) + url = url_for('web.get_cover', book_id=book.id, resolution=resolution, cache_bust=str(timestamp)) + srcset.append(f'{url} {resolution}x') return ', '.join(srcset) diff --git a/cps/schedule.py b/cps/schedule.py index d427d908d..8c350bd5d 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -21,7 +21,7 @@ from __future__ import division, print_function, unicode_literals from .services.background_scheduler import BackgroundScheduler from .services.worker import WorkerThread from .tasks.database import TaskReconnectDatabase -from .tasks.thumbnail import TaskSyncCoverThumbnailCache, TaskGenerateCoverThumbnails +from .tasks.thumbnail import TaskGenerateCoverThumbnails def register_jobs(): @@ -31,9 +31,6 @@ def register_jobs(): # Reconnect metadata.db once every 12 hours scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', hour='4,16') - # Cleanup book cover cache once every 24 hours - scheduler.add_task(user=None, task=lambda: TaskSyncCoverThumbnailCache(), trigger='cron', hour=4) - # Generate all missing book cover thumbnails once every 24 hours scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='cron', hour=4) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index fed12e8ba..688f6e4b4 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -22,7 +22,7 @@ import os from cps import config, db, fs, gdriveutils, logger, ub from cps.services.worker import CalibreTask from datetime import datetime, timedelta -from sqlalchemy import func +from sqlalchemy import or_ try: from urllib.request import urlopen @@ -41,9 +41,8 @@ THUMBNAIL_RESOLUTION_3X = 3 class TaskGenerateCoverThumbnails(CalibreTask): - def __init__(self, limit=100, task_message=u'Generating cover thumbnails'): + def __init__(self, task_message=u'Generating cover thumbnails'): super(TaskGenerateCoverThumbnails, self).__init__(task_message) - self.limit = limit self.log = logger.create() self.app_db_session = ub.get_new_session_instance() self.calibre_db = db.CalibreDB(expire_on_commit=False) @@ -55,74 +54,51 @@ class TaskGenerateCoverThumbnails(CalibreTask): def run(self, worker_thread): if self.calibre_db.session and use_IM: - expired_thumbnails = self.get_expired_thumbnails() - thumbnail_book_ids = self.get_thumbnail_book_ids() - books_without_thumbnails = self.get_books_without_thumbnails(thumbnail_book_ids) + books_with_covers = self.get_books_with_covers() + count = len(books_with_covers) - count = len(books_without_thumbnails) - if count == 0: - # Do not display this task on the frontend if there are no covers to update - self.self_cleanup = True + updated = 0 + generated = 0 + for i, book in enumerate(books_with_covers): + book_cover_thumbnails = self.get_book_cover_thumbnails(book.id) - for i, book in enumerate(books_without_thumbnails): - for resolution in self.resolutions: - expired_thumbnail = self.get_expired_thumbnail_for_book_and_resolution( - book, - resolution, - expired_thumbnails - ) - if expired_thumbnail: - self.update_book_thumbnail(book, expired_thumbnail) - else: - self.create_book_thumbnail(book, resolution) + # Generate new thumbnails for missing covers + resolutions = list(map(lambda t: t.resolution, book_cover_thumbnails)) + missing_resolutions = list(set(self.resolutions).difference(resolutions)) + for resolution in missing_resolutions: + generated += 1 + self.create_book_cover_thumbnail(book, resolution) - self.message = u'Generating cover thumbnail {0} of {1}'.format(i + 1, count) + # Replace outdated or missing thumbnails + for thumbnail in book_cover_thumbnails: + if book.last_modified > thumbnail.generated_at: + updated += 1 + self.update_book_cover_thumbnail(book, thumbnail) + + elif not self.cache.get_cache_file_exists(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + updated += 1 + self.update_book_cover_thumbnail(book, thumbnail) + + self.message = u'Processing book {0} of {1}'.format(i + 1, count) self.progress = (1.0 / count) * i self._handleSuccess() self.app_db_session.remove() - def get_expired_thumbnails(self): - return self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.expiration < datetime.utcnow())\ - .all() - - def get_thumbnail_book_ids(self): - return self.app_db_session\ - .query(ub.Thumbnail.book_id)\ - .group_by(ub.Thumbnail.book_id)\ - .having(func.min(ub.Thumbnail.expiration) > datetime.utcnow())\ - .distinct() - - def get_books_without_thumbnails(self, thumbnail_book_ids): + def get_books_with_covers(self): return self.calibre_db.session\ .query(db.Books)\ .filter(db.Books.has_cover == 1)\ - .filter(db.Books.id.notin_(thumbnail_book_ids))\ - .limit(self.limit)\ .all() - def get_expired_thumbnail_for_book_and_resolution(self, book, resolution, expired_thumbnails): - for thumbnail in expired_thumbnails: - if thumbnail.book_id == book.id and thumbnail.resolution == resolution: - return thumbnail + def get_book_cover_thumbnails(self, book_id): + return self.app_db_session\ + .query(ub.Thumbnail)\ + .filter(ub.Thumbnail.book_id == book_id)\ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow()))\ + .all() - return None - - def update_book_thumbnail(self, book, thumbnail): - thumbnail.generated_at = datetime.utcnow() - thumbnail.expiration = datetime.utcnow() + timedelta(days=30) - - try: - self.app_db_session.commit() - self.generate_book_thumbnail(book, thumbnail) - except Exception as ex: - self.log.info(u'Error updating book thumbnail: ' + str(ex)) - self._handleError(u'Error updating book thumbnail: ' + str(ex)) - self.app_db_session.rollback() - - def create_book_thumbnail(self, book, resolution): + def create_book_cover_thumbnail(self, book, resolution): thumbnail = ub.Thumbnail() thumbnail.book_id = book.id thumbnail.format = 'jpeg' @@ -137,6 +113,18 @@ class TaskGenerateCoverThumbnails(CalibreTask): self._handleError(u'Error creating book thumbnail: ' + str(ex)) self.app_db_session.rollback() + def update_book_cover_thumbnail(self, book, thumbnail): + thumbnail.generated_at = datetime.utcnow() + + try: + self.app_db_session.commit() + self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + self.generate_book_thumbnail(book, thumbnail) + except Exception as ex: + self.log.info(u'Error updating book thumbnail: ' + str(ex)) + self._handleError(u'Error updating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + def generate_book_thumbnail(self, book, thumbnail): if book and thumbnail: if config.config_use_google_drive: @@ -190,128 +178,6 @@ class TaskGenerateCoverThumbnails(CalibreTask): return "ThumbnailsGenerate" -class TaskSyncCoverThumbnailCache(CalibreTask): - def __init__(self, task_message=u'Syncing cover thumbnail cache'): - super(TaskSyncCoverThumbnailCache, self).__init__(task_message) - self.log = logger.create() - self.app_db_session = ub.get_new_session_instance() - self.calibre_db = db.CalibreDB(expire_on_commit=False) - self.cache = fs.FileSystem() - - def run(self, worker_thread): - cached_thumbnail_files = self.cache.list_cache_files(fs.CACHE_TYPE_THUMBNAILS) - - # Expire thumbnails in the database if the cached file is missing - # This case will happen if a user deletes the cache dir or cached files - if self.app_db_session: - self.expire_missing_thumbnails(cached_thumbnail_files) - self.progress = 0.25 - - # Delete thumbnails in the database if the book has been removed - # This case will happen if a book is removed in Calibre and the metadata.db file is updated in the filesystem - if self.app_db_session and self.calibre_db: - book_ids = self.get_book_ids() - self.delete_thumbnails_for_missing_books(book_ids) - self.progress = 0.50 - - # Expire thumbnails in the database if their corresponding book has been updated since they were generated - # This case will happen if the book was updated externally - if self.app_db_session and self.cache: - books = self.get_books_updated_in_the_last_day() - book_ids = list(map(lambda b: b.id, books)) - thumbnails = self.get_thumbnails_for_updated_books(book_ids) - self.expire_thumbnails_for_updated_book(books, thumbnails) - self.progress = 0.75 - - # Delete extraneous cached thumbnail files - # This case will happen if a book was deleted and the thumbnail OR the metadata.db file was changed externally - if self.app_db_session: - db_thumbnail_files = self.get_thumbnail_filenames() - self.delete_extraneous_thumbnail_files(cached_thumbnail_files, db_thumbnail_files) - - self._handleSuccess() - self.app_db_session.remove() - - def expire_missing_thumbnails(self, filenames): - try: - self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.filename.notin_(filenames))\ - .update({"expiration": datetime.utcnow()}, synchronize_session=False) - self.app_db_session.commit() - except Exception as ex: - self.log.info(u'Error expiring thumbnails for missing cache files: ' + str(ex)) - self._handleError(u'Error expiring thumbnails for missing cache files: ' + str(ex)) - self.app_db_session.rollback() - - def get_book_ids(self): - results = self.calibre_db.session\ - .query(db.Books.id)\ - .filter(db.Books.has_cover == 1)\ - .distinct() - - return [value for value, in results] - - def delete_thumbnails_for_missing_books(self, book_ids): - try: - self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id.notin_(book_ids))\ - .delete(synchronize_session=False) - self.app_db_session.commit() - except Exception as ex: - self.log.info(str(ex)) - self._handleError(u'Error deleting thumbnails for missing books: ' + str(ex)) - self.app_db_session.rollback() - - def get_thumbnail_filenames(self): - results = self.app_db_session\ - .query(ub.Thumbnail.filename)\ - .all() - - return [thumbnail for thumbnail, in results] - - def delete_extraneous_thumbnail_files(self, cached_thumbnail_files, db_thumbnail_files): - extraneous_files = list(set(cached_thumbnail_files).difference(db_thumbnail_files)) - for file in extraneous_files: - self.cache.delete_cache_file(file, fs.CACHE_TYPE_THUMBNAILS) - - def get_books_updated_in_the_last_day(self): - return self.calibre_db.session\ - .query(db.Books)\ - .filter(db.Books.has_cover == 1)\ - .filter(db.Books.last_modified > datetime.utcnow() - timedelta(days=1, hours=1))\ - .all() - - def get_thumbnails_for_updated_books(self, book_ids): - return self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id.in_(book_ids))\ - .all() - - def expire_thumbnails_for_updated_book(self, books, thumbnails): - thumbnail_ids = list() - for book in books: - for thumbnail in thumbnails: - if thumbnail.book_id == book.id and thumbnail.generated_at < book.last_modified: - thumbnail_ids.append(thumbnail.id) - - try: - self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.id.in_(thumbnail_ids)) \ - .update({"expiration": datetime.utcnow()}, synchronize_session=False) - self.app_db_session.commit() - except Exception as ex: - self.log.info(u'Error expiring thumbnails for updated books: ' + str(ex)) - self._handleError(u'Error expiring thumbnails for updated books: ' + str(ex)) - self.app_db_session.rollback() - - @property - def name(self): - return "ThumbnailsSync" - - class TaskClearCoverThumbnailCache(CalibreTask): def __init__(self, book_id=None, task_message=u'Clearing cover thumbnail cache'): super(TaskClearCoverThumbnailCache, self).__init__(task_message) @@ -325,9 +191,9 @@ class TaskClearCoverThumbnailCache(CalibreTask): if self.book_id: thumbnails = self.get_thumbnails_for_book(self.book_id) for thumbnail in thumbnails: - self.expire_and_delete_thumbnail(thumbnail) + self.delete_thumbnail(thumbnail) else: - self.expire_and_delete_all_thumbnails() + self.delete_all_thumbnails() self._handleSuccess() self.app_db_session.remove() @@ -338,29 +204,19 @@ class TaskClearCoverThumbnailCache(CalibreTask): .filter(ub.Thumbnail.book_id == book_id)\ .all() - def expire_and_delete_thumbnail(self, thumbnail): - thumbnail.expiration = datetime.utcnow() - + def delete_thumbnail(self, thumbnail): try: - self.app_db_session.commit() self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) except Exception as ex: - self.log.info(u'Error expiring book thumbnail: ' + str(ex)) - self._handleError(u'Error expiring book thumbnail: ' + str(ex)) - self.app_db_session.rollback() - - def expire_and_delete_all_thumbnails(self): - self.app_db_session\ - .query(ub.Thumbnail)\ - .update({'expiration': datetime.utcnow()}) + self.log.info(u'Error deleting book thumbnail: ' + str(ex)) + self._handleError(u'Error deleting book thumbnail: ' + str(ex)) + def delete_all_thumbnails(self): try: - self.app_db_session.commit() self.cache.delete_cache_dir(fs.CACHE_TYPE_THUMBNAILS) except Exception as ex: - self.log.info(u'Error expiring book thumbnails: ' + str(ex)) - self._handleError(u'Error expiring book thumbnails: ' + str(ex)) - self.app_db_session.rollback() + self.log.info(u'Error deleting book thumbnails: ' + str(ex)) + self._handleError(u'Error deleting book thumbnails: ' + str(ex)) @property def name(self): diff --git a/cps/templates/author.html b/cps/templates/author.html index 3a4e6c570..2ff1ce7ae 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -37,8 +37,7 @@
- {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry, title=author.name|safe) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html index 884ff4cd6..7d3a84f43 100644 --- a/cps/templates/book_cover.html +++ b/cps/templates/book_cover.html @@ -1,14 +1,11 @@ -{% macro book_cover_image(book, thumbnails, title=None) -%} +{% macro book_cover_image(book, title=None) -%} {%- set book_title = book.title if book.title else book.name -%} {%- set book_title = title if title else book_title -%} - {% set srcset = thumbnails|get_book_thumbnail_srcset if thumbnails|length else '' %} - {%- if srcset|length -%} - {{ book_title }} - {%- else -%} - {{ book_title }} - {%- endif -%} + {% set srcset = book|get_cover_srcset %} + {{ book_title }} {%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index bce329d0d..8525b8e3b 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -4,8 +4,7 @@ {% if book %}
- {{ book_cover_image(book, book.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(book) }}
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index ea870d4c3..b538ff9a0 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,8 +4,7 @@
- {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }}
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index ecfc83d08..01cd393d4 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -10,8 +10,7 @@ {% if entry.has_cover is defined %} - {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/grid.html b/cps/templates/grid.html index 5a3c1e010..45fb53bf6 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -29,8 +29,7 @@
- {{ book_cover_image(entry[0], entry[0].id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry[0], title=entry[0].series[0].name|shortentitle) }} {{entry.count}} diff --git a/cps/templates/index.html b/cps/templates/index.html index c38ba01e2..e47c6c703 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -10,8 +10,7 @@
- {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }} {% if entry.id in read_book_ids %}{% endif %} @@ -88,8 +87,7 @@
- {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/search.html b/cps/templates/search.html index cf9c4fe73..872b6dc1e 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -45,8 +45,7 @@ {% if entry.has_cover is defined %} - {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index cb08be906..0e5865c96 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -32,8 +32,7 @@
- {{ book_cover_image(entry, entry.id|get_book_thumbnails(thumbnails)) }} - + {{ book_cover_image(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/ub.py b/cps/ub.py index e0bee4efd..f108a1cea 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -532,7 +532,7 @@ class Thumbnail(Base): resolution = Column(SmallInteger, default=1) filename = Column(String, default=filename) generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) - expiration = Column(DateTime, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=90)) + expiration = Column(DateTime, nullable=True) # Add missing tables during migration of database diff --git a/cps/web.py b/cps/web.py index f43bc6ad1..8f78ff32a 100644 --- a/cps/web.py +++ b/cps/web.py @@ -51,7 +51,6 @@ from . import babel, db, ub, config, get_locale, app from . import calibre_db from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download from .helper import check_valid_domain, render_task_status, check_email, check_username, \ - get_cached_book_cover, get_cached_book_cover_thumbnail, get_thumbnails_for_books, get_thumbnails_for_book_series, \ get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \ send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password, valid_email from .pagination import Pagination @@ -415,10 +414,8 @@ def render_books_list(data, sort, book_id, page): db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) - - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Books"), page=website, thumbnails=thumbnails) + title=_(u"Books"), page=website) def render_rated_books(page, book_id, order): @@ -467,9 +464,8 @@ def render_hot_books(page): ub.delete_download(book.Downloads.book_id) numBooks = entries.__len__() pagination = Pagination(page, config.config_books_per_page, numBooks) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=_(u"Hot Books (Most Downloaded)"), page="hot", thumbnails=thumbnails) + title=_(u"Hot Books (Most Downloaded)"), page="hot") else: abort(404) @@ -497,16 +493,13 @@ def render_downloaded_books(page, order, user_id): .filter(db.Books.id == book.id).first(): ub.delete_download(book.id) user = ub.session.query(ub.User).filter(ub.User.id == user_id).first() - - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=user_id, title=_(u"Downloaded books by %(user)s",user=user.name), - page="download", - thumbnails=thumbnails) + page="download") else: abort(404) @@ -535,10 +528,9 @@ def render_author_books(page, author_id, order): author_info = services.goodreads_support.get_author_info(author_name) other_books = services.goodreads_support.get_other_books(author_info, entries) - thumbnails = get_thumbnails_for_books(entries) return render_title_template('author.html', entries=entries, pagination=pagination, id=author_id, title=_(u"Author: %(name)s", name=author_name), author=author_info, - other_books=other_books, page="author", thumbnails=thumbnails) + other_books=other_books, page="author") def render_publisher_books(page, book_id, order): @@ -551,10 +543,8 @@ def render_publisher_books(page, book_id, order): db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher", - thumbnails=thumbnails) + title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher") else: abort(404) @@ -566,10 +556,8 @@ def render_series_books(page, book_id, order): db.Books, db.Books.series.any(db.Series.id == book_id), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Series: %(serie)s", serie=name.name), page="series", - thumbnails=thumbnails) + title=_(u"Series: %(serie)s", serie=name.name), page="series") else: abort(404) @@ -581,10 +569,8 @@ def render_ratings_books(page, book_id, order): db.Books.ratings.any(db.Ratings.id == book_id), [order[0]]) if name and name.rating <= 10: - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings", - thumbnails=thumbnails) + title=_(u"Rating: %(rating)s stars", rating=int(name.rating / 2)), page="ratings") else: abort(404) @@ -596,10 +582,8 @@ def render_formats_books(page, book_id, order): db.Books, db.Books.data.any(db.Data.format == book_id.upper()), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, pagination=pagination, entries=entries, id=book_id, - title=_(u"File format: %(format)s", format=name.format), page="formats", - thumbnails=thumbnails) + title=_(u"File format: %(format)s", format=name.format), page="formats") else: abort(404) @@ -614,10 +598,8 @@ def render_category_books(page, book_id, order): db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=book_id, - title=_(u"Category: %(name)s", name=name.name), page="category", - thumbnails=thumbnails) + title=_(u"Category: %(name)s", name=name.name), page="category") else: abort(404) @@ -635,9 +617,8 @@ def render_language_books(page, name, order): db.Books, db.Books.languages.any(db.Languages.lang_code == name), [order[0]]) - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, id=name, - title=_(u"Language: %(name)s", name=lang_name), page="language", thumbnails=thumbnails) + title=_(u"Language: %(name)s", name=lang_name), page="language") def render_read_books(page, are_read, as_xml=False, order=None): @@ -687,10 +668,8 @@ def render_read_books(page, are_read, as_xml=False, order=None): else: name = _(u'Unread Books') + ' (' + str(pagination.total_count) + ')' pagename = "unread" - - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename, thumbnails=thumbnails) + title=name, page=pagename) def render_archived_books(page, order): @@ -713,9 +692,8 @@ def render_archived_books(page, order): name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" - thumbnails = get_thumbnails_for_books(entries + random if type(random) is list else entries) return render_title_template('index.html', random=random, entries=entries, pagination=pagination, - title=name, page=pagename, thumbnails=thumbnails) + title=name, page=pagename) def render_prepare_search_form(cc): @@ -752,7 +730,6 @@ def render_prepare_search_form(cc): def render_search_results(term, offset=None, order=None, limit=None): join = db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series entries, result_count, pagination = calibre_db.get_search_results(term, offset, order, limit, *join) - thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', searchterm=term, pagination=pagination, @@ -761,8 +738,7 @@ def render_search_results(term, offset=None, order=None, limit=None): entries=entries, result_count=result_count, title=_(u"Search"), - page="search", - thumbnails=thumbnails) + page="search") # ################################### View Books list ################################################################## @@ -973,10 +949,9 @@ def series_list(): .join(db.books_series_link).join(db.Books).filter(calibre_db.common_filters()) \ .group_by(func.upper(func.substr(db.Series.sort, 1, 1))).all() - thumbnails = get_thumbnails_for_book_series(entries) return render_title_template('grid.html', entries=entries, folder='web.books_list', charlist=charlist, title=_(u"Series"), page="serieslist", data="series", bodyClass="grid-view", - order=order_no, thumbnails=thumbnails) + order=order_no) else: abort(404) @@ -1392,17 +1367,13 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): else: offset = 0 limit_all = result_count - - entries = q[offset:limit_all] - thumbnails = get_thumbnails_for_books(entries) return render_title_template('search.html', adv_searchterm=searchterm, pagination=pagination, - entries=entries, + entries=q[offset:limit_all], result_count=result_count, title=_(u"Advanced Search"), - page="advsearch", - thumbnails=thumbnails) + page="advsearch") @web.route("/advsearch", methods=['GET']) @@ -1417,21 +1388,11 @@ def advanced_search_form(): @web.route("/cover/") +@web.route("/cover//") +@web.route("/cover///") @login_required_if_no_ano -def get_cover(book_id): - return get_book_cover(book_id) - - -@web.route("/cached-cover/") -@login_required_if_no_ano -def get_cached_cover(cache_id): - return get_cached_book_cover(cache_id) - - -@web.route("/cached-cover-thumbnail/") -@login_required_if_no_ano -def get_cached_cover_thumbnail(cache_id): - return get_cached_book_cover_thumbnail(cache_id) +def get_cover(book_id, resolution=None, cache_bust=None): + return get_book_cover(book_id, resolution) @web.route("/robots.txt") @@ -1841,7 +1802,6 @@ def show_book(book_id): if media_format.format.lower() in constants.EXTENSIONS_AUDIO: audioentries.append(media_format.format.lower()) - thumbnails = get_thumbnails_for_books([entries]) return render_title_template('detail.html', entry=entries, audioentries=audioentries, @@ -1853,8 +1813,7 @@ def show_book(book_id): is_archived=is_archived, kindle_list=kindle_list, reader_list=reader_list, - page="book", - thumbnails=thumbnails) + page="book") else: log.debug(u"Oops! Selected book title is unavailable. File does not exist or is not accessible") flash(_(u"Oops! Selected book title is unavailable. File does not exist or is not accessible"), From 0bd544704d2060efa544d176b582826838d306ec Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sat, 25 Sep 2021 03:04:38 -0500 Subject: [PATCH 017/412] Added series cover thumbnail generation. Better cache file handling. --- cps/admin.py | 2 +- cps/constants.py | 13 ++ cps/fs.py | 19 ++- cps/helper.py | 57 ++++++- cps/jinjia.py | 43 ++++-- cps/schedule.py | 3 +- cps/tasks/thumbnail.py | 280 ++++++++++++++++++++++++++++++---- cps/templates/author.html | 2 +- cps/templates/book_cover.html | 11 -- cps/templates/book_edit.html | 4 +- cps/templates/detail.html | 2 +- cps/templates/discover.html | 4 +- cps/templates/fragment.html | 2 +- cps/templates/grid.html | 4 +- cps/templates/image.html | 23 +++ cps/templates/index.html | 6 +- cps/templates/layout.html | 2 +- cps/templates/search.html | 4 +- cps/templates/shelf.html | 4 +- cps/ub.py | 5 +- cps/web.py | 32 +++- 21 files changed, 430 insertions(+), 92 deletions(-) delete mode 100644 cps/templates/book_cover.html create mode 100644 cps/templates/image.html diff --git a/cps/admin.py b/cps/admin.py index 98535320f..92c8bd702 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -166,7 +166,7 @@ def clear_cache(): cache_type = request.args.get('cache_type'.strip()) showtext = {} - if cache_type == fs.CACHE_TYPE_THUMBNAILS: + if cache_type == constants.CACHE_TYPE_THUMBNAILS: log.info('clearing cover thumbnail cache') showtext['text'] = _(u'Cleared cover thumbnail cache') helper.clear_cover_thumbnail_cache() diff --git a/cps/constants.py b/cps/constants.py index 6a6b8f2bb..306d28723 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -169,6 +169,19 @@ NIGHTLY_VERSION[1] = '$Format:%cI$' # NIGHTLY_VERSION[0] = 'bb7d2c6273ae4560e83950d36d64533343623a57' # NIGHTLY_VERSION[1] = '2018-09-09T10:13:08+02:00' +# CACHE +CACHE_TYPE_THUMBNAILS = 'thumbnails' + +# Thumbnail Types +THUMBNAIL_TYPE_COVER = 1 +THUMBNAIL_TYPE_SERIES = 2 +THUMBNAIL_TYPE_AUTHOR = 3 + +# Thumbnails Sizes +COVER_THUMBNAIL_ORIGINAL = 0 +COVER_THUMBNAIL_SMALL = 1 +COVER_THUMBNAIL_MEDIUM = 2 +COVER_THUMBNAIL_LARGE = 3 # clean-up the module namespace del sys, os, namedtuple diff --git a/cps/fs.py b/cps/fs.py index 30ab552a9..0171a5d51 100644 --- a/cps/fs.py +++ b/cps/fs.py @@ -19,12 +19,10 @@ from __future__ import division, print_function, unicode_literals from . import logger from .constants import CACHE_DIR -from os import listdir, makedirs, remove +from os import makedirs, remove from os.path import isdir, isfile, join from shutil import rmtree -CACHE_TYPE_THUMBNAILS = 'thumbnails' - class FileSystem: _instance = None @@ -54,8 +52,19 @@ class FileSystem: return path if cache_type else self._cache_dir + def get_cache_file_dir(self, filename, cache_type=None): + path = join(self.get_cache_dir(cache_type), filename[:2]) + if not isdir(path): + try: + makedirs(path) + except OSError: + self.log.info(f'Failed to create path {path} (Permission denied).') + return False + + return path + def get_cache_file_path(self, filename, cache_type=None): - return join(self.get_cache_dir(cache_type), filename) if filename else None + return join(self.get_cache_file_dir(filename, cache_type), filename) if filename else None def get_cache_file_exists(self, filename, cache_type=None): path = self.get_cache_file_path(filename, cache_type) @@ -78,7 +87,7 @@ class FileSystem: return False def delete_cache_file(self, filename, cache_type=None): - path = join(self.get_cache_dir(cache_type), filename) + path = self.get_cache_file_path(filename, cache_type) if isfile(path): try: remove(path) diff --git a/cps/helper.py b/cps/helper.py index 1652be236..2f2df0e07 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -55,7 +55,7 @@ from . import calibre_db from .tasks.convert import TaskConvert from . import logger, config, get_locale, db, fs, ub from . import gdriveutils as gd -from .constants import STATIC_DIR as _STATIC_DIR +from .constants import STATIC_DIR as _STATIC_DIR, CACHE_TYPE_THUMBNAILS, THUMBNAIL_TYPE_COVER, THUMBNAIL_TYPE_SERIES from .subproc_wrapper import process_wait from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS from .tasks.mail import TaskEmail @@ -575,8 +575,9 @@ def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None) thumbnail = get_book_cover_thumbnail(book, resolution) if thumbnail: cache = fs.FileSystem() - if cache.get_cache_file_exists(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): - return send_from_directory(cache.get_cache_dir(fs.CACHE_TYPE_THUMBNAILS), thumbnail.filename) + if cache.get_cache_file_exists(thumbnail.filename, CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), + thumbnail.filename) # Send the book cover from Google Drive if configured if config.config_use_google_drive: @@ -606,14 +607,54 @@ def get_book_cover_internal(book, use_generic_cover_on_failure, resolution=None) def get_book_cover_thumbnail(book, resolution): if book and book.has_cover: - return ub.session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id == book.id)\ - .filter(ub.Thumbnail.resolution == resolution)\ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow()))\ + return ub.session \ + .query(ub.Thumbnail) \ + .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_COVER) \ + .filter(ub.Thumbnail.entity_id == book.id) \ + .filter(ub.Thumbnail.resolution == resolution) \ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ .first() +def get_series_thumbnail_on_failure(series_id, resolution): + book = calibre_db.session \ + .query(db.Books) \ + .join(db.books_series_link) \ + .join(db.Series) \ + .filter(db.Series.id == series_id) \ + .filter(db.Books.has_cover == 1) \ + .first() + + return get_book_cover_internal(book, use_generic_cover_on_failure=True, resolution=resolution) + + +def get_series_cover_thumbnail(series_id, resolution=None): + return get_series_cover_internal(series_id, resolution) + + +def get_series_cover_internal(series_id, resolution=None): + # Send the series thumbnail if it exists in cache + if resolution: + thumbnail = get_series_thumbnail(series_id, resolution) + if thumbnail: + cache = fs.FileSystem() + if cache.get_cache_file_exists(thumbnail.filename, CACHE_TYPE_THUMBNAILS): + return send_from_directory(cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), + thumbnail.filename) + + return get_series_thumbnail_on_failure(series_id, resolution) + + +def get_series_thumbnail(series_id, resolution): + return ub.session \ + .query(ub.Thumbnail) \ + .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_SERIES) \ + .filter(ub.Thumbnail.entity_id == series_id) \ + .filter(ub.Thumbnail.resolution == resolution) \ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ + .first() + + # saves book cover from url def save_cover_from_url(url, book_path): try: diff --git a/cps/jinjia.py b/cps/jinjia.py index 8c8b72a92..1a58416a1 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -32,9 +32,7 @@ from flask import Blueprint, request, url_for from flask_babel import get_locale from flask_login import current_user from markupsafe import escape -from . import logger -from .tasks.thumbnail import THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X, THUMBNAIL_RESOLUTION_3X - +from . import constants, logger jinjia = Blueprint('jinjia', __name__) log = logger.create() @@ -141,17 +139,44 @@ def uuidfilter(var): return uuid4() +@jinjia.app_template_filter('cache_timestamp') +def cache_timestamp(rolling_period='month'): + if rolling_period == 'day': + return str(int(datetime.datetime.today().replace(hour=1, minute=1).timestamp())) + elif rolling_period == 'year': + return str(int(datetime.datetime.today().replace(day=1).timestamp())) + else: + return str(int(datetime.datetime.today().replace(month=1, day=1).timestamp())) + + @jinjia.app_template_filter('last_modified') -def book_cover_cache_id(book): - timestamp = int(book.last_modified.timestamp() * 1000) - return str(timestamp) +def book_last_modified(book): + return str(int(book.last_modified.timestamp())) @jinjia.app_template_filter('get_cover_srcset') def get_cover_srcset(book): srcset = list() - for resolution in [THUMBNAIL_RESOLUTION_1X, THUMBNAIL_RESOLUTION_2X, THUMBNAIL_RESOLUTION_3X]: - timestamp = int(book.last_modified.timestamp() * 1000) - url = url_for('web.get_cover', book_id=book.id, resolution=resolution, cache_bust=str(timestamp)) + resolutions = { + constants.COVER_THUMBNAIL_SMALL: 'sm', + constants.COVER_THUMBNAIL_MEDIUM: 'md', + constants.COVER_THUMBNAIL_LARGE: 'lg' + } + for resolution, shortname in resolutions.items(): + url = url_for('web.get_cover', book_id=book.id, resolution=shortname, c=book_last_modified(book)) + srcset.append(f'{url} {resolution}x') + return ', '.join(srcset) + + +@jinjia.app_template_filter('get_series_srcset') +def get_cover_srcset(series): + srcset = list() + resolutions = { + constants.COVER_THUMBNAIL_SMALL: 'sm', + constants.COVER_THUMBNAIL_MEDIUM: 'md', + constants.COVER_THUMBNAIL_LARGE: 'lg' + } + for resolution, shortname in resolutions.items(): + url = url_for('web.get_series_cover', series_id=series.id, resolution=shortname, c=cache_timestamp()) srcset.append(f'{url} {resolution}x') return ', '.join(srcset) diff --git a/cps/schedule.py b/cps/schedule.py index 8c350bd5d..dc153b9ae 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -21,7 +21,7 @@ from __future__ import division, print_function, unicode_literals from .services.background_scheduler import BackgroundScheduler from .services.worker import WorkerThread from .tasks.database import TaskReconnectDatabase -from .tasks.thumbnail import TaskGenerateCoverThumbnails +from .tasks.thumbnail import TaskGenerateCoverThumbnails, TaskGenerateSeriesThumbnails def register_jobs(): @@ -37,3 +37,4 @@ def register_jobs(): def register_startup_jobs(): WorkerThread.add(None, TaskGenerateCoverThumbnails()) + # WorkerThread.add(None, TaskGenerateSeriesThumbnails()) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 688f6e4b4..152b87727 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -19,10 +19,11 @@ from __future__ import division, print_function, unicode_literals import os +from .. import constants from cps import config, db, fs, gdriveutils, logger, ub from cps.services.worker import CalibreTask from datetime import datetime, timedelta -from sqlalchemy import or_ +from sqlalchemy import func, text, or_ try: from urllib.request import urlopen @@ -35,9 +36,34 @@ try: except (ImportError, RuntimeError) as e: use_IM = False -THUMBNAIL_RESOLUTION_1X = 1 -THUMBNAIL_RESOLUTION_2X = 2 -THUMBNAIL_RESOLUTION_3X = 3 + +def get_resize_height(resolution): + return int(225 * resolution) + + +def get_resize_width(resolution, original_width, original_height): + height = get_resize_height(resolution) + percent = (height / float(original_height)) + width = int((float(original_width) * float(percent))) + return width if width % 2 == 0 else width + 1 + + +def get_best_fit(width, height, image_width, image_height): + resize_width = int(width / 2.0) + resize_height = int(height / 2.0) + aspect_ratio = image_width / image_height + + # If this image's aspect ratio is different than the first image, then resize this image + # to fill the width and height of the first image + if aspect_ratio < width / height: + resize_width = int(width / 2.0) + resize_height = image_height * int(width / 2.0) / image_width + + elif aspect_ratio > width / height: + resize_width = image_width * int(height / 2.0) / image_height + resize_height = int(height / 2.0) + + return {'width': resize_width, 'height': resize_height} class TaskGenerateCoverThumbnails(CalibreTask): @@ -48,8 +74,8 @@ class TaskGenerateCoverThumbnails(CalibreTask): self.calibre_db = db.CalibreDB(expire_on_commit=False) self.cache = fs.FileSystem() self.resolutions = [ - THUMBNAIL_RESOLUTION_1X, - THUMBNAIL_RESOLUTION_2X + constants.COVER_THUMBNAIL_SMALL, + constants.COVER_THUMBNAIL_MEDIUM ] def run(self, worker_thread): @@ -75,7 +101,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): updated += 1 self.update_book_cover_thumbnail(book, thumbnail) - elif not self.cache.get_cache_file_exists(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS): + elif not self.cache.get_cache_file_exists(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS): updated += 1 self.update_book_cover_thumbnail(book, thumbnail) @@ -86,21 +112,23 @@ class TaskGenerateCoverThumbnails(CalibreTask): self.app_db_session.remove() def get_books_with_covers(self): - return self.calibre_db.session\ - .query(db.Books)\ - .filter(db.Books.has_cover == 1)\ + return self.calibre_db.session \ + .query(db.Books) \ + .filter(db.Books.has_cover == 1) \ .all() def get_book_cover_thumbnails(self, book_id): - return self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id == book_id)\ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow()))\ + return self.app_db_session \ + .query(ub.Thumbnail) \ + .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_COVER) \ + .filter(ub.Thumbnail.entity_id == book_id) \ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ .all() def create_book_cover_thumbnail(self, book, resolution): thumbnail = ub.Thumbnail() - thumbnail.book_id = book.id + thumbnail.type = constants.THUMBNAIL_TYPE_COVER + thumbnail.entity_id = book.id thumbnail.format = 'jpeg' thumbnail.resolution = resolution @@ -118,7 +146,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): try: self.app_db_session.commit() - self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + self.cache.delete_cache_file(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) self.generate_book_thumbnail(book, thumbnail) except Exception as ex: self.log.info(u'Error updating book thumbnail: ' + str(ex)) @@ -144,7 +172,8 @@ class TaskGenerateCoverThumbnails(CalibreTask): width = self.get_thumbnail_width(height, img) img.resize(width=width, height=height, filter='lanczos') img.format = thumbnail.format - filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + filename = self.cache.get_cache_file_path(thumbnail.filename, + constants.CACHE_TYPE_THUMBNAILS) img.save(filename=filename) except Exception as ex: # Bubble exception to calling function @@ -158,26 +187,212 @@ class TaskGenerateCoverThumbnails(CalibreTask): raise Exception('Book cover file not found') with Image(filename=book_cover_filepath) as img: - height = self.get_thumbnail_height(thumbnail) + height = get_resize_height(thumbnail.resolution) if img.height > height: - width = self.get_thumbnail_width(height, img) + width = get_resize_width(thumbnail.resolution, img.width, img.height) img.resize(width=width, height=height, filter='lanczos') img.format = thumbnail.format - filename = self.cache.get_cache_file_path(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + filename = self.cache.get_cache_file_path(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) img.save(filename=filename) - def get_thumbnail_height(self, thumbnail): - return int(225 * thumbnail.resolution) - - def get_thumbnail_width(self, height, img): - percent = (height / float(img.height)) - return int((float(img.width) * float(percent))) - @property def name(self): return "ThumbnailsGenerate" +class TaskGenerateSeriesThumbnails(CalibreTask): + def __init__(self, task_message=u'Generating series thumbnails'): + super(TaskGenerateSeriesThumbnails, self).__init__(task_message) + self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() + self.calibre_db = db.CalibreDB(expire_on_commit=False) + self.cache = fs.FileSystem() + self.resolutions = [ + constants.COVER_THUMBNAIL_SMALL, + constants.COVER_THUMBNAIL_MEDIUM + ] + + # get all series + # get all books in series with covers and count >= 4 books + # get the dimensions from the first book in the series & pop the first book from the series list of books + # randomly select three other books in the series + + # resize the covers in the sequence? + # create an image sequence from the 4 selected books of the series + # join pairs of books in the series with wand's concat + # join the two sets of pairs with wand's + + def run(self, worker_thread): + if self.calibre_db.session and use_IM: + all_series = self.get_series_with_four_plus_books() + count = len(all_series) + + updated = 0 + generated = 0 + for i, series in enumerate(all_series): + series_thumbnails = self.get_series_thumbnails(series.id) + series_books = self.get_series_books(series.id) + + # Generate new thumbnails for missing covers + resolutions = list(map(lambda t: t.resolution, series_thumbnails)) + missing_resolutions = list(set(self.resolutions).difference(resolutions)) + for resolution in missing_resolutions: + generated += 1 + self.create_series_thumbnail(series, series_books, resolution) + + # Replace outdated or missing thumbnails + for thumbnail in series_thumbnails: + if any(book.last_modified > thumbnail.generated_at for book in series_books): + updated += 1 + self.update_series_thumbnail(series_books, thumbnail) + + elif not self.cache.get_cache_file_exists(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS): + updated += 1 + self.update_series_thumbnail(series_books, thumbnail) + + self.message = u'Processing series {0} of {1}'.format(i + 1, count) + self.progress = (1.0 / count) * i + + self._handleSuccess() + self.app_db_session.remove() + + def get_series_with_four_plus_books(self): + return self.calibre_db.session \ + .query(db.Series) \ + .join(db.books_series_link) \ + .join(db.Books) \ + .filter(db.Books.has_cover == 1) \ + .group_by(text('books_series_link.series')) \ + .having(func.count('book_series_link') > 3) \ + .all() + + def get_series_books(self, series_id): + return self.calibre_db.session \ + .query(db.Books) \ + .join(db.books_series_link) \ + .join(db.Series) \ + .filter(db.Books.has_cover == 1) \ + .filter(db.Series.id == series_id) \ + .all() + + def get_series_thumbnails(self, series_id): + return self.app_db_session \ + .query(ub.Thumbnail) \ + .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_SERIES) \ + .filter(ub.Thumbnail.entity_id == series_id) \ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ + .all() + + def create_series_thumbnail(self, series, series_books, resolution): + thumbnail = ub.Thumbnail() + thumbnail.type = constants.THUMBNAIL_TYPE_SERIES + thumbnail.entity_id = series.id + thumbnail.format = 'jpeg' + thumbnail.resolution = resolution + + self.app_db_session.add(thumbnail) + try: + self.app_db_session.commit() + self.generate_series_thumbnail(series_books, thumbnail) + except Exception as ex: + self.log.info(u'Error creating book thumbnail: ' + str(ex)) + self._handleError(u'Error creating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def update_series_thumbnail(self, series_books, thumbnail): + thumbnail.generated_at = datetime.utcnow() + + try: + self.app_db_session.commit() + self.cache.delete_cache_file(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) + self.generate_series_thumbnail(series_books, thumbnail) + except Exception as ex: + self.log.info(u'Error updating book thumbnail: ' + str(ex)) + self._handleError(u'Error updating book thumbnail: ' + str(ex)) + self.app_db_session.rollback() + + def generate_series_thumbnail(self, series_books, thumbnail): + books = series_books[:4] + + top = 0 + left = 0 + width = 0 + height = 0 + with Image() as canvas: + for book in books: + if config.config_use_google_drive: + if not gdriveutils.is_gdrive_ready(): + raise Exception('Google Drive is configured but not ready') + + web_content_link = gdriveutils.get_cover_via_gdrive(book.path) + if not web_content_link: + raise Exception('Google Drive cover url not found') + + stream = None + try: + stream = urlopen(web_content_link) + with Image(file=stream) as img: + # Use the first image in this set to determine the width and height to scale the + # other images in this set + if width == 0 or height == 0: + width = get_resize_width(thumbnail.resolution, img.width, img.height) + height = get_resize_height(thumbnail.resolution) + canvas.blank(width, height) + + dimensions = get_best_fit(width, height, img.width, img.height) + + # resize and crop the image + img.resize(width=int(dimensions['width']), height=int(dimensions['height']), filter='lanczos') + img.crop(width=int(width / 2.0), height=int(height / 2.0), gravity='center') + + # add the image to the canvas + canvas.composite(img, left, top) + + except Exception as ex: + self.log.info(u'Error generating thumbnail file: ' + str(ex)) + raise ex + finally: + stream.close() + + book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') + if not os.path.isfile(book_cover_filepath): + raise Exception('Book cover file not found') + + with Image(filename=book_cover_filepath) as img: + # Use the first image in this set to determine the width and height to scale the + # other images in this set + if width == 0 or height == 0: + width = get_resize_width(thumbnail.resolution, img.width, img.height) + height = get_resize_height(thumbnail.resolution) + canvas.blank(width, height) + + dimensions = get_best_fit(width, height, img.width, img.height) + + # resize and crop the image + img.resize(width=int(dimensions['width']), height=int(dimensions['height']), filter='lanczos') + img.crop(width=int(width / 2.0), height=int(height / 2.0), gravity='center') + + # add the image to the canvas + canvas.composite(img, left, top) + + # set the coordinates for the next iteration + if left == 0 and top == 0: + left = int(width / 2.0) + elif left == int(width / 2.0) and top == 0: + left = 0 + top = int(height / 2.0) + else: + left = int(width / 2.0) + + canvas.format = thumbnail.format + filename = self.cache.get_cache_file_path(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) + canvas.save(filename=filename) + + @property + def name(self): + return "SeriesThumbnailGenerate" + + class TaskClearCoverThumbnailCache(CalibreTask): def __init__(self, book_id=None, task_message=u'Clearing cover thumbnail cache'): super(TaskClearCoverThumbnailCache, self).__init__(task_message) @@ -199,21 +414,22 @@ class TaskClearCoverThumbnailCache(CalibreTask): self.app_db_session.remove() def get_thumbnails_for_book(self, book_id): - return self.app_db_session\ - .query(ub.Thumbnail)\ - .filter(ub.Thumbnail.book_id == book_id)\ + return self.app_db_session \ + .query(ub.Thumbnail) \ + .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_COVER) \ + .filter(ub.Thumbnail.entity_id == book_id) \ .all() def delete_thumbnail(self, thumbnail): try: - self.cache.delete_cache_file(thumbnail.filename, fs.CACHE_TYPE_THUMBNAILS) + self.cache.delete_cache_file(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) except Exception as ex: self.log.info(u'Error deleting book thumbnail: ' + str(ex)) self._handleError(u'Error deleting book thumbnail: ' + str(ex)) def delete_all_thumbnails(self): try: - self.cache.delete_cache_dir(fs.CACHE_TYPE_THUMBNAILS) + self.cache.delete_cache_dir(constants.CACHE_TYPE_THUMBNAILS) except Exception as ex: self.log.info(u'Error deleting book thumbnails: ' + str(ex)) self._handleError(u'Error deleting book thumbnails: ' + str(ex)) diff --git a/cps/templates/author.html b/cps/templates/author.html index 2ff1ce7ae..df891d5b2 100644 --- a/cps/templates/author.html +++ b/cps/templates/author.html @@ -37,7 +37,7 @@
- {{ book_cover_image(entry, title=author.name|safe) }} + {{ image.book_cover(entry, title=author.name|safe) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/book_cover.html b/cps/templates/book_cover.html deleted file mode 100644 index 7d3a84f43..000000000 --- a/cps/templates/book_cover.html +++ /dev/null @@ -1,11 +0,0 @@ -{% macro book_cover_image(book, title=None) -%} - {%- set book_title = book.title if book.title else book.name -%} - {%- set book_title = title if title else book_title -%} - {% set srcset = book|get_cover_srcset %} - {{ book_title }} -{%- endmacro %} diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 8525b8e3b..b5f5df7a4 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,10 +1,10 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %} {% if book %}
- {{ book_cover_image(book) }} + {{ image.book_cover(book) }}
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index b538ff9a0..7985691a9 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,7 +4,7 @@
- {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }}
diff --git a/cps/templates/discover.html b/cps/templates/discover.html index 01cd393d4..d697ff0a9 100644 --- a/cps/templates/discover.html +++ b/cps/templates/discover.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %}
@@ -10,7 +10,7 @@ {% if entry.has_cover is defined %} - {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/fragment.html b/cps/templates/fragment.html index 901dd1931..f2e94fb2c 100644 --- a/cps/templates/fragment.html +++ b/cps/templates/fragment.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %}
{% block body %}{% endblock %}
diff --git a/cps/templates/grid.html b/cps/templates/grid.html index 45fb53bf6..b3395fcbf 100644 --- a/cps/templates/grid.html +++ b/cps/templates/grid.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %}

{{_(title)}}

@@ -29,7 +29,7 @@
- {{ book_cover_image(entry[0], title=entry[0].series[0].name|shortentitle) }} + {{ image.series(entry[0].series[0], title=entry[0].series[0].name|shortentitle) }} {{entry.count}} diff --git a/cps/templates/image.html b/cps/templates/image.html new file mode 100644 index 000000000..ae57727b0 --- /dev/null +++ b/cps/templates/image.html @@ -0,0 +1,23 @@ +{% macro book_cover(book, title=None, alt=None) -%} + {%- set image_title = book.title if book.title else book.name -%} + {%- set image_title = title if title else image_title -%} + {%- set image_alt = alt if alt else image_title -%} + {% set srcset = book|get_cover_srcset %} + {{ image_alt }} +{%- endmacro %} + +{% macro series(series, title=None, alt=None) -%} + {%- set image_alt = alt if alt else image_title -%} + {% set srcset = series|get_series_srcset %} + {{ book_title }} +{%- endmacro %} diff --git a/cps/templates/index.html b/cps/templates/index.html index e47c6c703..709d6ce73 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %} {% if g.user.show_detail_random() %} @@ -10,7 +10,7 @@
- {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }} {% if entry.id in read_book_ids %}{% endif %} @@ -87,7 +87,7 @@
- {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 63dc74694..4a664ec1e 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -1,5 +1,5 @@ {% from 'modal_dialogs.html' import restrict_modal, delete_book, filechooser_modal, delete_confirm_modal, change_confirm_modal %} -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} diff --git a/cps/templates/search.html b/cps/templates/search.html index 872b6dc1e..15ff344fb 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %}
@@ -45,7 +45,7 @@ {% if entry.has_cover is defined %} - {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index 0e5865c96..18dbde8b1 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -1,4 +1,4 @@ -{% from 'book_cover.html' import book_cover_image %} +{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %}
@@ -32,7 +32,7 @@
- {{ book_cover_image(entry) }} + {{ image.book_cover(entry) }} {% if entry.id in read_book_ids %}{% endif %} diff --git a/cps/ub.py b/cps/ub.py index f108a1cea..7666f0f29 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -526,10 +526,11 @@ class Thumbnail(Base): __tablename__ = 'thumbnail' id = Column(Integer, primary_key=True) - book_id = Column(Integer) + entity_id = Column(Integer) uuid = Column(String, default=lambda: str(uuid.uuid4()), unique=True) format = Column(String, default='jpeg') - resolution = Column(SmallInteger, default=1) + type = Column(SmallInteger, default=constants.THUMBNAIL_TYPE_COVER) + resolution = Column(SmallInteger, default=constants.COVER_THUMBNAIL_SMALL) filename = Column(String, default=filename) generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) expiration = Column(DateTime, nullable=True) diff --git a/cps/web.py b/cps/web.py index 8f78ff32a..88a5c0abf 100644 --- a/cps/web.py +++ b/cps/web.py @@ -50,8 +50,8 @@ from . import constants, logger, isoLanguages, services from . import babel, db, ub, config, get_locale, app from . import calibre_db from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download -from .helper import check_valid_domain, render_task_status, check_email, check_username, \ - get_cc_columns, get_book_cover, get_download_link, send_mail, generate_random_password, \ +from .helper import check_valid_domain, render_task_status, check_email, check_username, get_cc_columns, \ + get_book_cover, get_series_cover_thumbnail, get_download_link, send_mail, generate_random_password, \ send_registration_mail, check_send_to_kindle, check_read_formats, tags_filters, reset_password, valid_email from .pagination import Pagination from .redirect import redirect_back @@ -1388,11 +1388,31 @@ def advanced_search_form(): @web.route("/cover/") -@web.route("/cover//") -@web.route("/cover///") +@web.route("/cover//") @login_required_if_no_ano -def get_cover(book_id, resolution=None, cache_bust=None): - return get_book_cover(book_id, resolution) +def get_cover(book_id, resolution=None): + resolutions = { + 'og': constants.COVER_THUMBNAIL_ORIGINAL, + 'sm': constants.COVER_THUMBNAIL_SMALL, + 'md': constants.COVER_THUMBNAIL_MEDIUM, + 'lg': constants.COVER_THUMBNAIL_LARGE, + } + cover_resolution = resolutions.get(resolution, None) + return get_book_cover(book_id, cover_resolution) + + +@web.route("/series_cover/") +@web.route("/series_cover//") +@login_required_if_no_ano +def get_series_cover(series_id, resolution=None): + resolutions = { + 'og': constants.COVER_THUMBNAIL_ORIGINAL, + 'sm': constants.COVER_THUMBNAIL_SMALL, + 'md': constants.COVER_THUMBNAIL_MEDIUM, + 'lg': constants.COVER_THUMBNAIL_LARGE, + } + cover_resolution = resolutions.get(resolution, None) + return get_series_cover_thumbnail(series_id, cover_resolution) @web.route("/robots.txt") From 26071d4e7ad1943f91904804fc1b5464866d748b Mon Sep 17 00:00:00 2001 From: mmonkey Date: Sun, 26 Sep 2021 02:02:48 -0500 Subject: [PATCH 018/412] Added Scheduled Tasks Settings --- cps/admin.py | 62 +++++++++++++++++++--------- cps/config_sql.py | 15 +++++-- cps/schedule.py | 19 +++++---- cps/services/background_scheduler.py | 24 +++++++---- cps/tasks/thumbnail.py | 14 +------ cps/templates/admin.html | 43 +++++++++++-------- cps/templates/schedule_edit.html | 38 +++++++++++++++++ 7 files changed, 147 insertions(+), 68 deletions(-) create mode 100644 cps/templates/schedule_edit.html diff --git a/cps/admin.py b/cps/admin.py index 92c8bd702..bd292ba3a 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -159,23 +159,6 @@ def shutdown(): return json.dumps(showtext), 400 -@admi.route("/clear-cache") -@login_required -@admin_required -def clear_cache(): - cache_type = request.args.get('cache_type'.strip()) - showtext = {} - - if cache_type == constants.CACHE_TYPE_THUMBNAILS: - log.info('clearing cover thumbnail cache') - showtext['text'] = _(u'Cleared cover thumbnail cache') - helper.clear_cover_thumbnail_cache() - return json.dumps(showtext) - - showtext['text'] = _(u'Unknown command') - return json.dumps(showtext) - - @admi.route("/admin/view") @login_required @admin_required @@ -205,6 +188,7 @@ def admin(): feature_support=feature_support, kobo_support=kobo_support, title=_(u"Admin page"), page="admin") + @admi.route("/admin/dbconfig", methods=["GET", "POST"]) @login_required @admin_required @@ -245,6 +229,7 @@ def ajax_db_config(): def calibreweb_alive(): return "", 200 + @admi.route("/admin/viewconfig") @login_required @admin_required @@ -257,6 +242,7 @@ def view_configuration(): restrictColumns=restrict_columns, title=_(u"UI Configuration"), page="uiconfig") + @admi.route("/admin/usertable") @login_required @admin_required @@ -339,6 +325,7 @@ def list_users(): response.headers["Content-Type"] = "application/json; charset=utf-8" return response + @admi.route("/ajax/deleteuser", methods=['POST']) @login_required @admin_required @@ -372,6 +359,7 @@ def delete_user(): success.extend(errors) return Response(json.dumps(success), mimetype='application/json') + @admi.route("/ajax/getlocale") @login_required @admin_required @@ -517,6 +505,7 @@ def update_table_settings(): return "Invalid request", 400 return "" + def check_valid_read_column(column): if column != "0": if not calibre_db.session.query(db.Custom_Columns).filter(db.Custom_Columns.id == column) \ @@ -524,6 +513,7 @@ def check_valid_read_column(column): return False return True + def check_valid_restricted_column(column): if column != "0": if not calibre_db.session.query(db.Custom_Columns).filter(db.Custom_Columns.id == column) \ @@ -532,7 +522,6 @@ def check_valid_restricted_column(column): return True - @admi.route("/admin/viewconfig", methods=["POST"]) @login_required @admin_required @@ -564,7 +553,6 @@ def update_view_configuration(): _config_int(to_save, "config_books_per_page") _config_int(to_save, "config_authors_max") - config.config_default_role = constants.selected_roles(to_save) config.config_default_role &= ~constants.ROLE_ANONYMOUS @@ -1210,6 +1198,7 @@ def _db_configuration_update_helper(): config.save() return _db_configuration_result(None, gdrive_error) + def _configuration_update_helper(): reboot_required = False to_save = request.form.to_dict() @@ -1299,6 +1288,7 @@ def _configuration_update_helper(): return _configuration_result(None, reboot_required) + def _configuration_result(error_flash=None, reboot=False): resp = {} if error_flash: @@ -1388,6 +1378,7 @@ def _handle_new_user(to_save, content, languages, translations, kobo_support): log.error("Settings DB is not Writeable") flash(_("Settings DB is not Writeable"), category="error") + def _delete_user(content): if ub.session.query(ub.User).filter(ub.User.role.op('&')(constants.ROLE_ADMIN) == constants.ROLE_ADMIN, ub.User.id != content.id).count(): @@ -1572,6 +1563,39 @@ def update_mailsettings(): return edit_mailsettings() +@admi.route("/admin/scheduledtasks") +@login_required +@admin_required +def edit_scheduledtasks(): + content = config.get_scheduled_task_settings() + return render_title_template("schedule_edit.html", content=content, title=_(u"Edit Scheduled Tasks Settings")) + + +@admi.route("/admin/scheduledtasks", methods=["POST"]) +@login_required +@admin_required +def update_scheduledtasks(): + to_save = request.form.to_dict() + _config_int(to_save, "schedule_start_time") + _config_int(to_save, "schedule_end_time") + _config_checkbox(to_save, "schedule_generate_book_covers") + _config_checkbox(to_save, "schedule_generate_series_covers") + + try: + config.save() + flash(_(u"Scheduled tasks settings updated"), category="success") + except IntegrityError as ex: + ub.session.rollback() + log.error("An unknown error occurred while saving scheduled tasks settings") + flash(_(u"An unknown error occurred. Please try again later."), category="error") + except OperationalError: + ub.session.rollback() + log.error("Settings DB is not Writeable") + flash(_("Settings DB is not Writeable"), category="error") + + return edit_scheduledtasks() + + @admi.route("/admin/user/", methods=["GET", "POST"]) @login_required @admin_required diff --git a/cps/config_sql.py b/cps/config_sql.py index 88107f9b3..4841f03da 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -133,13 +133,18 @@ class _Settings(_Base): config_calibre = Column(String) config_rarfile_location = Column(String, default=None) config_upload_formats = Column(String, default=','.join(constants.EXTENSIONS_UPLOAD)) - config_unicode_filename =Column(Boolean, default=False) + config_unicode_filename = Column(Boolean, default=False) config_updatechannel = Column(Integer, default=constants.UPDATE_STABLE) config_reverse_proxy_login_header_name = Column(String) config_allow_reverse_proxy_header_login = Column(Boolean, default=False) + schedule_start_time = Column(Integer, default=4) + schedule_end_time = Column(Integer, default=6) + schedule_generate_book_covers = Column(Boolean, default=False) + schedule_generate_series_covers = Column(Boolean, default=False) + def __repr__(self): return self.__class__.__name__ @@ -170,7 +175,6 @@ class _ConfigSQL(object): if change: self.save() - def _read_from_storage(self): if self._settings is None: log.debug("_ConfigSQL._read_from_storage") @@ -254,6 +258,8 @@ class _ConfigSQL(object): return bool((self.mail_server != constants.DEFAULT_MAIL_SERVER and self.mail_server_type == 0) or (self.mail_gmail_token != {} and self.mail_server_type == 1)) + def get_scheduled_task_settings(self): + return {k:v for k, v in self.__dict__.items() if k.startswith('schedule_')} def set_from_dictionary(self, dictionary, field, convertor=None, default=None, encode=None): """Possibly updates a field of this object. @@ -289,7 +295,6 @@ class _ConfigSQL(object): storage[k] = v return storage - def load(self): '''Load all configuration values from the underlying storage.''' s = self._read_from_storage() # type: _Settings @@ -407,6 +412,7 @@ def autodetect_calibre_binary(): return element return "" + def autodetect_unrar_binary(): if sys.platform == "win32": calibre_path = ["C:\\program files\\WinRar\\unRAR.exe", @@ -418,6 +424,7 @@ def autodetect_unrar_binary(): return element return "" + def autodetect_kepubify_binary(): if sys.platform == "win32": calibre_path = ["C:\\program files\\kepubify\\kepubify-windows-64Bit.exe", @@ -429,6 +436,7 @@ def autodetect_kepubify_binary(): return element return "" + def _migrate_database(session): # make sure the table is created, if it does not exist _Base.metadata.create_all(session.bind) @@ -452,6 +460,7 @@ def load_configuration(session): # session.commit() return conf + def get_flask_session_key(session): flask_settings = session.query(_Flask_Settings).one_or_none() if flask_settings == None: diff --git a/cps/schedule.py b/cps/schedule.py index dc153b9ae..2cddaecb0 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -19,7 +19,6 @@ from __future__ import division, print_function, unicode_literals from .services.background_scheduler import BackgroundScheduler -from .services.worker import WorkerThread from .tasks.database import TaskReconnectDatabase from .tasks.thumbnail import TaskGenerateCoverThumbnails, TaskGenerateSeriesThumbnails @@ -28,13 +27,19 @@ def register_jobs(): scheduler = BackgroundScheduler() if scheduler: - # Reconnect metadata.db once every 12 hours - scheduler.add_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', hour='4,16') + # Reconnect Calibre database (metadata.db) + scheduler.schedule_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', hour='4,16') - # Generate all missing book cover thumbnails once every 24 hours - scheduler.add_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='cron', hour=4) + # Generate all missing book cover thumbnails + scheduler.schedule_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='cron', hour=4) + + # Generate all missing series thumbnails + scheduler.schedule_task(user=None, task=lambda: TaskGenerateSeriesThumbnails(), trigger='cron', hour=4) def register_startup_jobs(): - WorkerThread.add(None, TaskGenerateCoverThumbnails()) - # WorkerThread.add(None, TaskGenerateSeriesThumbnails()) + scheduler = BackgroundScheduler() + + if scheduler: + scheduler.schedule_task_immediately(None, task=lambda: TaskGenerateCoverThumbnails()) + scheduler.schedule_task_immediately(None, task=lambda: TaskGenerateSeriesThumbnails()) diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py index 1b588ac20..ba5789036 100644 --- a/cps/services/background_scheduler.py +++ b/cps/services/background_scheduler.py @@ -40,25 +40,31 @@ class BackgroundScheduler: if cls._instance is None: cls._instance = super(BackgroundScheduler, cls).__new__(cls) - - scheduler = BScheduler() - atexit.register(lambda: scheduler.shutdown()) - cls.log = logger.create() - cls.scheduler = scheduler + cls.scheduler = BScheduler() cls.scheduler.start() + atexit.register(lambda: cls.scheduler.shutdown()) + return cls._instance - def add(self, func, trigger, **trigger_args): + def _add(self, func, trigger, **trigger_args): if use_APScheduler: return self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) - def add_task(self, user, task, trigger, **trigger_args): + # Expects a lambda expression for the task, so that the task isn't instantiated before the task is scheduled + def schedule_task(self, user, task, trigger, **trigger_args): if use_APScheduler: def scheduled_task(): worker_task = task() - self.log.info(f'Running scheduled task in background: {worker_task.name} - {worker_task.message}') WorkerThread.add(user, worker_task) - return self.add(func=scheduled_task, trigger=trigger, **trigger_args) + return self._add(func=scheduled_task, trigger=trigger, **trigger_args) + + # Expects a lambda expression for the task, so that the task isn't instantiated before the task is scheduled + def schedule_task_immediately(self, user, task): + if use_APScheduler: + def scheduled_task(): + WorkerThread.add(user, task()) + + return self._add(func=scheduled_task, trigger='date') diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 152b87727..a220fd8c6 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -167,9 +167,9 @@ class TaskGenerateCoverThumbnails(CalibreTask): try: stream = urlopen(web_content_link) with Image(file=stream) as img: - height = self.get_thumbnail_height(thumbnail) + height = get_resize_height(thumbnail.resolution) if img.height > height: - width = self.get_thumbnail_width(height, img) + width = get_resize_width(thumbnail.resolution, img.width, img.height) img.resize(width=width, height=height, filter='lanczos') img.format = thumbnail.format filename = self.cache.get_cache_file_path(thumbnail.filename, @@ -212,16 +212,6 @@ class TaskGenerateSeriesThumbnails(CalibreTask): constants.COVER_THUMBNAIL_MEDIUM ] - # get all series - # get all books in series with covers and count >= 4 books - # get the dimensions from the first book in the series & pop the first book from the series list of books - # randomly select three other books in the series - - # resize the covers in the sequence? - # create an image sequence from the 4 selected books of the series - # join pairs of books in the series with wand's concat - # join the two sets of pairs with wand's - def run(self, worker_thread): if self.calibre_db.session and use_IM: all_series = self.get_series_with_four_plus_books() diff --git a/cps/templates/admin.html b/cps/templates/admin.html index 597ba1030..ec0fc84ea 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -156,6 +156,31 @@
+
+
+

{{_('Scheduled Tasks')}}

+
+
+
{{_('Time at which tasks start to run')}}
+
{{config.schedule_start_time}}:00
+
+
+
{{_('Time at which tasks stop running')}}
+
{{config.schedule_end_time}}:00
+
+
+
{{_('Generate book cover thumbnails')}}
+
{{ display_bool_setting(config.schedule_generate_book_covers) }}
+
+
+
{{_('Generate series cover thumbnails')}}
+
{{ display_bool_setting(config.schedule_generate_series_covers) }}
+
+
+ {{_('Edit Scheduled Tasks Settings')}} +
+
+

{{_('Administration')}}

{{_('Download Debug Package')}} @@ -163,7 +188,6 @@
{{_('Reconnect Calibre Database')}}
-
{{_('Clear Cover Thumbnail Cache')}}
{{_('Restart')}}
@@ -248,21 +272,4 @@
- {% endblock %} diff --git a/cps/templates/schedule_edit.html b/cps/templates/schedule_edit.html new file mode 100644 index 000000000..f4e722242 --- /dev/null +++ b/cps/templates/schedule_edit.html @@ -0,0 +1,38 @@ +{% extends "layout.html" %} +{% block header %} + + +{% endblock %} +{% block body %} +
+

{{title}}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + {{_('Cancel')}} +
+
+{% endblock %} From 46205a1f83ec6a81c57d5dd3348ea583f9201063 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Wed, 29 Sep 2021 02:40:12 -0500 Subject: [PATCH 019/412] Made long running tasks cancellable. Added cancel button to cancellable tasks in the task list. Added APP_MODE env variable for determining if the app is running in development, test, or production. --- cps.py | 8 +- cps/admin.py | 23 +++++- cps/constants.py | 7 +- cps/db.py | 6 +- cps/helper.py | 17 +++- cps/schedule.py | 61 ++++++++++++--- cps/services/background_scheduler.py | 35 ++++++--- cps/services/worker.py | 35 +++++++-- cps/static/css/caliBlur.css | 93 +++++++++------------- cps/static/js/main.js | 12 --- cps/static/js/table.js | 34 +++++++- cps/tasks/convert.py | 4 + cps/tasks/database.py | 4 + cps/tasks/mail.py | 6 +- cps/tasks/thumbnail.py | 111 +++++++++++++++++++-------- cps/tasks/upload.py | 4 + cps/templates/admin.html | 2 +- cps/templates/schedule_edit.html | 6 +- cps/templates/tasks.html | 27 +++++++ cps/web.py | 4 +- 20 files changed, 346 insertions(+), 153 deletions(-) diff --git a/cps.py b/cps.py index fe0065519..20a27c719 100755 --- a/cps.py +++ b/cps.py @@ -44,7 +44,7 @@ from cps.editbooks import editbook from cps.remotelogin import remotelogin from cps.search_metadata import meta from cps.error_handler import init_errorhandler -from cps.schedule import register_jobs, register_startup_jobs +from cps.schedule import register_scheduled_tasks, register_startup_tasks try: from cps.kobo import kobo, get_kobo_activated @@ -81,9 +81,9 @@ def main(): if oauth_available: app.register_blueprint(oauth) - # Register scheduled jobs - register_jobs() - # register_startup_jobs() + # Register scheduled tasks + register_scheduled_tasks() + register_startup_tasks() success = web_server.start() sys.exit(0 if success else 1) diff --git a/cps/admin.py b/cps/admin.py index bd292ba3a..62b3dbe0f 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -40,12 +40,13 @@ from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_, text -from . import constants, logger, helper, services, isoLanguages, fs -from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils +from . import constants, logger, helper, services, isoLanguages +from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils, schedule from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash, check_email, \ valid_email, check_username from .gdriveutils import is_gdrive_ready, gdrive_support from .render_template import render_title_template, get_sidebar_config +from .services.worker import WorkerThread from . import debug_info, _BABEL_TRANSLATIONS try: @@ -1568,7 +1569,7 @@ def update_mailsettings(): @admin_required def edit_scheduledtasks(): content = config.get_scheduled_task_settings() - return render_title_template("schedule_edit.html", content=content, title=_(u"Edit Scheduled Tasks Settings")) + return render_title_template("schedule_edit.html", config=content, title=_(u"Edit Scheduled Tasks Settings")) @admi.route("/admin/scheduledtasks", methods=["POST"]) @@ -1584,6 +1585,12 @@ def update_scheduledtasks(): try: config.save() flash(_(u"Scheduled tasks settings updated"), category="success") + + # Cancel any running tasks + schedule.end_scheduled_tasks() + + # Re-register tasks with new settings + schedule.register_scheduled_tasks() except IntegrityError as ex: ub.session.rollback() log.error("An unknown error occurred while saving scheduled tasks settings") @@ -1869,3 +1876,13 @@ def extract_dynamic_field_from_filter(user, filtr): def extract_user_identifier(user, filtr): dynamic_field = extract_dynamic_field_from_filter(user, filtr) return extract_user_data_from_field(user, dynamic_field) + + +@admi.route("/ajax/canceltask", methods=['POST']) +@login_required +@admin_required +def cancel_task(): + task_id = request.get_json().get('task_id', None) + worker = WorkerThread.get_instance() + worker.end_task(task_id) + return "" diff --git a/cps/constants.py b/cps/constants.py index 306d28723..a92a00299 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -24,10 +24,13 @@ from sqlalchemy import __version__ as sql_version sqlalchemy_version2 = ([int(x) for x in sql_version.split('.')] >= [2,0,0]) +# APP_MODE - production, development, or test +APP_MODE = os.environ.get('APP_MODE', 'production') + # if installed via pip this variable is set to true (empty file with name .HOMEDIR present) HOME_CONFIG = os.path.isfile(os.path.join(os.path.dirname(os.path.abspath(__file__)), '.HOMEDIR')) -#In executables updater is not available, so variable is set to False there +# In executables updater is not available, so variable is set to False there UPDATER_AVAILABLE = True # Base dir is parent of current file, necessary if called from different folder @@ -43,7 +46,7 @@ TRANSLATIONS_DIR = os.path.join(BASE_DIR, 'cps', 'translations') # Cache dir - use CACHE_DIR environment variable, otherwise use the default directory: cps/cache DEFAULT_CACHE_DIR = os.path.join(BASE_DIR, 'cps', 'cache') -CACHE_DIR = os.environ.get("CACHE_DIR", DEFAULT_CACHE_DIR) +CACHE_DIR = os.environ.get('CACHE_DIR', DEFAULT_CACHE_DIR) if HOME_CONFIG: home_dir = os.path.join(os.path.expanduser("~"),".calibre-web") diff --git a/cps/db.py b/cps/db.py index 296db7a4a..e4cea1008 100644 --- a/cps/db.py +++ b/cps/db.py @@ -443,11 +443,11 @@ class CalibreDB(): """ self.session = None if self._init: - self.initSession(expire_on_commit) + self.init_session(expire_on_commit) self.instances.add(self) - def initSession(self, expire_on_commit=True): + def init_session(self, expire_on_commit=True): self.session = self.session_factory() self.session.expire_on_commit = expire_on_commit self.update_title_sort(self.config) @@ -593,7 +593,7 @@ class CalibreDB(): autoflush=True, bind=cls.engine)) for inst in cls.instances: - inst.initSession() + inst.init_session() cls._init = True return True diff --git a/cps/helper.py b/cps/helper.py index 2f2df0e07..a221dbb78 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -57,7 +57,8 @@ from . import logger, config, get_locale, db, fs, ub from . import gdriveutils as gd from .constants import STATIC_DIR as _STATIC_DIR, CACHE_TYPE_THUMBNAILS, THUMBNAIL_TYPE_COVER, THUMBNAIL_TYPE_SERIES from .subproc_wrapper import process_wait -from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS +from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS, STAT_ENDED, \ + STAT_CANCELLED from .tasks.mail import TaskEmail from .tasks.thumbnail import TaskClearCoverThumbnailCache @@ -838,12 +839,22 @@ def render_task_status(tasklist): ret['status'] = _(u'Started') elif task.stat == STAT_FINISH_SUCCESS: ret['status'] = _(u'Finished') + elif task.stat == STAT_ENDED: + ret['status'] = _(u'Ended') + elif task.stat == STAT_CANCELLED: + ret['status'] = _(u'Cancelled') else: ret['status'] = _(u'Unknown Status') - ret['taskMessage'] = "{}: {}".format(_(task.name), task.message) + ret['taskMessage'] = "{}: {}".format(_(task.name), task.message) if task.message else _(task.name) ret['progress'] = "{} %".format(int(task.progress * 100)) ret['user'] = escape(user) # prevent xss + + # Hidden fields + ret['id'] = task.id + ret['stat'] = task.stat + ret['is_cancellable'] = task.is_cancellable + renderedtasklist.append(ret) return renderedtasklist @@ -914,5 +925,5 @@ def get_download_link(book_id, book_format, client): abort(404) -def clear_cover_thumbnail_cache(book_id=None): +def clear_cover_thumbnail_cache(book_id): WorkerThread.add(None, TaskClearCoverThumbnailCache(book_id)) diff --git a/cps/schedule.py b/cps/schedule.py index 2cddaecb0..2bb7878f7 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -17,29 +17,70 @@ # along with this program. If not, see . from __future__ import division, print_function, unicode_literals +import datetime +from . import config, constants from .services.background_scheduler import BackgroundScheduler from .tasks.database import TaskReconnectDatabase from .tasks.thumbnail import TaskGenerateCoverThumbnails, TaskGenerateSeriesThumbnails +from .services.worker import WorkerThread -def register_jobs(): +def get_scheduled_tasks(reconnect=True): + tasks = list() + + # Reconnect Calibre database (metadata.db) + if reconnect: + tasks.append(lambda: TaskReconnectDatabase()) + + # Generate all missing book cover thumbnails + if config.schedule_generate_book_covers: + tasks.append(lambda: TaskGenerateCoverThumbnails()) + + # Generate all missing series thumbnails + if config.schedule_generate_series_covers: + tasks.append(lambda: TaskGenerateSeriesThumbnails()) + + return tasks + + +def end_scheduled_tasks(): + worker = WorkerThread.get_instance() + for __, __, __, task in worker.tasks: + if task.scheduled and task.is_cancellable: + worker.end_task(task.id) + + +def register_scheduled_tasks(): scheduler = BackgroundScheduler() if scheduler: - # Reconnect Calibre database (metadata.db) - scheduler.schedule_task(user=None, task=lambda: TaskReconnectDatabase(), trigger='cron', hour='4,16') + # Remove all existing jobs + scheduler.remove_all_jobs() - # Generate all missing book cover thumbnails - scheduler.schedule_task(user=None, task=lambda: TaskGenerateCoverThumbnails(), trigger='cron', hour=4) + start = config.schedule_start_time + end = config.schedule_end_time - # Generate all missing series thumbnails - scheduler.schedule_task(user=None, task=lambda: TaskGenerateSeriesThumbnails(), trigger='cron', hour=4) + # Register scheduled tasks + if start != end: + scheduler.schedule_tasks(tasks=get_scheduled_tasks(), trigger='cron', hour=start) + scheduler.schedule(func=end_scheduled_tasks, trigger='cron', hour=end) + + # Kick-off tasks, if they should currently be running + now = datetime.datetime.now().hour + if start <= now < end: + scheduler.schedule_tasks_immediately(tasks=get_scheduled_tasks(False)) -def register_startup_jobs(): +def register_startup_tasks(): scheduler = BackgroundScheduler() if scheduler: - scheduler.schedule_task_immediately(None, task=lambda: TaskGenerateCoverThumbnails()) - scheduler.schedule_task_immediately(None, task=lambda: TaskGenerateSeriesThumbnails()) + start = config.schedule_start_time + end = config.schedule_end_time + now = datetime.datetime.now().hour + + # Run scheduled tasks immediately for development and testing + # Ignore tasks that should currently be running, as these will be added when registering scheduled tasks + if constants.APP_MODE in ['development', 'test'] and not (start <= now < end): + scheduler.schedule_tasks_immediately(tasks=get_scheduled_tasks(False)) diff --git a/cps/services/background_scheduler.py b/cps/services/background_scheduler.py index ba5789036..971b0bf79 100644 --- a/cps/services/background_scheduler.py +++ b/cps/services/background_scheduler.py @@ -48,23 +48,38 @@ class BackgroundScheduler: return cls._instance - def _add(self, func, trigger, **trigger_args): + def schedule(self, func, trigger, **trigger_args): if use_APScheduler: return self.scheduler.add_job(func=func, trigger=trigger, **trigger_args) - # Expects a lambda expression for the task, so that the task isn't instantiated before the task is scheduled - def schedule_task(self, user, task, trigger, **trigger_args): + # Expects a lambda expression for the task + def schedule_task(self, task, user=None, trigger='cron', **trigger_args): if use_APScheduler: def scheduled_task(): worker_task = task() + worker_task.scheduled = True WorkerThread.add(user, worker_task) + return self.schedule(func=scheduled_task, trigger=trigger, **trigger_args) - return self._add(func=scheduled_task, trigger=trigger, **trigger_args) - - # Expects a lambda expression for the task, so that the task isn't instantiated before the task is scheduled - def schedule_task_immediately(self, user, task): + # Expects a list of lambda expressions for the tasks + def schedule_tasks(self, tasks, user=None, trigger='cron', **trigger_args): if use_APScheduler: - def scheduled_task(): - WorkerThread.add(user, task()) + for task in tasks: + self.schedule_task(task, user=user, trigger=trigger, **trigger_args) - return self._add(func=scheduled_task, trigger='date') + # Expects a lambda expression for the task + def schedule_task_immediately(self, task, user=None): + if use_APScheduler: + def immediate_task(): + WorkerThread.add(user, task()) + return self.schedule(func=immediate_task, trigger='date') + + # Expects a list of lambda expressions for the tasks + def schedule_tasks_immediately(self, tasks, user=None): + if use_APScheduler: + for task in tasks: + self.schedule_task_immediately(task, user) + + # Remove all jobs + def remove_all_jobs(self): + self.scheduler.remove_all_jobs() diff --git a/cps/services/worker.py b/cps/services/worker.py index 97068f742..04a4c056b 100644 --- a/cps/services/worker.py +++ b/cps/services/worker.py @@ -21,6 +21,8 @@ STAT_WAITING = 0 STAT_FAIL = 1 STAT_STARTED = 2 STAT_FINISH_SUCCESS = 3 +STAT_ENDED = 4 +STAT_CANCELLED = 5 # Only retain this many tasks in dequeued list TASK_CLEANUP_TRIGGER = 20 @@ -50,7 +52,7 @@ class WorkerThread(threading.Thread): _instance = None @classmethod - def getInstance(cls): + def get_instance(cls): if cls._instance is None: cls._instance = WorkerThread() return cls._instance @@ -67,12 +69,13 @@ class WorkerThread(threading.Thread): @classmethod def add(cls, user, task): - ins = cls.getInstance() + ins = cls.get_instance() ins.num += 1 - log.debug("Add Task for user: {}: {}".format(user, task)) + username = user if user is not None else 'System' + log.debug("Add Task for user: {}: {}".format(username, task)) ins.queue.put(QueuedTask( num=ins.num, - user=user, + user=username, added=datetime.now(), task=task, )) @@ -134,6 +137,12 @@ class WorkerThread(threading.Thread): self.queue.task_done() + def end_task(self, task_id): + ins = self.get_instance() + for __, __, __, task in ins.tasks: + if str(task.id) == str(task_id) and task.is_cancellable: + task.stat = STAT_CANCELLED if task.stat == STAT_WAITING else STAT_ENDED + class CalibreTask: __metaclass__ = abc.ABCMeta @@ -147,10 +156,11 @@ class CalibreTask: self.message = message self.id = uuid.uuid4() self.self_cleanup = False + self._scheduled = False @abc.abstractmethod def run(self, worker_thread): - """Provides the caller some human-readable name for this class""" + """The main entry-point for this task""" raise NotImplementedError @abc.abstractmethod @@ -158,6 +168,11 @@ class CalibreTask: """Provides the caller some human-readable name for this class""" raise NotImplementedError + @abc.abstractmethod + def is_cancellable(self): + """Does this task gracefully handle being cancelled (STAT_ENDED, STAT_CANCELLED)?""" + raise NotImplementedError + def start(self, *args): self.start_time = datetime.now() self.stat = STAT_STARTED @@ -208,7 +223,7 @@ class CalibreTask: We have a separate dictating this because there may be certain tasks that want to override this """ # By default, we're good to clean a task if it's "Done" - return self.stat in (STAT_FINISH_SUCCESS, STAT_FAIL) + return self.stat in (STAT_FINISH_SUCCESS, STAT_FAIL, STAT_ENDED, STAT_CANCELLED) '''@progress.setter def progress(self, x): @@ -226,6 +241,14 @@ class CalibreTask: def self_cleanup(self, is_self_cleanup): self._self_cleanup = is_self_cleanup + @property + def scheduled(self): + return self._scheduled + + @scheduled.setter + def scheduled(self, is_scheduled): + self._scheduled = is_scheduled + def _handleError(self, error_message): self.stat = STAT_FAIL self.progress = 1 diff --git a/cps/static/css/caliBlur.css b/cps/static/css/caliBlur.css index b4fa60450..b2b354234 100644 --- a/cps/static/css/caliBlur.css +++ b/cps/static/css/caliBlur.css @@ -5150,7 +5150,7 @@ body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-head pointer-events: none } -#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #ClearCacheDialog:hover:before, #deleteButton, #deleteModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { +#DeleteDomain:hover:before, #RestartDialog:hover:before, #ShutdownDialog:hover:before, #StatusDialog:hover:before, #deleteButton, #deleteModal:hover:before, #cancelTaskModal:hover:before, body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover td > a:hover { cursor: pointer } @@ -5237,6 +5237,10 @@ body.admin > div.container-fluid > div > div.col-sm-10 > div.container-fluid > d margin-bottom: 20px } +body.admin > div.container-fluid div.scheduled_tasks_details { + margin-bottom: 20px +} + body.admin .btn-default { margin-bottom: 10px } @@ -5468,7 +5472,7 @@ body.admin.modal-open .navbar { z-index: 0 !important } -#RestartDialog, #ShutdownDialog, #StatusDialog, #ClearCacheDialog, #deleteModal { +#RestartDialog, #ShutdownDialog, #StatusDialog, #deleteModal, #cancelTaskModal { top: 0; overflow: hidden; padding-top: 70px; @@ -5478,7 +5482,7 @@ body.admin.modal-open .navbar { background: rgba(0, 0, 0, .5) } -#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #ClearCacheDialog:before, #deleteModal:before { +#RestartDialog:before, #ShutdownDialog:before, #StatusDialog:before, #deleteModal:before, #cancelTaskModal:before { content: "\E208"; padding-right: 10px; display: block; @@ -5500,18 +5504,18 @@ body.admin.modal-open .navbar { z-index: 99 } -#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { +#RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before, #cancelTaskModal.in:before { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0) } -#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { +#RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog, #cancelTaskModal > .modal-dialog { width: 450px; margin: auto } -#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { +#RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content, #cancelTaskModal > .modal-dialog > .modal-content { max-height: calc(100% - 90px); -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); @@ -5522,7 +5526,7 @@ body.admin.modal-open .navbar { width: 450px } -#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header { +#RestartDialog > .modal-dialog > .modal-content > .modal-header, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header, #StatusDialog > .modal-dialog > .modal-content > .modal-header, #deleteModal > .modal-dialog > .modal-content > .modal-header, #cancelTaskModal > .modal-dialog > .modal-content > .modal-header { padding: 15px 20px; border-radius: 3px 3px 0 0; line-height: 1.71428571; @@ -5535,7 +5539,7 @@ body.admin.modal-open .navbar { text-align: left } -#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before { +#RestartDialog > .modal-dialog > .modal-content > .modal-header:before, #ShutdownDialog > .modal-dialog > .modal-content > .modal-header:before, #StatusDialog > .modal-dialog > .modal-content > .modal-header:before, #deleteModal > .modal-dialog > .modal-content > .modal-header:before, #cancelTaskModal > .modal-dialog > .modal-content > .modal-header:before { padding-right: 10px; font-size: 18px; color: #999; @@ -5559,12 +5563,12 @@ body.admin.modal-open .navbar { font-family: plex-icons-new, serif } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:before { - content: "\EA15"; +#deleteModal > .modal-dialog > .modal-content > .modal-header:before { + content: "\EA6D"; font-family: plex-icons-new, serif } -#deleteModal > .modal-dialog > .modal-content > .modal-header:before { +#cancelTaskModal > .modal-dialog > .modal-content > .modal-header:before { content: "\EA6D"; font-family: plex-icons-new, serif } @@ -5587,19 +5591,19 @@ body.admin.modal-open .navbar { font-size: 20px } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-header:after { - content: "Clear Cover Thumbnail Cache"; - display: inline-block; - font-size: 20px -} - #deleteModal > .modal-dialog > .modal-content > .modal-header:after { content: "Delete Book"; display: inline-block; font-size: 20px } -#StatusDialog > .modal-dialog > .modal-content > .modal-header > span, #deleteModal > .modal-dialog > .modal-content > .modal-header > span, #loader > center > img, .rating-mobile { +#cancelTaskModal > .modal-dialog > .modal-content > .modal-header:after { + content: "Delete Book"; + display: inline-block; + font-size: 20px +} + +#StatusDialog > .modal-dialog > .modal-content > .modal-header > span, #deleteModal > .modal-dialog > .modal-content > .modal-header > span, #cancelTaskModal > .modal-dialog > .modal-content > .modal-header > span, #loader > center > img, .rating-mobile { display: none } @@ -5613,7 +5617,7 @@ body.admin.modal-open .navbar { text-align: left } -#ShutdownDialog > .modal-dialog > .modal-content > .modal-body, #StatusDialog > .modal-dialog > .modal-content > .modal-body, #deleteModal > .modal-dialog > .modal-content > .modal-body { +#ShutdownDialog > .modal-dialog > .modal-content > .modal-body, #StatusDialog > .modal-dialog > .modal-content > .modal-body, #deleteModal > .modal-dialog > .modal-content > .modal-body, #cancelTaskModal > .modal-dialog > .modal-content > .modal-body { padding: 20px 20px 40px; font-size: 16px; line-height: 1.6em; @@ -5623,17 +5627,7 @@ body.admin.modal-open .navbar { text-align: left } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body { - padding: 20px 20px 10px; - font-size: 16px; - line-height: 1.6em; - font-family: Open Sans Regular, Helvetica Neue, Helvetica, Arial, sans-serif; - color: #eee; - background: #282828; - text-align: left -} - -#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > p, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > p, #StatusDialog > .modal-dialog > .modal-content > .modal-body > p, #deleteModal > .modal-dialog > .modal-content > .modal-body > p, #cancelTaskModal > .modal-dialog > .modal-content > .modal-body > p { padding: 20px 20px 0 0; font-size: 16px; line-height: 1.6em; @@ -5642,7 +5636,7 @@ body.admin.modal-open .navbar { background: #282828 } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart), #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown), #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default, #cancelTaskModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { float: right; z-index: 9; position: relative; @@ -5678,11 +5672,11 @@ body.admin.modal-open .navbar { border-radius: 3px } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > #clear_cache { +#deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-danger { float: right; z-index: 9; position: relative; - margin: 25px 0 0 10px; + margin: 0 0 0 10px; min-width: 80px; padding: 10px 18px; font-size: 16px; @@ -5690,7 +5684,7 @@ body.admin.modal-open .navbar { border-radius: 3px } -#deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-danger { +#cancelTaskModal > .modal-dialog > .modal-content > .modal-footer > .btn-danger { float: right; z-index: 9; position: relative; @@ -5710,15 +5704,15 @@ body.admin.modal-open .navbar { margin: 55px 0 0 10px } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache) { - margin: 25px 0 0 10px -} - #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { margin: 0 0 0 10px } -#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #ClearCacheDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#clear_cache):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { +#cancelTaskModal > .modal-dialog > .modal-content > .modal-footer > .btn-default { + margin: 0 0 0 10px +} + +#RestartDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#restart):hover, #ShutdownDialog > .modal-dialog > .modal-content > .modal-body > .btn-default:not(#shutdown):hover, #deleteModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover, #cancelTaskModal > .modal-dialog > .modal-content > .modal-footer > .btn-default:hover { background-color: hsla(0, 0%, 100%, .3) } @@ -5752,21 +5746,6 @@ body.admin.modal-open .navbar { box-shadow: 0 5px 15px rgba(0, 0, 0, .5) } -#ClearCacheDialog > .modal-dialog > .modal-content > .modal-body:after { - content: ''; - position: absolute; - width: 100%; - height: 72px; - background-color: #323232; - border-radius: 0 0 3px 3px; - left: 0; - margin-top: 10px; - z-index: 0; - border-top: 1px solid #222; - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5) -} - #deleteButton { position: fixed; top: 60px; @@ -7355,11 +7334,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. background-color: transparent !important } - #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #ClearCacheDialog > .modal-dialog, #deleteModal > .modal-dialog { + #RestartDialog > .modal-dialog, #ShutdownDialog > .modal-dialog, #StatusDialog > .modal-dialog, #deleteModal > .modal-dialog, #cancelTaskModal > .modal-dialog { max-width: calc(100vw - 40px) } - #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #ClearCacheDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content { + #RestartDialog > .modal-dialog > .modal-content, #ShutdownDialog > .modal-dialog > .modal-content, #StatusDialog > .modal-dialog > .modal-content, #deleteModal > .modal-dialog > .modal-content, #cancelTaskModal > .modal-dialog > .modal-content { max-width: calc(100vw - 40px); left: 0 } @@ -7509,7 +7488,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div. padding: 30px 15px } - #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #ClearCacheDialog.in:before, #deleteModal.in:before { + #RestartDialog.in:before, #ShutdownDialog.in:before, #StatusDialog.in:before, #deleteModal.in:before, #cancelTaskModal.in:before { left: auto; right: 34px } diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 5537d189d..988e3b9f7 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -454,18 +454,6 @@ $(function() { } }); }); - $("#clear_cache").click(function () { - $("#spinner3").show(); - $.ajax({ - dataType: "json", - url: window.location.pathname + "/../../clear-cache", - data: {"cache_type":"thumbnails"}, - success: function(data) { - $("#spinner3").hide(); - $("#ClearCacheDialog").modal("hide"); - } - }); - }); // Init all data control handlers to default $("input[data-control]").trigger("change"); diff --git a/cps/static/js/table.js b/cps/static/js/table.js index a55ec5d13..dc4ab4ab6 100644 --- a/cps/static/js/table.js +++ b/cps/static/js/table.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -/* exported TableActions, RestrictionActions, EbookActions, responseHandler */ +/* exported TableActions, RestrictionActions, EbookActions, TaskActions, responseHandler */ /* global getPath, confirmDialog */ var selections = []; @@ -42,6 +42,24 @@ $(function() { }, 1000); } + $("#cancel_task_confirm").click(function() { + //get data-id attribute of the clicked element + var taskId = $(this).data("task-id"); + $.ajax({ + method: "post", + contentType: "application/json; charset=utf-8", + dataType: "json", + url: window.location.pathname + "/../ajax/canceltask", + data: JSON.stringify({"task_id": taskId}), + }); + }); + //triggered when modal is about to be shown + $("#cancelTaskModal").on("show.bs.modal", function(e) { + //get data-id attribute of the clicked element and store in button + var taskId = $(e.relatedTarget).data("task-id"); + $(e.currentTarget).find("#cancel_task_confirm").data("task-id", taskId); + }); + $("#books-table").on("check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table", function (e, rowsAfter, rowsBefore) { var rows = rowsAfter; @@ -576,6 +594,7 @@ function handle_header_buttons () { $(".header_select").removeAttr("disabled"); } } + /* Function for deleting domain restrictions */ function TableActions (value, row) { return [ @@ -613,6 +632,19 @@ function UserActions (value, row) { ].join(""); } +/* Function for cancelling tasks */ +function TaskActions (value, row) { + var cancellableStats = [0, 1, 2]; + if (row.id && row.is_cancellable && cancellableStats.includes(row.stat)) { + return [ + "
", + "", + "
" + ].join(""); + } + return ''; +} + /* Function for keeping checked rows */ function responseHandler(res) { $.each(res.rows, function (i, row) { diff --git a/cps/tasks/convert.py b/cps/tasks/convert.py index 56cc7076d..f150a3976 100644 --- a/cps/tasks/convert.py +++ b/cps/tasks/convert.py @@ -234,3 +234,7 @@ class TaskConvert(CalibreTask): @property def name(self): return "Convert" + + @property + def is_cancellable(self): + return False diff --git a/cps/tasks/database.py b/cps/tasks/database.py index 11f0186d4..0441d5641 100644 --- a/cps/tasks/database.py +++ b/cps/tasks/database.py @@ -47,3 +47,7 @@ class TaskReconnectDatabase(CalibreTask): @property def name(self): return "Reconnect Database" + + @property + def is_cancellable(self): + return False diff --git a/cps/tasks/mail.py b/cps/tasks/mail.py index 292114d5a..24064bd39 100644 --- a/cps/tasks/mail.py +++ b/cps/tasks/mail.py @@ -162,7 +162,6 @@ class TaskEmail(CalibreTask): log.debug_or_exception(ex) self._handleError(u'Error sending e-mail: {}'.format(ex)) - def send_standard_email(self, msg): use_ssl = int(self.settings.get('mail_use_ssl', 0)) timeout = 600 # set timeout to 5mins @@ -218,7 +217,6 @@ class TaskEmail(CalibreTask): self.asyncSMTP = None self._progress = x - @classmethod def _get_attachment(cls, bookpath, filename): """Get file as MIMEBase message""" @@ -260,5 +258,9 @@ class TaskEmail(CalibreTask): def name(self): return "E-mail" + @property + def is_cancellable(self): + return False + def __str__(self): return "{}, {}".format(self.name, self.subject) diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index a220fd8c6..d147f10d8 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) -# Copyright (C) 2020 mmonkey +# Copyright (C) 2020 monkey # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,8 +21,8 @@ import os from .. import constants from cps import config, db, fs, gdriveutils, logger, ub -from cps.services.worker import CalibreTask -from datetime import datetime, timedelta +from cps.services.worker import CalibreTask, STAT_CANCELLED, STAT_ENDED +from datetime import datetime from sqlalchemy import func, text, or_ try: @@ -67,7 +67,7 @@ def get_best_fit(width, height, image_width, image_height): class TaskGenerateCoverThumbnails(CalibreTask): - def __init__(self, task_message=u'Generating cover thumbnails'): + def __init__(self, task_message=''): super(TaskGenerateCoverThumbnails, self).__init__(task_message) self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -79,13 +79,14 @@ class TaskGenerateCoverThumbnails(CalibreTask): ] def run(self, worker_thread): - if self.calibre_db.session and use_IM: + if self.calibre_db.session and use_IM and self.stat != STAT_CANCELLED and self.stat != STAT_ENDED: + self.message = 'Scanning Books' books_with_covers = self.get_books_with_covers() count = len(books_with_covers) - updated = 0 - generated = 0 + total_generated = 0 for i, book in enumerate(books_with_covers): + generated = 0 book_cover_thumbnails = self.get_book_cover_thumbnails(book.id) # Generate new thumbnails for missing covers @@ -98,16 +99,32 @@ class TaskGenerateCoverThumbnails(CalibreTask): # Replace outdated or missing thumbnails for thumbnail in book_cover_thumbnails: if book.last_modified > thumbnail.generated_at: - updated += 1 + generated += 1 self.update_book_cover_thumbnail(book, thumbnail) elif not self.cache.get_cache_file_exists(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS): - updated += 1 + generated += 1 self.update_book_cover_thumbnail(book, thumbnail) - self.message = u'Processing book {0} of {1}'.format(i + 1, count) + # Increment the progress self.progress = (1.0 / count) * i + if generated > 0: + total_generated += generated + self.message = u'Generated {0} cover thumbnails'.format(total_generated) + + # Check if job has been cancelled or ended + if self.stat == STAT_CANCELLED: + self.log.info(f'GenerateCoverThumbnails task has been cancelled.') + return + + if self.stat == STAT_ENDED: + self.log.info(f'GenerateCoverThumbnails task has been ended.') + return + + if total_generated == 0: + self.self_cleanup = True + self._handleSuccess() self.app_db_session.remove() @@ -180,7 +197,8 @@ class TaskGenerateCoverThumbnails(CalibreTask): self.log.info(u'Error generating thumbnail file: ' + str(ex)) raise ex finally: - stream.close() + if stream is not None: + stream.close() else: book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') if not os.path.isfile(book_cover_filepath): @@ -197,11 +215,15 @@ class TaskGenerateCoverThumbnails(CalibreTask): @property def name(self): - return "ThumbnailsGenerate" + return 'GenerateCoverThumbnails' + + @property + def is_cancellable(self): + return True class TaskGenerateSeriesThumbnails(CalibreTask): - def __init__(self, task_message=u'Generating series thumbnails'): + def __init__(self, task_message=''): super(TaskGenerateSeriesThumbnails, self).__init__(task_message) self.log = logger.create() self.app_db_session = ub.get_new_session_instance() @@ -209,17 +231,18 @@ class TaskGenerateSeriesThumbnails(CalibreTask): self.cache = fs.FileSystem() self.resolutions = [ constants.COVER_THUMBNAIL_SMALL, - constants.COVER_THUMBNAIL_MEDIUM + constants.COVER_THUMBNAIL_MEDIUM, ] def run(self, worker_thread): - if self.calibre_db.session and use_IM: + if self.calibre_db.session and use_IM and self.stat != STAT_CANCELLED and self.stat != STAT_ENDED: + self.message = 'Scanning Series' all_series = self.get_series_with_four_plus_books() count = len(all_series) - updated = 0 - generated = 0 + total_generated = 0 for i, series in enumerate(all_series): + generated = 0 series_thumbnails = self.get_series_thumbnails(series.id) series_books = self.get_series_books(series.id) @@ -233,16 +256,32 @@ class TaskGenerateSeriesThumbnails(CalibreTask): # Replace outdated or missing thumbnails for thumbnail in series_thumbnails: if any(book.last_modified > thumbnail.generated_at for book in series_books): - updated += 1 + generated += 1 self.update_series_thumbnail(series_books, thumbnail) elif not self.cache.get_cache_file_exists(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS): - updated += 1 + generated += 1 self.update_series_thumbnail(series_books, thumbnail) - self.message = u'Processing series {0} of {1}'.format(i + 1, count) + # Increment the progress self.progress = (1.0 / count) * i + if generated > 0: + total_generated += generated + self.message = u'Generated {0} series thumbnails'.format(total_generated) + + # Check if job has been cancelled or ended + if self.stat == STAT_CANCELLED: + self.log.info(f'GenerateSeriesThumbnails task has been cancelled.') + return + + if self.stat == STAT_ENDED: + self.log.info(f'GenerateSeriesThumbnails task has been ended.') + return + + if total_generated == 0: + self.self_cleanup = True + self._handleSuccess() self.app_db_session.remove() @@ -302,7 +341,8 @@ class TaskGenerateSeriesThumbnails(CalibreTask): self.app_db_session.rollback() def generate_series_thumbnail(self, series_books, thumbnail): - books = series_books[:4] + # Get the last four books in the series based on series_index + books = sorted(series_books, key=lambda b: float(b.series_index), reverse=True)[:4] top = 0 left = 0 @@ -342,7 +382,8 @@ class TaskGenerateSeriesThumbnails(CalibreTask): self.log.info(u'Error generating thumbnail file: ' + str(ex)) raise ex finally: - stream.close() + if stream is not None: + stream.close() book_cover_filepath = os.path.join(config.config_calibre_dir, book.path, 'cover.jpg') if not os.path.isfile(book_cover_filepath): @@ -380,11 +421,15 @@ class TaskGenerateSeriesThumbnails(CalibreTask): @property def name(self): - return "SeriesThumbnailGenerate" + return 'GenerateSeriesThumbnails' + + @property + def is_cancellable(self): + return True class TaskClearCoverThumbnailCache(CalibreTask): - def __init__(self, book_id=None, task_message=u'Clearing cover thumbnail cache'): + def __init__(self, book_id, task_message=u'Clearing cover thumbnail cache'): super(TaskClearCoverThumbnailCache, self).__init__(task_message) self.log = logger.create() self.book_id = book_id @@ -397,8 +442,6 @@ class TaskClearCoverThumbnailCache(CalibreTask): thumbnails = self.get_thumbnails_for_book(self.book_id) for thumbnail in thumbnails: self.delete_thumbnail(thumbnail) - else: - self.delete_all_thumbnails() self._handleSuccess() self.app_db_session.remove() @@ -411,19 +454,19 @@ class TaskClearCoverThumbnailCache(CalibreTask): .all() def delete_thumbnail(self, thumbnail): + thumbnail.expiration = datetime.utcnow() + try: + self.app_db_session.commit() self.cache.delete_cache_file(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS) except Exception as ex: self.log.info(u'Error deleting book thumbnail: ' + str(ex)) self._handleError(u'Error deleting book thumbnail: ' + str(ex)) - def delete_all_thumbnails(self): - try: - self.cache.delete_cache_dir(constants.CACHE_TYPE_THUMBNAILS) - except Exception as ex: - self.log.info(u'Error deleting book thumbnails: ' + str(ex)) - self._handleError(u'Error deleting book thumbnails: ' + str(ex)) - @property def name(self): - return "ThumbnailsClear" + return 'ThumbnailsClear' + + @property + def is_cancellable(self): + return False diff --git a/cps/tasks/upload.py b/cps/tasks/upload.py index d7ef34c21..9f58bf165 100644 --- a/cps/tasks/upload.py +++ b/cps/tasks/upload.py @@ -16,3 +16,7 @@ class TaskUpload(CalibreTask): @property def name(self): return "Upload" + + @property + def is_cancellable(self): + return False diff --git a/cps/templates/admin.html b/cps/templates/admin.html index ec0fc84ea..3fd55ae21 100644 --- a/cps/templates/admin.html +++ b/cps/templates/admin.html @@ -159,7 +159,7 @@

{{_('Scheduled Tasks')}}

-
+
{{_('Time at which tasks start to run')}}
{{config.schedule_start_time}}:00
diff --git a/cps/templates/schedule_edit.html b/cps/templates/schedule_edit.html index f4e722242..71bb2d1a2 100644 --- a/cps/templates/schedule_edit.html +++ b/cps/templates/schedule_edit.html @@ -11,7 +11,7 @@
@@ -19,12 +19,12 @@
- +
diff --git a/cps/templates/tasks.html b/cps/templates/tasks.html index c13ddff9d..b36a6daaf 100644 --- a/cps/templates/tasks.html +++ b/cps/templates/tasks.html @@ -16,6 +16,9 @@ {{_('Progress')}} {{_('Run Time')}} {{_('Start Time')}} + {% if g.user.role_admin() %} + {{_('Actions')}} + {% endif %} @@ -23,6 +26,30 @@
{% endblock %} +{% block modal %} +{{ delete_book() }} +{% if g.user.role_admin() %} + +{% endif %} +{% endblock %} {% block js %} diff --git a/cps/web.py b/cps/web.py index 88a5c0abf..c5ad22654 100644 --- a/cps/web.py +++ b/cps/web.py @@ -124,7 +124,7 @@ def viewer_required(f): @web.route("/ajax/emailstat") @login_required def get_email_status_json(): - tasks = WorkerThread.getInstance().tasks + tasks = WorkerThread.get_instance().tasks return jsonify(render_task_status(tasks)) @@ -1055,7 +1055,7 @@ def category_list(): @login_required def get_tasks_status(): # if current user admin, show all email, otherwise only own emails - tasks = WorkerThread.getInstance().tasks + tasks = WorkerThread.get_instance().tasks answer = render_task_status(tasks) return render_title_template('tasks.html', entries=answer, title=_(u"Tasks"), page="tasks") From 9e7f69e38a2958d63d1c0a1299687d82ff686417 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Wed, 29 Sep 2021 03:01:28 -0500 Subject: [PATCH 020/412] Updated series cache timeout to one day --- cps/templates/image.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/templates/image.html b/cps/templates/image.html index ae57727b0..728384a10 100644 --- a/cps/templates/image.html +++ b/cps/templates/image.html @@ -16,7 +16,7 @@ {% set srcset = series|get_series_srcset %} {{ book_title }} From cd3791f5f4b85581705117dcaff9f18bbe052336 Mon Sep 17 00:00:00 2001 From: mmonkey Date: Thu, 30 Sep 2021 01:43:31 -0500 Subject: [PATCH 021/412] Always use full-sized image for book edit and details pages --- cps/__init__.py | 3 +-- cps/admin.py | 2 +- cps/templates/book_edit.html | 4 ++-- cps/templates/detail.html | 3 ++- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cps/__init__.py b/cps/__init__.py index 838da5b4e..af4a82e88 100644 --- a/cps/__init__.py +++ b/cps/__init__.py @@ -114,9 +114,8 @@ def create_app(): if os.environ.get('FLASK_DEBUG'): cache_buster.init_cache_busting(app) - cache_buster.init_cache_busting(app) - log.info('Starting Calibre Web...') + Principal(app) lm.init_app(app) app.secret_key = os.getenv('SECRET_KEY', config_sql.get_flask_session_key(ub.session)) diff --git a/cps/admin.py b/cps/admin.py index 62b3dbe0f..4d168aa08 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -40,7 +40,7 @@ from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError from sqlalchemy.sql.expression import func, or_, text -from . import constants, logger, helper, services, isoLanguages +from . import constants, logger, helper, services from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils, schedule from .helper import check_valid_domain, send_test_mail, reset_password, generate_password_hash, check_email, \ valid_email, check_username diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index b5f5df7a4..12d3bd077 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -1,10 +1,10 @@ -{% import 'image.html' as image %} {% extends "layout.html" %} {% block body %} {% if book %}
- {{ image.book_cover(book) }} + +
{% if g.user.role_delete_books() %}
diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 7985691a9..19cd079e3 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -4,7 +4,8 @@
- {{ image.book_cover(entry) }} + +
From 917909cfdb931a608319a57cbfe70e72a9217116 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 24 Oct 2021 09:48:29 +0200 Subject: [PATCH 022/412] Refactored books detail page --- cps/db.py | 52 +++++++++++++++++++++++--------- cps/editbooks.py | 6 ++-- cps/templates/detail.html | 30 +++++++++---------- cps/web.py | 63 +++++++++++++-------------------------- 4 files changed, 76 insertions(+), 75 deletions(-) diff --git a/cps/db.py b/cps/db.py index d8709335b..dc985167c 100644 --- a/cps/db.py +++ b/cps/db.py @@ -39,9 +39,8 @@ except ImportError: from sqlalchemy.pool import StaticPool from sqlalchemy.sql.expression import and_, true, false, text, func, or_ from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy.orm import joinedload from flask_login import current_user -from babel import Locale as LC -from babel.core import UnknownLocaleError from flask_babel import gettext as _ from flask import flash @@ -338,15 +337,15 @@ class Books(Base): isbn = Column(String(collation='NOCASE'), default="") flags = Column(Integer, nullable=False, default=1) - authors = relationship('Authors', secondary=books_authors_link, backref='books') - tags = relationship('Tags', secondary=books_tags_link, backref='books', order_by="Tags.name") - comments = relationship('Comments', backref='books') - data = relationship('Data', backref='books') - series = relationship('Series', secondary=books_series_link, backref='books') - ratings = relationship('Ratings', secondary=books_ratings_link, backref='books') - languages = relationship('Languages', secondary=books_languages_link, backref='books') - publishers = relationship('Publishers', secondary=books_publishers_link, backref='books') - identifiers = relationship('Identifiers', backref='books') + authors = relationship(Authors, secondary=books_authors_link, backref='books') + tags = relationship(Tags, secondary=books_tags_link, backref='books', order_by="Tags.name") + comments = relationship(Comments, backref='books') + data = relationship(Data, backref='books') + series = relationship(Series, secondary=books_series_link, backref='books') + ratings = relationship(Ratings, secondary=books_ratings_link, backref='books') + languages = relationship(Languages, secondary=books_languages_link, backref='books') + publishers = relationship(Publishers, secondary=books_publishers_link, backref='books') + identifiers = relationship(Identifiers, backref='books') def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, authors, tags, languages=None): @@ -602,6 +601,33 @@ class CalibreDB(): return self.session.query(Books).filter(Books.id == book_id). \ filter(self.common_filters(allow_show_archived)).first() + def get_book_read_archived(self, book_id, read_column, allow_show_archived=False): + # Add missing relationships for inter database joins + #setattr(Books, "is_archived", + # relationship(ub.ArchivedBook, + # uselist=False, + # foreign_keys=ub.ArchivedBook.book_id, + # primaryjoin=and_(Books.id == ub.ArchivedBook.book_id, + # int(current_user.id) == ub.ArchivedBook.user_id))) + if not read_column: + bd = (self.session.query(Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived).select_from(Books) + .join(ub.ReadBook, and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id), + isouter=True)) + else: + try: + read_column = cc_classes[read_column] + bd = (self.session.query(Books, read_column.value, ub.ArchivedBook.is_archived).select_from(Books) + .join(read_column, read_column.book == book_id, + isouter=True)) + except (KeyError, AttributeError): + log.error("Custom Column No.%d is not existing in calibre database", read_column) + # Skip linking read column and return None instead of read status + bd = self.session.query(Books, None, ub.ArchivedBook.is_archived) + return (bd.filter(Books.id == book_id) + .join(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id), isouter=True) + .filter(self.common_filters(allow_show_archived)).first()) + def get_book_by_uuid(self, book_uuid): return self.session.query(Books).filter(Books.uuid == book_uuid).first() @@ -709,8 +735,6 @@ class CalibreDB(): entries = query.order_by(*order).offset(off).limit(pagesize).all() except Exception as ex: log.debug_or_exception(ex) - #for book in entries: - # book = self.order_authors(book) return entries, randm, pagination # Orders all Authors in the list according to authors sort @@ -730,7 +754,7 @@ class CalibreDB(): authors_ordered.append(r) if not error: entry.authors = authors_ordered - return entry + return authors_ordered def get_typeahead(self, database, query, replace=('', ''), tag_filter=true()): query = query or '' diff --git a/cps/editbooks.py b/cps/editbooks.py index d3e1f01e6..14e0e1a1b 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -376,7 +376,7 @@ def render_edit_book(book_id): for lang in book.languages: lang.language_name = isoLanguages.get_language_name(get_locale(), lang.lang_code) - book = calibre_db.order_authors(book) + book.authors = calibre_db.order_authors(book) author_names = [] for authr in book.authors: @@ -1249,9 +1249,9 @@ def table_xchange_author_title(): modif_date = False book = calibre_db.get_book(val) authors = book.title - entries = calibre_db.order_authors(book) + book.authors = calibre_db.order_authors(book) author_names = [] - for authr in entries.authors: + for authr in book.authors: author_names.append(authr.name.replace('|', ',')) title_change = handle_title_on_edit(book, " ".join(author_names)) diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 6dd1c72a3..bd8f71c19 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -36,9 +36,9 @@
{% endif %} {% endif %} - {% if g.user.kindle_mail and kindle_list %} - {% if kindle_list.__len__() == 1 %} - {{kindle_list[0]['text']}} + {% if g.user.kindle_mail and entry.kindle_list %} + {% if entry.kindle_list.__len__() == 1 %} + {{entry.kindle_list[0]['text']}} {% else %}
{% endif %} {% endif %} - {% if reader_list and g.user.role_viewer() %} + {% if entry.reader_list and g.user.role_viewer() %}
- {% if reader_list|length > 1 %} + {% if entry.reader_list|length > 1 %} {% else %} - {{_('Read in Browser')}} - {{reader_list[0]}} + {{_('Read in Browser')}} - {{entry.reader_list[0]}} {% endif %}
{% endif %} - {% if audioentries|length > 0 and g.user.role_viewer() %} + {% if entry.audioentries|length > 0 and g.user.role_viewer() %}
- {% if audioentries|length > 1 %} + {% if entry.audioentries|length > 1 %} {% else %} - {{_('Listen in Browser')}} - {{audioentries[0]}} + {{_('Listen in Browser')}} - {{entry.audioentries[0]}} {% endif %}
{% endif %} @@ -216,7 +216,7 @@
@@ -226,7 +226,7 @@
diff --git a/cps/web.py b/cps/web.py index 066169eb8..ce887c98d 100644 --- a/cps/web.py +++ b/cps/web.py @@ -187,7 +187,7 @@ def toggle_read(book_id): return "Custom Column No.{} is not existing in calibre database".format(config.config_read_column), 400 except (OperationalError, InvalidRequestError) as e: calibre_db.session.rollback() - log.error(u"Read status could not set: %e", e) + log.error(u"Read status could not set: {}".format(e)) return "Read status could not set: {}".format(e), 400 return "" @@ -1756,63 +1756,40 @@ def read_book(book_id, book_format): @web.route("/book/") @login_required_if_no_ano def show_book(book_id): - entries = calibre_db.get_filtered_book(book_id, allow_show_archived=True) + entries = calibre_db.get_book_read_archived(book_id, config.config_read_column, allow_show_archived=True) if entries: - for index in range(0, len(entries.languages)): - entries.languages[index].language_name = isoLanguages.get_language_name(get_locale(), entries.languages[ + read_book = entries[1] + archived_book = entries[2] + entry = entries[0] + entry.read_status = read_book == ub.ReadBook.STATUS_FINISHED + entry.is_archived = archived_book + for index in range(0, len(entry.languages)): + entry.languages[index].language_name = isoLanguages.get_language_name(get_locale(), entry.languages[ index].lang_code) cc = get_cc_columns(filter_config_custom_read=True) book_in_shelfs = [] shelfs = ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).all() - for entry in shelfs: - book_in_shelfs.append(entry.shelf) + for sh in shelfs: + book_in_shelfs.append(sh.shelf) - if not current_user.is_anonymous: - if not config.config_read_column: - matching_have_read_book = ub.session.query(ub.ReadBook). \ - filter(and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id)).all() - have_read = len( - matching_have_read_book) > 0 and matching_have_read_book[0].read_status == ub.ReadBook.STATUS_FINISHED - else: - try: - matching_have_read_book = getattr(entries, 'custom_column_' + str(config.config_read_column)) - have_read = len(matching_have_read_book) > 0 and matching_have_read_book[0].value - except (KeyError, AttributeError): - log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column) - have_read = None + entry.tags = sort(entry.tags, key=lambda tag: tag.name) - archived_book = ub.session.query(ub.ArchivedBook).\ - filter(and_(ub.ArchivedBook.user_id == int(current_user.id), - ub.ArchivedBook.book_id == book_id)).first() - is_archived = archived_book and archived_book.is_archived + entry.authors = calibre_db.order_authors(entry) - else: - have_read = None - is_archived = None + entry.kindle_list = check_send_to_kindle(entry) + entry.reader_list = check_read_formats(entry) - entries.tags = sort(entries.tags, key=lambda tag: tag.name) - - entries = calibre_db.order_authors(entries) - - kindle_list = check_send_to_kindle(entries) - reader_list = check_read_formats(entries) - - audioentries = [] - for media_format in entries.data: + entry.audioentries = [] + for media_format in entry.data: if media_format.format.lower() in constants.EXTENSIONS_AUDIO: - audioentries.append(media_format.format.lower()) + entry.audioentries.append(media_format.format.lower()) return render_title_template('detail.html', - entry=entries, - audioentries=audioentries, + entry=entry, cc=cc, is_xhr=request.headers.get('X-Requested-With')=='XMLHttpRequest', - title=entries.title, + title=entry.title, books_shelfs=book_in_shelfs, - have_read=have_read, - is_archived=is_archived, - kindle_list=kindle_list, - reader_list=reader_list, page="book") else: log.debug(u"Oops! Selected book title is unavailable. File does not exist or is not accessible") From 4c7b5999f713dc39c1a4d9a38282c608305b1055 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 24 Oct 2021 10:57:29 +0200 Subject: [PATCH 023/412] Archived Flag available in book list array --- cps/db.py | 66 ++++++++++++++++++++++++++++++------------------------ cps/ub.py | 6 +++++ cps/web.py | 43 ++++++++++++++++++++++------------- 3 files changed, 71 insertions(+), 44 deletions(-) diff --git a/cps/db.py b/cps/db.py index f5696d07d..64abbe1b3 100644 --- a/cps/db.py +++ b/cps/db.py @@ -685,9 +685,12 @@ class CalibreDB(): pos_content_cc_filter, ~neg_content_cc_filter, archived_filter) @staticmethod - def get_checkbox_sorted(inputlist, state, offset, limit, order): + def get_checkbox_sorted(inputlist, state, offset, limit, order, combo=False): outcome = list() - elementlist = {ele.id: ele for ele in inputlist} + if combo: + elementlist = {ele[0].id: ele for ele in inputlist} + else: + elementlist = {ele.id: ele for ele in inputlist} for entry in state: try: outcome.append(elementlist[entry]) @@ -702,10 +705,10 @@ class CalibreDB(): # Fill indexpage with all requested data from database def fill_indexpage(self, page, pagesize, database, db_filter, order, *join): - return self.fill_indexpage_with_archived_books(page, pagesize, database, db_filter, order, False, *join) + return self.fill_indexpage_with_archived_books(page, pagesize, db_filter, order, False, database, join) - def fill_indexpage_with_archived_books(self, page, pagesize, database, db_filter, order, allow_show_archived, - *join): + def fill_indexpage_with_archived_books(self, page, pagesize, db_filter, order, allow_show_archived, + *args): pagesize = pagesize or self.config.config_books_per_page if current_user.show_detail_random(): randm = self.session.query(Books) \ @@ -714,20 +717,32 @@ class CalibreDB(): .limit(self.config.config_random_books).all() else: randm = false() + if len(args) > 1: + if isinstance(args[0], DeclarativeMeta): + query = self.session.query(args[0]) + else: + query = self.session.query(*args[0]) + join = args[1] + else: + join = tuple() + query = self.session.query(args) off = int(int(pagesize) * (page - 1)) - query = self.session.query(database) - if len(join) == 6: - query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]).outerjoin(join[5]) - if len(join) == 5: - query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]) - if len(join) == 4: - query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3]) - if len(join) == 3: - query = query.outerjoin(join[0], join[1]).outerjoin(join[2]) - elif len(join) == 2: - query = query.outerjoin(join[0], join[1]) - elif len(join) == 1: - query = query.outerjoin(join[0]) + + indx = len(join) + element = 0 + while indx: + if indx >= 3: + query = query.outerjoin(join[element], join[element+1]).outerjoin(join[element+2]) + indx -= 3 + element += 3 + elif indx == 2: + query = query.outerjoin(join[element], join[element+1]) + indx -= 2 + element += 2 + elif indx == 1: + query = query.outerjoin(join[element]) + indx -= 1 + element += 1 query = query.filter(db_filter)\ .filter(self.common_filters(allow_show_archived)) entries = list() @@ -785,7 +800,9 @@ class CalibreDB(): authorterms = re.split("[, ]+", term) for authorterm in authorterms: q.append(Books.authors.any(func.lower(Authors.name).ilike("%" + authorterm + "%"))) - query = self.session.query(Books) + query = (self.session.query(Books, ub.ArchivedBook.is_archived) + .outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id))) if len(join) == 6: query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]).outerjoin(join[5]) if len(join) == 3: @@ -816,7 +833,7 @@ class CalibreDB(): offset = 0 limit_all = result_count - ub.store_ids(result) + ub.store_combo_ids(result) return result[offset:limit_all], result_count, pagination # Creates for all stored languages a translated speaking name in the array for the UI @@ -831,15 +848,6 @@ class CalibreDB(): .group_by(text('books_languages_link.lang_code')).all() for lang in languages: lang.name = isoLanguages.get_language_name(get_locale(), lang.lang_code) - #try: - # if lang.lang_code.lower() == "und": - # lang.name = isoLanguages.get_language_name(get_locale(), lang.lang_code) - # # lang.name = _("Undetermined") - # else: - # cur_l = LC.parse(lang.lang_code) - # lang.name = cur_l.get_language_name(get_locale()) - #except UnknownLocaleError: - # lang.name = _(isoLanguages.get(part3=lang.lang_code).name) return languages def update_title_sort(self, config, conn=None): diff --git a/cps/ub.py b/cps/ub.py index 69ea55f6c..e9ad264fa 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -126,6 +126,12 @@ def store_ids(result): ids.append(element.id) searched_ids[current_user.id] = ids +def store_combo_ids(result): + ids = list() + for element in result: + ids.append(element[0].id) + searched_ids[current_user.id] = ids + class UserBase: diff --git a/cps/web.py b/cps/web.py index c6a5bfa1d..0fcb43f45 100644 --- a/cps/web.py +++ b/cps/web.py @@ -677,10 +677,10 @@ def render_archived_books(page, order): archived_filter = db.Books.id.in_(archived_book_ids) entries, random, pagination = calibre_db.fill_indexpage_with_archived_books(page, 0, - db.Books, archived_filter, order, - allow_show_archived=True) + True, + db.Books) name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" @@ -770,20 +770,19 @@ def list_books(): sort = request.args.get("sort", "id") order = request.args.get("order", "").lower() state = None - join = tuple() + join = list() if sort == "state": state = json.loads(request.args.get("state", "[]")) - # order = [db.Books.timestamp.asc()] if order == "asc" else [db.Books.timestamp.desc()] # ToDo wrong: sort ticked elif sort == "tags": order = [db.Tags.name.asc()] if order == "asc" else [db.Tags.name.desc()] - join = db.books_tags_link,db.Books.id == db.books_tags_link.c.book, db.Tags + join = db.books_tags_link, db.Books.id == db.books_tags_link.c.book, db.Tags elif sort == "series": order = [db.Series.name.asc()] if order == "asc" else [db.Series.name.desc()] - join = db.books_series_link,db.Books.id == db.books_series_link.c.book, db.Series + join = db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series elif sort == "publishers": order = [db.Publishers.name.asc()] if order == "asc" else [db.Publishers.name.desc()] - join = db.books_publishers_link,db.Books.id == db.books_publishers_link.c.book, db.Publishers + join = db.books_publishers_link, db.Books.id == db.books_publishers_link.c.book, db.Publishers elif sort == "authors": order = [db.Authors.name.asc(), db.Series.name, db.Books.series_index] if order == "asc" \ else [db.Authors.name.desc(), db.Series.name.desc(), db.Books.series_index.desc()] @@ -798,24 +797,38 @@ def list_books(): order = [db.Books.timestamp.desc()] total_count = filtered_count = calibre_db.session.query(db.Books).filter(calibre_db.common_filters(False)).count() - if state is not None: if search: books = calibre_db.search_query(search).all() filtered_count = len(books) else: - books = calibre_db.session.query(db.Books).filter(calibre_db.common_filters()).all() - entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order) + books = (calibre_db.session.query(db.Books,ub.ArchivedBook.is_archived) + .outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id)) + .filter(calibre_db.common_filters()).all()) + entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order, True) elif search: - entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *join) + entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *tuple(join)) else: - entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, db.Books, True, order, *join) + join.append(ub.ArchivedBook) + join.append(and_(db.Books.id == ub.ArchivedBook.book_id,int(current_user.id) == ub.ArchivedBook.user_id)) + entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), + limit, + (db.Books, ub.ArchivedBook), + True, + order, + *tuple(join)) + result = list() for entry in entries: - for index in range(0, len(entry.languages)): - entry.languages[index].language_name = isoLanguages.get_language_name(get_locale(), entry.languages[ + val = entry[0] + val.is_archived = entry[1] == True + for index in range(0, len(val.languages)): + val.languages[index].language_name = isoLanguages.get_language_name(get_locale(), val.languages[ index].lang_code) - table_entries = {'totalNotFiltered': total_count, 'total': filtered_count, "rows": entries} + result.append(val) + + table_entries = {'totalNotFiltered': total_count, 'total': filtered_count, "rows": result} js_list = json.dumps(table_entries, cls=db.AlchemyEncoder) response = make_response(js_list) From 516e76de4fc1e56792d8f75a3922b58fc1f0123f Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 24 Oct 2021 17:13:57 +0200 Subject: [PATCH 024/412] Updated tinymce editor, enabled raw html edit --- cps/static/js/edit_books.js | 2 + .../libs/tinymce/icons/default/icons.min.js | 2 +- cps/static/js/libs/tinymce/langs/bg_BG.js | 419 ---------------- cps/static/js/libs/tinymce/langs/bn_BD.js | 419 ---------------- cps/static/js/libs/tinymce/langs/cs.js | 193 +++++--- cps/static/js/libs/tinymce/langs/cy.js | 79 ++- cps/static/js/libs/tinymce/langs/da.js | 77 ++- cps/static/js/libs/tinymce/langs/de.js | 77 ++- cps/static/js/libs/tinymce/langs/es_ES.js | 370 -------------- cps/static/js/libs/tinymce/langs/es_MX.js | 419 ---------------- cps/static/js/libs/tinymce/langs/fa.js | 77 ++- cps/static/js/libs/tinymce/langs/fa_IR.js | 390 --------------- cps/static/js/libs/tinymce/langs/fr_FR.js | 77 ++- cps/static/js/libs/tinymce/langs/he_IL.js | 420 ---------------- cps/static/js/libs/tinymce/langs/hu_HU.js | 419 ---------------- cps/static/js/libs/tinymce/langs/it_IT.js | 370 -------------- cps/static/js/libs/tinymce/langs/ko_KR.js | 419 ---------------- cps/static/js/libs/tinymce/langs/nb_NO.js | 419 ---------------- cps/static/js/libs/tinymce/langs/pl.js | 77 ++- cps/static/js/libs/tinymce/langs/pt_BR.js | 77 ++- cps/static/js/libs/tinymce/langs/pt_PT.js | 419 ---------------- cps/static/js/libs/tinymce/langs/ro.js | 77 ++- cps/static/js/libs/tinymce/langs/ro_RO.js | 370 -------------- cps/static/js/libs/tinymce/langs/sl.js | 73 ++- cps/static/js/libs/tinymce/langs/sl_SI.js | 388 --------------- cps/static/js/libs/tinymce/langs/sq.js | 219 +++++++++ cps/static/js/libs/tinymce/langs/sv_SE.js | 419 ---------------- cps/static/js/libs/tinymce/langs/ta.js | 77 ++- cps/static/js/libs/tinymce/langs/ta_IN.js | 419 ---------------- cps/static/js/libs/tinymce/langs/th_TH.js | 419 ---------------- cps/static/js/libs/tinymce/langs/tr_TR.js | 389 --------------- cps/static/js/libs/tinymce/langs/ug.js | 462 ++++++++++++++++++ cps/static/js/libs/tinymce/langs/zh_CN.js | 419 ---------------- .../js/libs/tinymce/langs/zh_Hans_CN.js | 89 +++- .../libs/tinymce/plugins/code/plugin.min.js | 9 + .../skins/content/dark/content.min.css | 7 - .../skins/content/document/content.min.css | 7 - .../skins/content/writer/content.min.css | 7 - .../skins/lightgray/content.inline.min.css | 1 - .../tinymce/skins/lightgray/content.min.css | 1 - .../skins/lightgray/fonts/tinymce-small.eot | Bin 9492 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 --- .../skins/lightgray/fonts/tinymce-small.ttf | Bin 9304 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 9380 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 17572 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 ----- .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 17408 -> 0 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 17484 -> 0 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 53 -> 0 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 2608 -> 0 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 152 -> 0 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 43 -> 0 bytes .../libs/tinymce/skins/lightgray/skin.min.css | 1 - .../ui/oxide-dark/content.inline.min.css | 7 - .../skins/ui/oxide-dark/content.min.css | 7 - .../ui/oxide-dark/content.mobile.min.css | 7 - .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 4624 -> 0 bytes .../tinymce/skins/ui/oxide-dark/skin.min.css | 7 - .../skins/ui/oxide-dark/skin.mobile.min.css | 7 - .../ui/oxide-dark/skin.shadowdom.min.css | 7 - .../skins/ui/oxide/content.inline.min.css | 2 +- .../tinymce/skins/ui/oxide/content.min.css | 2 +- .../libs/tinymce/skins/ui/oxide/skin.min.css | 2 +- .../skins/ui/oxide/skin.shadowdom.min.css | 2 +- .../libs/tinymce/themes/inlite/theme.min.js | 1 - .../libs/tinymce/themes/mobile/theme.min.js | 9 - .../libs/tinymce/themes/modern/theme.min.js | 1 - .../libs/tinymce/themes/silver/theme.min.js | 4 +- cps/static/js/libs/tinymce/tinymce.min.js | 4 +- 69 files changed, 1500 insertions(+), 7837 deletions(-) delete mode 100644 cps/static/js/libs/tinymce/langs/bg_BG.js delete mode 100644 cps/static/js/libs/tinymce/langs/bn_BD.js delete mode 100644 cps/static/js/libs/tinymce/langs/es_ES.js delete mode 100644 cps/static/js/libs/tinymce/langs/es_MX.js delete mode 100644 cps/static/js/libs/tinymce/langs/fa_IR.js delete mode 100644 cps/static/js/libs/tinymce/langs/he_IL.js delete mode 100644 cps/static/js/libs/tinymce/langs/hu_HU.js delete mode 100644 cps/static/js/libs/tinymce/langs/it_IT.js delete mode 100644 cps/static/js/libs/tinymce/langs/ko_KR.js delete mode 100644 cps/static/js/libs/tinymce/langs/nb_NO.js delete mode 100644 cps/static/js/libs/tinymce/langs/pt_PT.js delete mode 100644 cps/static/js/libs/tinymce/langs/ro_RO.js delete mode 100644 cps/static/js/libs/tinymce/langs/sl_SI.js create mode 100644 cps/static/js/libs/tinymce/langs/sq.js delete mode 100644 cps/static/js/libs/tinymce/langs/sv_SE.js delete mode 100644 cps/static/js/libs/tinymce/langs/ta_IN.js delete mode 100644 cps/static/js/libs/tinymce/langs/th_TH.js delete mode 100644 cps/static/js/libs/tinymce/langs/tr_TR.js create mode 100644 cps/static/js/libs/tinymce/langs/ug.js delete mode 100644 cps/static/js/libs/tinymce/langs/zh_CN.js create mode 100644 cps/static/js/libs/tinymce/plugins/code/plugin.min.js delete mode 100644 cps/static/js/libs/tinymce/skins/content/dark/content.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/content/document/content.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/content/writer/content.min.css delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/content.inline.min.css delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/content.min.css delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.eot delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.svg delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.ttf delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.woff delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.eot delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.svg delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.ttf delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.woff delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/img/anchor.gif delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/img/loader.gif delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/img/object.gif delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/img/trans.gif delete mode 100755 cps/static/js/libs/tinymce/skins/lightgray/skin.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.inline.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.mobile.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.mobile.min.css delete mode 100644 cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css delete mode 100755 cps/static/js/libs/tinymce/themes/inlite/theme.min.js delete mode 100644 cps/static/js/libs/tinymce/themes/mobile/theme.min.js delete mode 100755 cps/static/js/libs/tinymce/themes/modern/theme.min.js diff --git a/cps/static/js/edit_books.js b/cps/static/js/edit_books.js index ef1eb42b7..ddc7a3e7e 100644 --- a/cps/static/js/edit_books.js +++ b/cps/static/js/edit_books.js @@ -6,6 +6,7 @@ if ($("#description").length) { tinymce.init({ selector: "#description", + plugins: 'code', branding: false, menubar: "edit view format", language: language @@ -15,6 +16,7 @@ if ($("#description").length) { if ($(".tiny_editor").length) { tinymce.init({ selector: ".tiny_editor", + plugins: 'code', branding: false, menubar: "edit view format", language: language diff --git a/cps/static/js/libs/tinymce/icons/default/icons.min.js b/cps/static/js/libs/tinymce/icons/default/icons.min.js index 086f297d3..2cf9ef86d 100644 --- a/cps/static/js/libs/tinymce/icons/default/icons.min.js +++ b/cps/static/js/libs/tinymce/icons/default/icons.min.js @@ -1 +1 @@ -tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',"export":'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/bg_BG.js b/cps/static/js/libs/tinymce/langs/bg_BG.js deleted file mode 100644 index 20e8e6275..000000000 --- a/cps/static/js/libs/tinymce/langs/bg_BG.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('bg_BG',{ -"Redo": "\u041e\u0442\u043c\u0435\u043d\u044f\u043d\u0435", -"Undo": "\u0412\u0440\u044a\u0449\u0430\u043d\u0435", -"Cut": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435", -"Copy": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435", -"Paste": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435", -"Select all": "\u041c\u0430\u0440\u043a\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0446\u044f\u043b\u043e\u0442\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435", -"New document": "\u041d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", -"Ok": "\u0414\u043e\u0431\u0440\u0435", -"Cancel": "\u041e\u0442\u043a\u0430\u0437", -"Visual aids": "\u0412\u0438\u0437\u0443\u0430\u043b\u043d\u043e \u043e\u0442\u043a\u0440\u043e\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0438 \u0431\u0435\u0437 \u043a\u0430\u043d\u0442\u043e\u0432\u0435 (\u0440\u0430\u043c\u043a\u0438)", -"Bold": "\u0423\u0434\u0435\u0431\u0435\u043b\u0435\u043d (\u043f\u043e\u043b\u0443\u0447\u0435\u0440)", -"Italic": "\u041d\u0430\u043a\u043b\u043e\u043d\u0435\u043d (\u043a\u0443\u0440\u0441\u0438\u0432)", -"Underline": "\u041f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u0432\u0430\u043d\u0435", -"Strikethrough": "\u0417\u0430\u0447\u0435\u0440\u0442\u0430\u0432\u0430\u043d\u0435", -"Superscript": "\u0413\u043e\u0440\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441", -"Subscript": "\u0414\u043e\u043b\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441", -"Clear formatting": "\u0418\u0437\u0447\u0438\u0441\u0442\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435\u0442\u043e", -"Align left": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u043b\u044f\u0432\u043e", -"Align center": "\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u0435", -"Align right": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u0434\u044f\u0441\u043d\u043e", -"Justify": "\u0414\u0432\u0443\u0441\u0442\u0440\u0430\u043d\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"Bullet list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0432\u043e\u0434\u0430\u0447\u0438", -"Numbered list": "\u041d\u043e\u043c\u0435\u0440\u0438\u0440\u0430\u043d \u0441\u043f\u0438\u0441\u044a\u043a", -"Decrease indent": "\u041d\u0430\u043c\u0430\u043b\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430", -"Increase indent": "\u0423\u0432\u0435\u043b\u0438\u0447\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430", -"Close": "\u0417\u0430\u0442\u0432\u0430\u0440\u044f\u043d\u0435", -"Formats": "\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0412\u0430\u0448\u0438\u044f\u0442 \u0431\u0440\u0430\u0443\u0437\u044a\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u044a\u0440\u0436\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u0435\u043d \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043b\u0438\u043f\u0431\u043e\u0440\u0434\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0432\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 Ctrl+X (\u0437\u0430 \u0438\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435), Ctrl+C (\u0437\u0430 \u043a\u043e\u043f\u0438\u0440\u0430\u043d\u0435) \u0438 Ctrl+V (\u0437\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435).", -"Headers": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u044f", -"Header 1": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 1", -"Header 2": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 2", -"Header 3": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 3", -"Header 4": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 4", -"Header 5": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 5", -"Header 6": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 6", -"Headings": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u044f", -"Heading 1": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 1", -"Heading 2": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 2", -"Heading 3": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 3", -"Heading 4": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 4", -"Heading 5": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 5", -"Heading 6": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 6", -"Preformatted": "\u041f\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d", -"Div": "\u0411\u043b\u043e\u043a", -"Pre": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e \u043e\u0444\u043e\u0440\u043c\u0435\u043d \u0442\u0435\u043a\u0441\u0442", -"Code": "\u041a\u043e\u0434", -"Paragraph": "\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444", -"Blockquote": "\u0426\u0438\u0442\u0430\u0442", -"Inline": "\u041d\u0430 \u0435\u0434\u0438\u043d \u0440\u0435\u0434", -"Blocks": "\u0411\u043b\u043e\u043a\u043e\u0432\u0435", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435 \u0432 \u043e\u0431\u0438\u043a\u043d\u043e\u0432\u0435\u043d \u0440\u0435\u0436\u0438\u043c. \u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u0449\u0435 \u0431\u044a\u0434\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u043e \u043a\u0430\u0442\u043e \u043d\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d \u0442\u0435\u043a\u0441\u0442, \u0434\u043e\u043a\u0430\u0442\u043e \u0438\u0437\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0442\u0430\u0437\u0438 \u043e\u043f\u0446\u0438\u044f.", -"Fonts": "\u0428\u0440\u0438\u0444\u0442\u043e\u0432\u0435", -"Font Sizes": "\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430", -"Class": "\u041a\u043b\u0430\u0441", -"Browse for an image": "\u041f\u043e\u0442\u044a\u0440\u0441\u0435\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", -"OR": "\u0418\u041b\u0418", -"Drop an image here": "\u041f\u0443\u0441\u043d\u0435\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0442\u0443\u043a", -"Upload": "\u041a\u0430\u0447\u0432\u0430\u043d\u0435", -"Block": "\u0411\u043b\u043e\u043a", -"Align": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"Default": "\u041f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435", -"Circle": "\u041e\u043a\u0440\u044a\u0436\u043d\u043e\u0441\u0442\u0438", -"Disc": "\u041a\u0440\u044a\u0433\u0447\u0435\u0442\u0430", -"Square": "\u0417\u0430\u043f\u044a\u043b\u043d\u0435\u043d\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438", -"Lower Alpha": "\u041c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438", -"Lower Greek": "\u041c\u0430\u043b\u043a\u0438 \u0433\u0440\u044a\u0446\u043a\u0438 \u0431\u0443\u043a\u0432\u0438", -"Lower Roman": "\u0420\u0438\u043c\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438", -"Upper Alpha": "\u0413\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438", -"Upper Roman": "\u0420\u0438\u043c\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0441 \u0433\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438", -"Anchor...": "\u041a\u043e\u0442\u0432\u0430...", -"Name": "\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435", -"Id": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (id)", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (id) \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u043f\u043e\u0447\u0432\u0430 \u0441 \u0431\u0443\u043a\u0432\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u0432\u0430\u043d \u043e\u0442 \u0431\u0443\u043a\u0432\u0438, \u0447\u0438\u0444\u0440\u0438, \u0442\u0438\u0440\u0435\u0442\u0430, \u0442\u043e\u0447\u043a\u0438, \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 \u0438 \u0434\u043e\u043b\u043d\u043e \u0442\u0438\u0440\u0435.", -"You have unsaved changes are you sure you want to navigate away?": "\u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u043c\u0430 \u043d\u0435\u0437\u0430\u043f\u0430\u0437\u0435\u043d\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438. \u0429\u0435 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u043b\u0438?", -"Restore last draft": "\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0430\u0442\u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0430", -"Special character...": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0435\u043d \u0441\u0438\u043c\u0432\u043e\u043b...", -"Source code": "\u0418\u0437\u0445\u043e\u0434\u0435\u043d \u043a\u043e\u0434 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 HTML", -"Insert\/Edit code sample": "\u0412\u043c\u044a\u043a\u043d\u0438\/ \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434", -"Language": "\u0415\u0437\u0438\u043a", -"Code sample...": "\u041f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434...", -"Color Picker": "\u0418\u0437\u0431\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0446\u0432\u044f\u0442", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430\u0434\u044f\u0441\u043d\u043e", -"Right to left": "\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430\u043b\u044f\u0432\u043e", -"Emoticons...": "\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438...", -"Metadata and Document Properties": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", -"Title": "\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435", -"Keywords": "\u041a\u043b\u044e\u0447\u043e\u0432\u0438 \u0434\u0443\u043c\u0438", -"Description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", -"Robots": "\u0420\u043e\u0431\u043e\u0442\u0438 \u043d\u0430 \u0443\u0435\u0431 \u0442\u044a\u0440\u0441\u0430\u0447\u043a\u0438", -"Author": "\u0410\u0432\u0442\u043e\u0440", -"Encoding": "\u041a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0437\u043d\u0430\u0446\u0438\u0442\u0435", -"Fullscreen": "\u041d\u0430 \u0446\u044f\u043b \u0435\u043a\u0440\u0430\u043d", -"Action": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435", -"Shortcut": "\u0411\u044a\u0440\u0437 \u043a\u043b\u0430\u0432\u0438\u0448", -"Help": "\u041f\u043e\u043c\u043e\u0449", -"Address": "\u0410\u0434\u0440\u0435\u0441", -"Focus to menubar": "Focus to menubar", -"Focus to toolbar": "Focus to toolbar", -"Focus to element path": "Focus to element path", -"Focus to contextual toolbar": "Focus to contextual toolbar", -"Insert link (if link plugin activated)": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0432\u0440\u044a\u0437\u043a\u0430 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0438 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)", -"Save (if save plugin activated)": "\u0417\u0430\u043f\u0438\u0448\u0438 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0437\u0430\u043f\u0438\u0441 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)", -"Find (if searchreplace plugin activated)": "\u041d\u0430\u043c\u0435\u0440\u0438 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0442\u044a\u0440\u0441\u0435\u043d\u0435\/\u0437\u0430\u043c\u044f\u043d\u0430 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)", -"Plugins installed ({0}):": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0438 \u043f\u043b\u044a\u0433\u0438\u043d\u0438 ({0}):", -"Premium plugins:": "\u041f\u0440\u0435\u043c\u0438\u0439\u043d\u0438 \u043f\u043b\u044a\u0433\u0438\u043d\u0438:", -"Learn more...": "\u041d\u0430\u0443\u0447\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435...", -"You are using {0}": "\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 {0}", -"Plugins": "Plugins", -"Handy Shortcuts": "Handy Shortcuts", -"Horizontal line": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u0447\u0435\u0440\u0442\u0430", -"Insert\/edit image": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430", -"Image description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e", -"Source": "\u0410\u0434\u0440\u0435\u0441", -"Dimensions": "\u0420\u0430\u0437\u043c\u0435\u0440", -"Constrain proportions": "\u0417\u0430\u0432\u0430\u0437\u043d\u0430\u0432\u0435 \u043d\u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435", -"General": "\u041e\u0431\u0449\u043e", -"Advanced": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e", -"Style": "\u0421\u0442\u0438\u043b", -"Vertical space": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e", -"Horizontal space": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e", -"Border": "\u041a\u0430\u043d\u0442 (\u0440\u0430\u043c\u043a\u0430)", -"Insert image": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", -"Image...": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435...", -"Image list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438", -"Rotate counterclockwise": "\u0417\u0430\u0432\u044a\u0440\u0442\u0430\u043d\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u043d\u0438\u043a\u0430", -"Rotate clockwise": "\u0417\u0430\u0432\u044a\u0440\u0442\u0430\u043d\u0435 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043d\u0438\u043a\u0430", -"Flip vertically": "\u041e\u0431\u044a\u0440\u043d\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e", -"Flip horizontally": "\u041e\u0431\u044a\u0440\u043d\u0438 \u0445\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e", -"Edit image": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e", -"Image options": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e", -"Zoom in": "\u041f\u0440\u0438\u0431\u043b\u0438\u0436\u0438", -"Zoom out": "\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0438", -"Crop": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435", -"Resize": "\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435", -"Orientation": "\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f", -"Brightness": "\u042f\u0440\u043a\u043e\u0441\u0442", -"Sharpen": "\u0418\u0437\u043e\u0441\u0442\u0440\u044f\u043d\u0435", -"Contrast": "\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442", -"Color levels": "\u0426\u0432\u0435\u0442\u043d\u0438 \u043d\u0438\u0432\u0430", -"Gamma": "\u0413\u0430\u043c\u0430", -"Invert": "\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f", -"Apply": "\u041f\u0440\u0438\u043b\u043e\u0436\u0438", -"Back": "\u041d\u0430\u0437\u0430\u0434", -"Insert date\/time": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0434\u0430\u0442\u0430\/\u0447\u0430\u0441", -"Date\/time": "\u0414\u0430\u0442\u0430\/\u0447\u0430\u0441", -"Insert\/Edit Link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)", -"Insert\/edit link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)", -"Text to display": "\u0422\u0435\u043a\u0441\u0442", -"Url": "\u0410\u0434\u0440\u0435\u0441 (URL)", -"Open link in...": "\u041e\u0442\u0432\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 \u0432...", -"Current window": "\u0422\u0435\u043a\u0443\u0449 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446", -"None": "\u0411\u0435\u0437", -"New window": "\u0412 \u043d\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 (\u043f\u043e\u0434\u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446)", -"Remove link": "\u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430", -"Anchors": "\u041a\u043e\u0442\u0432\u0438", -"Link...": "\u0425\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430...", -"Paste or type a link": "\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u0440\u044a\u0437\u043a\u0430(\u043b\u0438\u043d\u043a)", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL \u0430\u0434\u0440\u0435\u0441\u044a\u0442, \u043a\u043e\u0439\u0442\u043e \u0432\u044a\u0432\u0434\u043e\u0445\u0442\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u0430 \u043d\u0430 \u0435-\u043c\u0435\u0439\u043b \u0430\u0434\u0440\u0435\u0441. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0438\u044f mailto: \u043f\u0440\u0435\u0444\u0438\u043a\u0441?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL \u0430\u0434\u0440\u0435\u0441\u044a\u0442, \u043a\u043e\u0439\u0442\u043e \u0432\u044a\u0432\u0434\u043e\u0445\u0442\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u0430 \u0432\u044a\u043d\u0448\u0435\u043d \u0430\u0434\u0440\u0435\u0441. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0438\u044f http:\/\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441?", -"Link list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0432\u0440\u044a\u0437\u043a\u0438", -"Insert video": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e", -"Insert\/edit video": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u0432\u0438\u0434\u0435\u043e", -"Insert\/edit media": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043c\u0435\u0434\u0438\u044f", -"Alternative source": "\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0430\u0434\u0440\u0435\u0441", -"Alternative source URL": "\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0430\u0434\u0440\u0435\u0441 URL", -"Media poster (Image URL)": "\u041c\u0435\u0434\u0438\u0435\u043d \u043f\u043b\u0430\u043a\u0430\u0442 (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 URL)", -"Paste your embed code below:": "\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0432\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435 \u0432 \u043f\u043e\u043b\u0435\u0442\u043e \u043f\u043e-\u0434\u043e\u043b\u0443:", -"Embed": "\u0412\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435", -"Media...": "\u041c\u0435\u0434\u0438\u044f...", -"Nonbreaking space": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b", -"Page break": "\u041d\u043e\u0432\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430", -"Paste as text": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043a\u0430\u0442\u043e \u0442\u0435\u043a\u0441\u0442", -"Preview": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u0435\u043d \u0438\u0437\u0433\u043b\u0435\u0434", -"Print...": "\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u0432\u0430\u043d\u0435...", -"Save": "\u0421\u044a\u0445\u0440\u0430\u043d\u044f\u0432\u0430\u043d\u0435", -"Find": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0437\u0430", -"Replace with": "\u0417\u0430\u043c\u044f\u043d\u0430 \u0441", -"Replace": "\u0417\u0430\u043c\u044f\u043d\u0430", -"Replace all": "\u0417\u0430\u043c\u044f\u043d\u0430 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0441\u0440\u0435\u0449\u0430\u043d\u0438\u044f", -"Previous": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d", -"Next": "\u0421\u043b\u0435\u0434\u0432\u0430\u0449", -"Find and replace...": "\u041d\u0430\u043c\u0438\u0440\u0430\u043d\u0435 \u0438 \u0437\u0430\u043c\u044f\u043d\u0430...", -"Could not find the specified string.": "\u0422\u044a\u0440\u0441\u0435\u043d\u0438\u044f\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d.", -"Match case": "\u0421\u044a\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u044a\u0440\u0430 (\u043c\u0430\u043b\u043a\u0438\/\u0433\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438)", -"Find whole words only": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0441\u0430\u043c\u043e \u043d\u0430 \u0446\u0435\u043b\u0438 \u0434\u0443\u043c\u0438", -"Spell check": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430", -"Ignore": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u043d\u0435", -"Ignore all": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u043e", -"Finish": "\u041a\u0440\u0430\u0439", -"Add to Dictionary": "\u0414\u043e\u0431\u0430\u0432\u0438 \u0432 \u0440\u0435\u0447\u043d\u0438\u043a\u0430", -"Insert table": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430", -"Table properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430", -"Delete table": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430", -"Cell": "\u041a\u043b\u0435\u0442\u043a\u0430", -"Row": "\u0420\u0435\u0434", -"Column": "\u041a\u043e\u043b\u043e\u043d\u0430", -"Cell properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430", -"Merge cells": "\u0421\u043b\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435", -"Split cell": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u043d\u0435 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430", -"Insert row before": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438", -"Insert row after": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434", -"Delete row": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434\u0430", -"Row properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430", -"Cut row": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434", -"Copy row": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434", -"Paste row before": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438", -"Paste row after": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434", -"Insert column before": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0438", -"Insert column after": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430 \u0441\u043b\u0435\u0434", -"Delete column": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430\u0442\u0430", -"Cols": "\u041a\u043e\u043b\u043e\u043d\u0438", -"Rows": "\u0420\u0435\u0434\u043e\u0432\u0435", -"Width": "\u0428\u0438\u0440\u0438\u043d\u0430", -"Height": "\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430", -"Cell spacing": "\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435", -"Cell padding": "\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e", -"Show caption": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043d\u0430\u0434\u043f\u0438\u0441", -"Left": "\u041b\u044f\u0432\u043e", -"Center": "\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u043e", -"Right": "\u0414\u044f\u0441\u043d\u043e", -"Cell type": "\u0422\u0438\u043f \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430", -"Scope": "\u041e\u0431\u0445\u0432\u0430\u0442", -"Alignment": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"H Align": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"V Align": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"Top": "\u0413\u043e\u0440\u0435", -"Middle": "\u041f\u043e \u0441\u0440\u0435\u0434\u0430\u0442\u0430", -"Bottom": "\u0414\u043e\u043b\u0443", -"Header cell": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430 (\u0430\u043d\u0442\u0435\u0442\u043a\u0430)", -"Row group": "Row group", -"Column group": "Column group", -"Row type": "\u0422\u0438\u043f \u043d\u0430 \u0440\u0435\u0434\u0430", -"Header": "\u0413\u043e\u0440\u0435\u043d \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b (header)", -"Body": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435 (body)", -"Footer": "\u0414\u043e\u043b\u0435\u043d \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b (footer)", -"Border color": "\u0426\u0432\u044f\u0442 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430", -"Insert template...": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d...", -"Templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u0438", -"Template": "\u0428\u0430\u0431\u043b\u043e\u043d", -"Text color": "\u0426\u0432\u044f\u0442 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430", -"Background color": "\u0424\u043e\u043d\u043e\u0432 \u0446\u0432\u044f\u0442", -"Custom...": "\u0418\u0437\u0431\u0440\u0430\u043d...", -"Custom color": "\u0426\u0432\u044f\u0442 \u043f\u043e \u0438\u0437\u0431\u043e\u0440", -"No color": "\u0411\u0435\u0437 \u0446\u0432\u044f\u0442", -"Remove color": "\u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u043d\u0435 \u043d\u0430 \u0446\u0432\u0435\u0442\u0430", -"Table of Contents": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435", -"Show blocks": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u043e\u0432\u0435\u0442\u0435", -"Show invisible characters": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043d\u0435\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c\u0438 \u0437\u043d\u0430\u0446\u0438", -"Word count": "\u0411\u0440\u043e\u0435\u043d\u0435 \u043d\u0430 \u0434\u0443\u043c\u0438", -"Count": "\u0411\u0440\u043e\u0439", -"Document": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442", -"Selection": "\u0418\u0437\u0431\u0440\u0430\u043d\u043e", -"Words": "\u0414\u0443\u043c\u0438", -"Words: {0}": "\u0411\u0440\u043e\u0439 \u0434\u0443\u043c\u0438: {0}", -"{0} words": "{0} \u0431\u0440\u043e\u0439 \u0434\u0443\u043c\u0438", -"File": "\u0424\u0430\u0439\u043b", -"Edit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435", -"Insert": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435", -"View": "\u0418\u0437\u0433\u043b\u0435\u0434", -"Format": "\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435", -"Table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430", -"Tools": "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438", -"Powered by {0}": "\u0421\u044a\u0437\u0434\u0430\u0434\u0435\u043d\u043e \u0441 {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u041f\u043e\u043b\u0435 \u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d \u0442\u0435\u043a\u0441\u0442. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 Alt+F9 \u0437\u0430 \u043c\u0435\u043d\u044e; Alt+F10 \u0437\u0430 \u043b\u0435\u043d\u0442\u0430 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438; Alt+0 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449.", -"Image title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e", -"Border width": "\u0428\u0438\u0440\u0438\u043d\u0430 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430", -"Border style": "\u0421\u0442\u0438\u043b \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430", -"Error": "\u0413\u0440\u0435\u0448\u043a\u0430", -"Warn": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435", -"Valid": "\u0412\u0430\u043b\u0438\u0434\u043d\u043e", -"To open the popup, press Shift+Enter": "\u0417\u0430 \u0434\u0430 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0435 \u0438\u0437\u0441\u043a\u0430\u0447\u0430\u0449\u0438\u044f \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446, \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "\u041f\u043e\u043b\u0435 \u0437\u0430 \u043e\u0431\u043e\u0433\u0430\u0442\u0435\u043d \u0442\u0435\u043a\u0441\u0442. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 ALT+0 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449.", -"System Font": "\u0421\u0438\u0441\u0442\u0435\u043c\u0435\u043d \u0448\u0440\u0438\u0444\u0442", -"Failed to upload image: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435: {0}", -"Failed to load plugin: {0} from url {1}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d {0} \u043e\u0442 URL {1}", -"Failed to load plugin url: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 URL \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d: {0}", -"Failed to initialize plugin: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d: {0}", -"example": "\u043f\u0440\u0438\u043c\u0435\u0440", -"Search": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435", -"All": "\u0412\u0441\u0438\u0447\u043a\u0438", -"Currency": "\u0412\u0430\u043b\u0443\u0442\u0430", -"Text": "\u0422\u0435\u043a\u0441\u0442", -"Quotations": "\u0426\u0438\u0442\u0430\u0442\u0438", -"Mathematical": "\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438", -"Extended Latin": "\u0420\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 \u0431\u0443\u043a\u0432\u0438", -"Symbols": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438", -"Arrows": "\u0421\u0442\u0440\u0435\u043b\u043a\u0438", -"User Defined": "\u0417\u0430\u0434\u0430\u0434\u0435\u043d\u0438 \u043e\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f", -"dollar sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0434\u043e\u043b\u0430\u0440", -"currency sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0432\u0430\u043b\u0443\u0442\u0430", -"euro-currency sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0435\u0432\u0440\u043e \u0432\u0430\u043b\u0443\u0442\u0430", -"colon sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u043e\u043b\u043e\u043d", -"cruzeiro sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e", -"french franc sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0444\u0440\u0435\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a", -"lira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0438\u0440\u0430", -"mill sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u0438\u043b", -"naira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u0430\u0439\u0440\u0430", -"peseta sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043f\u0435\u0441\u0435\u0442\u0430", -"rupee sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0440\u0443\u043f\u0438\u044f", -"won sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438 \u0432\u043e\u043d", -"new sheqel sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u043e\u0432 \u0448\u0435\u043a\u0435\u043b", -"dong sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0432\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u0434\u043e\u043d\u0433", -"kip sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f", -"tugrik sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438 \u0442\u0443\u0433\u0440\u0438\u043a", -"drachma sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0434\u0440\u0430\u0445\u043c\u0430", -"german penny symbol": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0433\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u043e \u043f\u0435\u043d\u0438", -"peso sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043f\u0435\u0441\u043e", -"guarani sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0433\u0443\u0430\u0440\u0430\u043d\u0438", -"austral sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0430\u0443\u0441\u0442\u0440\u0430\u043b", -"hryvnia sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0433\u0440\u0438\u0432\u043d\u044f", -"cedi sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0441\u0435\u0434\u0438", -"livre tournois sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0438\u0432\u0440 \u0442\u0443\u0440\u043d\u0443\u0430", -"spesmilo sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0441\u043f\u0435\u0441\u043c\u0438\u043b\u043e", -"tenge sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0442\u0435\u043d\u0433\u0435", -"indian rupee sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f", -"turkish lira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0442\u0443\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430", -"nordic mark sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u043e\u0440\u0434\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430", -"manat sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u0430\u043d\u0430\u0442", -"ruble sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0440\u0443\u0431\u043b\u0430", -"yen character": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0439\u0435\u043d\u0430", -"yuan character": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u044e\u0430\u043d", -"yuan character, in hong kong and taiwan": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u044e\u0430\u043d \u0432 \u0425\u043e\u043d\u043a\u043e\u043d\u0433 \u0438 \u0422\u0430\u0439\u0432\u0430\u043d", -"yen\/yuan character variant one": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0439\u0435\u043d\u0430\/\u044e\u0430\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0435\u0434\u043d\u043e", -"Loading emoticons...": "\u0417\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0435\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438...", -"Could not load emoticons": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0435\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438", -"People": "\u0425\u043e\u0440\u0430", -"Animals and Nature": "\u0416\u0438\u0432\u043e\u0442\u043d\u0438 \u0438 \u043f\u0440\u0438\u0440\u043e\u0434\u0430", -"Food and Drink": "\u0425\u0440\u0430\u043d\u0430 \u0438 \u043d\u0430\u043f\u0438\u0442\u043a\u0438", -"Activity": "\u0414\u0435\u0439\u043d\u043e\u0441\u0442\u0438", -"Travel and Places": "\u041f\u044a\u0442\u0443\u0432\u0430\u043d\u0435 \u0438 \u043c\u0435\u0441\u0442\u0430", -"Objects": "\u041f\u0440\u0435\u0434\u043c\u0435\u0442\u0438", -"Flags": "\u0417\u043d\u0430\u043c\u0435\u043d\u0430", -"Characters": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438", -"Characters (no spaces)": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438 (\u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0438)", -"{0} characters": "{0} \u0441\u0438\u043c\u0432\u043e\u043b\u0430", -"Error: Form submit field collision.": "\u0413\u0440\u0435\u0448\u043a\u0430: \u041d\u0435\u0441\u044a\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u0435 \u043f\u0440\u0438 \u0438\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044f\u0440.", -"Error: No form element found.": "\u0413\u0440\u0435\u0448\u043a\u0430: \u041d\u0435 \u0435 \u043e\u0442\u043a\u0440\u0438\u0442 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044f\u0440\u0430.", -"Update": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435", -"Color swatch": "\u0426\u0432\u0435\u0442\u043d\u0430 \u043c\u043e\u0441\u0442\u0440\u0430", -"Turquoise": "\u0422\u044e\u0440\u043a\u043e\u0430\u0437\u0435\u043d\u043e", -"Green": "\u0417\u0435\u043b\u0435\u043d\u043e", -"Blue": "\u0421\u0438\u043d\u044c\u043e", -"Purple": "\u041b\u0438\u043b\u0430\u0432\u043e", -"Navy Blue": "\u041c\u043e\u0440\u0441\u043a\u043e\u0441\u0438\u043d\u044c\u043e", -"Dark Turquoise": "\u0422\u044a\u043c\u043d\u043e\u0442\u044e\u0440\u043a\u043e\u0430\u0437\u0435\u043d\u043e", -"Dark Green": "\u0422\u044a\u043c\u043d\u043e\u0437\u0435\u043b\u0435\u043d\u043e", -"Medium Blue": "\u0421\u0440\u0435\u0434\u043d\u043e\u0441\u0438\u043d\u044c\u043e", -"Medium Purple": "\u0421\u0440\u0435\u0434\u043d\u043e\u043b\u0438\u043b\u0430\u0432\u043e", -"Midnight Blue": "\u0421\u0440\u0435\u0434\u043d\u043e\u0449\u043d\u043e \u0441\u0438\u043d\u044c\u043e", -"Yellow": "\u0416\u044a\u043b\u0442\u043e", -"Orange": "\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u043e", -"Red": "\u0427\u0435\u0440\u0432\u0435\u043d\u043e", -"Light Gray": "\u0421\u0432\u0435\u0442\u043b\u043e\u0441\u0438\u0432\u043e", -"Gray": "\u0421\u0438\u0432\u043e", -"Dark Yellow": "\u0422\u044a\u043c\u043d\u043e\u0436\u044a\u043b\u0442\u043e", -"Dark Orange": "\u0422\u044a\u043c\u043d\u043e\u043e\u0440\u0430\u043d\u0436\u0435\u0432\u043e", -"Dark Red": "\u0422\u044a\u043c\u043d\u043e\u0447\u0435\u0440\u0432\u0435\u043d\u043e", -"Medium Gray": "\u0421\u0440\u0435\u0434\u043d\u043e\u0441\u0438\u0432\u043e", -"Dark Gray": "\u0422\u044a\u043c\u043d\u043e\u0441\u0438\u0432\u043e", -"Light Green": "\u0421\u0432\u0435\u0442\u043b\u043e\u0437\u0435\u043b\u0435\u043d", -"Light Yellow": "\u0421\u0432\u0435\u0442\u043b\u043e\u0436\u044a\u043b\u0442", -"Light Red": "\u0421\u0432\u0435\u0442\u043b\u043e\u0447\u0435\u0440\u0432\u0435\u043d", -"Light Purple": "\u0421\u0432\u0435\u0442\u043b\u043e\u043b\u0438\u043b\u0430\u0432", -"Light Blue": "\u0421\u0432\u0435\u0442\u043b\u043e\u0441\u0438\u043d", -"Dark Purple": "\u0422\u044a\u043c\u043d\u043e\u043b\u0438\u043b\u0430\u0432", -"Dark Blue": "\u0422\u044a\u043c\u043d\u043e\u0441\u0438\u043d", -"Black": "\u0427\u0435\u0440\u043d\u043e", -"White": "\u0411\u044f\u043b\u043e", -"Switch to or from fullscreen mode": "\u041f\u0440\u0435\u0432\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043a\u044a\u043c \u0438\u043b\u0438 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u0446\u044f\u043b \u0435\u043a\u0440\u0430\u043d", -"Open help dialog": "\u041e\u0442\u0432\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449", -"history": "\u0438\u0441\u0442\u043e\u0440\u0438\u044f", -"styles": "\u0441\u0442\u0438\u043b\u043e\u0432\u0435", -"formatting": "\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435", -"alignment": "\u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435", -"indentation": "\u043e\u0442\u0441\u0442\u044a\u043f", -"permanent pen": "\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430 \u0445\u0438\u043c\u0438\u043a\u0430\u043b\u043a\u0430", -"comments": "\u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438", -"Format Painter": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435\u0442\u043e", -"Insert\/edit iframe": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043d\u0435 \u043d\u0430 iframe", -"Capitalization": "\u0413\u043b\u0430\u0432\u043d\u0430 \u0431\u0443\u043a\u0432\u0430", -"lowercase": "\u043c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438", -"UPPERCASE": "\u0413\u041e\u041b\u0415\u041c\u0418 \u0411\u0423\u041a\u0412\u0418", -"Title Case": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0438 \u0411\u0443\u043a\u0432\u0438", -"Permanent Pen Properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u041f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u0438\u044f \u041c\u0430\u0440\u043a\u0435\u0440", -"Permanent pen properties...": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u0438\u044f \u043c\u0430\u0440\u043a\u0435\u0440...", -"Font": "\u0428\u0440\u0438\u0444\u0442", -"Size": "\u0420\u0430\u0437\u043c\u0435\u0440", -"More...": "\u041e\u0449\u0435...", -"Spellcheck Language": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438 \u041f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430", -"Select...": "\u0418\u0437\u0431\u0435\u0440\u0438...", -"Preferences": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u043d\u0438\u044f", -"Yes": "\u0414\u0430", -"No": "\u041d\u0435", -"Keyboard Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430", -"Version": "\u0412\u0435\u0440\u0441\u0438\u044f", -"Anchor": "\u041a\u043e\u0442\u0432\u0430 (\u0432\u0440\u044a\u0437\u043a\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430)", -"Special character": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0435\u043d \u0437\u043d\u0430\u043a", -"Code sample": "\u041f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434", -"Color": "\u0426\u0432\u044f\u0442", -"Emoticons": "\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438", -"Document properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", -"Image": "\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430", -"Insert link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)", -"Target": "\u0426\u0435\u043b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", -"Link": "\u0412\u0440\u044a\u0437\u043a\u0430(\u043b\u0438\u043d\u043a)", -"Poster": "\u041f\u043e\u0441\u0442\u0435\u0440", -"Media": "\u041c\u0435\u0434\u0438\u044f", -"Print": "\u041f\u0435\u0447\u0430\u0442", -"Prev": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d", -"Find and replace": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0438 \u0437\u0430\u043c\u044f\u043d\u0430", -"Whole words": "\u0421\u0430\u043c\u043e \u0446\u0435\u043b\u0438 \u0434\u0443\u043c\u0438", -"Spellcheck": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430", -"Caption": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043f\u0440\u0435\u0434\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430", -"Insert template": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/bn_BD.js b/cps/static/js/libs/tinymce/langs/bn_BD.js deleted file mode 100644 index 0084ce785..000000000 --- a/cps/static/js/libs/tinymce/langs/bn_BD.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('bn_BD',{ -"Redo": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8", -"Undo": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09bf\u09b0\u09c1\u09a8", -"Cut": "\u0995\u09b0\u09cd\u09a4\u09a8", -"Copy": "\u0985\u09a8\u09c1\u0995\u09b0\u09a3", -"Paste": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b2\u09c7\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8", -"Select all": "\u09b8\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09c1\u09a8", -"New document": "\u09a8\u09a4\u09c1\u09a8 \u09a6\u09b8\u09cd\u09a4\u09be\u09ac\u09c7\u099c", -"Ok": "\u09a0\u09bf\u0995 \u0986\u099b\u09c7", -"Cancel": "\u09ac\u09be\u09a4\u09bf\u09b2", -"Visual aids": "\u09ac\u09cd\u09af\u09be\u0996\u09cd\u09af\u09be\u09ae\u09c2\u09b2\u0995 \u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af", -"Bold": "\u09b8\u09cd\u09a5\u09c2\u09b2", -"Italic": "\u09a4\u09bf\u09b0\u09cd\u09af\u0995", -"Underline": "\u09a8\u09bf\u09ae\u09cd\u09a8\u09b0\u09c7\u0996\u09be", -"Strikethrough": "\u09b8\u09cd\u099f\u09cd\u09b0\u09be\u0987\u0995\u09a5\u09cd\u09b0\u09c1", -"Superscript": "\u098a\u09b0\u09cd\u09a7\u09cd\u09ac\u09b2\u09bf\u09aa\u09bf", -"Subscript": "\u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u09aa\u09bf", -"Clear formatting": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8 \u0985\u09aa\u09b8\u09be\u09b0\u09a3", -"Align left": "\u09ac\u09be\u09ae\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3", -"Align center": "\u09ae\u09a7\u09cd\u09af\u09b8\u09cd\u09a5\u09be\u09a8\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3", -"Align right": "\u09a1\u09be\u09a8\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3", -"Justify": "\u0989\u09ad\u09af\u09bc\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09c7 \u09b8\u09ae\u09be\u09a8 \u0995\u09b0\u09c1\u09a8", -"Bullet list": "\u09ac\u09c1\u09b2\u09c7\u099f \u09a4\u09be\u09b2\u09bf\u0995\u09be", -"Numbered list": "\u09b8\u0982\u0996\u09cd\u09af\u09be\u09af\u09c1\u0995\u09cd\u09a4 \u09a4\u09be\u09b2\u09bf\u0995\u09be", -"Decrease indent": "\u0987\u09a8\u09cd\u09a1\u09c7\u09a8\u09cd\u099f \u0995\u09ae\u09be\u09a8", -"Increase indent": "\u0987\u09a8\u09cd\u09a1\u09c7\u09a8\u09cd\u099f \u09ac\u09be\u09a1\u09bc\u09be\u09a8", -"Close": "\u09ac\u09a8\u09cd\u09a7", -"Formats": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09cd\u09b0\u09be\u0989\u099c\u09be\u09b0 \u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1 \u09a5\u09c7\u0995\u09c7 \u09b8\u09b0\u09be\u09b8\u09b0\u09bf \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6\u09be\u09a7\u09bf\u0995\u09be\u09b0 \u09b8\u09ae\u09b0\u09cd\u09a5\u09a8 \u0995\u09b0\u09c7 \u09a8\u09be\u0964 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0995\u09c0\u09ac\u09cb\u09b0\u09cd\u09a1 \u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f Ctrl +X\/C\/V \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8\u0964", -"Headers": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09b8\u09ae\u09c1\u09b9", -"Header 1": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e7", -"Header 2": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e8", -"Header 3": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e9", -"Header 4": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09ea", -"Header 5": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09eb", -"Header 6": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09ec", -"Headings": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae", -"Heading 1": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e7", -"Heading 2": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e8", -"Heading 3": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e9", -"Heading 4": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09ea", -"Heading 5": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09eb", -"Heading 6": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09ec", -"Preformatted": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8\u09bf\u09a4", -"Div": "\u09a1\u09bf\u09ad", -"Pre": "\u09aa\u09cd\u09b0\u09be\u0995", -"Code": "\u09b8\u0982\u0995\u09c7\u09a4\u09b2\u09bf\u09aa\u09bf", -"Paragraph": "\u09aa\u09cd\u09af\u09be\u09b0\u09be\u0997\u09cd\u09b0\u09be\u09ab", -"Blockquote": "\u09ac\u09cd\u09b2\u0995\u0995\u09cb\u099f", -"Inline": "\u09b8\u0999\u09cd\u0997\u09a4\u09bf\u09aa\u09c2\u09b0\u09cd\u09a3\u09ad\u09be\u09ac\u09c7", -"Blocks": "\u09b8\u09cd\u09a5\u09c2\u09b2 ", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u09aa\u09c7\u09b8\u09cd\u099f \u098f\u0996\u09a8 \u09aa\u09cd\u09b2\u09c7\u0987\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ae\u09cb\u09a1\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u098f\u0996\u09a8 \u098f\u0987 \u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u09ac\u09a8\u09cd\u09a7 \u099f\u0997\u09b2 \u09aa\u09b0\u09cd\u09af\u09a8\u09cd\u09a4 \u09ac\u09bf\u09b7\u09af\u09bc\u09ac\u09b8\u09cd\u09a4\u09c1 \u098f\u0996\u09a8 \u09aa\u09cd\u09b2\u09c7\u0987\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09b9\u09bf\u09b8\u09be\u09ac\u09c7 \u0986\u099f\u0995\u09be\u09a8\u09cb \u09b9\u09ac\u09c7\u0964", -"Fonts": "\u09ab\u09a8\u09cd\u099f\u09b8", -"Font Sizes": "\u09ab\u09a8\u09cd\u099f \u09ae\u09be\u09aa", -"Class": "\u0995\u09cd\u09b2\u09be\u09b8", -"Browse for an image": "\u098f\u0995\u099f\u09bf \u099b\u09ac\u09bf \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8", -"OR": "\u0985\u09a5\u09ac\u09be", -"Drop an image here": "\u098f\u0996\u09be\u09a8\u09c7 \u098f\u0995\u099f\u09bf \u099b\u09ac\u09bf \u09a1\u09cd\u09b0\u09aa \u0995\u09b0\u09c1\u09a8", -"Upload": "\u0986\u09aa\u09b2\u09cb\u09a1", -"Block": "\u09ac\u09cd\u09b2\u0995", -"Align": "\u09ac\u09bf\u09a8\u09cd\u09af\u09b8\u09cd\u09a4\u0995\u09b0\u09c1\u09a8", -"Default": "\u09a1\u09bf\u09ab\u09b2\u09cd\u099f", -"Circle": "\u09ac\u09c3\u09a4\u09cd\u09a4", -"Disc": "\u09a1\u09bf\u09b8\u09cd\u0995", -"Square": "\u09ac\u09b0\u09cd\u0997\u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0", -"Lower Alpha": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u0986\u09b2\u09ab\u09be", -"Lower Greek": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u0997\u09cd\u09b0\u09bf\u0995", -"Lower Roman": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u09b0\u09cb\u09ae\u09be\u09a8", -"Upper Alpha": "\u0989\u099a\u09cd\u099a\u09a4\u09b0 \u0986\u09b2\u09ab\u09be", -"Upper Roman": "\u098a\u09b0\u09cd\u09a7\u09cd\u09ac \u09b0\u09cb\u09ae\u09be\u09a8", -"Anchor...": "\u098f\u0999\u09cd\u0995\u09b0...", -"Name": "\u09a8\u09be\u09ae", -"Id": "\u0986\u0987\u09a1\u09bf", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0986\u0987\u09a1\u09bf\u099f\u09bf \u0985\u0995\u09cd\u09b7\u09b0, \u09b8\u0982\u0996\u09cd\u09af\u09be, \u09a1\u09cd\u09af\u09be\u09b6, \u09a1\u099f\u09b8, \u0995\u09b2\u09cb\u09a8 \u09ac\u09be \u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b8\u09cd\u0995\u09cb\u09b0 \u09a6\u09cd\u09ac\u09be\u09b0\u09be \u0985\u09a8\u09c1\u09b8\u09b0\u09a3 \u0995\u09b0\u09be \u098f\u0995\u099f\u09bf \u099a\u09bf\u09a0\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09be \u0989\u099a\u09bf\u09a4\u0964", -"You have unsaved changes are you sure you want to navigate away?": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u09af\u09c7 \u0986\u09aa\u09a8\u09bf \u09a8\u09c7\u09ad\u09bf\u0997\u09c7\u099f \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8?", -"Restore last draft": "\u09b6\u09c7\u09b7 \u0996\u09b8\u09a1\u09bc\u09be\u099f\u09bf \u09aa\u09c1\u09a8\u09b0\u09c1\u09a6\u09cd\u09a7\u09be\u09b0 \u0995\u09b0\u09c1\u09a8", -"Special character...": "\u09ac\u09bf\u09b6\u09c7\u09b7 \u09ac\u09b0\u09cd\u09a3...", -"Source code": "\u09b8\u09cb\u09b0\u09cd\u09b8 \u0995\u09cb\u09a1", -"Insert\/Edit code sample": "\u0995\u09cb\u09a1 \u09a8\u09ae\u09c1\u09a8\u09be \u09a2\u09cb\u0995\u09be\u09a8 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", -"Language": "\u09ad\u09be\u09b7\u09be", -"Code sample...": "\u09a8\u09ae\u09c1\u09a8\u09be \u0995\u09cb\u09a1", -"Color Picker": "\u09b0\u0999 \u099a\u09af\u09bc\u09a8\u0995\u09be\u09b0\u09c0", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "\u09ac\u09be\u09ae \u09a5\u09c7\u0995\u09c7 \u09a1\u09be\u09a8", -"Right to left": "\u09a1\u09be\u09a8 \u09a5\u09c7\u0995\u09c7 \u09ac\u09be\u09ae", -"Emoticons...": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8", -"Metadata and Document Properties": "\u09ae\u09c7\u099f\u09be\u09a1\u09c7\u099f\u09be \u098f\u09ac\u0982 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Title": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae", -"Keywords": "\u0995\u09c0\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", -"Description": "\u09ac\u09bf\u09ac\u09b0\u09a3", -"Robots": "\u09b0\u09cb\u09ac\u099f", -"Author": "\u09b2\u09c7\u0996\u0995", -"Encoding": "\u098f\u09a8\u0995\u09cb\u09a1\u09bf\u0982", -"Fullscreen": "\u09aa\u09c2\u09b0\u09cd\u09a3 \u09aa\u09b0\u09cd\u09a6\u09be", -"Action": "\u0995\u09b0\u09cd\u09ae", -"Shortcut": "\u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f", -"Help": "\u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af \u0995\u09b0\u09c1\u09a8", -"Address": "\u09a0\u09bf\u0995\u09be\u09a8\u09be", -"Focus to menubar": "\u09ae\u09c7\u09a8\u09c1\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8", -"Focus to toolbar": "\u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8", -"Focus to element path": "\u0989\u09aa\u09be\u09a6\u09be\u09a8 \u09aa\u09be\u09a5 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8", -"Focus to contextual toolbar": "\u09aa\u09cd\u09b0\u09be\u09b8\u0999\u09cd\u0997\u09bf\u0995 \u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8", -"Insert link (if link plugin activated)": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8 (\u09af\u09a6\u09bf \u09b2\u09bf\u0999\u09cd\u0995 \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09cd\u099f\u09bf\u09ad\u09c7\u099f \u0995\u09b0\u09be \u09b9\u09af\u09bc)", -"Save (if save plugin activated)": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8 (\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09cd\u099f\u09bf\u09ad\u09c7\u099f \u09b9\u09b2\u09c7)", -"Find (if searchreplace plugin activated)": "\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8 (\u09af\u09a6\u09bf \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09af\u09cb\u0997\u09cd\u09af \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u09b8\u0995\u09cd\u09b0\u09bf\u09af\u09bc \u0995\u09b0\u09be \u09b9\u09af\u09bc)", -"Plugins installed ({0}):": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0987\u09a8\u09b8\u09cd\u099f\u09b2 ({0}):", -"Premium plugins:": "\u09aa\u09cd\u09b0\u09bf\u09ae\u09bf\u09af\u09bc\u09be\u09ae \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8:", -"Learn more...": "\u0986\u09b0\u0993 \u099c\u09be\u09a8\u09c1\u09a8...", -"You are using {0}": "\u0986\u09aa\u09a8\u09bf \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7\u09a8 {0}", -"Plugins": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8", -"Handy Shortcuts": "\u09b8\u09b9\u099c \u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f ", -"Horizontal line": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995 \u09b0\u09c7\u0996\u09be", -"Insert\/edit image": "\u0987\u09ae\u09c7\u099c \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", -"Image description": "\u099b\u09ac\u09bf\u09b0 \u09ac\u09b0\u09cd\u09a3\u09a8\u09be", -"Source": "\u0989\u09ce\u09b8", -"Dimensions": "\u09ae\u09be\u09a4\u09cd\u09b0\u09be", -"Constrain proportions": "\u0985\u09a8\u09c1\u09aa\u09be\u09a4 \u09b8\u09c0\u09ae\u09be\u09ac\u09a6\u09cd\u09a7", -"General": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3", -"Advanced": "\u0985\u0997\u09cd\u09b0\u09b8\u09b0", -"Style": "\u09b6\u09c8\u09b2\u09c0", -"Vertical space": "\u0989\u09b2\u09cd\u09b2\u09ae\u09cd\u09ac \u09b8\u09cd\u09a5\u09be\u09a8", -"Horizontal space": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995 \u09b8\u09cd\u09a5\u09be\u09a8", -"Border": "\u09b8\u09c0\u09ae\u09be\u09a8\u09cd\u09a4", -"Insert image": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09a2\u09cb\u0995\u09be\u09a8", -"Image...": "\u0987\u09ae\u09c7\u099c...", -"Image list": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09a4\u09be\u09b2\u09bf\u0995\u09be", -"Rotate counterclockwise": "\u09ac\u09be\u09ae\u09be\u09ac\u09b0\u09cd\u09a4\u09c7 \u0998\u09cb\u09b0\u09be\u09a4\u09c7", -"Rotate clockwise": "\u0998\u09a1\u09bc\u09bf\u09b0 \u0995\u09be\u0981\u099f\u09be\u09b0 \u09a6\u09bf\u0995\u09c7 \u0998\u09cb\u09b0\u09be\u09a8", -"Flip vertically": "\u0989\u09b2\u09cd\u09b2\u09ae\u09cd\u09ac\u09ad\u09be\u09ac\u09c7 \u09ab\u09cd\u09b2\u09bf\u09aa \u0995\u09b0\u09c1\u09a8", -"Flip horizontally": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995\u09ad\u09be\u09ac\u09c7 \u09ab\u09cd\u09b2\u09bf\u09aa \u0995\u09b0\u09c1\u09a8", -"Edit image": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", -"Image options": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09ac\u09bf\u0995\u09b2\u09cd\u09aa\u0997\u09c1\u09b2\u09bf", -"Zoom in": "\u09aa\u09cd\u09b0\u09b8\u09be\u09b0\u09bf\u09a4 \u0995\u09b0\u09cb", -"Zoom out": "\u099b\u09cb\u099f \u0995\u09b0\u09be", -"Crop": "\u0995\u09be\u099f\u09be", -"Resize": "\u09ae\u09be\u09aa \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8", -"Orientation": "\u099d\u09cb\u0981\u0995", -"Brightness": "\u0989\u099c\u09cd\u099c\u09cd\u09ac\u09b2\u09a4\u09be", -"Sharpen": "\u09a7\u09be\u09b0 \u0995\u09b0\u09be", -"Contrast": "\u09ac\u09bf\u09aa\u09b0\u09c0\u09a4 \u09b9\u09a4\u09cd\u09a4\u09af\u09bc\u09be", -"Color levels": "\u09b0\u0999\u09c7\u09b0 \u09ae\u09be\u09a4\u09cd\u09b0\u09be", -"Gamma": "Gamma", -"Invert": "\u09ac\u09bf\u09a8\u09b7\u09cd\u099f \u0995\u09b0\u09be", -"Apply": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u0997 \u0995\u09b0\u09be", -"Back": "\u09aa\u09bf\u099b\u09a8\u09c7", -"Insert date\/time": "\u09a4\u09be\u09b0\u09bf\u0996 \/ \u09b8\u09ae\u09af\u09bc \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8", -"Date\/time": "\u09a4\u09be\u09b0\u09bf\u0996 \/ \u09b8\u09ae\u09af\u09bc", -"Insert\/Edit Link": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6\/\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u09b2\u09bf\u0999\u09cd\u0995", -"Insert\/edit link": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u09b2\u09bf\u0999\u09cd\u0995", -"Text to display": "\u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f", -"Url": "URL", -"Open link in...": "\u09b2\u09bf\u0999\u09cd\u0995\u099f\u09bf \u0996\u09c1\u09b2\u09c1\u09a8...", -"Current window": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u0989\u0987\u09a8\u09cd\u09a1\u09cb", -"None": "\u09a8\u09be", -"New window": "\u09a8\u09a4\u09c1\u09a8 \u0989\u0987\u09a8\u09cd\u09a1\u09cb", -"Remove link": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09b0\u09be\u09a8", -"Anchors": "\u09a8\u09cb\u0999\u09cd\u0997\u09b0", -"Link...": "\u09b2\u09bf\u0982\u0995...", -"Paste or type a link": "\u098f\u0995\u099f\u09bf \u09b2\u09bf\u0999\u09cd\u0995 \u0986\u099f\u0995\u09be\u09a8 \u09ac\u09be \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6 \u0995\u09b0\u09be URL\u099f\u09bf \u098f\u0995\u099f\u09bf \u0987\u09ae\u09c7\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be \u09ac\u09b2\u09c7 \u09ae\u09a8\u09c7 \u09b9\u099a\u09cd\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u09ae\u09c7\u0987\u09b2\u099f\u09cb \u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8: \u0989\u09aa\u09b8\u09b0\u09cd\u0997?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6 \u0995\u09b0\u09be URL\u099f\u09bf \u098f\u0995\u099f\u09bf \u09ac\u09b9\u09bf\u09b0\u09be\u0997\u09a4 \u09b2\u09bf\u0999\u09cd\u0995 \u09ac\u09b2\u09c7 \u09ae\u09a8\u09c7 \u09b9\u099a\u09cd\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc http:\/\/ \u09aa\u09cd\u09b0\u09bf\u09ab\u09bf\u0995\u09cd\u09b8 \u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8?", -"Link list": "\u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09be\u09b2\u09bf\u0995\u09be", -"Insert video": "\u09ad\u09bf\u09a1\u09bf\u0993 \u09a2\u09cb\u0995\u09be\u09a8", -"Insert\/edit video": "\u09ad\u09bf\u09a1\u09bf\u0993 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", -"Insert\/edit media": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", -"Alternative source": "\u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u0989\u09ce\u09b8", -"Alternative source URL": "\u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u0989\u09ce\u09b8 \u0987\u0986\u09b0\u098f\u09b2", -"Media poster (Image URL)": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be \u09aa\u09cb\u09b8\u09cd\u099f\u09be\u09b0 (\u0987\u09ae\u09c7\u099c \u0987\u0989\u0986\u09b0\u098f\u09b2)", -"Paste your embed code below:": "\u09a8\u09c0\u099a\u09c7\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09cb\u09a1 \u0986\u099f\u0995\u09be\u09a8:", -"Embed": "\u098f\u09ae\u09cd\u09ac\u09c7\u09a1", -"Media...": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be...", -"Nonbreaking space": "\u0985\u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8 \u09b8\u09cd\u09a5\u09be\u09a8", -"Page break": "\u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09ac\u09bf\u09b0\u09a4\u09bf", -"Paste as text": "\u09aa\u09be\u09a0\u09cd\u09af \u09b9\u09bf\u09b8\u09be\u09ac\u09c7 \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8", -"Preview": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09b0\u09c2\u09aa", -"Print...": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09a8...", -"Save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3", -"Find": "\u0986\u09ac\u09bf\u09b7\u09cd\u0995\u09be\u09b0", -"Replace with": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8", -"Replace": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be", -"Replace all": "\u09b8\u09ae\u09b8\u09cd\u09a4 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8", -"Previous": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0", -"Next": "\u09aa\u09b0\u09ac\u09b0\u09cd\u09a4\u09c0", -"Find and replace...": "\u0996\u09c1\u0981\u099c\u09c1\u09a8 \u0993 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8...", -"Could not find the specified string.": "\u09a8\u09bf\u09b0\u09cd\u09a6\u09bf\u09b7\u09cd\u099f \u09b8\u09cd\u099f\u09cd\u09b0\u09bf\u0982\u099f\u09bf \u0996\u09c1\u0981\u099c\u09c7 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf\u0964", -"Match case": "\u09ae\u09cd\u09af\u09be\u099a \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0\u09c7", -"Find whole words only": "\u09b6\u09c1\u09a7\u09c1\u09ae\u09be\u09a4\u09cd\u09b0 \u09aa\u09c1\u09b0\u09cb \u09b6\u09ac\u09cd\u09a6\u0997\u09c1\u09b2\u09bf \u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8", -"Spell check": "\u09ac\u09be\u09a8\u09be\u09a8 \u09af\u09be\u099a\u09be\u0987", -"Ignore": "\u0989\u09aa\u09c7\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09be", -"Ignore all": "\u09b8\u09ac\u0997\u09c1\u09b2\u09cb \u0989\u09aa\u09c7\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09c1\u09a8", -"Finish": "\u09b6\u09c7\u09b7", -"Add to Dictionary": "\u0985\u09ad\u09bf\u09a7\u09be\u09a8 \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8", -"Insert table": "\u099f\u09c7\u09ac\u09bf\u09b2 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8", -"Table properties": "\u099f\u09c7\u09ac\u09bf\u09b2 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Delete table": "\u09b8\u09be\u09b0\u09a3\u09bf \u09ae\u09c1\u099b\u09c1\u09a8", -"Cell": "\u09b8\u09c7\u09b2", -"Row": "\u09b8\u09be\u09b0\u09bf", -"Column": "\u0995\u09b2\u09be\u09ae", -"Cell properties": "\u09b8\u09c7\u09b2 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Merge cells": "\u09b8\u09c7\u09b2 \u09ae\u09be\u09b0\u09cd\u099c \u0995\u09b0\u09c1\u09a8", -"Split cell": "\u09b8\u09cd\u09aa\u09cd\u09b2\u09bf\u099f \u09b8\u09c7\u09b2", -"Insert row before": "\u0986\u0997\u09c7 \u09b8\u09be\u09b0\u09bf \u09a2\u09cb\u0995\u09be\u09a8", -"Insert row after": "\u09aa\u09b0\u09c7 \u09b8\u09be\u09b0\u09bf \u09a2\u09cb\u0995\u09be\u09a8", -"Delete row": "\u09b8\u09be\u09b0\u09bf \u09ae\u09c1\u099b\u09c1\u09a8", -"Row properties": "\u09b8\u09be\u09b0\u09bf \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Cut row": "\u09b8\u09be\u09b0\u09bf \u0995\u09be\u099f\u09c1\u09a8", -"Copy row": "\u09b8\u09be\u09b0\u09bf \u0985\u09a8\u09c1\u09b2\u09bf\u09aa\u09bf \u0995\u09b0\u09c1\u09a8", -"Paste row before": "\u0986\u0997\u09c7 \u09b8\u09be\u09b0\u09bf \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8", -"Paste row after": "\u09aa\u09b0\u09c7 \u09b8\u09be\u09b0\u09bf \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8", -"Insert column before": "\u0986\u0997\u09c7 \u0995\u09b2\u09be\u09ae \u09a2\u09cb\u0995\u09be\u09a8", -"Insert column after": "\u09aa\u09b0\u09c7 \u0995\u09b2\u09be\u09ae \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8", -"Delete column": "\u0995\u09b2\u09be\u09ae \u09ae\u09c1\u099b\u09c1\u09a8", -"Cols": "\u0995\u09b2\u09be\u09ae \u0997\u09c1\u09b2\u09cb", -"Rows": "\u09b8\u09be\u09b0\u09bf\u0997\u09c1\u09b2\u09cb", -"Width": "\u09aa\u09cd\u09b0\u09b8\u09cd\u09a5", -"Height": "\u0989\u099a\u09cd\u099a\u09a4\u09be", -"Cell spacing": "\u09b8\u09c7\u09b2 \u09ab\u09be\u0981\u0995\u09be", -"Cell padding": "\u09b8\u09c7\u09b2 \u09aa\u09cd\u09af\u09be\u09a1\u09bf\u0982", -"Show caption": "\u0995\u09cd\u09af\u09be\u09aa\u09b6\u09a8 \u09a6\u09c7\u0996\u09be\u09a8", -"Left": "\u09ac\u09be\u09ae", -"Center": "\u0995\u09c7\u09a8\u09cd\u09a6\u09cd\u09b0", -"Right": "\u09a1\u09be\u09a8", -"Cell type": "\u09b8\u09c7\u09b2 \u099f\u09be\u0987\u09aa", -"Scope": "\u09ac\u09cd\u09af\u09be\u09aa\u09cd\u09a4\u09bf", -"Alignment": "\u09b6\u09cd\u09b0\u09c7\u09a3\u09c0\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8", -"H Align": "H \u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7", -"V Align": "V \u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7", -"Top": "\u0989\u09aa\u09b0", -"Middle": "\u09ae\u09a7\u09cd\u09af\u09ae", -"Bottom": "\u09a8\u09bf\u099a\u09c7", -"Header cell": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09b8\u09c7\u09b2", -"Row group": "\u09b8\u09be\u09b0\u09bf \u0997\u09cd\u09b0\u09c1\u09aa", -"Column group": "\u0995\u09b2\u09be\u09ae \u0997\u09cd\u09b0\u09c1\u09aa", -"Row type": "\u09b8\u09be\u09b0\u09bf\u09b0 \u09a7\u09b0\u09a8", -"Header": "\u09b9\u09c7\u09a1\u09be\u09b0", -"Body": "\u09ac\u09a1\u09bf", -"Footer": "\u09ab\u09c1\u099f\u09be\u09b0", -"Border color": "\u09b8\u09c0\u09ae\u09be\u09a8\u09cd\u09a4 \u09b0\u0999", -"Insert template...": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f \u09a2\u09cb\u0995\u09be\u09a8...", -"Templates": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f", -"Template": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f", -"Text color": "\u09b2\u09c7\u0996\u09be\u09b0 \u09b0\u0999", -"Background color": "\u09aa\u09c7\u099b\u09a8\u09c7\u09b0 \u09b0\u0982", -"Custom...": "\u0995\u09be\u09b8\u09cd\u099f\u09ae...", -"Custom color": "\u0995\u09be\u09b8\u09cd\u099f\u09ae \u09b0\u0982", -"No color": "\u0995\u09cb\u09a8 \u09b0\u0982 \u09a8\u09c7\u0987", -"Remove color": "\u09b0\u0999 \u09b8\u09b0\u09be\u09a8", -"Table of Contents": "\u09b8\u09c1\u099a\u09bf\u09aa\u09a4\u09cd\u09b0", -"Show blocks": "\u09ac\u09cd\u09b2\u0995 \u09a6\u09c7\u0996\u09be\u09a8", -"Show invisible characters": "\u0985\u09a6\u09c3\u09b6\u09cd\u09af \u0985\u0995\u09cd\u09b7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8", -"Word count": "\u09b6\u09ac\u09cd\u09a6 \u0997\u09a3\u09a8\u09be", -"Count": "\u0997\u09a3\u09a8\u09be", -"Document": "\u09a6\u09b2\u09bf\u09b2", -"Selection": "\u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8", -"Words": "\u09b6\u09ac\u09cd\u09a6\u09b8\u09ae\u09c2\u09b9", -"Words: {0}": "\u09b6\u09ac\u09cd\u09a6: {0}", -"{0} words": "{0} \u09b6\u09ac\u09cd\u09a6", -"File": "\u09ab\u09be\u0987\u09b2", -"Edit": "\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8 \u0995\u09b0\u09be", -"Insert": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6", -"View": "\u09a6\u09c3\u09b6\u09cd\u09af", -"Format": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8", -"Table": "\u099f\u09c7\u09ac\u09bf\u09b2", -"Tools": "\u09b8\u09b0\u099e\u09cd\u099c\u09be\u09ae\u09b8\u09ae\u09c2\u09b9", -"Powered by {0}": "{0} \u09a6\u09cd\u09ac\u09be\u09b0\u09be \u099a\u09be\u09b2\u09bf\u09a4", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u09b0\u09bf\u099a \u099f\u09c7\u0995\u09cd\u09b8\u099f \u098f\u09b0\u09bf\u09af\u09bc\u09be \u09ae\u09c7\u09a8\u09c1 \u099c\u09a8\u09cd\u09af ALT-F9 \u099a\u09be\u09aa\u09c1\u09a8 \u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7\u09b0 \u099c\u09a8\u09cd\u09af ALT-F10 \u099f\u09bf\u09aa\u09c1\u09a8 \u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af\u09c7\u09b0 \u099c\u09a8\u09cd\u09af ALT-0 \u099a\u09be\u09aa\u09c1\u09a8", -"Image title": "\u0987\u09ae\u09c7\u099c\u09c7\u09b0 \u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae", -"Border width": "\u09b8\u09c0\u09ae\u09be\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09b6\u09b8\u09cd\u09a5\u09a4\u09be", -"Border style": "\u09b8\u09c0\u09ae\u09be\u09a8\u09be \u09b6\u09c8\u09b2\u09c0", -"Error": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf", -"Warn": "\u09b8\u09be\u09ac\u09a7\u09be\u09a8", -"Valid": "\u09ac\u09c8\u09a7", -"To open the popup, press Shift+Enter": "\u09aa\u09aa\u0986\u09aa \u0996\u09c1\u09b2\u09a4\u09c7, \u09b6\u09bf\u09ab\u099f + \u098f\u09a8\u09cd\u099f\u09be\u09b0 \u099f\u09bf\u09aa\u09c1\u09a8", -"Rich Text Area. Press ALT-0 for help.": "\u09b8\u09ae\u09c3\u09a6\u09cd\u09a7 \u09aa\u09be\u09a0\u09cd\u09af \u0985\u099e\u09cd\u099a\u09b2\u0964 \u09b8\u09b9\u09be\u09af\u09bc\u09a4\u09be\u09b0 \u099c\u09a8\u09cd\u09af ALT-0 \u099f\u09bf\u09aa\u09c1\u09a8\u0964", -"System Font": "\u09b8\u09bf\u09b8\u09cd\u099f\u09c7\u09ae \u09ab\u09a8\u09cd\u099f", -"Failed to upload image: {0}": "\u099a\u09bf\u09a4\u09cd\u09b0 \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09df\u09c7\u099b\u09c7: {0}", -"Failed to load plugin: {0} from url {1}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5: {0} \u0987\u0989\u0986\u09b0\u098f\u09b2 \u09a5\u09c7\u0995\u09c7 {1}", -"Failed to load plugin url: {0}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0987\u0989\u0986\u09b0\u098f\u09b2 \u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5: {0}", -"Failed to initialize plugin: {0}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09df\u09c7\u099b\u09c7: {0}", -"example": "\u0989\u09a6\u09be\u09b9\u09b0\u09a3", -"Search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8", -"All": "\u09b8\u0995\u09b2", -"Currency": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09be", -"Text": "\u099f\u09c7\u0995\u09cd\u09b8\u099f", -"Quotations": "\u0989\u09a6\u09cd\u09a7\u09c3\u09a4\u09bf", -"Mathematical": "\u0997\u09be\u09a3\u09bf\u09a4\u09bf\u0995", -"Extended Latin": "\u09ac\u09b0\u09cd\u09a7\u09bf\u09a4 \u09b2\u09be\u09a4\u09bf\u09a8", -"Symbols": "\u09aa\u09cd\u09b0\u09a4\u09c0\u0995", -"Arrows": "\u09a4\u09c0\u09b0", -"User Defined": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0 \u09b8\u0982\u099c\u09cd\u099e\u09be\u09af\u09bc\u09bf\u09a4", -"dollar sign": "\u09a1\u09b2\u09be\u09b0 \u099a\u09bf\u09b9\u09cd\u09a8", -"currency sign": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09be\u09b0 \u099a\u09bf\u09b9\u09cd\u09a8", -"euro-currency sign": "\u0987\u0989\u09b0\u09cb-\u09ae\u09c1\u09a6\u09cd\u09b0\u09be \u09b8\u09be\u0987\u09a8", -"colon sign": "\u0995\u09cb\u09b2\u09a8 \u099a\u09bf\u09b9\u09cd\u09a8", -"cruzeiro sign": "\u0995\u09cd\u09b0\u09c1\u099c\u09c1\u0987\u09b0\u09cb \u099a\u09bf\u09b9\u09cd\u09a8", -"french franc sign": "\u09ab\u09cd\u09b0\u09c7\u099e\u09cd\u099a \u09ab\u09cd\u09b0\u09cd\u09af\u09be\u0999\u09cd\u0995 \u099a\u09bf\u09b9\u09cd\u09a8", -"lira sign": "\u09b2\u09bf\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"mill sign": "\u09ae\u09bf\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8", -"naira sign": "\u09a8\u09be\u09df\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"peseta sign": "\u09aa\u09c7\u09b8\u09c7\u099f\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"rupee sign": "\u09b0\u09c1\u09aa\u09bf \u099a\u09bf\u09b9\u09cd\u09a8", -"won sign": "\u0989\u09a8 \u099a\u09bf\u09b9\u09cd\u09a8", -"new sheqel sign": "\u09a8\u09a4\u09c1\u09a8 \u09b6\u09bf\u0995\u09c7\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8", -"dong sign": "\u09a1\u0982 \u099a\u09bf\u09b9\u09cd\u09a8", -"kip sign": "\u0995\u09bf\u09aa \u099a\u09bf\u09b9\u09cd\u09a8", -"tugrik sign": "\u09a4\u09c1\u0997\u09b0\u09bf\u0995 \u099a\u09bf\u09b9\u09cd\u09a8", -"drachma sign": "\u09a1\u09cd\u09b0\u09be\u099a\u09ae\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"german penny symbol": "\u099c\u09be\u09b0\u09cd\u09ae\u09be\u09a8 \u09aa\u09c7\u09a8\u09bf \u099a\u09bf\u09b9\u09cd\u09a8", -"peso sign": "\u09aa\u09c7\u09b8\u09cb \u099a\u09bf\u09b9\u09cd\u09a8", -"guarani sign": "\u0997\u09c1\u09df\u09be\u09b0\u09be\u09a8\u09c0 \u099a\u09bf\u09b9\u09cd\u09a8", -"austral sign": "\u0993\u09b8\u09cd\u099f\u09cd\u09b0\u09be\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8", -"hryvnia sign": "\u09b9\u09be\u09b0\u09ad\u09a8\u09bf\u09df\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"cedi sign": "\u09b8\u09c7\u09a1\u09bf \u099a\u09bf\u09b9\u09cd\u09a8", -"livre tournois sign": "\u09b2\u09bf\u09ad\u09cd\u09b0\u09c7 \u099f\u09c1\u09b0\u09a8\u0987\u09b8 \u099a\u09bf\u09b9\u09cd\u09a8", -"spesmilo sign": "\u09b8\u09cd\u09aa\u09c7\u09b8\u09ae\u09bf\u09b2\u09cb \u099a\u09bf\u09b9\u09cd\u09a8", -"tenge sign": "\u099f\u09bf\u09a8\u0997\u09c7 \u099a\u09bf\u09b9\u09cd\u09a8", -"indian rupee sign": "\u0987\u09a8\u09cd\u09a1\u09bf\u09df\u09be\u09a8 \u09b0\u09c1\u09aa\u09bf \u099a\u09bf\u09b9\u09cd\u09a8", -"turkish lira sign": "\u09a4\u09c1\u0995\u09bf\u09b8\u09cd\u09a4\u09be\u09a8 \u09b2\u09bf\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8", -"nordic mark sign": "\u09a8\u09b0\u09a1\u09bf\u0995 \u09ae\u09be\u09b0\u09cd\u0995 \u099a\u09bf\u09b9\u09cd\u09a8", -"manat sign": "\u09ae\u09be\u09a8\u09be\u099f \u099a\u09bf\u09b9\u09cd\u09a8", -"ruble sign": "\u09b0\u09c1\u09ac\u09c7\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8", -"yen character": "\u0987\u09df\u09c7\u09a8 \u0985\u0995\u09cd\u09b7\u09b0", -"yuan character": "\u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0", -"yuan character, in hong kong and taiwan": "\u09b9\u0982\u0995\u0982 \u098f\u09ac\u0982 \u09a4\u09be\u0987\u0993\u09af\u09bc\u09be\u09a8\u09c7 \u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0", -"yen\/yuan character variant one": "\u0987\u09af\u09bc\u09c7\u09a8\/\u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0\u09c7\u09b0 \u098f\u0995\u099f\u09bf \u09ac\u09c8\u0995\u09b2\u09cd\u09aa\u09bf\u0995", -"Loading emoticons...": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8 \u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...", -"Could not load emoticons": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8 \u09b2\u09cb\u09a1 \u0995\u09b0\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf", -"People": "\u099c\u09a8\u09b8\u09be\u09a7\u09be\u09b0\u09a3", -"Animals and Nature": "\u09aa\u09cd\u09b0\u09be\u09a3\u09c0 \u098f\u09ac\u0982 \u09aa\u09cd\u09b0\u0995\u09c3\u09a4\u09bf", -"Food and Drink": "\u0996\u09be\u09a6\u09cd\u09af \u0993 \u09aa\u09be\u09a8\u09c0\u09af\u09bc", -"Activity": "\u0995\u09be\u09b0\u09cd\u09af\u0995\u09b2\u09be\u09aa", -"Travel and Places": "\u09ad\u09cd\u09b0\u09ae\u09a3 \u098f\u09ac\u0982 \u09b8\u09cd\u09a5\u09be\u09a8", -"Objects": "\u0989\u09a6\u09cd\u09a6\u09c7\u09b6\u09cd\u09af", -"Flags": "\u09aa\u09a4\u09be\u0995\u09be", -"Characters": "\u0985\u0995\u09cd\u09b7\u09b0", -"Characters (no spaces)": "\u0985\u0995\u09cd\u09b7\u09b0 (\u0995\u09cb\u09a8\u0993 \u09b8\u09cd\u09aa\u09c7\u09b8 \u09a8\u09c7\u0987)", -"{0} characters": "{0} \u0985\u0995\u09cd\u09b7\u09b0", -"Error: Form submit field collision.": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf: \u09ab\u09b0\u09cd\u09ae \u099c\u09ae\u09be \u09a6\u09c7\u0993\u09af\u09bc\u09be\u09b0 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0\u09c7 \u09b8\u0982\u0998\u09b0\u09cd\u09b7\u0964", -"Error: No form element found.": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf: \u0995\u09cb\u09a8\u0993 \u09ab\u09b0\u09cd\u09ae \u0989\u09aa\u09be\u09a6\u09be\u09a8 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc \u09a8\u09bf\u0964", -"Update": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6", -"Color swatch": "\u09b0\u0999\u09cd\u0997\u09c7\u09b0 \u09aa\u09cd\u09b2\u09c7\u099f", -"Turquoise": "\u09ab\u09bf\u09b0\u09cb\u099c\u09be", -"Green": "\u09b8\u09ac\u09c1\u099c", -"Blue": "\u09a8\u09c0\u09b2", -"Purple": "\u09ac\u09c7\u0997\u09c1\u09a8\u09c0", -"Navy Blue": "\u0986\u0995\u09be\u09b6\u09c0", -"Dark Turquoise": "\u0997\u09be\u09a2\u09bc \u09ab\u09bf\u09b0\u09cb\u099c\u09be", -"Dark Green": "\u0997\u09be\u09a2\u09bc \u09b8\u09ac\u09c1\u099c", -"Medium Blue": "\u09ae\u09be\u099d\u09be\u09b0\u09bf \u09a8\u09c0\u09b2", -"Medium Purple": "\u09ae\u09be\u099d\u09be\u09b0\u09bf \u09ac\u09c7\u0997\u09c1\u09a8\u09bf", -"Midnight Blue": "\u09ae\u09be\u099d\u09b0\u09be\u09a4\u09c7\u09b0 \u09a8\u09c0\u09b2", -"Yellow": "\u09b9\u09b2\u09c1\u09a6", -"Orange": "\u0995\u09ae\u09b2\u09be", -"Red": "\u09b2\u09be\u09b2", -"Light Gray": "\u09b9\u09be\u09b2\u0995\u09be \u09a7\u09c2\u09b8\u09b0", -"Gray": "\u09a7\u09c2\u09b8\u09b0", -"Dark Yellow": "\u0997\u09be\u09a2\u09bc \u09b9\u09b2\u09c1\u09a6", -"Dark Orange": "\u0997\u09be\u09a2\u09bc \u0995\u09ae\u09b2\u09be", -"Dark Red": "\u0997\u09be\u09a2\u09bc \u09b2\u09be\u09b2", -"Medium Gray": "\u09ae\u09cb\u099f\u09be\u09ae\u09c1\u099f\u09bf \u09a7\u09c2\u09b8\u09b0", -"Dark Gray": "\u0997\u09be\u09a2\u09bc \u09a7\u09c2\u09b8\u09b0", -"Light Green": "\u09b9\u09be\u09b2\u0995\u09be \u09b8\u09ac\u09c1\u099c", -"Light Yellow": "\u09b9\u09be\u09b2\u0995\u09be \u09b9\u09b2\u09c1\u09a6", -"Light Red": "\u09b9\u09be\u09b2\u0995\u09be \u09b2\u09be\u09b2", -"Light Purple": "\u09b9\u09be\u09b2\u0995\u09be \u09b0\u0995\u09cd\u09a4\u09ac\u09b0\u09cd\u09a3", -"Light Blue": "\u09b9\u09be\u09b2\u0995\u09be \u09a8\u09c0\u09b2", -"Dark Purple": "\u0997\u09be\u09a2\u09bc \u09b0\u0995\u09cd\u09a4\u09ac\u09b0\u09cd\u09a3", -"Dark Blue": "\u0997\u09be\u09a2\u09bc \u09a8\u09c0\u09b2", -"Black": "\u0995\u09be\u09b2\u09cb", -"White": "\u09b8\u09be\u09a6\u09be", -"Switch to or from fullscreen mode": "\u09aa\u09c2\u09b0\u09cd\u09a3\u09b8\u09cd\u0995\u09cd\u09b0\u09bf\u09a8 \u09ae\u09cb\u09a1\u09c7 \u09ac\u09be \u09a5\u09c7\u0995\u09c7 \u09b8\u09cd\u09af\u09c1\u0987\u099a \u0995\u09b0\u09c1\u09a8", -"Open help dialog": "\u09b8\u09b9\u09be\u09af\u09bc\u09a4\u09be \u09a1\u09be\u09af\u09bc\u09be\u09b2\u0997 \u0996\u09c1\u09b2\u09c1\u09a8", -"history": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8", -"styles": "\u09b6\u09c8\u09b2\u09c0", -"formatting": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8", -"alignment": "\u09b8\u09ae\u09a4\u09b2\u09a4\u09be", -"indentation": "\u0996\u09be\u0981\u099c", -"permanent pen": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae", -"comments": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af", -"Format Painter": "\u099a\u09bf\u09a4\u09cd\u09b0\u0995\u09b0 \u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8", -"Insert\/edit iframe": "\u0986\u0987\u09ab\u09cd\u09b0\u09c7\u09ae \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6\/\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8", -"Capitalization": "\u09aa\u09cd\u09b0\u09a5\u09ae \u0985\u0995\u09cd\u09b7\u09b0 \u09ac\u09dc \u09b9\u09be\u09a4\u09c7\u09b0", -"lowercase": "\u099a\u09cb\u099f \u09b9\u09be\u09a4\u09c7\u09b0", -"UPPERCASE": "\u09ac\u09dc \u09b9\u09be\u09a4\u09c7\u09b0", -"Title Case": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u0995\u09c7\u09b8", -"Permanent Pen Properties": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Permanent pen properties...": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af...", -"Font": "\u09ab\u09a8\u09cd\u099f", -"Size": "\u0986\u09df\u09a4\u09a8", -"More...": "\u0986\u09b0\u09cb...", -"Spellcheck Language": "\u09ad\u09be\u09b7\u09be\u09b0 \u09ac\u09be\u09a8\u09be\u09a8 \u099a\u09c7\u0995", -"Select...": "\u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8...", -"Preferences": "\u09aa\u099b\u09a8\u09cd\u09a6\u09b8\u09ae\u09c2\u09b9", -"Yes": "\u09b9\u09cd\u09af\u09be\u0981", -"No": "\u09a8\u09be", -"Keyboard Navigation": "\u0995\u09c0\u09ac\u09cb\u09b0\u09cd\u09a1 \u09a8\u09c7\u09ad\u09bf\u0997\u09c7\u09b6\u09a8", -"Version": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3", -"Anchor": "\u09a8\u09cb\u0999\u09cd\u0997\u09b0", -"Special character": "\u09ac\u09bf\u09b6\u09c7\u09b7 \u099a\u09b0\u09bf\u09a4\u09cd\u09b0", -"Code sample": "\u09a8\u09ae\u09c1\u09a8\u09be \u0995\u09cb\u09a1", -"Color": "\u09b0\u0999", -"Emoticons": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8", -"Document properties": "\u09a8\u09a5\u09bf\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af", -"Image": "\u099b\u09ac\u09bf", -"Insert link": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8", -"Target": "\u09b2\u0995\u09cd\u09b7\u09cd\u09af", -"Link": "\u09b2\u09bf\u0982\u0995", -"Poster": "\u09aa\u09cb\u09b8\u09cd\u099f\u09be\u09b0", -"Media": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be", -"Print": "\u099b\u09be\u09aa\u09be", -"Prev": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0", -"Find and replace": "\u0996\u09c1\u0981\u099c\u09c1\u09a8 \u0993 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8", -"Whole words": "\u09b8\u09ae\u09cd\u09aa\u09c2\u09b0\u09cd\u09a3 \u09b6\u09ac\u09cd\u09a6\u09c7\u09b0", -"Spellcheck": "\u09ac\u09be\u09a8\u09be\u09a8 \u09af\u09be\u099a\u09be\u0987", -"Caption": "\u0995\u09cd\u09af\u09be\u09aa\u09b6\u09a8", -"Insert template": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f \u09a2\u09cb\u0995\u09be\u09a8" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/cs.js b/cps/static/js/libs/tinymce/langs/cs.js index 49b6dd857..14877f9b6 100644 --- a/cps/static/js/libs/tinymce/langs/cs.js +++ b/cps/static/js/libs/tinymce/langs/cs.js @@ -1,5 +1,5 @@ tinymce.addI18n('cs',{ -"Redo": "Opakovat", +"Redo": "Znovu", "Undo": "Zp\u011bt", "Cut": "Vyjmout", "Copy": "Kop\u00edrovat", @@ -7,19 +7,19 @@ tinymce.addI18n('cs',{ "Select all": "Vybrat v\u0161e", "New document": "Nov\u00fd dokument", "Ok": "OK", -"Cancel": "Storno", +"Cancel": "Zru\u0161it", "Visual aids": "Vizu\u00e1ln\u00ed pom\u016fcky", "Bold": "Tu\u010dn\u00e9", "Italic": "Kurz\u00edva", -"Underline": "Podtr\u017een\u00ed", +"Underline": "Podtr\u017een\u00e9", "Strikethrough": "P\u0159e\u0161krtnut\u00e9", "Superscript": "Horn\u00ed index", "Subscript": "Doln\u00ed index", "Clear formatting": "Vymazat form\u00e1tov\u00e1n\u00ed", -"Align left": "Zarovnat doleva", +"Align left": "Zarovnat vlevo", "Align center": "Zarovnat na st\u0159ed", -"Align right": "Zarovnat doprava", -"Justify": "Zarovnat do bloku", +"Align right": "Zarovnat vpravo", +"Justify": "Do bloku", "Bullet list": "Odr\u00e1\u017eky", "Numbered list": "\u010c\u00edslov\u00e1n\u00ed", "Decrease indent": "Zmen\u0161it odsazen\u00ed", @@ -42,23 +42,23 @@ tinymce.addI18n('cs',{ "Heading 5": "Nadpis 5", "Heading 6": "Nadpis 6", "Preformatted": "P\u0159edform\u00e1tovan\u00fd text", -"Div": "Div", -"Pre": "Pre", -"Code": "K\u00f3d", +"Div": "Div (blok)", +"Pre": "Pre (p\u0159edform\u00e1tov\u00e1no)", +"Code": "Code (k\u00f3d)", "Paragraph": "Odstavec", -"Blockquote": "Blokov\u00e1 citace", +"Blockquote": "Citace", "Inline": "\u0158\u00e1dkov\u00e9 zobrazen\u00ed (inline)", -"Blocks": "Bloky", +"Blocks": "Blokov\u00e9 zobrazen\u00ed (block)", "Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Je zapnuto vkl\u00e1d\u00e1n\u00ed \u010dist\u00e9ho textu. Dokud nebude tato volba vypnuta, bude ve\u0161ker\u00fd obsah vlo\u017een jako \u010dist\u00fd text.", -"Fonts": "P\u00edsma", +"Fonts": "Typ p\u00edsma", "Font Sizes": "Velikost p\u00edsma", "Class": "T\u0159\u00edda", "Browse for an image": "Vyhledat obr\u00e1zek", -"OR": "OR", -"Drop an image here": "P\u0159esu\u0148te obr\u00e1zek sem", +"OR": "NEBO", +"Drop an image here": "P\u0159et\u00e1hn\u011bte obr\u00e1zek do tohoto um\u00edst\u011bn\u00ed", "Upload": "Nahr\u00e1t", "Block": "Do bloku", -"Align": "Zarovnat", +"Align": "Zarovn\u00e1n\u00ed", "Default": "V\u00fdchoz\u00ed", "Circle": "Kole\u010dko", "Disc": "Punt\u00edk", @@ -68,7 +68,7 @@ tinymce.addI18n('cs',{ "Lower Roman": "Mal\u00e9 \u0159\u00edmsk\u00e9 \u010d\u00edslice", "Upper Alpha": "velk\u00e9 p\u00edsmenkov\u00e1n\u00ed", "Upper Roman": "\u0158\u00edmsk\u00e9 \u010d\u00edslice", -"Anchor...": "Kotva...", +"Anchor...": "Kotva", "Name": "N\u00e1zev", "Id": "Id", "Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id by m\u011blo za\u010d\u00ednat p\u00edsmenem a d\u00e1le obsahovat pouze p\u00edsmena, \u010d\u00edsla, poml\u010dky, te\u010dky, dvojte\u010dky, nebo podtr\u017e\u00edtka.", @@ -78,14 +78,15 @@ tinymce.addI18n('cs',{ "Source code": "Zdrojov\u00fd k\u00f3d", "Insert\/Edit code sample": "Vlo\u017eit \/ Upravit uk\u00e1zkov\u00fd k\u00f3d", "Language": "Jazyk", -"Code sample...": "Uk\u00e1zkov\u00fd k\u00f3d...", +"Code sample...": "Uk\u00e1zka k\u00f3du", "Color Picker": "V\u00fdb\u011br barvy", "R": "R", "G": "G", "B": "B", "Left to right": "Zleva doprava", "Right to left": "Zprava doleva", -"Emoticons...": "Emotikony...", +"Emoticons": "Emotikony", +"Emoticons...": "Emotikony", "Metadata and Document Properties": "Metadata a vlastnosti dokumentu", "Title": "Titulek", "Keywords": "Kl\u00ed\u010dov\u00e1 slova", @@ -113,7 +114,9 @@ tinymce.addI18n('cs',{ "Handy Shortcuts": "U\u017eite\u010dn\u00e9 kl\u00e1vesov\u00e9 zkratky", "Horizontal line": "Vodorovn\u00e1 \u010d\u00e1ra", "Insert\/edit image": "Vlo\u017eit \/ upravit obr\u00e1zek", -"Image description": "Popis obr\u00e1zku", +"Alternative description": "Alternativn\u00ed text", +"Accessibility": "Bez alternativn\u00edho textu", +"Image is decorative": "(dekorativn\u00ed obr\u00e1zek bez alternativn\u00edho textu)", "Source": "URL", "Dimensions": "Rozm\u011bry", "Constrain proportions": "Zachovat proporce", @@ -124,7 +127,7 @@ tinymce.addI18n('cs',{ "Horizontal space": "Horizont\u00e1ln\u00ed mezera", "Border": "R\u00e1me\u010dek", "Insert image": "Vlo\u017eit obr\u00e1zek", -"Image...": "Obr\u00e1zek\u2026", +"Image...": "Obr\u00e1zek", "Image list": "Seznam obr\u00e1zk\u016f", "Rotate counterclockwise": "Oto\u010dit doleva", "Rotate clockwise": "Oto\u010dit doprava", @@ -147,30 +150,31 @@ tinymce.addI18n('cs',{ "Back": "Zp\u011bt", "Insert date\/time": "Vlo\u017eit datum \/ \u010das", "Date\/time": "Datum\/\u010das", -"Insert\/Edit Link": "P\u0159idat\/upravit odkaz", "Insert\/edit link": "Vlo\u017eit \/ upravit odkaz", "Text to display": "Text k zobrazen\u00ed", "Url": "URL", -"Open link in...": "Otev\u0159\u00edt odkaz v...", -"Current window": "Aktu\u00e1ln\u00ed okno", +"Open link in...": "C\u00edlov\u00e9 okno URL", +"Current window": "Otev\u0159\u00edt v nad\u0159azen\u00e9 okn\u011b", "None": "\u017d\u00e1dn\u00e9", "New window": "Nov\u00e9 okno", +"Open link": "C\u00edlov\u00e9 okno URL", "Remove link": "Odstranit odkaz", "Anchors": "Kotvy", -"Link...": "Odkaz...", +"Link...": "Odkaz", "Paste or type a link": "Vlo\u017eit nebo napsat odkaz", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Zadan\u00e9 URL vypad\u00e1 jako e-mailov\u00e1 adresa. Chcete doplnit povinn\u00fd prefix mailto:?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Zadan\u00e9 URL vypad\u00e1 jako odkaz na jin\u00fd web. Chcete doplnit povinn\u00fd prefix http:\/\/?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Zadan\u00e9 URL vypad\u00e1 jako odkaz na jin\u00fd web. Chcete doplnit povinn\u00fd prefix https:\/\/?", "Link list": "Seznam odkaz\u016f", "Insert video": "Vlo\u017eit video", "Insert\/edit video": "Vlo\u017eit \/ upravit video", "Insert\/edit media": "Vlo\u017eit \/ upravit m\u00e9dia", "Alternative source": "Alternativn\u00ed zdroj", "Alternative source URL": "Alternativn\u00ed zdrojov\u00e1 URL", -"Media poster (Image URL)": "Medi\u00e1ln\u00ed plak\u00e1t (URL obr\u00e1zku)", +"Media poster (Image URL)": "URL n\u00e1hledu", "Paste your embed code below:": "Vlo\u017ete k\u00f3d pro vlo\u017een\u00ed n\u00ed\u017ee:", "Embed": "Vlo\u017eit", -"Media...": "M\u00e9dium...", +"Media...": "M\u00e9dia", "Nonbreaking space": "Pevn\u00e1 mezera", "Page break": "Konec str\u00e1nky", "Paste as text": "Vlo\u017eit jako \u010dist\u00fd text", @@ -183,11 +187,15 @@ tinymce.addI18n('cs',{ "Replace all": "Nahradit v\u0161e", "Previous": "P\u0159edchoz\u00ed", "Next": "Dal\u0161\u00ed", -"Find and replace...": "Naj\u00edt a nahradit...", +"Find and Replace": "Naj\u00edt a nahradit", +"Find and replace...": "Naj\u00edt a nahradit", "Could not find the specified string.": "Zadan\u00fd \u0159et\u011bzec nebyl nalezen.", "Match case": "Rozli\u0161ovat mal\u00e1 a velk\u00e1 p\u00edsmena", -"Find whole words only": "Hledat pouze cel\u00e1 slova", -"Spell check": "Kontrola pravopisu", +"Find whole words only": "Pouze cel\u00e1 slova", +"Find in selection": "Ozna\u010den\u00fd text", +"Spellcheck": "Kontrola pravopisu", +"Spellcheck Language": "Jazyk kontroly pravopisu", +"No misspellings found.": "Nebyly nalezeny \u017e\u00e1dn\u00e9 p\u0159eklepy.", "Ignore": "Ignorovat", "Ignore all": "Ignorovat v\u0161e", "Finish": "Ukon\u010dit", @@ -218,7 +226,8 @@ tinymce.addI18n('cs',{ "Height": "V\u00fd\u0161ka", "Cell spacing": "Vn\u011bj\u0161\u00ed okraj bun\u011bk", "Cell padding": "Vnit\u0159n\u00ed okraj bun\u011bk", -"Show caption": "Zobrazit titulku", +"Caption": "Nadpis", +"Show caption": "Zobrazit titulek", "Left": "Vlevo", "Center": "Na st\u0159ed", "Right": "Vpravo", @@ -238,7 +247,7 @@ tinymce.addI18n('cs',{ "Body": "T\u011blo", "Footer": "Pati\u010dka", "Border color": "Barva r\u00e1me\u010dku", -"Insert template...": "Vlo\u017eit \u0161ablonu...", +"Insert template...": "Vlo\u017eit \u0161ablonu", "Templates": "\u0160ablony", "Template": "\u0160ablona", "Text color": "Barva p\u00edsma", @@ -274,11 +283,11 @@ tinymce.addI18n('cs',{ "Valid": "Platn\u00fd", "To open the popup, press Shift+Enter": "Vyskakovac\u00ed okno otev\u0159ete stisknut\u00edm Shift+Enter", "Rich Text Area. Press ALT-0 for help.": "Oblast Rich Text, stiskn\u011bte ALT-0 pro n\u00e1pov\u011bdu.", -"System Font": "Syst\u00e9mov\u00e9 p\u00edsmo", -"Failed to upload image: {0}": "Nahr\u00e1n\u00ed obr\u00e1zku selhalo:", -"Failed to load plugin: {0} from url {1}": "Na\u010dten\u00ed z\u00e1suvn\u00e9ho modulu selhalo: {0} z URL {1}", -"Failed to load plugin url: {0}": "Na\u010dten\u00ed z\u00e1suvn\u00e9ho modulu URL selhalo: {0}", -"Failed to initialize plugin: {0}": "Inicializace z\u00e1suvn\u00e9ho modulu selhala:", +"System Font": "Typ p\u00edsma", +"Failed to upload image: {0}": "Selhalo nahr\u00e1n\u00ed obr\u00e1zku: {0}", +"Failed to load plugin: {0} from url {1}": "Selhalo na\u010dten\u00ed pluginu: {0} z URL {1}", +"Failed to load plugin url: {0}": "Selhalo na\u010dten\u00ed URL pluginu: {0}", +"Failed to initialize plugin: {0}": "Selhala inicializace pluginu: {0}", "example": "p\u0159\u00edklad", "Search": "Hledat", "All": "V\u0161e", @@ -286,43 +295,43 @@ tinymce.addI18n('cs',{ "Text": "Text", "Quotations": "Citace", "Mathematical": "Matematick\u00e9 symboly", -"Extended Latin": "Roz\u0161\u00ed\u0159en\u00e9 Latin", +"Extended Latin": "Roz\u0161\u00ed\u0159en\u00e1 latinka", "Symbols": "Symboly", "Arrows": "\u0160ipky", "User Defined": "Definovan\u00e9 u\u017eivatelem", -"dollar sign": "znak dolaru", +"dollar sign": "znak dolar", "currency sign": "znak m\u011bny", -"euro-currency sign": "znak m\u011bny euro", -"colon sign": "znak dvojte\u010dky", +"euro-currency sign": "znak eura", +"colon sign": "znak colon", "cruzeiro sign": "znak cruzeiro", -"french franc sign": "znak francouzsk\u00e9ho franku", -"lira sign": "znak liry", +"french franc sign": "znak francouzsk\u00fdo frank", +"lira sign": "znak lira", "mill sign": "znak mill", -"naira sign": "znak nairy", -"peseta sign": "znak pesety", +"naira sign": "znak nairo", +"peseta sign": "znak peseto", "rupee sign": "znak rupie", -"won sign": "znak wonu", -"new sheqel sign": "znak nov\u00e9ho \u0161ekelu", -"dong sign": "znak dongu", -"kip sign": "znak kipu", -"tugrik sign": "znak tugriku", -"drachma sign": "znak drachmy", -"german penny symbol": "znak n\u011bmeck\u00e9ho feniku", -"peso sign": "znak pesa", +"won sign": "znak won", +"new sheqel sign": "znak nov\u00fd \u0161ekel", +"dong sign": "znak dong", +"kip sign": "znak kip", +"tugrik sign": "znak tugrik", +"drachma sign": "znak drachma", +"german penny symbol": "znak n\u011bmeck\u00fd fenik", +"peso sign": "znak peso", "guarani sign": "znak guaran\u00ed", "austral sign": "znak austral", -"hryvnia sign": "znak h\u0159ivny", +"hryvnia sign": "znak h\u0159ivna", "cedi sign": "znak cedi", -"livre tournois sign": "znak tournois libry", +"livre tournois sign": "znak tournois libra", "spesmilo sign": "znak spesmilo", "tenge sign": "znak tenge", -"indian rupee sign": "znak indick\u00e9 rupie", -"turkish lira sign": "znak tureck\u00e9 liry", -"nordic mark sign": "znak norsk\u00e9 marky", -"manat sign": "znak manatu", -"ruble sign": "znak rublu", -"yen character": "znak jenu", -"yuan character": "znak juanu", +"indian rupee sign": "znak indick\u00e1 rupie", +"turkish lira sign": "znak tureck\u00e1 liry", +"nordic mark sign": "znak norsk\u00e1 marka", +"manat sign": "znak manat", +"ruble sign": "znak rubl", +"yen character": "znak jen", +"yuan character": "znak juan", "yuan character, in hong kong and taiwan": "znak juanu v hongkongu a tchaj-wanu", "yen\/yuan character variant one": "znak jenu\/juanu, varianta 1", "Loading emoticons...": "Na\u010d\u00edt\u00e1n\u00ed emotikon\u016f...", @@ -377,7 +386,21 @@ tinymce.addI18n('cs',{ "formatting": "form\u00e1tov\u00e1n\u00ed", "alignment": "zarovn\u00e1n\u00ed", "indentation": "odsazen\u00ed", -"permanent pen": "permanentn\u00ed pero", +"Font": "P\u00edsmo", +"Size": "Velikost", +"More...": "Dal\u0161\u00ed\u2026", +"Select...": "Vybrat", +"Preferences": "P\u0159edvolby", +"Yes": "Ano", +"No": "Ne", +"Keyboard Navigation": "Navigace pomoc\u00ed kl\u00e1vesnice", +"Version": "Verze", +"Code view": "Zobrazit k\u00f3d", +"Open popup menu for split buttons": "Otev\u0159ete vyskakovac\u00ed nab\u00eddku pro rozd\u011blen\u00e1 tla\u010d\u00edtka", +"List Properties": "Vlastnosti seznamu", +"List properties...": "Vlastnosti seznamu...", +"Start list at number": "Po\u010d\u00e1te\u010dn\u00ed \u010d\u00edslo seznamu", +"Line height": "V\u00fd\u0161ka \u0159\u00e1dku", "comments": "koment\u00e1\u0159e", "Format Painter": "Kop\u00edrovat form\u00e1t", "Insert\/edit iframe": "Vlo\u017eit\/upravit prvek iframe", @@ -385,24 +408,46 @@ tinymce.addI18n('cs',{ "lowercase": "mal\u00e1 p\u00edsmena", "UPPERCASE": "VELK\u00c1 P\u00cdSMENA", "Title Case": "V\u0161echna Prvn\u00ed Velk\u00e1", +"permanent pen": "Permanentn\u00ed pero", "Permanent Pen Properties": "Vlastnosti permanentn\u00edho pera", "Permanent pen properties...": "Vlastnosti permanentn\u00edho pera\u2026", -"Font": "P\u00edsmo", -"Size": "Velikost", -"More...": "Dal\u0161\u00ed\u2026", -"Spellcheck Language": "Jazyk kontroly pravopisu", -"Select...": "Vybrat\u2026", -"Preferences": "P\u0159edvolby", -"Yes": "Ano", -"No": "Ne", -"Keyboard Navigation": "Navigace pomoc\u00ed kl\u00e1vesnice", -"Version": "Verze", +"case change": "Zm\u011bna velikosti p\u00edsma", +"page embed": "Vlo\u017een\u00ed str\u00e1nky", +"Advanced sort...": "Roz\u0161\u00ed\u0159en\u00e9 \u0159azen\u00ed...", +"Advanced Sort": "Roz\u0161\u00ed\u0159en\u00e9 \u0159azen\u00ed", +"Sort table by column ascending": "Se\u0159adit tabulku podle sloupce vzestupn\u011b", +"Sort table by column descending": "Se\u0159adit tabulku podle sloupce sestupn\u011b", +"Sort": "\u0158adit", +"Order": "\u0158azen\u00ed", +"Sort by": "\u0158adit dle", +"Ascending": "Vzestupn\u011b", +"Descending": "Sestupn\u011b", +"Column {0}": "Sloupec {0}", +"Row {0}": "\u0158\u00e1dek {0}", +"Spellcheck...": "Kontrola pravopisu", +"Misspelled word": "\u0160patn\u011b napsan\u00e9 slovo", +"Suggestions": "N\u00e1vrhy", +"Change": "Zm\u011bnit", +"Finding word suggestions": "Hled\u00e1n\u00ed n\u00e1vrh\u016f slov", +"Success": "\u00dasp\u011b\u0161n\u00e9", +"Repair": "Opraveno", +"Issue {0} of {1}": "Probl\u00e9m {0} z {1}", +"Images must be marked as decorative or have an alternative text description": "Obr\u00e1zky mus\u00ed b\u00fdt ozna\u010deny jako dekorativn\u00ed nebo mus\u00ed m\u00edt alternativn\u00ed textov\u00fd popis.", +"Images must have an alternative text description. Decorative images are not allowed.": "Obr\u00e1zky mus\u00ed m\u00edt alternativn\u00ed textov\u00fd popis. Dekorativn\u00ed obr\u00e1zky nejsou povoleny.", +"Or provide alternative text:": "Nebo zadejte alternativn\u00ed text:", +"Make image decorative:": "Nastavit obr\u00e1zek jako dekorativn\u00ed:", +"ID attribute must be unique": "ID atributu mus\u00ed b\u00fdt jedine\u010dn\u00e9", +"Make ID unique": "Nastavit ID jako jedine\u010dn\u00e9", +"Keep this ID and remove all others": "Ponechat toto ID a odstranit v\u0161echny ostatn\u00ed", +"Remove this ID": "Odebrat toto ID", +"Remove all IDs": "Odebrat v\u0161echna ID", +"Checklist": "Kontroln\u00ed seznam", "Anchor": "Kotva", "Special character": "Speci\u00e1ln\u00ed znak", "Code sample": "Uk\u00e1zkov\u00fd k\u00f3d", "Color": "Barva", -"Emoticons": "Emotikony", "Document properties": "Vlastnosti dokumentu", +"Image description": "Popis obr\u00e1zku", "Image": "Obr\u00e1zek", "Insert link": "Vlo\u017eit odkaz", "Target": "C\u00edl", @@ -413,7 +458,5 @@ tinymce.addI18n('cs',{ "Prev": "P\u0159edchoz\u00ed", "Find and replace": "Naj\u00edt a nahradit", "Whole words": "Pouze cel\u00e1 slova", -"Spellcheck": "Kontrola pravopisu", -"Caption": "Nadpis", "Insert template": "Vlo\u017eit \u0161ablonu" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/cy.js b/cps/static/js/libs/tinymce/langs/cy.js index 77e8b1245..775b20de3 100644 --- a/cps/static/js/libs/tinymce/langs/cy.js +++ b/cps/static/js/libs/tinymce/langs/cy.js @@ -9,7 +9,7 @@ tinymce.addI18n('cy',{ "Ok": "Iawn", "Cancel": "Canslo", "Visual aids": "Cymorth gweledol", -"Bold": "Bras", +"Bold": "Trwm", "Italic": "Italig", "Underline": "Tanlinellu", "Strikethrough": "Llinell drwodd", @@ -85,6 +85,7 @@ tinymce.addI18n('cy',{ "B": "Gl", "Left to right": "Chwith i'r dde", "Right to left": "De i'r chwith", +"Emoticons": "Gwenogluniau", "Emoticons...": "Gwenogluniau...", "Metadata and Document Properties": "Metaddata a Priodweddau'r ddogfen", "Title": "Teitl", @@ -113,7 +114,9 @@ tinymce.addI18n('cy',{ "Handy Shortcuts": "Llwybrau byr cyfleus", "Horizontal line": "Llinell lorweddol", "Insert\/edit image": "Mewnosod\/golygu delwedd", -"Image description": "Disgrifiad y ddelwedd", +"Alternative description": "Disgrifiad arall", +"Accessibility": "Hygyrchedd", +"Image is decorative": "Delwedd yn addurniadol", "Source": "Ffynhonnell", "Dimensions": "Dimensiynau", "Constrain proportions": "Gorfodi cyfrannedd", @@ -147,7 +150,6 @@ tinymce.addI18n('cy',{ "Back": "Nol", "Insert date\/time": "Mewnosod dyddiad\/amser", "Date\/time": "Dyddiad\/amser", -"Insert\/Edit Link": "Mewnosod\/Golygu dolen", "Insert\/edit link": "Mewnosod\/golygu dolen", "Text to display": "Testun i'w ddangos", "Url": "Url", @@ -155,12 +157,14 @@ tinymce.addI18n('cy',{ "Current window": "Ffenestr gyfredol", "None": "Dim", "New window": "Ffenest newydd", +"Open link": "Agor dolen", "Remove link": "Tynnu dolen", "Anchors": "Angorau", "Link...": "Dolen...", "Paste or type a link": "Pastio neu deipio dolen", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Mae'n debyg mai cyfeiriad e-bost yw'r URL hwn. Ydych chi am ychwanegu'r rhagddoddiad mailto:?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Mae'n debyg mai dolen allanol yw'r URL hwn. Ydych chi am ychwanegu'r rhagddodiad http:\/\/ ?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Ymddengys mai dolen allannol yw'r URL a roddoch chi. Ydych chi eisiau ychwanegu'r rhagddodiad https:\/\/ gofynnol?", "Link list": "Rhestr dolenni", "Insert video": "Mewnosod fideo", "Insert\/edit video": "Mewnosod\/golygu fideo", @@ -183,11 +187,15 @@ tinymce.addI18n('cy',{ "Replace all": "Amnewid y cwbl", "Previous": "Blaenorol", "Next": "Nesaf", +"Find and Replace": "Canfod a Newid", "Find and replace...": "Chwilio ac amnewid", "Could not find the specified string.": "Methu ffeindio'r llinyn hwnnw.", "Match case": "Cas yn cyfateb", "Find whole words only": "Canfod geiriau llawn yn unig", -"Spell check": "Gwirwr sillafu", +"Find in selection": "Canfod yn y dewisiad", +"Spellcheck": "Sillafydd", +"Spellcheck Language": "Iaith Gwirio Sillafu", +"No misspellings found.": "Dim camsillafiadau.", "Ignore": "Anwybyddu", "Ignore all": "Amwybyddu pob", "Finish": "Gorffen", @@ -218,6 +226,7 @@ tinymce.addI18n('cy',{ "Height": "Uchder", "Cell spacing": "Bylchiad celloedd", "Cell padding": "Padio celloedd", +"Caption": "Pennawd", "Show caption": "Dangos capsiwn", "Left": "Chwith", "Center": "Canol", @@ -377,31 +386,67 @@ tinymce.addI18n('cy',{ "formatting": "fformatio", "alignment": "aliniad", "indentation": "mewnoli", -"permanent pen": "pen sefydlog", -"comments": "Sylwadau", -"Format Painter": "Brwsh Fformat", -"Insert\/edit iframe": "Mewnosod\/golygu iframe", -"Capitalization": "Priflythrennu", -"lowercase": "llythrennau bach", -"UPPERCASE": "Priflythrennau", -"Title Case": "Priflythyren i bob gair", -"Permanent Pen Properties": "Priodweddau Yswgrifbin Parhaol", -"Permanent pen properties...": "Priodweddau ysgrifbin parhaol...", "Font": "Ffont", "Size": "Maint", "More...": "Mwy...", -"Spellcheck Language": "Iaith Gwirio Sillafu", "Select...": "Dewis...", "Preferences": "Dewisiadau", "Yes": "Iawn", "No": "Na", "Keyboard Navigation": "Llywio Bysellfwrdd", "Version": "Fersiwn", +"Code view": "Golwg cod", +"Open popup menu for split buttons": "Agor naidlen ar gyfer botymau hollt", +"List Properties": "Rhestru Priodweddau", +"List properties...": "Rhestru priodweddau...", +"Start list at number": "Dechrau rhestr efo rhif", +"Line height": "Uchder llinell", +"comments": "Sylwadau", +"Format Painter": "Brwsh Fformat", +"Insert\/edit iframe": "Mewnosod\/golygu iframe", +"Capitalization": "Priflythrennu", +"lowercase": "llythrennau bach", +"UPPERCASE": "PRIFLYTHRENNAU", +"Title Case": "Priflythyren i bob gair", +"permanent pen": "pen sefydlog", +"Permanent Pen Properties": "Priodweddau Yswgrifbin Parhaol", +"Permanent pen properties...": "Priodweddau ysgrifbin parhaol...", +"case change": "Newid Cas", +"page embed": "Mewnblannu i'r dudalen", +"Advanced sort...": "Trefnu uwch...", +"Advanced Sort": "Trefnu Uwch", +"Sort table by column ascending": "Trefnu tabl yn \u00f4l colofn yn esgynnol", +"Sort table by column descending": "Trefnu tabl yn \u00f4l colofn yn ddisgynnol", +"Sort": "Trefnu", +"Order": "Trefn", +"Sort by": "Trefnu yn \u00f4l", +"Ascending": "yn Esgynnol", +"Descending": "yn Ddisgynnol", +"Column {0}": "Colofn {0}", +"Row {0}": "Rhes {0}", +"Spellcheck...": "Gwirydd sillafu...", +"Misspelled word": "Gair wedi ei gamsillafu", +"Suggestions": "Awgrymiadau", +"Change": "Newid", +"Finding word suggestions": "Darganfod geiriau a awgrymir", +"Success": "Llwyddiant", +"Repair": "Trwsio", +"Issue {0} of {1}": "Problem {0} o {1}", +"Images must be marked as decorative or have an alternative text description": "Rhaid bod delwedd wedi ei marcio yn addurniadol neu gyda disgrifiad testun arall", +"Images must have an alternative text description. Decorative images are not allowed.": "Rhaid bod gan ddelwedd ddisgrifiad testun arall. Ni chaniateir delweddau addurniadol.", +"Or provide alternative text:": "Neu darparu testun arall:", +"Make image decorative:": "Gwneud delwedd yn addurniadol:", +"ID attribute must be unique": "Rhaid i'r priodoledd ID fod yn unigryw", +"Make ID unique": "Gwneud yr ID yn unigryw", +"Keep this ID and remove all others": "Cadwch yr ID hwn a dileu pob un arall", +"Remove this ID": "Dileu'r ID hwn", +"Remove all IDs": "Dileu pob ID", +"Checklist": "Rhestr wirio", "Anchor": "Angor", "Special character": "Nod arbennig", "Color": "Lliw", -"Emoticons": "Gwenogluniau", "Document properties": "Priodweddau'r ddogfen", +"Image description": "Disgrifiad y ddelwedd", "Image": "Delwedd", "Insert link": "Mewnosod dolen", "Link": "Dolen", @@ -412,7 +457,5 @@ tinymce.addI18n('cy',{ "Whole words": "Geiriau cyfan", "Find and replace": "Chwilio ac amnewid", "Prev": "Blaenorol", -"Spellcheck": "Sillafydd", -"Caption": "Pennawd", "Insert template": "Mewnosod templed" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/da.js b/cps/static/js/libs/tinymce/langs/da.js index aadff6d9c..a5bddaf75 100644 --- a/cps/static/js/libs/tinymce/langs/da.js +++ b/cps/static/js/libs/tinymce/langs/da.js @@ -85,6 +85,7 @@ tinymce.addI18n('da',{ "B": "B", "Left to right": "Venstre til h\u00f8jre", "Right to left": "H\u00f8jre til venstre", +"Emoticons": "Emot-ikoner", "Emoticons...": "Emotikoner...", "Metadata and Document Properties": "Metadata og dokumentegenskaber", "Title": "Titel", @@ -113,7 +114,9 @@ tinymce.addI18n('da',{ "Handy Shortcuts": "Praktiske Genveje", "Horizontal line": "Vandret linie", "Insert\/edit image": "Inds\u00e6t\/ret billede", -"Image description": "Billede beskrivelse", +"Alternative description": "Alternativ beskrivelse", +"Accessibility": "Tilg\u00e6ngelighed", +"Image is decorative": "Billede er dekorativt", "Source": "Kilde", "Dimensions": "Dimensioner", "Constrain proportions": "Behold propertioner", @@ -147,7 +150,6 @@ tinymce.addI18n('da',{ "Back": "Tilbage", "Insert date\/time": "Inds\u00e6t dato\/klokkeslet", "Date\/time": "Dato\/klokkeslet", -"Insert\/Edit Link": "Inds\u00e6t\/rediger link", "Insert\/edit link": "Inds\u00e6t\/ret link", "Text to display": "Vis tekst", "Url": "Url", @@ -155,12 +157,14 @@ tinymce.addI18n('da',{ "Current window": "Aktuelle vindue", "None": "Ingen", "New window": "Nyt vindue", +"Open link": "\u00c5ben link", "Remove link": "Fjern link", "Anchors": "Ankre", "Link...": "Link...", "Paste or type a link": "Inds\u00e6t eller skriv et link", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URLen som du angav ser ud til at v\u00e6re en email adresse. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks mailto: ?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URLen som du angav ser ud til at v\u00e6re et eksternt link. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks http:\/\/ ?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "URL'en som du angav ser ud til at v\u00e6re et eksternt link. \u00d8nsker du at tilf\u00f8je det n\u00f8dvendige https:\/\/ pr\u00e6fiks?", "Link list": "Link liste", "Insert video": "Inds\u00e6t video", "Insert\/edit video": "Inds\u00e6t\/ret video", @@ -183,11 +187,15 @@ tinymce.addI18n('da',{ "Replace all": "Erstat alt", "Previous": "Forrige", "Next": "N\u00e6ste", +"Find and Replace": "Find og erstat", "Find and replace...": "Find og erstat...", "Could not find the specified string.": "Kunne ikke finde s\u00f8getekst", "Match case": "STORE og sm\u00e5 bogstaver", "Find whole words only": "Find kun hele ord", -"Spell check": "Stavekontrol", +"Find in selection": "Find i det valgte", +"Spellcheck": "Stavekontrol", +"Spellcheck Language": "Sprog til stavekontrol", +"No misspellings found.": "Ingen stavefejl fundet.", "Ignore": "Ignorer", "Ignore all": "Ignorer alt", "Finish": "F\u00e6rdig", @@ -218,6 +226,7 @@ tinymce.addI18n('da',{ "Height": "H\u00f8jde", "Cell spacing": "Celle afstand", "Cell padding": "Celle padding", +"Caption": "Tekst", "Show caption": "Vis overskrift", "Left": "Venstre", "Center": "Centrering", @@ -377,7 +386,21 @@ tinymce.addI18n('da',{ "formatting": "formatering", "alignment": "justering", "indentation": "indrykning", -"permanent pen": "permanent pen", +"Font": "Skrifttype", +"Size": "St\u00f8rrelse", +"More...": "Mere...", +"Select...": "V\u00e6lg...", +"Preferences": "Pr\u00e6ferencer", +"Yes": "Ja", +"No": "Nej", +"Keyboard Navigation": "Navigation med tastatur", +"Version": "Version", +"Code view": "Kodevisning", +"Open popup menu for split buttons": "\u00c5ben popup menu for split knapper", +"List Properties": "List indstillinger", +"List properties...": "List indstillinger...", +"Start list at number": "Start liste ved nummer", +"Line height": "Linjeh\u00f8jde", "comments": "kommentarer", "Format Painter": "Formatpensel", "Insert\/edit iframe": "Inds\u00e6t\/rediger iframe", @@ -385,24 +408,46 @@ tinymce.addI18n('da',{ "lowercase": "sm\u00e5 bogstaver", "UPPERCASE": "STORE BOGSTAVER", "Title Case": "Stort begyndelsesbogstav", +"permanent pen": "permanent pen", "Permanent Pen Properties": "Permanente penegenskaber", "Permanent pen properties...": "Permanente penegenskaber...", -"Font": "Skrifttype", -"Size": "St\u00f8rrelse", -"More...": "Mere...", -"Spellcheck Language": "Sprog til stavekontrol", -"Select...": "V\u00e6lg...", -"Preferences": "Pr\u00e6ferencer", -"Yes": "Ja", -"No": "Nej", -"Keyboard Navigation": "Navigation med tastatur", -"Version": "Version", +"case change": "\u00e6ndring af stort\/sm\u00e5t", +"page embed": "side indlejring", +"Advanced sort...": "Avanceret sortering...", +"Advanced Sort": "Avanceret sortering", +"Sort table by column ascending": "Sorter tabel efter kolonne stigende", +"Sort table by column descending": "Sorter tabel efter kolonne faldende", +"Sort": "Sorter", +"Order": "R\u00e6kkef\u00f8lge", +"Sort by": "Sorter efter", +"Ascending": "Stigende", +"Descending": "Faldende", +"Column {0}": "Kolonne {0}", +"Row {0}": "R\u00e6kke {0}", +"Spellcheck...": "Stavekontrol...", +"Misspelled word": "Ord med stavefejl", +"Suggestions": "Forslag", +"Change": "\u00c6ndring", +"Finding word suggestions": "Finder ord forslag", +"Success": "Succes", +"Repair": "Reparer", +"Issue {0} of {1}": "Problem {0} ud af {1}", +"Images must be marked as decorative or have an alternative text description": "Billeder skal markeres som dekorative eller have en alternativ tekstbeskrivelse", +"Images must have an alternative text description. Decorative images are not allowed.": "Billeder skal have en alternativ tekstbeskrivelse. Dekorative billeder er ikke tilladte.", +"Or provide alternative text:": "Eller angiv en alternativ tekst:", +"Make image decorative:": "G\u00f8r billede dekorativ:", +"ID attribute must be unique": "ID attribut skal v\u00e6re unik", +"Make ID unique": "G\u00f8r ID unik", +"Keep this ID and remove all others": "Behold dette ID og fjern alle andre", +"Remove this ID": "Fjern dette ID", +"Remove all IDs": "Fjern alle ID'er", +"Checklist": "Kontrolliste", "Anchor": "Anchor", "Special character": "Specielle tegn", "Code sample": "Kodepr\u00f8ve", "Color": "Farve", -"Emoticons": "Emot-ikoner", "Document properties": "Dokument egenskaber", +"Image description": "Billede beskrivelse", "Image": "Billede", "Insert link": "Inds\u00e6t link", "Target": "Target", @@ -413,7 +458,5 @@ tinymce.addI18n('da',{ "Prev": "Forrige", "Find and replace": "Find og erstat", "Whole words": "Hele ord", -"Spellcheck": "Stavekontrol", -"Caption": "Tekst", "Insert template": "Inds\u00e6t skabelon" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/de.js b/cps/static/js/libs/tinymce/langs/de.js index 007238f0f..def1e0bb1 100644 --- a/cps/static/js/libs/tinymce/langs/de.js +++ b/cps/static/js/libs/tinymce/langs/de.js @@ -85,6 +85,7 @@ tinymce.addI18n('de',{ "B": "B", "Left to right": "Von links nach rechts", "Right to left": "Von rechts nach links", +"Emoticons": "Emoticons", "Emoticons...": "Emoticons...", "Metadata and Document Properties": "Dokument-Eigenschaften und -Metadaten", "Title": "Titel", @@ -113,7 +114,9 @@ tinymce.addI18n('de',{ "Handy Shortcuts": "Praktische Tastenkombinationen", "Horizontal line": "Horizontale Linie", "Insert\/edit image": "Bild einf\u00fcgen\/bearbeiten", -"Image description": "Bildbeschreibung", +"Alternative description": "Alternative Beschreibung", +"Accessibility": "Barrierefreiheit", +"Image is decorative": "Bild ist dekorativ", "Source": "Quelle", "Dimensions": "Abmessungen", "Constrain proportions": "Seitenverh\u00e4ltnis beibehalten", @@ -147,7 +150,6 @@ tinymce.addI18n('de',{ "Back": "Zur\u00fcck", "Insert date\/time": "Datum\/Uhrzeit einf\u00fcgen ", "Date\/time": "Datum\/Uhrzeit", -"Insert\/Edit Link": "Link einf\u00fcgen\/bearbeiten", "Insert\/edit link": "Link einf\u00fcgen\/bearbeiten", "Text to display": "Anzuzeigender Text", "Url": "URL", @@ -155,12 +157,14 @@ tinymce.addI18n('de',{ "Current window": "Aktuelles Fenster", "None": "Keine", "New window": "Neues Fenster", +"Open link": "Link \u00f6ffnen", "Remove link": "Link entfernen", "Anchors": "Textmarken", "Link...": "Link...", "Paste or type a link": "Link einf\u00fcgen oder eintippen", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http:\/\/\" voranstellen?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Die eingegebene URL scheint ein externer Link zu sein. Soll das fehlende https:\/\/ davor erg\u00e4nzt werden?", "Link list": "Linkliste", "Insert video": "Video einf\u00fcgen", "Insert\/edit video": "Video einf\u00fcgen\/bearbeiten", @@ -183,11 +187,15 @@ tinymce.addI18n('de',{ "Replace all": "Alles ersetzen", "Previous": "Vorherige", "Next": "Weiter", +"Find and Replace": "Suchen und Ersetzen", "Find and replace...": "Suchen und ersetzen...", "Could not find the specified string.": "Die Zeichenfolge wurde nicht gefunden.", "Match case": "Gro\u00df-\/Kleinschreibung beachten", "Find whole words only": "Nur ganze W\u00f6rter suchen", -"Spell check": "Rechschreibpr\u00fcfung", +"Find in selection": "In Auswahl suchen", +"Spellcheck": "Rechtschreibpr\u00fcfung", +"Spellcheck Language": "Sprache f\u00fcr die Rechtschreibpr\u00fcfung", +"No misspellings found.": "Keine Rechtschreibfehler gefunden", "Ignore": "Ignorieren", "Ignore all": "Alles Ignorieren", "Finish": "Ende", @@ -218,6 +226,7 @@ tinymce.addI18n('de',{ "Height": "H\u00f6he", "Cell spacing": "Zellenabstand", "Cell padding": "Zelleninnenabstand", +"Caption": "Beschriftung", "Show caption": "Beschriftung anzeigen", "Left": "Linksb\u00fcndig", "Center": "Zentriert", @@ -377,7 +386,21 @@ tinymce.addI18n('de',{ "formatting": "Formatierung", "alignment": "Ausrichtung", "indentation": "Einr\u00fcckungen", -"permanent pen": "Textmarker", +"Font": "Schriftart", +"Size": "Schriftgr\u00f6\u00dfe", +"More...": "Mehr...", +"Select...": "Auswahl...", +"Preferences": "Einstellungen", +"Yes": "Ja", +"No": "Nein", +"Keyboard Navigation": "Tastaturnavigation", +"Version": "Version", +"Code view": "Code Ansicht", +"Open popup menu for split buttons": "\u00d6ffne Popup Menge um Buttons zu trennen", +"List Properties": "Liste Eigenschaften", +"List properties...": "Liste Eigenschaften", +"Start list at number": "Beginne Liste mit Nummer", +"Line height": "Liniendicke", "comments": "Anmerkungen", "Format Painter": "Format-Painter", "Insert\/edit iframe": "iframe einf\u00fcgen\/bearbeiten", @@ -385,24 +408,46 @@ tinymce.addI18n('de',{ "lowercase": "Kleinbuchstaben", "UPPERCASE": "Gro\u00dfbuchstaben", "Title Case": "Gro\u00df-\/Kleinschreibung des Titels", +"permanent pen": "Textmarker", "Permanent Pen Properties": "Eigenschaften von Permanent Pen", "Permanent pen properties...": "Eigenschaften von Permanent Pen...", -"Font": "Schriftart", -"Size": "Schriftgr\u00f6\u00dfe", -"More...": "Mehr...", -"Spellcheck Language": "Sprache f\u00fcr die Rechtschreibpr\u00fcfung", -"Select...": "Auswahl...", -"Preferences": "Einstellungen", -"Yes": "Ja", -"No": "Nein", -"Keyboard Navigation": "Tastaturnavigation", -"Version": "Version", +"case change": "Gro\u00df-\/Kleinschreibung", +"page embed": "Seite einbetten", +"Advanced sort...": "Erweiterte Sortierung...", +"Advanced Sort": "Erweiterte Sortierung", +"Sort table by column ascending": "Tabelle aufsteigend nach Spalten sortieren", +"Sort table by column descending": "Tabelle absteigend nach Spalten sortieren", +"Sort": "Sortieren", +"Order": "Reihenfolge", +"Sort by": "Sortieren nach", +"Ascending": "Aufsteigend", +"Descending": "Absteigend", +"Column {0}": "Spalte {0}", +"Row {0}": "Reihe {0}", +"Spellcheck...": "Rechtschreibpr\u00fcfung...", +"Misspelled word": "Rechtschreibfehler", +"Suggestions": "Vorschl\u00e4ge", +"Change": "Ver\u00e4ndere", +"Finding word suggestions": "Finde Wort Vorschl\u00e4ge", +"Success": "Erfolg", +"Repair": "Reparieren", +"Issue {0} of {1}": "Fehler {0} von {1}", +"Images must be marked as decorative or have an alternative text description": "Bilder m\u00fcssen entweder als dekorativ markiert werden oder eine alternative Beschreibung bekommen", +"Images must have an alternative text description. Decorative images are not allowed.": "Bilder ben\u00f6tigen alternativen Text. Dekorative Bilder nicht erlaubt!", +"Or provide alternative text:": "Oder definiere alternativen Text:", +"Make image decorative:": "Markiere Bild als dekorativ:", +"ID attribute must be unique": "ID muss einzigartig sein", +"Make ID unique": "Mache diese ID einzigartig", +"Keep this ID and remove all others": "Behalte diese ID und entferne alle anderen", +"Remove this ID": "Entferne diese ID", +"Remove all IDs": "Entferne alle IDs", +"Checklist": "Checkliste", "Anchor": "Textmarke", "Special character": "Sonderzeichen", "Code sample": "Codebeispiel", "Color": "Farbe", -"Emoticons": "Emoticons", "Document properties": "Dokumenteigenschaften", +"Image description": "Bildbeschreibung", "Image": "Bild", "Insert link": "Link einf\u00fcgen", "Target": "Ziel", @@ -413,7 +458,5 @@ tinymce.addI18n('de',{ "Prev": "Zur\u00fcck", "Find and replace": "Suchen und ersetzen", "Whole words": "Nur ganze W\u00f6rter", -"Spellcheck": "Rechtschreibpr\u00fcfung", -"Caption": "Beschriftung", "Insert template": "Vorlage einf\u00fcgen " }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/es_ES.js b/cps/static/js/libs/tinymce/langs/es_ES.js deleted file mode 100644 index a10b46d71..000000000 --- a/cps/static/js/libs/tinymce/langs/es_ES.js +++ /dev/null @@ -1,370 +0,0 @@ -tinymce.addI18n('es_ES',{ -"Redo": "Rehacer", -"Undo": "Deshacer", -"Cut": "Cortar", -"Copy": "Copiar", -"Paste": "Pegar", -"Select all": "Seleccionar todo", -"New document": "Nuevo documento", -"Ok": "Ok", -"Cancel": "Cancelar", -"Visual aids": "Ayudas visuales", -"Bold": "Negrita", -"Italic": "Cursiva", -"Underline": "Subrayado", -"Strikethrough": "Tachado", -"Superscript": "Super\u00edndice", -"Subscript": "Sub\u00edndice", -"Clear formatting": "Limpiar formato", -"Align left": "Alinear a la izquierda", -"Align center": "Alinear al centro", -"Align right": "Alinear a la derecha", -"Justify": "Justificar", -"Bullet list": "Lista de vi\u00f1etas", -"Numbered list": "Lista numerada", -"Decrease indent": "Disminuir sangr\u00eda", -"Increase indent": "Incrementar sangr\u00eda", -"Close": "Cerrar", -"Formats": "Formatos", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.", -"Headers": "Encabezados", -"Header 1": "Encabezado 1", -"Header 2": "Encabezado 2", -"Header 3": "Encabezado 3", -"Header 4": "Encabezado 4", -"Header 5": "Encabezado 5", -"Header 6": "Encabezado 6", -"Headings": "Encabezados", -"Heading 1": "Encabezado 1", -"Heading 2": "Encabezado 2", -"Heading 3": "Encabezado 3", -"Heading 4": "Encabezado 4", -"Heading 5": "Encabezado 5", -"Heading 6": "Encabezado 6", -"Preformatted": "Con formato previo", -"Div": "Div", -"Pre": "Pre", -"Code": "C\u00f3digo", -"Paragraph": "P\u00e1rrafo", -"Blockquote": "Blockquote", -"Inline": "Alineado", -"Blocks": "Bloques", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Pegar est\u00e1 ahora en modo de texto sin formato. El contenido se pegar\u00e1 ahora como texto sin formato hasta que desactive esta opci\u00f3n.", -"Fonts": "Fuentes", -"Font Sizes": "Tama\u00f1os de fuente", -"Class": "Clase", -"Browse for an image": "Buscar una imagen", -"OR": "O", -"Drop an image here": "Arrastre una imagen aqu\u00ed", -"Upload": "Cargar", -"Block": "Bloque", -"Align": "Alinear", -"Default": "Por defecto", -"Circle": "C\u00edrculo", -"Disc": "Disco", -"Square": "Cuadrado", -"Lower Alpha": "Letras min\u00fasculas", -"Lower Greek": "Griego en min\u00fasculas", -"Lower Roman": "Romano en min\u00fasculas", -"Upper Alpha": "Letras may\u00fasculas", -"Upper Roman": "Romano en may\u00fasculas", -"Anchor...": "Anclaje...", -"Name": "Nombre", -"Id": "Id.", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "El Id. debe comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.", -"You have unsaved changes are you sure you want to navigate away?": "Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?", -"Restore last draft": "Restaurar el \u00faltimo borrador", -"Special characters...": "Caracteres especiales...", -"Source code": "C\u00f3digo fuente", -"Insert\/Edit code sample": "Insertar\/editar ejemplo de c\u00f3digo", -"Language": "Idioma", -"Code sample...": "Ejemplo de c\u00f3digo...", -"Color Picker": "Selector de colores", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Izquierda a derecha", -"Right to left": "Derecha a izquierda", -"Emoticons...": "Emoticones...", -"Metadata and Document Properties": "Metadatos y propiedades del documento", -"Title": "T\u00edtulo", -"Keywords": "Palabras clave", -"Description": "Descripci\u00f3n", -"Robots": "Robots", -"Author": "Autor", -"Encoding": "Codificaci\u00f3n", -"Fullscreen": "Pantalla completa", -"Action": "Acci\u00f3n", -"Shortcut": "Acceso directo", -"Help": "Ayuda", -"Address": "Direcci\u00f3n", -"Focus to menubar": "Enfocar la barra del men\u00fa", -"Focus to toolbar": "Enfocar la barra de herramientas", -"Focus to element path": "Enfocar la ruta del elemento", -"Focus to contextual toolbar": "Enfocar la barra de herramientas contextual", -"Insert link (if link plugin activated)": "Insertar enlace (si el complemento de enlace est\u00e1 activado)", -"Save (if save plugin activated)": "Guardar (si el complemento de guardar est\u00e1 activado)", -"Find (if searchreplace plugin activated)": "Buscar (si el complemento buscar-reemplazar est\u00e1 activado)", -"Plugins installed ({0}):": "Complementos instalados ({0}):", -"Premium plugins:": "Complementos premium:", -"Learn more...": "M\u00e1s informaci\u00f3n...", -"You are using {0}": "Est\u00e1 usando {0}", -"Plugins": "Complementos", -"Handy Shortcuts": "Accesos pr\u00e1cticos", -"Horizontal line": "L\u00ednea horizontal", -"Insert\/edit image": "Insertar\/editar imagen", -"Image description": "Descripci\u00f3n de la imagen", -"Source": "C\u00f3digo fuente", -"Dimensions": "Dimensiones", -"Constrain proportions": "Restringir proporciones", -"General": "General", -"Advanced": "Avanzado", -"Style": "Estilo", -"Vertical space": "Espacio vertical", -"Horizontal space": "Espacio horizontal", -"Border": "Borde", -"Insert image": "Insertar imagen", -"Image...": "Imagen...", -"Image list": "Lista de im\u00e1genes", -"Rotate counterclockwise": "Girar a la izquierda", -"Rotate clockwise": "Girar a la derecha", -"Flip vertically": "Invertir verticalmente", -"Flip horizontally": "Invertir horizontalmente", -"Edit image": "Editar imagen", -"Image options": "Opciones de imagen", -"Zoom in": "Acercar", -"Zoom out": "Alejar", -"Crop": "Recortar", -"Resize": "Redimensionar", -"Orientation": "Orientaci\u00f3n", -"Brightness": "Brillo", -"Sharpen": "Enfocar", -"Contrast": "Contraste", -"Color levels": "Niveles de color", -"Gamma": "Gama", -"Invert": "Invertir", -"Apply": "Aplicar", -"Back": "Atr\u00e1s", -"Insert date\/time": "Insertar fecha\/hora", -"Date\/time": "Fecha\/hora", -"Insert\/Edit Link": "Insertar\/editar enlace", -"Insert\/edit link": "Insertar\/editar enlace", -"Text to display": "Texto que mostrar", -"Url": "URL", -"Open link in...": "Abrir enlace en...", -"Current window": "Ventana actual", -"None": "Ninguno", -"New window": "Nueva ventana", -"Remove link": "Quitar enlace", -"Anchors": "Anclajes", -"Link...": "Enlace...", -"Paste or type a link": "Pegue o escriba un enlace", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "La URL que ha introducido parece ser una direcci\u00f3n de correo electr\u00f3nico. \u00bfQuiere a\u00f1adir el prefijo necesario mailto:?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "La URL que ha introducido parece ser un enlace externo. \u00bfQuiere a\u00f1adir el prefijo necesario http:\/\/?", -"Link list": "Lista de enlaces", -"Insert video": "Insertar v\u00eddeo", -"Insert\/edit video": "Insertar\/editar v\u00eddeo", -"Insert\/edit media": "Insertar\/editar medio", -"Alternative source": "Enlace alternativo", -"Alternative source URL": "Origen de URL alternativo", -"Media poster (Image URL)": "P\u00f3ster de medio (URL de imagen)", -"Paste your embed code below:": "Pegue el c\u00f3digo para insertar a continuaci\u00f3n:", -"Embed": "Insertar", -"Media...": "Medios...", -"Nonbreaking space": "Espacio de no separaci\u00f3n", -"Page break": "Salto de p\u00e1gina", -"Paste as text": "Pegar como texto", -"Preview": "Previsualizar", -"Print...": "Imprimir...", -"Save": "Guardar", -"Find": "Buscar", -"Replace with": "Reemplazar por", -"Replace": "Reemplazar", -"Replace all": "Reemplazar todo", -"Previous": "Anterior", -"Next": "Siguiente", -"Find and replace...": "Buscar y reemplazar...", -"Could not find the specified string.": "No se encuentra la cadena especificada.", -"Match case": "Coincidir may\u00fasculas y min\u00fasculas", -"Find whole words only": "Solo palabras completas", -"Spell check": "Revisar ortograf\u00eda", -"Ignore": "Ignorar", -"Ignore all": "Ignorar todo", -"Finish": "Fin\u00e9s", -"Add to Dictionary": "A\u00f1adir al Diccionario", -"Insert table": "Insertar tabla", -"Table properties": "Propiedades de la tabla", -"Delete table": "Eliminar tabla", -"Cell": "Celda", -"Row": "Fila", -"Column": "Columna", -"Cell properties": "Propiedades de la celda", -"Merge cells": "Combinar celdas", -"Split cell": "Dividir celda", -"Insert row before": "Insertar fila antes", -"Insert row after": "Insertar fila despu\u00e9s", -"Delete row": "Eliminar fila", -"Row properties": "Propiedades de la fila", -"Cut row": "Cortar fila", -"Copy row": "Copiar fila", -"Paste row before": "Pegar la fila antes", -"Paste row after": "Pegar la fila despu\u00e9s", -"Insert column before": "Insertar columna antes", -"Insert column after": "Insertar columna despu\u00e9s", -"Delete column": "Eliminar columna", -"Cols": "Columnas", -"Rows": "Filas", -"Width": "Ancho", -"Height": "Altura", -"Cell spacing": "Espacio entre celdas", -"Cell padding": "Relleno de celda", -"Show caption": "Mostrar t\u00edtulo", -"Left": "Izquierda", -"Center": "Centro", -"Right": "Derecha", -"Cell type": "Tipo de celda", -"Scope": "\u00c1mbito", -"Alignment": "Alineaci\u00f3n", -"H Align": "Alineaci\u00f3n horizontal", -"V Align": "Alineaci\u00f3n vertical", -"Top": "Superior", -"Middle": "Central", -"Bottom": "Inferior", -"Header cell": "Celda de encabezado", -"Row group": "Grupo de filas", -"Column group": "Grupo de columnas", -"Row type": "Tipo de fila", -"Header": "Encabezado", -"Body": "Cuerpo", -"Footer": "Pie de p\u00e1gina", -"Border color": "Color de borde", -"Insert template...": "Insertar plantilla...", -"Templates": "Plantillas", -"Template": "Plantilla", -"Text color": "Color del texto", -"Background color": "Color de fondo", -"Custom...": "Personalizado...", -"Custom color": "Color personalizado", -"No color": "Sin color", -"Remove color": "Quitar color", -"Table of Contents": "Tabla de contenido", -"Show blocks": "Mostrar bloques", -"Show invisible characters": "Mostrar caracteres invisibles", -"Word count": "Contar palabras", -"Words: {0}": "Palabras: {0}", -"{0} words": "{0} palabras", -"File": "Archivo", -"Edit": "Editar", -"Insert": "Insertar", -"View": "Ver", -"Format": "Formato", -"Table": "Tabla", -"Tools": "Herramientas", -"Powered by {0}": "Con tecnolog\u00eda de {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u00c1rea de texto enriquecido. Pulse ALT-F9 para el men\u00fa. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para la ayuda.", -"Image title": "Titulo de imagen", -"Border width": "Ancho de borde", -"Border style": "Estilo de borde", -"Error": "Error", -"Warn": "Advertencia", -"Valid": "V\u00e1lido", -"To open the popup, press Shift+Enter": "Para abrir el elemento emergente, pulse May\u00fas+Intro", -"Rich Text Area. Press ALT-0 for help.": "\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.", -"System Font": "Fuente de sistema", -"Failed to upload image: {0}": "Fallo al cargar imagen: {0}", -"Failed to load plugin: {0} from url {1}": "Fallo al cargar complemento: {0} desde URL {1}", -"Failed to load plugin url: {0}": "Fallo al cargar URL del complemento: {0}", -"Failed to initialize plugin: {0}": "Fallo al iniciar el complemento: {0}", -"example": "ejemplo", -"Search": "Buscar", -"All": "Todo", -"Currency": "Divisa", -"Text": "Texto", -"Quotations": "Comillas", -"Mathematical": "S\u00edmbolo matem\u00e1tico", -"Extended Latin": "Latino extendido A", -"Symbols": "S\u00edmbolos", -"Arrows": "Flechas", -"User Defined": "Definido por el usuario", -"dollar sign": "signo de d\u00f3lar", -"currency sign": "signo de divisa", -"euro-currency sign": "signo de euro", -"colon sign": "signo de dos puntos", -"cruzeiro sign": "signo de cruceiro", -"french franc sign": "signo de franco franc\u00e9s", -"lira sign": "signo de lira", -"mill sign": "signo de mill", -"naira sign": "signo de naira", -"peseta sign": "signo de peseta", -"rupee sign": "signo de rupia", -"won sign": "signo de won", -"new sheqel sign": "signo de nuevo s\u00e9quel", -"dong sign": "signo de dong", -"kip sign": "signo de kip", -"tugrik sign": "signo de tugrik", -"drachma sign": "signo de dracma", -"german penny symbol": "signo de penique alem\u00e1n", -"peso sign": "signo de peso", -"guarani sign": "signo de guaran\u00ed", -"austral sign": "signo de austral", -"hryvnia sign": "signo de grivna", -"cedi sign": "signo de cedi", -"livre tournois sign": "signo de libra tornesa", -"spesmilo sign": "signo de spesmilo", -"tenge sign": "signo de tenge", -"indian rupee sign": "signo de rupia india", -"turkish lira sign": "signo de lira turca", -"nordic mark sign": "signo de marco n\u00f3rdico", -"manat sign": "signo de manat", -"ruble sign": "signo de rublo", -"yen character": "car\u00e1cter de yen", -"yuan character": "car\u00e1cter de yuan", -"yuan character, in hong kong and taiwan": "car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n", -"yen\/yuan character variant one": "Variante uno de car\u00e1cter de yen\/yuan", -"Loading emoticons...": "Cargando emoticonos...", -"Could not load emoticons": "No se han podido cargar los emoticonos", -"People": "Personas", -"Animals and Nature": "Animales y naturaleza", -"Food and Drink": "Comida y bebida", -"Activity": "Actividad", -"Travel and Places": "Viajes y lugares", -"Objects": "Objetos", -"Flags": "Banderas", -"Characters": "Caracteres", -"Characters (no spaces)": "Caracteres (sin espacios)", -"Error: Form submit field collision.": "Error: Colisi\u00f3n de campo al enviar formulario.", -"Error: No form element found.": "Error: No se encuentra ning\u00fan elemento de formulario.", -"Update": "Actualizar", -"Color swatch": "Muestrario de colores", -"Turquoise": "Turquesa", -"Green": "Verde", -"Blue": "Azul", -"Purple": "P\u00farpura", -"Navy Blue": "Azul marino", -"Dark Turquoise": "Turquesa oscuro", -"Dark Green": "Verde oscuro", -"Medium Blue": "Azul medio", -"Medium Purple": "P\u00farpura medio", -"Midnight Blue": "Azul medio", -"Yellow": "Amarillo", -"Orange": "Naranja", -"Red": "Rojo", -"Light Gray": "Gris claro", -"Gray": "Gris", -"Dark Yellow": "Amarillo oscuro", -"Dark Orange": "Naranja oscuro", -"Dark Red": "Rojo oscuro", -"Medium Gray": "Gris medio", -"Dark Gray": "Gris oscuro", -"Black": "Negro", -"White": "Blanco", -"Switch to or from fullscreen mode": "Activar o desactivar modo pantalla completa", -"Open help dialog": "Abrir di\u00e1logo de ayuda", -"history": "historial", -"styles": "estilos", -"formatting": "formato", -"alignment": "alineaci\u00f3n", -"indentation": "sangr\u00eda", -"permanent pen": "bol\u00edgrafo permanente", -"comments": "comentarios" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/es_MX.js b/cps/static/js/libs/tinymce/langs/es_MX.js deleted file mode 100644 index bff27cad1..000000000 --- a/cps/static/js/libs/tinymce/langs/es_MX.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('es_MX',{ -"Redo": "Rehacer", -"Undo": "Deshacer", -"Cut": "Cortar", -"Copy": "Copiar", -"Paste": "Pegar", -"Select all": "Seleccionar todo", -"New document": "Nuevo documento", -"Ok": "Aceptar", -"Cancel": "Cancelar", -"Visual aids": "Ayudas visuales", -"Bold": "Negrita", -"Italic": "Cursiva", -"Underline": "Subrayado", -"Strikethrough": "Tachado", -"Superscript": "Super\u00edndice", -"Subscript": "Sub\u00edndice", -"Clear formatting": "Borrar formato", -"Align left": "Alinear a la izquierda", -"Align center": "Alinear al centro", -"Align right": "Alinear a la derecha", -"Justify": "Justificar", -"Bullet list": "Lista de vi\u00f1etas", -"Numbered list": "Lista numerada", -"Decrease indent": "Reducir sangr\u00eda", -"Increase indent": "Aumentar sangr\u00eda", -"Close": "Cerrar", -"Formats": "Formatos", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Su navegador no admite el acceso directo al portapapeles. Utilice los m\u00e9todos abreviados de teclado Ctrl+ X\/C\/V.", -"Headers": "Encabezados", -"Header 1": "Encabezado 1", -"Header 2": "Encabezado 2", -"Header 3": "Encabezado 3", -"Header 4": "Encabezado 4", -"Header 5": "Encabezado 5", -"Header 6": "Encabezado 6", -"Headings": "T\u00edtulos", -"Heading 1": "T\u00edtulo 1", -"Heading 2": "T\u00edtulo 2", -"Heading 3": "T\u00edtulo 3", -"Heading 4": "T\u00edtulo 4", -"Heading 5": "T\u00edtulo 5", -"Heading 6": "T\u00edtulo 6", -"Preformatted": "Con formato previo", -"Div": "Div", -"Pre": "Pre", -"Code": "C\u00f3digo", -"Paragraph": "P\u00e1rrafo", -"Blockquote": "Blockquote", -"Inline": "En l\u00ednea", -"Blocks": "Bloques", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Se pegar\u00e1 en texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.", -"Fonts": "Fuentes", -"Font Sizes": "Tama\u00f1os de fuente", -"Class": "Clase", -"Browse for an image": "Buscar una imagen", -"OR": "O", -"Drop an image here": "Soltar una imagen aqu\u00ed", -"Upload": "Cargar", -"Block": "Bloque", -"Align": "Alinear", -"Default": "Por defecto", -"Circle": "Circulo", -"Disc": "Disco", -"Square": "Cuadro", -"Lower Alpha": "Alfa min\u00fascula", -"Lower Greek": "Griega min\u00fascula", -"Lower Roman": "Romano min\u00fascula", -"Upper Alpha": "Alfa may\u00fascula", -"Upper Roman": "May\u00fascula Romana", -"Anchor...": "Marcador...", -"Name": "Nombre", -"Id": "Identificador", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "El Identificador debe comenzar con una letra, seguido solo por letras, n\u00fameros, puntos, guiones medios o guiones bajos. ", -"You have unsaved changes are you sure you want to navigate away?": "No se han guardado los cambios. \u00bfSeguro que desea abandonar la p\u00e1gina?", -"Restore last draft": "Restaurar el \u00faltimo borrador", -"Special character...": "Car\u00e1cter especial...", -"Source code": "C\u00f3digo fuente", -"Insert\/Edit code sample": "Insertar\/Editar c\u00f3digo muestra", -"Language": "idioma", -"Code sample...": "Ejemplo de c\u00f3digo...", -"Color Picker": "Selector de colores", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Izquierda a derecha", -"Right to left": "Derecha a Izquierda", -"Emoticons...": "Emoticonos...", -"Metadata and Document Properties": "Metadatos y propiedades del documento", -"Title": "T\u00edtulo", -"Keywords": "Palabras clave", -"Description": "Descripci\u00f3n ", -"Robots": "Robots", -"Author": "Autor", -"Encoding": "Codificaci\u00f3n", -"Fullscreen": "Pantalla completa", -"Action": "Acci\u00f3n", -"Shortcut": "Atajo", -"Help": "Ayuda", -"Address": "Direcci\u00f3n", -"Focus to menubar": "Enfocar en barra de menu", -"Focus to toolbar": "Enfocar en barra de herramientas", -"Focus to element path": "Enfocar ruta del elemento", -"Focus to contextual toolbar": "Enfocar en barra de herramientas contextual", -"Insert link (if link plugin activated)": "Insertar enlace (si enlace del plugin est\u00e1 activo)", -"Save (if save plugin activated)": "Guardar (si el plugin guardar est\u00e1 activo)", -"Find (if searchreplace plugin activated)": "Buscar (si el plugin buscar\/reemplazar est\u00e1 activo)", -"Plugins installed ({0}):": "Plugins instalados ({0}):", -"Premium plugins:": "Plugins premium:", -"Learn more...": "Aprende m\u00e1s...", -"You are using {0}": "est\u00e1s usando {0}", -"Plugins": "Plugins", -"Handy Shortcuts": "Atajos \u00fatiles", -"Horizontal line": "L\u00ednea Horizontal", -"Insert\/edit image": "Insertar\/editar imagen", -"Image description": "Descripci\u00f3n de imagen", -"Source": "Origen", -"Dimensions": "Dimensiones", -"Constrain proportions": "Restringir proporciones", -"General": "General", -"Advanced": "Avanzado", -"Style": "Estilo", -"Vertical space": "Espacio vertical", -"Horizontal space": "Espacio horizontal", -"Border": "Borde", -"Insert image": "Insertar imagen", -"Image...": "Imagen...", -"Image list": "Lista de im\u00e1genes", -"Rotate counterclockwise": "Rotar en sentido contrario a las manecillas", -"Rotate clockwise": "Rotar en sentido de las manecillas", -"Flip vertically": "Voltear verticalmente", -"Flip horizontally": "Volter horizontalmente", -"Edit image": "Editar imagen", -"Image options": "Opciones de la imagen", -"Zoom in": "Acercar", -"Zoom out": "Alejar", -"Crop": "Recortar", -"Resize": "Cambiar tama\u00f1o", -"Orientation": "Orientaci\u00f3n", -"Brightness": "Brillo", -"Sharpen": "Nitidez", -"Contrast": "Contraste", -"Color levels": "Niveles de Color", -"Gamma": "Gamma", -"Invert": "Invertir", -"Apply": "Aplicar", -"Back": "Regresar", -"Insert date\/time": "Insertar fecha\/hora", -"Date\/time": "Fecha\/hora", -"Insert\/Edit Link": "Insertar\/editar v\u00ednculo", -"Insert\/edit link": "Inserta\/editar enlace", -"Text to display": "Texto a mostrar", -"Url": "Url", -"Open link in...": "Abrir v\u00ednculo en...", -"Current window": "Ventana actual", -"None": "Ninguno", -"New window": "Nueva ventana", -"Remove link": "Eliminar elnace", -"Anchors": "Anclas", -"Link...": "V\u00ednculo...", -"Paste or type a link": "Pega o escribe un enlace", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "El URL que ha insertado tiene formato de correo electr\u00f3nico. \u00bfDesea agregar con prefijo \"mailto:\"?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "El URL que ha ingresado es un enlace externo. \u00bfDesea agregar el prefijo \"http:\/\/\"?", -"Link list": "Lista de enlaces", -"Insert video": "Insertar video", -"Insert\/edit video": "Insertar\/editar video", -"Insert\/edit media": "Insertar\/editar multimedia", -"Alternative source": "Fuente alternativa", -"Alternative source URL": "URL de origen alternativo", -"Media poster (Image URL)": "P\u00f3ster multimedia (URL de la imagen)", -"Paste your embed code below:": "Pegue su c\u00f3digo de inserci\u00f3n abajo:", -"Embed": "Incrustar", -"Media...": "Elemento multimedia...", -"Nonbreaking space": "Espacio de no separaci\u00f3n", -"Page break": "Salto de p\u00e1gina ", -"Paste as text": "Copiar como texto", -"Preview": "Vista previa ", -"Print...": "Imprimir...", -"Save": "Guardar", -"Find": "Buscar", -"Replace with": "Remplazar con", -"Replace": "Remplazar", -"Replace all": "Remplazar todo", -"Previous": "Anterior", -"Next": "Siguiente", -"Find and replace...": "Buscar y reemplazar...", -"Could not find the specified string.": "No se ha encontrado la cadena especificada.", -"Match case": "Coincidencia", -"Find whole words only": "Buscar solo palabras completas", -"Spell check": "Corrector ortogr\u00e1fico", -"Ignore": "Ignorar", -"Ignore all": "Ignorar todo", -"Finish": "Terminar", -"Add to Dictionary": "Agregar al diccionario ", -"Insert table": "Insertar tabla", -"Table properties": "Propiedades de tabla", -"Delete table": "Eliminar tabla", -"Cell": "Celda", -"Row": "Rengl\u00f3n ", -"Column": "Columna", -"Cell properties": "Propiedades de celda", -"Merge cells": "Unir celdas", -"Split cell": "Dividir celdas", -"Insert row before": "Insertar rengl\u00f3n antes", -"Insert row after": "Insertar rengl\u00f3n despu\u00e9s", -"Delete row": "Eliminar rengl\u00f3n ", -"Row properties": "Propiedades del rengl\u00f3n ", -"Cut row": "Cortar renglon", -"Copy row": "Copiar rengl\u00f3n ", -"Paste row before": "Pegar rengl\u00f3n antes", -"Paste row after": "Pegar rengl\u00f3n despu\u00e9s", -"Insert column before": "Insertar columna antes", -"Insert column after": "Insertar columna despu\u00e9s", -"Delete column": "Eliminar columna", -"Cols": "Columnas", -"Rows": "Renglones ", -"Width": "Ancho", -"Height": "Alto", -"Cell spacing": "Espacio entre celdas", -"Cell padding": "Relleno de la celda", -"Show caption": "Mostrar leyenda", -"Left": "Izquierda", -"Center": "Centro", -"Right": "Derecha", -"Cell type": "Tipo de celda", -"Scope": "Alcance", -"Alignment": "Alineaci\u00f3n ", -"H Align": "Alineaci\u00f3n Horizontal", -"V Align": "Alineaci\u00f3n Vertical", -"Top": "Arriba", -"Middle": "Centrado", -"Bottom": "Abajo", -"Header cell": "Celda de encabezado", -"Row group": "Grupo de renglones", -"Column group": "Grupo de columnas", -"Row type": "Tipo de rengl\u00f3n ", -"Header": "Encabezado", -"Body": "Cuerpo", -"Footer": "Pie", -"Border color": "Color del borde", -"Insert template...": "Insertar plantilla...", -"Templates": "Plantilla", -"Template": "Plantilla", -"Text color": "Color de letra", -"Background color": "Color de fondo", -"Custom...": "Personalizar", -"Custom color": "Perzonalizar color", -"No color": "Sin color", -"Remove color": "Eliminar color", -"Table of Contents": "Tabla de Contenidos", -"Show blocks": "Mostrar bloques", -"Show invisible characters": "Mostrar caracteres invisibles", -"Word count": "Contar palabras", -"Count": "Recuento", -"Document": "Documento", -"Selection": "Selecci\u00f3n", -"Words": "Palabras", -"Words: {0}": "Palabras:{0}", -"{0} words": "{0} palabras", -"File": "Archivo", -"Edit": "Editar", -"Insert": "Insertar", -"View": "Vistas", -"Format": "Formato", -"Table": "Tabla", -"Tools": "Herramientas", -"Powered by {0}": "Creado con {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Presione dentro del \u00e1rea de texto ALT-F9 para invocar el men\u00fa, ALT-F10 para la barra de herramientas y ALT-0 para la ayuda.", -"Image title": "T\u00edtulo de la imagen", -"Border width": "Ancho del borde", -"Border style": "Estilo del borde", -"Error": "Error", -"Warn": "Advertencia", -"Valid": "V\u00e1lido", -"To open the popup, press Shift+Enter": "Para abrir la ventana emergente, pulse May\u00fas+Intro", -"Rich Text Area. Press ALT-0 for help.": "\u00c1rea de texto enriquecido. Pulse ALT-0 para obtener ayuda.", -"System Font": "Fuente del sistema", -"Failed to upload image: {0}": "Error al cargar la imagen: {0}", -"Failed to load plugin: {0} from url {1}": "Error al cargar el complemento: {0} desde la url {1}", -"Failed to load plugin url: {0}": "Error al cargar la url del complemento: {0}", -"Failed to initialize plugin: {0}": "Error al inicializar el complemento: {0}", -"example": "ejemplo", -"Search": "Buscar", -"All": "Todo", -"Currency": "Moneda", -"Text": "Texto", -"Quotations": "Comillas", -"Mathematical": "Matem\u00e1ticos", -"Extended Latin": "Lat\u00edn extendido", -"Symbols": "S\u00edmbolos", -"Arrows": "Flechas", -"User Defined": "Definido por el usuario", -"dollar sign": "signo de d\u00f3lar", -"currency sign": "signo de moneda", -"euro-currency sign": "signo de euro", -"colon sign": "signo del col\u00f3n", -"cruzeiro sign": "signo del cruzeiro", -"french franc sign": "signo del franco franc\u00e9s", -"lira sign": "signo de la lira", -"mill sign": "signo de mil", -"naira sign": "signo del naira", -"peseta sign": "signo de la peseta", -"rupee sign": "signo de la rupia", -"won sign": "signo del won", -"new sheqel sign": "signo de nuevo shequel", -"dong sign": "signo del dong", -"kip sign": "signo del kip", -"tugrik sign": "signo del tugrik", -"drachma sign": "signo del dracma", -"german penny symbol": "signo del penique alem\u00e1n", -"peso sign": "signo del peso", -"guarani sign": "signo del guaran\u00ed", -"austral sign": "signo del austral", -"hryvnia sign": "signo de hryvnia", -"cedi sign": "signo de cedi", -"livre tournois sign": "signo de livre tournois", -"spesmilo sign": "signo de spesmilo", -"tenge sign": "signo de tenge", -"indian rupee sign": "signo de la rupia india", -"turkish lira sign": "signo de la lira turca", -"nordic mark sign": "signo del marco n\u00f3rdico", -"manat sign": "signo de manat", -"ruble sign": "signo de rublo", -"yen character": "car\u00e1cter del yen", -"yuan character": "car\u00e1cter del yuan", -"yuan character, in hong kong and taiwan": "car\u00e1cter del yuan, en Hong Kong y Taiw\u00e1n", -"yen\/yuan character variant one": "variante uno del car\u00e1cter del yen\/yuan", -"Loading emoticons...": "Cargando emoticonos...", -"Could not load emoticons": "No se pudieron cargar los emoticonos", -"People": "Personas", -"Animals and Nature": "Animales y naturaleza", -"Food and Drink": "Comida y bebida", -"Activity": "Actividad", -"Travel and Places": "Viajes y lugares", -"Objects": "Objetos", -"Flags": "Banderas", -"Characters": "Caracteres", -"Characters (no spaces)": "Caracteres (sin espacios)", -"{0} characters": "{0} caracteres", -"Error: Form submit field collision.": "Error: colisi\u00f3n de campo env\u00edo de formulario.", -"Error: No form element found.": "Error: no se encontr\u00f3 ning\u00fan elemento de formulario.", -"Update": "Actualizar", -"Color swatch": "Muestrario de colores", -"Turquoise": "Turquesa", -"Green": "Verde", -"Blue": "Azul", -"Purple": "Morado", -"Navy Blue": "Azul marino", -"Dark Turquoise": "Turquesa oscuro", -"Dark Green": "Verde oscuro", -"Medium Blue": "Azul medio", -"Medium Purple": "Morado medio", -"Midnight Blue": "Azul noche", -"Yellow": "Amarillo", -"Orange": "Anaranjado", -"Red": "Rojo", -"Light Gray": "Gris claro", -"Gray": "Gris", -"Dark Yellow": "Amarillo oscuro", -"Dark Orange": "Anaranjado oscuro", -"Dark Red": "Rojo oscuro", -"Medium Gray": "Gris medio", -"Dark Gray": "Gris oscuro", -"Light Green": "Verde claro", -"Light Yellow": "Amarillo claro", -"Light Red": "Rojo claro", -"Light Purple": "Morado claro", -"Light Blue": "Azul claro", -"Dark Purple": "Morado oscuro", -"Dark Blue": "Azul oscuro", -"Black": "Negro", -"White": "Blanco", -"Switch to or from fullscreen mode": "Cambiar a modo de pantalla completa o salir de \u00e9l", -"Open help dialog": "Abrir di\u00e1logo de ayuda", -"history": "historial", -"styles": "estilos", -"formatting": "formato", -"alignment": "alineaci\u00f3n", -"indentation": "sangr\u00eda", -"permanent pen": "l\u00e1piz permanente", -"comments": "comentarios", -"Format Painter": "Copiar formato", -"Insert\/edit iframe": "Insertar\/editar marco flotante", -"Capitalization": "Uso de may\u00fasculas", -"lowercase": "min\u00fascula", -"UPPERCASE": "MAY\u00daSCULA", -"Title Case": "Tipo t\u00edtulo", -"Permanent Pen Properties": "Propiedades del l\u00e1piz permanente", -"Permanent pen properties...": "Propiedades del l\u00e1piz permanente...", -"Font": "Fuente", -"Size": "Tama\u00f1o", -"More...": "M\u00e1s...", -"Spellcheck Language": "Idioma de la revisi\u00f3n ortogr\u00e1fica", -"Select...": "Seleccionar...", -"Preferences": "Preferencias", -"Yes": "S\u00ed", -"No": "No", -"Keyboard Navigation": "Navegaci\u00f3n con el teclado", -"Version": "Versi\u00f3n", -"Anchor": "Anclar", -"Special character": "Caracter especial", -"Code sample": "C\u00f3digo muestra", -"Color": "Color", -"Emoticons": "Emoticones", -"Document properties": "Propiedades del documento", -"Image": "Imagen", -"Insert link": "Insertar enlace", -"Target": "Objetivo", -"Link": "Enlace", -"Poster": "Cartel", -"Media": "Multimedia", -"Print": "Imprimir", -"Prev": "Anterior", -"Find and replace": "Buscar y reemplazar", -"Whole words": "Palabras completas", -"Spellcheck": "Revisi\u00f3n ortogr\u00e1fica", -"Caption": "Subt\u00edtulo", -"Insert template": "Insertar plantilla" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/fa.js b/cps/static/js/libs/tinymce/langs/fa.js index 9968edc9d..0a24c8691 100644 --- a/cps/static/js/libs/tinymce/langs/fa.js +++ b/cps/static/js/libs/tinymce/langs/fa.js @@ -85,6 +85,7 @@ tinymce.addI18n('fa',{ "B": "\u0622\u0628\u06cc", "Left to right": "\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a", "Right to left": "\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e", +"Emoticons": "\u0634\u06a9\u0644\u06a9\u200c\u0647\u0627", "Emoticons...": "\u0635\u0648\u0631\u062a\u06a9\u200c\u0647\u0627...", "Metadata and Document Properties": "\u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0648 \u0645\u0634\u062e\u0635\u0627\u062a \u0633\u0646\u062f", "Title": "\u0639\u0646\u0648\u0627\u0646", @@ -113,7 +114,9 @@ tinymce.addI18n('fa',{ "Handy Shortcuts": "\u0645\u06cc\u0627\u0646\u0628\u0631\u0647\u0627\u06cc \u0645\u0641\u06cc\u062f", "Horizontal line": "\u062e\u0637 \u0627\u0641\u0642\u06cc", "Insert\/edit image": "\u0627\u0636\u0627\u0641\u0647\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0646 \u062a\u0635\u0648\u06cc\u0631", -"Image description": "\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0639\u06a9\u0633", +"Alternative description": "\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646", +"Accessibility": "\u062f\u0633\u062a\u0631\u0633\u06cc", +"Image is decorative": "\u0627\u06cc\u0646 \u062a\u0635\u0648\u06cc\u0631 \u062f\u06a9\u0648\u0631\u06cc \u0627\u0633\u062a", "Source": "\u0645\u0646\u0628\u0639", "Dimensions": "\u0627\u0628\u0639\u0627\u062f", "Constrain proportions": "\u062d\u0641\u0638 \u062a\u0646\u0627\u0633\u0628", @@ -147,7 +150,6 @@ tinymce.addI18n('fa',{ "Back": "Back", "Insert date\/time": "\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062a\u0627\u0631\u06cc\u062e\/\u0632\u0645\u0627\u0646", "Date\/time": "Date\/time", -"Insert\/Edit Link": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u067e\u06cc\u0648\u0646\u062f", "Insert\/edit link": "\u0627\u0636\u0627\u0641\u0647\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0646 \u0644\u06cc\u0646\u06a9", "Text to display": "\u0645\u062a\u0646 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634", "Url": "\u0627\u062f\u0631\u0633 \u0644\u06cc\u0646\u06a9", @@ -155,12 +157,14 @@ tinymce.addI18n('fa',{ "Current window": "\u067e\u0646\u062c\u0631\u0647 \u062c\u0627\u0631\u06cc", "None": "\u0647\u06cc\u0686 \u06a9\u062f\u0627\u0645", "New window": "\u067e\u0646\u062c\u0631\u0647 \u062c\u062f\u06cc\u062f", +"Open link": "\u0628\u0627\u0632\u06a9\u0631\u062f\u0646 \u0644\u06cc\u0646\u06a9", "Remove link": "\u062d\u0630\u0641 \u0644\u06cc\u0646\u06a9", "Anchors": "\u0644\u0646\u06af\u0631 - \u0644\u06cc\u0646\u06a9 \u062f\u0627\u062e\u0644 \u0635\u0641\u062d\u0647", "Link...": "\u067e\u06cc\u0648\u0646\u062f...", "Paste or type a link": "Paste or type a link", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u0622\u062f\u0631\u0633 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u06af\u0648\u06cc\u0627 \u06cc\u06a9 \u0622\u062f\u0631\u0633 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u062e\u0627\u0631\u062c\u06cc \u0627\u0633\u062a. \u0622\u06cc\u0627 \u0645\u06cc\u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0647 \u067e\u06cc\u0634\u0648\u0646\u062f \u0636\u0631\u0648\u0631\u06cc https:\/\/ \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645\u061f", "Link list": "\u0641\u0647\u0631\u0633\u062a \u067e\u06cc\u0648\u0646\u062f\u0647\u0627", "Insert video": "\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631\u06cc", "Insert\/edit video": "\u0627\u0636\u0627\u0641\u0647\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0646 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631\u06cc", @@ -183,11 +187,15 @@ tinymce.addI18n('fa',{ "Replace all": "\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0631\u062f\u0646 \u0647\u0645\u0647", "Previous": "\u0642\u0628\u0644\u06cc", "Next": "\u0628\u0639\u062f\u06cc", +"Find and Replace": "\u062c\u0633\u062a\u200c\u0648\u200c\u062c\u0648 \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0631\u062f\u0646", "Find and replace...": "\u06cc\u0627\u0641\u062a\u0646 \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0631\u062f\u0646...", "Could not find the specified string.": "\u0631\u0634\u062a\u0647 \u0645\u062a\u0646\u06cc \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f.", "Match case": "\u062d\u0633\u0627\u0633 \u0628\u0647 \u062d\u0631\u0648\u0641 \u06a9\u0648\u0686\u06a9 \u0648 \u0628\u0632\u0631\u06af", "Find whole words only": "\u06cc\u0627\u0641\u062a\u0646 \u062f\u0642\u06cc\u0642\u0627\u064b \u06a9\u0644 \u0648\u0627\u0698\u0647", -"Spell check": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627", +"Find in selection": "\u062f\u0631 \u06af\u0644\u0686\u06cc\u0646 \u0628\u06cc\u0627\u0628\u06cc\u062f", +"Spellcheck": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627\u06cc\u06cc", +"Spellcheck Language": "\u0632\u0628\u0627\u0646 \u0686\u06a9 \u0627\u0633\u067e\u0644\u06cc\u0646\u06af", +"No misspellings found.": "\u063a\u0644\u0637 \u0627\u0645\u0644\u0627\u06cc\u06cc \u06cc\u0627\u0641\u062a \u0646\u0634\u062f.", "Ignore": "\u0646\u0627\u062f\u06cc\u062f\u0647 \u06af\u0631\u0641\u062a\u0646", "Ignore all": "\u0646\u0627\u062f\u06cc\u062f\u0647 \u06af\u0631\u0641\u062a\u0646 \u0647\u0645\u0647", "Finish": "\u067e\u0627\u06cc\u0627\u0646", @@ -218,6 +226,7 @@ tinymce.addI18n('fa',{ "Height": "\u0627\u0631\u062a\u0641\u0627\u0639", "Cell spacing": "\u0641\u0627\u0635\u0644\u0647\u200c\u06cc \u0628\u06cc\u0646 \u0633\u0644\u0648\u0644 \u0647\u0627", "Cell padding": "\u062d\u0627\u0634\u06cc\u0647 \u0633\u0644\u0648\u0644 \u0647\u0627", +"Caption": "\u0639\u0646\u0648\u0627\u0646", "Show caption": "\u0646\u0645\u0627\u06cc\u0634 \u0639\u0646\u0648\u0627\u0646", "Left": "\u0686\u067e", "Center": "\u0648\u0633\u0637", @@ -377,7 +386,21 @@ tinymce.addI18n('fa',{ "formatting": "\u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc", "alignment": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc", "indentation": "\u062a\u0648\u0631\u0641\u062a\u06af\u06cc", -"permanent pen": "\u0642\u0644\u0645 \u062f\u0627\u0626\u0645\u06cc", +"Font": "\u0641\u0648\u0646\u062a", +"Size": "\u0627\u0646\u062f\u0627\u0632\u0647", +"More...": "\u0628\u06cc\u0634\u062a\u0631...", +"Select...": "\u0627\u0646\u062a\u062e\u0627\u0628...", +"Preferences": "\u062a\u0631\u062c\u06cc\u062d\u0627\u062a", +"Yes": "\u0628\u0644\u0647", +"No": "\u062e\u06cc\u0631", +"Keyboard Navigation": "\u0645\u0631\u0648\u0631 \u0628\u0627 \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u062f", +"Version": "\u0646\u0633\u062e\u0647", +"Code view": "\u0646\u0645\u0627\u06cc \u06a9\u062f", +"Open popup menu for split buttons": "\u0645\u0646\u0648\u06cc \u0628\u0627\u0632\u0634\u0648 \u0628\u0631\u0627\u06cc \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f", +"List Properties": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0641\u0647\u0631\u0633\u062a", +"List properties...": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0641\u0647\u0631\u0633\u062a", +"Start list at number": "\u0644\u06cc\u0633\u062a \u0631\u0627 \u062f\u0631 \u0634\u0645\u0627\u0631\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f", +"Line height": "\u0628\u0644\u0646\u062f\u06cc \u062e\u0637 ", "comments": "\u0646\u0638\u0631\u0627\u062a", "Format Painter": "\u0646\u0642\u0627\u0634 \u0641\u0631\u0645\u062a", "Insert\/edit iframe": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 iframe", @@ -385,23 +408,45 @@ tinymce.addI18n('fa',{ "lowercase": "\u062d\u0631\u0648\u0641 \u06a9\u0648\u0686\u06a9", "UPPERCASE": "\u062d\u0631\u0648\u0641 \u0628\u0632\u0631\u06af", "Title Case": "\u062d\u0631\u0648\u0641 \u062a\u06cc\u062a\u0631\u06cc", +"permanent pen": "\u0642\u0644\u0645 \u062f\u0627\u0626\u0645\u06cc", "Permanent Pen Properties": "\u0645\u0634\u062e\u0635\u0627\u062a \u062f\u0627\u0626\u0645\u06cc \u0642\u0644\u0645", "Permanent pen properties...": "\u0645\u0634\u062e\u0635\u0627\u062a \u062f\u0627\u0626\u0645\u06cc \u0642\u0644\u0645...", -"Font": "\u0641\u0648\u0646\u062a", -"Size": "\u0627\u0646\u062f\u0627\u0632\u0647", -"More...": "\u0628\u06cc\u0634\u062a\u0631...", -"Spellcheck Language": "\u0632\u0628\u0627\u0646 \u0686\u06a9 \u0627\u0633\u067e\u0644\u06cc\u0646\u06af", -"Select...": "\u0627\u0646\u062a\u062e\u0627\u0628...", -"Preferences": "\u062a\u0631\u062c\u06cc\u062d\u0627\u062a", -"Yes": "\u0628\u0644\u0647", -"No": "\u062e\u06cc\u0631", -"Keyboard Navigation": "\u0645\u0631\u0648\u0631 \u0628\u0627 \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u062f", -"Version": "\u0646\u0633\u062e\u0647", +"case change": "\u062a\u063a\u06cc\u06cc\u0631 \u0645\u0648\u0631\u062f", +"page embed": "\u0635\u0641\u062d\u0647 \u062c\u0627\u0633\u0627\u0632\u06cc\u00a0", +"Advanced sort...": "\u0645\u0631\u062a\u0628 \u0633\u0627\u0632\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647", +"Advanced Sort": "\u0645\u0631\u062a\u0628 \u0633\u0627\u0632\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647", +"Sort table by column ascending": "\u062c\u062f\u0648\u0644 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0633\u062a\u0648\u0646 \u0628\u0647 \u0635\u0648\u0631\u062a \u0635\u0639\u0648\u062f\u06cc \u0645\u0631\u062a\u0628 \u06a9\u0646\u06cc\u062f", +"Sort table by column descending": "\u062c\u062f\u0648\u0644 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0633\u062a\u0648\u0646 \u0628\u0647 \u0635\u0648\u0631\u062a \u0646\u0632\u0648\u0644\u06cc \u0645\u0631\u062a\u0628 \u06a9\u0646\u06cc\u062f", +"Sort": "\u0645\u0631\u062a\u0628 \u0633\u0627\u0632\u06cc", +"Order": "\u062a\u0631\u062a\u06cc\u0628", +"Sort by": "\u0645\u0631\u062a\u0628 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637", +"Ascending": "\u0635\u0639\u0648\u062f\u06cc", +"Descending": "\u0646\u0632\u0648\u0644\u06cc", +"Column {0}": "\u0633\u062a\u0648\u0646 {0}", +"Row {0}": "\u0631\u062f\u06cc\u0641 {0}", +"Spellcheck...": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627\u06cc\u06cc", +"Misspelled word": "\u06a9\u0644\u0645\u0647 \u063a\u0644\u0637 \u0627\u0645\u0644\u0627\u06cc\u06cc", +"Suggestions": "\u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u0627\u062a", +"Change": "\u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0646", +"Finding word suggestions": "\u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f\u0627\u062a \u06a9\u0644\u0645\u0647", +"Success": "\u0645\u0648\u0641\u0642", +"Repair": "\u062a\u0639\u0645\u06cc\u0631", +"Issue {0} of {1}": "\u0645\u0634\u06a9\u0644 {0} \u0627\u0632 {1}", +"Images must be marked as decorative or have an alternative text description": "\u062a\u0635\u0648\u06cc\u0631 \u0647\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0635\u0648\u0631\u062a \u0646\u0645\u0627\u06cc\u0634\u06cc \u0645\u0634\u062e\u0635 \u0634\u0648\u062f \u06cc\u0627 \u06cc\u06a9 \u0645\u062a\u0646 \u062a\u0648\u0636\u06cc\u062d\u06cc \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f", +"Images must have an alternative text description. Decorative images are not allowed.": "\u0639\u06a9\u0633 \u0647\u0627 \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0645\u062a\u0646 \u062a\u0648\u0636\u06cc\u062d\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f. \u0639\u06a9\u0633 \u0647\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u0645\u062c\u0627\u0632 \u0646\u06cc\u0633\u062a\u0646\u062f.", +"Or provide alternative text:": "\u06cc\u0627 \u06cc\u06a9 \u0645\u062a\u0646 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u062a\u0647\u06cc\u0647 \u06a9\u0646\u06cc\u062f:", +"Make image decorative:": "\u0639\u06a9\u0633 \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634\u06cc \u06a9\u0646\u06cc\u062f:", +"ID attribute must be unique": "\u0634\u0646\u0627\u0633\u0647 \u0635\u0641\u062a \u0628\u0627\u06cc\u062f \u06cc\u06a9\u062a\u0627 \u0628\u0627\u0634\u062f", +"Make ID unique": "\u0634\u0646\u0627\u0633\u0647 \u0631\u0627 \u06cc\u06a9\u062a\u0627 \u06a9\u0646\u06cc\u062f", +"Keep this ID and remove all others": "\u0627\u06cc\u0646 \u0634\u0646\u0627\u0633\u0647 \u0631\u0627 \u0646\u06af\u0647 \u062f\u0627\u0631 \u0648 \u0647\u0645\u0647 \u0634\u0646\u0627\u0633\u0647 \u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646", +"Remove this ID": "\u0627\u06cc\u0646 \u0634\u0646\u0627\u0633\u0647 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646", +"Remove all IDs": "\u062a\u0645\u0627\u0645 \u0634\u0646\u0627\u0633\u0647 \u0647\u0627 \u0631\u0627 \u0627\u0632 \u0628\u06cc\u0646 \u0628\u0628\u0631", +"Checklist": "\u0686\u06a9 \u0644\u06cc\u0633\u062a", "Anchor": "\u0644\u0646\u06af\u0631 - \u0644\u06cc\u0646\u06a9", "Special character": "\u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0647\u0627\u06cc \u062e\u0627\u0635", "Color": "Color", -"Emoticons": "\u0634\u06a9\u0644\u06a9\u200c\u0647\u0627", "Document properties": "\u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0633\u0646\u062f", +"Image description": "\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0639\u06a9\u0633", "Image": "\u0639\u06a9\u0633", "Insert link": "\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0644\u06cc\u0646\u06a9", "Link": "Link", @@ -412,8 +457,6 @@ tinymce.addI18n('fa',{ "Whole words": "\u0647\u0645\u0647 \u06a9\u0644\u0645\u0647\u200c\u0647\u0627", "Find and replace": "\u062c\u0633\u062a\u200c\u0648\u200c\u062c\u0648 \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0631\u062f\u0646", "Prev": "\u0642\u0628\u0644\u06cc", -"Spellcheck": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627\u06cc\u06cc", -"Caption": "\u0639\u0646\u0648\u0627\u0646", "Insert template": "\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0644\u06af\u0648", "_dir": "rtl" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/fa_IR.js b/cps/static/js/libs/tinymce/langs/fa_IR.js deleted file mode 100644 index e944666ab..000000000 --- a/cps/static/js/libs/tinymce/langs/fa_IR.js +++ /dev/null @@ -1,390 +0,0 @@ -tinymce.addI18n('fa_IR',{ -"Redo": "\u0628\u0627\u0632\u0627\u0646\u062c\u0627\u0645", -"Undo": "\u0648\u0627\u06af\u0631\u062f", -"Cut": "\u0628\u0631\u0634", -"Copy": "\u06a9\u067e\u06cc", -"Paste": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646", -"Select all": "\u0627\u0646\u062a\u062e\u0627\u0628 \u0647\u0645\u0647", -"New document": "\u0633\u0646\u062f \u062c\u062f\u06cc\u062f", -"Ok": "\u062a\u0623\u06cc\u06cc\u062f", -"Cancel": "\u0644\u063a\u0648", -"Visual aids": "\u06a9\u0645\u06a9\u200c\u0647\u0627\u06cc \u0628\u0635\u0631\u06cc", -"Bold": "\u067e\u0631\u0631\u0646\u06af", -"Italic": "\u06a9\u062c", -"Underline": "\u0632\u06cc\u0631 \u062e\u0637 \u062f\u0627\u0631", -"Strikethrough": "\u062e\u0637 \u0632\u062f\u0646", -"Superscript": "\u0628\u0627\u0644\u0627\u0646\u06af\u0627\u0634\u062a", -"Subscript": "\u0632\u06cc\u0631\u0646\u06af\u0627\u0634\u062a", -"Clear formatting": "\u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc", -"Align left": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc \u0627\u0632 \u0686\u067e", -"Align center": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc \u0627\u0632 \u0648\u0633\u0637", -"Align right": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc \u0627\u0632 \u0631\u0627\u0633\u062a", -"Justify": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc \u062f\u0648\u0637\u0631\u0641\u0647", -"Bullet list": "\u0641\u0647\u0631\u0633\u062a \u0646\u0634\u0627\u0646\u0647\u200c\u062f\u0627\u0631", -"Numbered list": "\u0641\u0647\u0631\u0633\u062a \u0634\u0645\u0627\u0631\u0647\u200c\u062f\u0627\u0631", -"Decrease indent": "\u06a9\u0627\u0647\u0634 \u062a\u0648\u0631\u0641\u062a\u06af\u06cc", -"Increase indent": "\u0627\u0641\u0632\u0627\u06cc\u0634 \u062a\u0648\u0631\u0641\u062a\u06af\u06cc", -"Close": "\u0628\u0633\u062a\u0646", -"Formats": "\u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0647\u0627", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0645\u0631\u0648\u0631\u06af\u0631 \u0634\u0645\u0627 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 \u06a9\u0644\u06cc\u067e\u200c\u0628\u0648\u0631\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0644\u0637\u0641\u0627\u064b \u0627\u0632 \u0645\u06cc\u0627\u0646\u0628\u0631\u0647\u0627\u06cc Ctrl+X\/C\/V \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.", -"Headers": "\u0633\u0631\u0628\u0631\u06af\u200c\u0647\u0627", -"Header 1": "\u0633\u0631\u0628\u0631\u06af 1", -"Header 2": "\u0633\u0631\u0628\u0631\u06af 2", -"Header 3": "\u0633\u0631\u0628\u0631\u06af 3", -"Header 4": "\u0633\u0631\u0628\u0631\u06af 4", -"Header 5": "\u0633\u0631\u0628\u0631\u06af 5", -"Header 6": "\u0633\u0631\u0628\u0631\u06af 6", -"Headings": "\u0633\u0631\u0641\u0635\u0644\u200c\u0647\u0627", -"Heading 1": "\u0633\u0631\u0641\u0635\u0644\u200c 1", -"Heading 2": "\u0633\u0631\u0641\u0635\u0644 2", -"Heading 3": "\u0633\u0631\u0641\u0635\u0644 3", -"Heading 4": "\u0633\u0631\u0641\u0635\u0644 4", -"Heading 5": "\u0633\u0631\u0641\u0635\u0644 5", -"Heading 6": "\u0633\u0631\u0641\u0635\u0644 6", -"Preformatted": "\u0627\u0632 \u067e\u06cc\u0634 \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647", -"Div": "\u0628\u062e\u0634", -"Pre": "\u067e\u06cc\u0634", -"Code": "\u06a9\u062f", -"Paragraph": "\u067e\u0627\u0631\u0627\u06af\u0631\u0627\u0641", -"Blockquote": "\u0646\u0642\u0644 \u0642\u0648\u0644 \u0628\u0644\u0648\u06a9\u06cc", -"Inline": "\u0647\u0645\u200c\u0631\u0627\u0633\u062a\u0627", -"Blocks": "\u0628\u0644\u0648\u06a9\u200c\u0647\u0627", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u0627\u0645\u06a9\u0627\u0646 \u0686\u0633\u0628\u0627\u0646\u062f\u0646\u060c \u062f\u0631 \u062d\u0627\u0644\u062a \u0645\u062a\u0646 \u062e\u0627\u0644\u0635 \u062a\u0646\u0638\u06cc\u0645 \u06af\u0634\u062a\u0647. \u062a\u0627 \u0632\u0645\u0627\u0646 \u062a\u063a\u06cc\u06cc\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u0645\u062d\u062a\u0648\u0627\u06cc \u0645\u0648\u0631\u062f \u0686\u0633\u0628\u0627\u0646\u062f\u0646\u060c \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062a\u0646 \u062e\u0627\u0644\u0635 \u062e\u0648\u0627\u0647\u062f \u0686\u0633\u0628\u06cc\u062f.", -"Fonts": "\u0641\u0648\u0646\u062a\u200c\u200c\u0647\u0627", -"Font Sizes": "\u0627\u0646\u062f\u0627\u0632\u0647\u0654 \u0641\u0648\u0646\u062a", -"Class": "\u0637\u0628\u0642\u0647", -"Browse for an image": "\u06af\u0634\u062a\u0646 \u0628\u0631\u0627\u06cc \u0639\u06a9\u0633 \u0645\u0648\u0631\u062f \u0646\u0638\u0631", -"OR": "\u06cc\u0627", -"Drop an image here": "\u062a\u0635\u0648\u06cc\u0631 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u0631\u0627 \u0627\u06cc\u0646\u062c\u0627 \u0631\u0647\u0627 \u06a9\u0646\u06cc\u062f", -"Upload": "\u0622\u067e\u0644\u0648\u062f", -"Block": "\u0628\u0644\u0648\u06a9", -"Align": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc", -"Default": "\u067e\u06cc\u0634 \u0641\u0631\u0636", -"Circle": "\u062f\u0627\u06cc\u0631\u0647", -"Disc": "\u062f\u0627\u06cc\u0631\u0647\u0621 \u062a\u0648\u067e\u0631", -"Square": "\u0686\u0647\u0627\u0631 \u06af\u0648\u0634", -"Lower Alpha": "\u062d\u0631\u0648\u0641 \u06a9\u0648\u0686\u06a9", -"Lower Greek": "\u062d\u0631\u0648\u0641 \u06a9\u0648\u0686\u06a9 \u06cc\u0648\u0646\u0627\u0646\u06cc", -"Lower Roman": "\u0627\u0631\u0642\u0627\u0645 \u06a9\u0648\u0686\u06a9 \u0631\u0648\u0645\u06cc", -"Upper Alpha": "\u062d\u0631\u0648\u0641 \u0628\u0632\u0631\u06af", -"Upper Roman": "\u0627\u0631\u0642\u0627\u0645 \u0628\u0632\u0631\u06af \u0631\u0648\u0645\u06cc", -"Anchor...": "\u0642\u0644\u0627\u0628...", -"Name": "\u0646\u0627\u0645", -"Id": "\u0634\u0646\u0627\u0633\u0647", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0634\u0646\u0627\u0633\u0647 \u0645\u06cc \u0628\u0627\u06cc\u0633\u062a \u0628\u0627 \u06cc\u06a9 \u062d\u0631\u0641 \u0627\u0644\u0641\u0628\u0627 \u0622\u063a\u0627\u0632 \u0648 \u0628\u0627 \u062f\u0646\u0628\u0627\u0644\u0647 \u0627\u06cc \u0627\u0632 \u062d\u0631\u0648\u0641\u060c \u0627\u0639\u062f\u0627\u062f\u060c \u0639\u0644\u0627\u0645\u062a \u0645\u0650\u0646\u0647\u0627\u060c \u0646\u0642\u0637\u0647\u060c \u062f\u0648 \u0646\u0642\u0637\u0647 \u06cc\u0627 \u062e\u0637 \u062a\u06cc\u0631\u0647 \u0627\u062f\u0627\u0645\u0647 \u06cc\u0627\u0628\u062f.", -"You have unsaved changes are you sure you want to navigate away?": "\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0634\u0645\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0646\u0634\u062f\u0647 \u0627\u0646\u062f\u060c \u0622\u06cc\u0627 \u062c\u0647\u062a \u062e\u0631\u0648\u062c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062f\u0627\u0631\u06cc\u062f\u061f", -"Restore last draft": "\u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0622\u062e\u0631\u06cc\u0646 \u067e\u06cc\u0634 \u0646\u0648\u06cc\u0633", -"Special characters...": "\u0646\u0648\u06cc\u0633\u0647\u200c\u0647\u0627\u06cc \u0648\u06cc\u0698\u0647...", -"Source code": "\u0645\u062a\u0646 \u06a9\u062f \u0645\u0646\u0628\u0639", -"Insert\/Edit code sample": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0646\u0645\u0648\u0646\u0647\u0621 \u06a9\u062f", -"Language": "\u0632\u0628\u0627\u0646", -"Code sample...": "\u0646\u0645\u0648\u0646\u0647 \u06a9\u062f...", -"Color Picker": "\u0627\u0646\u062a\u062e\u0627\u0628\u200c\u06a9\u0646\u0646\u062f\u0647 \u0631\u0646\u06af", -"R": "\u0642\u0631\u0645\u0632", -"G": "\u0633\u0628\u0632", -"B": "\u0622\u0628\u06cc", -"Left to right": "\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a", -"Right to left": "\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e", -"Emoticons...": "\u0635\u0648\u0631\u062a\u06a9\u200c\u0647\u0627...", -"Metadata and Document Properties": "\u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0648 \u0645\u0634\u062e\u0635\u0627\u062a \u0633\u0646\u062f", -"Title": "\u0639\u0646\u0648\u0627\u0646", -"Keywords": "\u0648\u0627\u0698\u06af\u0627\u0646 \u06a9\u0644\u06cc\u062f\u06cc", -"Description": "\u062a\u0648\u0636\u06cc\u062d", -"Robots": "\u0631\u0648\u0628\u0627\u062a\u0647\u0627", -"Author": "\u0645\u0648\u0644\u0641", -"Encoding": "\u06a9\u062f\u06af\u0632\u0627\u0631\u06cc \u0645\u062a\u0646", -"Fullscreen": "\u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647", -"Action": "\u0639\u0645\u0644", -"Shortcut": "\u0645\u06cc\u0627\u0646\u0628\u064f\u0631", -"Help": "\u0631\u0627\u0647\u0646\u0645\u0627", -"Address": "\u0646\u0634\u0627\u0646\u06cc", -"Focus to menubar": "\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0646\u0648\u0627\u0631 \u0645\u0646\u0648", -"Focus to toolbar": "\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0646\u0648\u0627\u0631 \u0627\u0628\u0632\u0627\u0631", -"Focus to element path": "\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0645\u0633\u06cc\u0631 \u0627\u0650\u0644\u0650\u0645\u0627\u0646", -"Focus to contextual toolbar": "\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0646\u0648\u0627\u0631 \u0627\u0628\u0632\u0627\u0631 \u0645\u062a\u0646\u06cc", -"Insert link (if link plugin activated)": "\u062f\u0631\u062c \u067e\u06cc\u0648\u0646\u062f (\u0627\u06af\u0631 \u0627\u0641\u0632\u0648\u0646\u0647\u0621 \u067e\u06cc\u0648\u0646\u062f \u0641\u0639\u0627\u0644 \u0634\u062f)", -"Save (if save plugin activated)": "\u062b\u0628\u062a\u00a0(\u0627\u06af\u0631 \u0627\u0641\u0632\u0648\u0646\u0647\u0621 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0641\u0639\u0627\u0644 \u0634\u062f)", -"Find (if searchreplace plugin activated)": "\u06cc\u0627\u0641\u062a\u0646 (\u0627\u06af\u0631 \u0627\u0641\u0632\u0648\u0646\u0647\u0621 \u062c\u0633\u062a\u062c\u0648\/\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc \u0641\u0639\u0627\u0644 \u0634\u062f)", -"Plugins installed ({0}):": "\u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0646\u0635\u0628 \u0634\u062f\u0646\u062f ({0}):", -"Premium plugins:": "\u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc \u0645\u062e\u0635\u0648\u0635:", -"Learn more...": "\u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0628\u06cc\u0634\u062a\u0631...", -"You are using {0}": "\u0634\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 {0} \u0645\u06cc \u0628\u0627\u0634\u06cc\u062f", -"Plugins": "\u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627", -"Handy Shortcuts": "\u0645\u06cc\u0627\u0646\u0628\u064f\u0631\u0647\u0627\u06cc \u0633\u0648\u062f\u0645\u0646\u062f", -"Horizontal line": "\u062e\u0637 \u0627\u0641\u0642\u06cc", -"Insert\/edit image": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u062a\u0635\u0648\u06cc\u0631", -"Image description": "\u062a\u0648\u0635\u06cc\u0641 \u062a\u0635\u0648\u06cc\u0631", -"Source": "\u0645\u0646\u0628\u0639", -"Dimensions": "\u0627\u0628\u0639\u0627\u062f", -"Constrain proportions": "\u062d\u0641\u0638 \u062a\u0646\u0627\u0633\u0628", -"General": "\u0639\u0645\u0648\u0645\u06cc", -"Advanced": "\u067e\u06cc\u0634\u0631\u0641\u062a\u0647", -"Style": "\u0633\u0628\u06a9", -"Vertical space": "\u0641\u0636\u0627\u06cc \u0639\u0645\u0648\u062f\u06cc", -"Horizontal space": "\u0641\u0636\u0627\u06cc \u0627\u0641\u0642\u06cc", -"Border": "\u0644\u0628\u0647", -"Insert image": "\u062f\u0631\u062c \u062a\u0635\u0648\u06cc\u0631", -"Image...": "\u062a\u0635\u0648\u06cc\u0631...", -"Image list": "\u0641\u0647\u0631\u0633\u062a \u062a\u0635\u0648\u06cc\u0631\u06cc", -"Rotate counterclockwise": "\u062f\u064e\u0648\u064e\u0631\u0627\u0646 \u067e\u0627\u062f \u0633\u0627\u0639\u062a \u06af\u0631\u062f", -"Rotate clockwise": "\u062f\u064e\u0648\u064e\u0631\u0627\u0646 \u0633\u0627\u0639\u062a \u06af\u0631\u062f", -"Flip vertically": "\u0642\u0631\u06cc\u0646\u0647 \u0639\u0645\u0648\u062f\u06cc", -"Flip horizontally": "\u0642\u0631\u06cc\u0646\u0647 \u0627\u0641\u0642\u06cc", -"Edit image": "\u0648\u06cc\u0631\u0627\u0633\u062a \u062a\u0635\u0648\u06cc\u0631", -"Image options": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062a\u0635\u0648\u06cc\u0631", -"Zoom in": "\u0628\u0632\u0631\u06af \u0646\u0645\u0627\u06cc\u06cc", -"Zoom out": "\u06a9\u0648\u0686\u06a9 \u0646\u0645\u0627\u06cc\u06cc", -"Crop": "\u0628\u064f\u0631\u0634 \u062f\u064f\u0648\u0631", -"Resize": "\u062a\u063a\u06cc\u06cc\u0631 \u0627\u0646\u062f\u0627\u0632\u0647", -"Orientation": "\u06af\u0650\u0631\u0627", -"Brightness": "\u0631\u0648\u0634\u0646\u0627\u06cc\u06cc", -"Sharpen": "\u0628\u0647\u0628\u0648\u062f \u0644\u0628\u0647", -"Contrast": "\u062a\u0636\u0627\u062f \u0631\u0646\u06af", -"Color levels": "\u0633\u0637\u0648\u062d \u0631\u0646\u06af", -"Gamma": "\u06af\u0627\u0645\u0627", -"Invert": "\u0628\u0631\u06af\u0634\u062a \u0631\u0646\u06af", -"Apply": "\u0627\u0650\u0639\u0645\u0627\u0644", -"Back": "\u0628\u0627\u0632\u06af\u0634\u062a", -"Insert date\/time": "\u062f\u0631\u062c \u062a\u0627\u0631\u06cc\u062e\/\u0632\u0645\u0627\u0646", -"Date\/time": "\u062a\u0627\u0631\u06cc\u062e\/\u0632\u0645\u0627\u0646", -"Insert\/Edit Link": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u067e\u06cc\u0648\u0646\u062f", -"Insert\/edit link": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u067e\u06cc\u0648\u0646\u062f", -"Text to display": "\u0645\u062a\u0646 \u0646\u0645\u0627\u06cc\u0634\u06cc", -"Url": "\u0622\u062f\u0631\u0633", -"Open link in...": "\u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u067e\u06cc\u0648\u0646\u062f \u062f\u0631...", -"Current window": "\u067e\u0646\u062c\u0631\u0647 \u062c\u0627\u0631\u06cc", -"None": "\u0647\u06cc\u0686", -"New window": "\u067e\u0646\u062c\u0631\u0647\u0621 \u062c\u062f\u06cc\u062f", -"Remove link": "\u062d\u0630\u0641 \u067e\u06cc\u0648\u0646\u062f", -"Anchors": "\u0642\u0644\u0627\u0628 \u0647\u0627", -"Link...": "\u067e\u06cc\u0648\u0646\u062f...", -"Paste or type a link": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u06cc\u0627 \u062a\u0627\u06cc\u067e \u067e\u06cc\u0648\u0646\u062f", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0622\u062f\u0631\u0633 \u0648\u0631\u0648\u062f\u06cc \u06cc\u06a9 \u0631\u0627\u06cc\u0627\u0646\u0627\u0645\u0647 \u0628\u0627\u0634\u062f. \u0622\u06cc\u0627 \u062a\u0645\u0627\u06cc\u0644 \u0628\u0647 \u0627\u0641\u0632\u0648\u0631\u062f\u0646 \u067e\u06cc\u0634\u0648\u0646\u062f mailto: \u062f\u0627\u0631\u06cc\u062f\u061f", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0622\u062f\u0631\u0633 \u0648\u0631\u0648\u062f\u06cc \u0627\u0631\u062c\u0627\u0639\u06cc \u0628\u0647 \u062e\u0627\u0631\u062c \u0627\u0632 \u0627\u06cc\u0646 \u0633\u0627\u06cc\u062a \u0645\u06cc \u0628\u0627\u0634\u062f. \u0622\u06cc\u0627 \u062a\u0645\u0627\u06cc\u0644 \u0628\u0647 \u0627\u0641\u0632\u0648\u0631\u062f\u0646 \u067e\u06cc\u0634\u0648\u0646\u062f http:\/\/ \u062f\u0627\u0631\u06cc\u062f\u061f", -"Link list": "\u0641\u0647\u0631\u0633\u062a \u067e\u06cc\u0648\u0646\u062f", -"Insert video": "\u062f\u0631\u062c \u0648\u06cc\u062f\u06cc\u0648", -"Insert\/edit video": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0648\u06cc\u062f\u06cc\u0648", -"Insert\/edit media": "\u062f\u0631\u062c\/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0631\u0633\u0627\u0646\u0647", -"Alternative source": "\u0645\u0646\u0628\u0639 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646", -"Alternative source URL": "\u0646\u0634\u0627\u0646\u06cc \u0648\u0628 \u0645\u0646\u0628\u0639 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646", -"Media poster (Image URL)": "\u067e\u0648\u0633\u062a\u0631 \u0631\u0633\u0627\u0646\u0647 (\u0646\u0634\u0627\u0646\u06cc \u0648\u0628 \u062a\u0635\u0648\u06cc\u0631)", -"Paste your embed code below:": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u06a9\u062f \u062c\u0627\u0633\u0627\u0632\u06cc \u0634\u0645\u0627 \u062f\u0631 \u0632\u06cc\u0631: ", -"Embed": "\u062c\u0627\u0633\u0627\u0632\u06cc", -"Media...": "\u0631\u0633\u0627\u0646\u0647...", -"Nonbreaking space": "\u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u0628\u0631\u0634 \u0646\u0627\u067e\u0630\u06cc\u0631", -"Page break": "\u0628\u0631\u0634 \u0635\u0641\u062d\u0647", -"Paste as text": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0645\u062a\u0646", -"Preview": "\u067e\u06cc\u0634 \u0646\u0645\u0627\u06cc\u0634", -"Print...": "\u0686\u0627\u067e...", -"Save": "\u0630\u062e\u06cc\u0631\u0647", -"Find": "\u062c\u0633\u062a\u062c\u0648", -"Replace with": "\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc \u0628\u0627", -"Replace": "\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc", -"Replace all": "\u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0647\u0645\u0647", -"Previous": "\u0642\u0628\u0644\u06cc", -"Next": "\u0628\u0639\u062f\u06cc", -"Find and replace...": "\u06cc\u0627\u0641\u062a\u0646 \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0631\u062f\u0646...", -"Could not find the specified string.": "\u0631\u0634\u062a\u0647\u0621 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u06cc\u0627\u0641\u062a \u0646\u06af\u0631\u062f\u06cc\u062f.", -"Match case": "\u062a\u0637\u0627\u0628\u0642 \u062d\u0631\u0648\u0641", -"Find whole words only": "\u06cc\u0627\u0641\u062a\u0646 \u062f\u0642\u06cc\u0642\u0627\u064b \u06a9\u0644 \u0648\u0627\u0698\u0647", -"Spell check": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627", -"Ignore": "\u0628\u06cc \u062e\u06cc\u0627\u0644", -"Ignore all": "\u0628\u06cc \u062e\u06cc\u0627\u0644 \u0647\u0645\u0647", -"Finish": "\u0627\u062a\u0645\u0627\u0645", -"Add to Dictionary": "\u0628\u0647 \u0648\u0627\u0698\u0647 \u0646\u0627\u0645\u0647 \u0628\u06cc \u0627\u0641\u0632\u0627", -"Insert table": "\u062f\u0631\u062c \u062c\u062f\u0648\u0644", -"Table properties": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062c\u062f\u0648\u0644", -"Delete table": "\u062d\u0630\u0641 \u062c\u062f\u0648\u0644", -"Cell": "\u0633\u0644\u0648\u0644", -"Row": "\u0633\u0637\u0631", -"Column": "\u0633\u062a\u0648\u0646", -"Cell properties": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0633\u0644\u0648\u0644", -"Merge cells": "\u067e\u06cc\u0648\u0646\u062f \u0633\u0644\u0648\u0644 \u0647\u0627", -"Split cell": "\u062c\u062f\u0627 \u0633\u0627\u0632\u06cc \u0633\u0644\u0648\u0644", -"Insert row before": "\u062f\u0631\u062c \u0633\u0637\u0631 \u062f\u0631 \u0628\u0627\u0644\u0627", -"Insert row after": "\u062f\u0631\u062c \u0633\u0637\u0631 \u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646", -"Delete row": "\u062d\u0630\u0641 \u0633\u0637\u0631", -"Row properties": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0633\u0637\u0631", -"Cut row": "\u0628\u0631\u0634 \u0633\u0637\u0631", -"Copy row": "\u0631\u0648\u0646\u0648\u06cc\u0633\u06cc \u0633\u0637\u0631", -"Paste row before": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0633\u0637\u0631 \u062f\u0631 \u0628\u0627\u0644\u0627", -"Paste row after": "\u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0633\u0637\u0631 \u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646", -"Insert column before": "\u062f\u0631\u062c \u0633\u062a\u0648\u0646 \u0642\u0628\u0644", -"Insert column after": "\u062f\u0631\u062c \u0633\u062a\u0648\u0646 \u0628\u0639\u062f", -"Delete column": "\u062d\u0630\u0641 \u0633\u062a\u0648\u0646", -"Cols": "\u0633\u062a\u0648\u0646 \u0647\u0627", -"Rows": "\u0633\u0637\u0631 \u0647\u0627", -"Width": "\u0639\u0631\u0636", -"Height": "\u0627\u0631\u062a\u0641\u0627\u0639", -"Cell spacing": "\u0641\u0627\u0635\u0644\u0647 \u0645\u06cc\u0627\u0646 \u0633\u0644\u0648\u0644\u06cc", -"Cell padding": "\u062d\u0627\u0634\u06cc\u0647 \u062f\u0631\u0648\u0646 \u0633\u0644\u0648\u0644\u06cc", -"Show caption": "\u0646\u0645\u0627\u06cc\u0634 \u0639\u0646\u0648\u0627\u0646", -"Left": "\u0686\u067e", -"Center": "\u0645\u06cc\u0627\u0646\u0647", -"Right": "\u0631\u0627\u0633\u062a", -"Cell type": "\u0646\u0648\u0639 \u0633\u0644\u0648\u0644", -"Scope": "\u062d\u0648\u0632\u0647", -"Alignment": "\u0647\u0645 \u062a\u0631\u0627\u0632\u06cc", -"H Align": "\u062a\u0631\u0627\u0632 \u0627\u0641\u0642\u06cc", -"V Align": "\u062a\u0631\u0627\u0632 \u0639\u0645\u0648\u062f\u06cc", -"Top": "\u0628\u0627\u0644\u0627", -"Middle": "\u0645\u06cc\u0627\u0646\u0647", -"Bottom": "\u067e\u0627\u06cc\u06cc\u0646", -"Header cell": "\u0633\u0644\u0648\u0644 \u0633\u0631 \u0633\u062a\u0648\u0646", -"Row group": "\u06af\u0631\u0648\u0647 \u0633\u0637\u0631\u06cc", -"Column group": "\u06af\u0631\u0648\u0647 \u0633\u062a\u0648\u0646\u06cc", -"Row type": "\u0646\u0648\u0639 \u0633\u0637\u0631", -"Header": "\u0633\u0631 \u0622\u0645\u062f", -"Body": "\u0628\u062f\u0646\u0647", -"Footer": "\u067e\u0627 \u0646\u0648\u0634\u062a", -"Border color": "\u0631\u0646\u06af \u0644\u0628\u0647", -"Insert template...": "\u062f\u0631\u062c \u0627\u0644\u06af\u0648...", -"Templates": "\u0627\u0644\u06af\u0648\u0647\u0627", -"Template": "\u0627\u0644\u06af\u0648", -"Text color": "\u0631\u0646\u06af \u0645\u062a\u0646", -"Background color": "\u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647", -"Custom...": "\u062f\u0644\u062e\u0648\u0627\u0647...", -"Custom color": "\u0631\u0646\u06af \u062f\u0644\u062e\u0648\u0627\u0647", -"No color": "\u0628\u062f\u0648\u0646 \u0631\u0646\u06af", -"Remove color": "\u062d\u0630\u0641 \u0631\u0646\u06af", -"Table of Contents": "\u0641\u0647\u0631\u0633\u062a \u0639\u0646\u0627\u0648\u06cc\u0646", -"Show blocks": "\u0646\u0645\u0627\u06cc\u0634 \u0628\u0644\u0648\u06a9 \u0647\u0627", -"Show invisible characters": "\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u06cc\u0633\u0647 \u0647\u0627\u06cc \u0646\u0627\u067e\u06cc\u062f\u0627", -"Word count": "\u062a\u0639\u062f\u0627\u062f \u0648\u0627\u0698\u0647\u200c\u0647\u0627", -"Words: {0}": "\u0648\u0627\u0698\u0647 \u0647\u0627: {0}", -"{0} words": "{0} \u0648\u0627\u0698\u0647", -"File": "\u067e\u0631\u0648\u0646\u062f\u0647", -"Edit": "\u0648\u06cc\u0631\u0627\u06cc\u0634", -"Insert": "\u062f\u0631\u062c", -"View": "\u0646\u0645\u0627\u06cc\u0634", -"Format": "\u0642\u0627\u0644\u0628", -"Table": "\u062c\u062f\u0648\u0644", -"Tools": "\u0627\u0628\u0632\u0627\u0631\u0647\u0627", -"Powered by {0}": "\u062a\u0648\u0627\u0646 \u06af\u0631\u0641\u062a\u0647 \u0627\u0632 {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0646\u0627\u062d\u06cc\u0647 \u0645\u062a\u0646 \u063a\u0646\u06cc.\n\u062c\u0647\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u0646\u0648 \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628\u06cc ALT + F9 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u0627\u06cc\u06cc\u062f.\n\u062c\u0647\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u0646\u0648\u0627\u0631 \u0627\u0628\u0632\u0627\u0631 \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628\u06cc ALT + F10 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u0627\u06cc\u06cc\u062f.\n\u062c\u0647\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u0631\u0627\u0647\u0646\u0645\u0627 \u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628\u06cc ALT + 0 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u0627\u06cc\u06cc\u062f.", -"Image title": "\u0639\u0646\u0648\u0627\u0646 \u062a\u0635\u0648\u06cc\u0631", -"Border width": "\u0639\u0631\u0636 \u062d\u0627\u0634\u06cc\u0647", -"Border style": "\u0633\u0628\u06a9 \u062d\u0627\u0634\u06cc\u0647", -"Error": "\u062e\u0637\u0627", -"Warn": "\u0647\u0634\u062f\u0627\u0631", -"Valid": "\u0645\u0639\u062a\u0628\u0631", -"To open the popup, press Shift+Enter": "\u062c\u0647\u062a \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648\u060c \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc Shift + Enter \u0631\u0627 \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f.", -"Rich Text Area. Press ALT-0 for help.": "\u0646\u0627\u062d\u06cc\u0647 \u0645\u062a\u0646 \u063a\u0646\u06cc. \u062c\u0647\u062a \u0645\u0634\u0627\u0647\u062f\u0647\u0654 \u0631\u0627\u0647\u0646\u0645\u0627 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc ALT + 0 \u0631\u0627 \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f.", -"System Font": "\u0641\u0648\u0646\u062a \u0633\u06cc\u0633\u062a\u0645\u06cc", -"Failed to upload image: {0}": "\u0639\u062f\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u062a\u0635\u0648\u06cc\u0631: {0}", -"Failed to load plugin: {0} from url {1}": "\u0639\u062f\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0627\u0641\u0632\u0648\u0646\u0647: {0} \u0627\u0632 \u0646\u0634\u0627\u0646\u06cc \u0648\u0628 {1}", -"Failed to load plugin url: {0}": "\u0639\u062f\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0646\u0634\u0627\u0646\u06cc \u0648\u0628 \u0627\u0641\u0632\u0648\u0646\u0647: {0}", -"Failed to initialize plugin: {0}": "\u0639\u062f\u0645 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0641\u0632\u0648\u0646\u0647: {0}", -"example": "\u0645\u062b\u0627\u0644", -"Search": "\u062c\u0633\u062a\u062c\u0648", -"All": "\u0647\u0645\u0647", -"Currency": "\u0627\u0631\u0632", -"Text": "\u0645\u062a\u0646", -"Quotations": "\u0646\u0642\u0644\u200c\u0642\u0648\u0644\u200c\u0647\u0627", -"Mathematical": "\u0631\u06cc\u0627\u0636\u06cc", -"Extended Latin": "\u0644\u0627\u062a\u06cc\u0646 \u06af\u0633\u062a\u0631\u062f\u0647", -"Symbols": "\u0646\u0645\u0627\u062f\u0647\u0627", -"Arrows": "\u067e\u06cc\u06a9\u0627\u0646\u200c\u0647\u0627", -"User Defined": "\u0628\u0647 \u062e\u0648\u0627\u0633\u062a \u06a9\u0627\u0631\u0628\u0631", -"dollar sign": "\u0646\u0645\u0627\u062f \u062f\u0644\u0627\u0631", -"currency sign": "\u0646\u0645\u0627\u062f \u0627\u0631\u0632", -"euro-currency sign": "\u0646\u0645\u0627\u062f \u06cc\u0648\u0631\u0648", -"colon sign": "\u0646\u0645\u0627\u062f \u062f\u0648\u0646\u0642\u0637\u0647", -"cruzeiro sign": "\u0646\u0645\u0627\u062f \u06a9\u0631\u0648\u0632\u06cc\u0631\u0648", -"french franc sign": "\u0646\u0645\u0627\u062f \u0641\u0631\u0627\u0646\u06a9 \u0641\u0631\u0627\u0646\u0633\u0647", -"lira sign": "\u0646\u0645\u0627\u062f \u0644\u06cc\u0631\u0647", -"mill sign": "\u0646\u0645\u0627\u062f \u0645\u06cc\u0644", -"naira sign": "\u0646\u0645\u0627\u062f \u0646\u0627\u06cc\u0631\u0627", -"peseta sign": "\u0646\u0645\u0627\u062f \u067e\u0632\u062a\u0627", -"rupee sign": "\u0646\u0645\u0627\u062f \u0631\u0648\u067e\u06cc\u0647", -"won sign": "\u0646\u0645\u0627\u062f \u0648\u0648\u0646", -"new sheqel sign": "\u0646\u0645\u0627\u062f \u0634\u06a9\u0644 \u062c\u062f\u06cc\u062f", -"dong sign": "\u0646\u0645\u0627\u062f \u062f\u0627\u0646\u06af", -"kip sign": "\u0646\u0645\u0627\u062f \u06a9\u06cc\u067e", -"tugrik sign": "\u0646\u0645\u0627\u062f \u062a\u0648\u06af\u0631\u0648\u06af", -"drachma sign": "\u0646\u0645\u0627\u062f \u062f\u0631\u0627\u062e\u0645\u0627", -"german penny symbol": "\u0646\u0645\u0627\u062f \u067e\u0646\u06cc \u0622\u0644\u0645\u0627\u0646\u06cc", -"peso sign": "\u0646\u0645\u0627\u062f \u067e\u0632\u0648", -"guarani sign": "\u0646\u0645\u0627\u062f \u06af\u0648\u0627\u0631\u0627\u0646\u06cc", -"austral sign": "\u0646\u0645\u0627\u062f \u0622\u0633\u062a\u0631\u0627\u0644", -"hryvnia sign": "\u0646\u0645\u0627\u062f \u06af\u0631\u06cc\u0648\u0646\u0627", -"cedi sign": "\u0646\u0645\u0627\u062f \u0633\u062f\u06cc", -"livre tournois sign": "\u0646\u0645\u0627\u062f \u0644\u06cc\u0648\u0631\u0647 \u062a\u0648\u0631\u0646\u0648\u0627", -"spesmilo sign": "\u0646\u0645\u0627\u062f \u0627\u0633\u067e\u0633\u0645\u06cc\u0644\u0648", -"tenge sign": "\u0646\u0645\u0627\u062f \u062a\u0646\u06af\u0647", -"indian rupee sign": "\u0646\u0645\u0627\u062f \u0631\u0648\u067e\u06cc\u0647 \u0647\u0646\u062f\u06cc", -"turkish lira sign": "\u0646\u0645\u0627\u062f \u0644\u06cc\u0631\u0647 \u062a\u0631\u06a9\u06cc", -"nordic mark sign": "\u0646\u0645\u0627\u062f \u0645\u0627\u0631\u06a9 \u0646\u0631\u0648\u0698", -"manat sign": "\u0646\u0645\u0627\u062f \u0645\u0646\u0627\u062a", -"ruble sign": "\u0646\u0645\u0627\u062f \u0631\u0648\u0628\u0644", -"yen character": "\u0646\u0648\u06cc\u0633\u0647 \u06cc\u0646", -"yuan character": "\u0646\u0648\u06cc\u0633\u0647 \u06cc\u0648\u0627\u0646", -"yuan character, in hong kong and taiwan": "\u0646\u0648\u06cc\u0633\u0647 \u06cc\u0648\u0627\u0646\u060c \u062f\u0631 \u0647\u0646\u06af\u200c\u06a9\u0646\u06af \u0648 \u062a\u0627\u06cc\u0648\u0627\u0646", -"yen\/yuan character variant one": "\u0646\u0648\u06cc\u0633\u0647 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06cc\u0646\/\u06cc\u0648\u0627\u0646", -"Loading emoticons...": "\u062f\u0631 \u062d\u0627\u0644 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0634\u06a9\u0644\u06a9\u200c\u0647\u0627...", -"Could not load emoticons": "\u0634\u06a9\u0644\u06a9\u200c\u0647\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0646\u0634\u062f\u0646\u062f", -"People": "\u0627\u0641\u0631\u0627\u062f", -"Animals and Nature": "\u062d\u06cc\u0648\u0627\u0646\u0627\u062a \u0648 \u0637\u0628\u06cc\u0639\u062a", -"Food and Drink": "\u063a\u0630\u0627 \u0648 \u0646\u0648\u0634\u06cc\u062f\u0646\u06cc", -"Activity": "\u0641\u0639\u0627\u0644\u06cc\u062a", -"Travel and Places": "\u0633\u0641\u0631 \u0648 \u0627\u0645\u0627\u06a9\u0646", -"Objects": "\u0627\u0634\u06cc\u0627", -"Flags": "\u067e\u0631\u0686\u0645\u200c\u0647\u0627", -"Characters": "\u0646\u0648\u06cc\u0633\u0647\u200c\u0647\u0627", -"Characters (no spaces)": "\u0646\u0648\u06cc\u0633\u0647 \u0647\u0627 (\u0628\u062f\u0648\u0646 \u0641\u0627\u0635\u0644\u0647)", -"Error: Form submit field collision.": "\u062e\u0637\u0627: \u062a\u062f\u0627\u062e\u0644 \u062f\u0631 \u062b\u0628\u062a \u0641\u0631\u0645.", -"Error: No form element found.": "\u062e\u0637\u0627: \u0647\u06cc\u0686 \u0627\u0644\u0645\u0627\u0646 \u0641\u0631\u0645\u06cc \u06cc\u0627\u0641\u062a \u0646\u0634\u062f.", -"Update": "\u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc", -"Color swatch": "\u0646\u0645\u0648\u0646\u0647 \u0631\u0646\u06af", -"Turquoise": "\u0641\u06cc\u0631\u0648\u0632\u0647\u200c\u0627\u06cc", -"Green": "\u0633\u0628\u0632", -"Blue": "\u0622\u0628\u06cc", -"Purple": "\u0628\u0646\u0641\u0634", -"Navy Blue": "\u0633\u0631\u0645\u0647\u200c\u0627\u06cc", -"Dark Turquoise": "\u0641\u06cc\u0631\u0648\u0632\u0647\u200c\u0627\u06cc \u062a\u06cc\u0631\u0647", -"Dark Green": "\u0633\u0628\u0632 \u062a\u06cc\u0631\u0647", -"Medium Blue": "\u0622\u0628\u06cc \u0633\u06cc\u0631", -"Medium Purple": "\u0622\u0628\u06cc \u0628\u0646\u0641\u0634", -"Midnight Blue": "\u0622\u0628\u06cc \u0646\u0641\u062a\u06cc", -"Yellow": "\u0632\u0631\u062f", -"Orange": "\u0646\u0627\u0631\u0646\u062c\u06cc", -"Red": "\u0642\u0631\u0645\u0632", -"Light Gray": "\u062e\u0627\u06a9\u0633\u062a\u0631\u06cc \u0631\u0648\u0634\u0646", -"Gray": "\u062e\u0627\u06a9\u0633\u062a\u0631\u06cc", -"Dark Yellow": "\u0632\u0631\u062f \u062a\u06cc\u0631\u0647", -"Dark Orange": "\u0646\u0627\u0631\u0646\u062c\u06cc \u062a\u06cc\u0631\u0647", -"Dark Red": "\u0642\u0631\u0645\u0632 \u062a\u06cc\u0631\u0647", -"Medium Gray": "\u062e\u0627\u06a9\u0633\u062a\u0631\u06cc \u0646\u06cc\u0645\u0647\u200c\u0631\u0648\u0634\u0646", -"Dark Gray": "\u062e\u0627\u06a9\u0633\u062a\u0631\u06cc \u062a\u06cc\u0631\u0647", -"Black": "\u0633\u06cc\u0627\u0647", -"White": "\u0633\u0641\u06cc\u062f", -"Switch to or from fullscreen mode": "\u062a\u063a\u06cc\u06cc\u0631 \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645\u200c\u0635\u0641\u062d\u0647 \u06cc\u0627 \u0628\u0647 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645\u200c\u0635\u0641\u062d\u0647", -"Open help dialog": "\u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06a9\u0627\u062f\u0631 \u0631\u0627\u0647\u0646\u0645\u0627", -"history": "\u062a\u0627\u0631\u06cc\u062e\u0686\u0647", -"styles": "\u0633\u0628\u06a9\u200c\u0647\u0627", -"formatting": "\u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc", -"alignment": "\u062a\u0631\u0627\u0632\u0628\u0646\u062f\u06cc", -"indentation": "\u062a\u0648\u0631\u0641\u062a\u06af\u06cc", -"permanent pen": "\u0642\u0644\u0645 \u062f\u0627\u0626\u0645\u06cc", -"comments": "\u0646\u0638\u0631\u0627\u062a", -"Anchor": "\u0642\u0644\u0627\u0628", -"Special character": "\u0646\u0648\u06cc\u0633\u0647 \u0647\u0627\u06cc \u062e\u0627\u0635", -"Code sample": "\u0646\u0645\u0648\u0646\u0647 \u06a9\u064f\u062f", -"Color": "\u0631\u0646\u06af", -"Emoticons": "\u0635\u0648\u0631\u062a\u06a9 \u0647\u0627", -"Document properties": "\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0633\u0646\u062f", -"Image": "\u062a\u0635\u0648\u06cc\u0631", -"Insert link": "\u062f\u0631\u062c \u067e\u06cc\u0648\u0646\u062f", -"Target": "\u0645\u0642\u0635\u062f", -"Link": "\u067e\u06cc\u0648\u0646\u062f", -"Poster": "\u067e\u0648\u0633\u062a\u0631", -"Media": "\u0631\u0633\u0627\u0646\u0647", -"Print": "\u0686\u0627\u067e", -"Prev": "\u0642\u0628\u0644\u06cc", -"Find and replace": "\u062c\u0633\u062a\u062c\u0648 \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc", -"Whole words": "\u062a\u0645\u0627\u0645 \u0648\u0627\u0698\u06af\u0627\u0646", -"Spellcheck": "\u0628\u0631\u0631\u0633\u06cc \u0627\u0645\u0644\u0627\u0621", -"Caption": "\u0639\u0646\u0648\u0627\u0646", -"Insert template": "\u062f\u0631\u062c \u0627\u0644\u06af\u0648", -"_dir": "rtl" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/fr_FR.js b/cps/static/js/libs/tinymce/langs/fr_FR.js index 67c6e21ed..3126171f9 100644 --- a/cps/static/js/libs/tinymce/langs/fr_FR.js +++ b/cps/static/js/libs/tinymce/langs/fr_FR.js @@ -85,6 +85,7 @@ tinymce.addI18n('fr_FR',{ "B": "B", "Left to right": "Gauche \u00e0 droite", "Right to left": "Droite \u00e0 gauche", +"Emoticons": "Emotic\u00f4nes", "Emoticons...": "\u00c9motic\u00f4nes...", "Metadata and Document Properties": "M\u00e9tadonn\u00e9es et propri\u00e9t\u00e9s du document", "Title": "Titre", @@ -113,7 +114,9 @@ tinymce.addI18n('fr_FR',{ "Handy Shortcuts": "Raccourcis utiles", "Horizontal line": "Ligne horizontale", "Insert\/edit image": "Ins\u00e9rer\/modifier une image", -"Image description": "Description de l'image", +"Alternative description": "Description alternative", +"Accessibility": "Accessibilit\u00e9", +"Image is decorative": "L'image est d\u00e9corative", "Source": "Source", "Dimensions": "Dimensions", "Constrain proportions": "Conserver les proportions", @@ -147,7 +150,6 @@ tinymce.addI18n('fr_FR',{ "Back": "Retour", "Insert date\/time": "Ins\u00e9rer date\/heure", "Date\/time": "Date\/heure", -"Insert\/Edit Link": "Ins\u00e9rer\/Modifier lien", "Insert\/edit link": "Ins\u00e9rer\/modifier un lien", "Text to display": "Texte \u00e0 afficher", "Url": "Url", @@ -155,12 +157,14 @@ tinymce.addI18n('fr_FR',{ "Current window": "Fen\u00eatre active", "None": "n\/a", "New window": "Nouvelle fen\u00eatre", +"Open link": "Ouvrir le lien", "Remove link": "Enlever le lien", "Anchors": "Ancres", "Link...": "Lien...", "Paste or type a link": "Coller ou taper un lien", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre une adresse e-mail. Voulez-vous ajouter le pr\u00e9fixe mailto: n\u00e9cessaire?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe http:\/\/ n\u00e9cessaire?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "L'URL que vous avez saisie semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe https:\/\/ requis\u00a0?", "Link list": "Liste de liens", "Insert video": "Ins\u00e9rer une vid\u00e9o", "Insert\/edit video": "Ins\u00e9rer\/modifier une vid\u00e9o", @@ -183,11 +187,15 @@ tinymce.addI18n('fr_FR',{ "Replace all": "Tout remplacer", "Previous": "Pr\u00e9c\u00e9dente", "Next": "Suiv", +"Find and Replace": "Trouver et remplacer", "Find and replace...": "Trouver et remplacer...", "Could not find the specified string.": "Impossible de trouver la cha\u00eene sp\u00e9cifi\u00e9e.", "Match case": "Respecter la casse", "Find whole words only": "Mot entier", -"Spell check": "V\u00e9rification de l'orthographe", +"Find in selection": "Trouver dans la s\u00e9lection", +"Spellcheck": "V\u00e9rification orthographique", +"Spellcheck Language": "Langue du correcteur orthographique", +"No misspellings found.": "Aucune faute d'orthographe trouv\u00e9e.", "Ignore": "Ignorer", "Ignore all": "Tout ignorer", "Finish": "Finie", @@ -218,6 +226,7 @@ tinymce.addI18n('fr_FR',{ "Height": "Hauteur", "Cell spacing": "Espacement inter-cellulles", "Cell padding": "Espacement interne cellule", +"Caption": "Titre", "Show caption": "Afficher le sous-titrage", "Left": "Gauche", "Center": "Centr\u00e9", @@ -377,7 +386,21 @@ tinymce.addI18n('fr_FR',{ "formatting": "mise en forme", "alignment": "alignement", "indentation": "retrait", -"permanent pen": "feutre ind\u00e9l\u00e9bile", +"Font": "Police", +"Size": "Taille", +"More...": "Plus...", +"Select...": "S\u00e9lectionner...", +"Preferences": "Pr\u00e9f\u00e9rences", +"Yes": "Oui", +"No": "Non", +"Keyboard Navigation": "Navigation au clavier", +"Version": "Version", +"Code view": "Affichage du code", +"Open popup menu for split buttons": "Ouvrir le menu contextuel pour les boutons partag\u00e9s", +"List Properties": "Propri\u00e9t\u00e9s de la liste", +"List properties...": "Lister les propri\u00e9t\u00e9s...", +"Start list at number": "Liste de d\u00e9part au num\u00e9ro", +"Line height": "Hauteur de la ligne", "comments": "commentaires", "Format Painter": "Reproduire la mise en forme", "Insert\/edit iframe": "Ins\u00e9rer\/modifier iframe", @@ -385,24 +408,46 @@ tinymce.addI18n('fr_FR',{ "lowercase": "minuscule", "UPPERCASE": "MAJUSCULE", "Title Case": "Casse du titre", +"permanent pen": "feutre ind\u00e9l\u00e9bile", "Permanent Pen Properties": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile", "Permanent pen properties...": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile...", -"Font": "Police", -"Size": "Taille", -"More...": "Plus...", -"Spellcheck Language": "Langue du correcteur orthographique", -"Select...": "S\u00e9lectionner...", -"Preferences": "Pr\u00e9f\u00e9rences", -"Yes": "Oui", -"No": "Non", -"Keyboard Navigation": "Navigation au clavier", -"Version": "Version", +"case change": "changement de cas", +"page embed": "int\u00e9gration de page", +"Advanced sort...": "Tri avanc\u00e9...", +"Advanced Sort": "Tri avanc\u00e9", +"Sort table by column ascending": "Trier le tableau par colonne ascendante", +"Sort table by column descending": "Trier le tableau par colonne en ordre d\u00e9croissant", +"Sort": "Sorte", +"Order": "Ordre", +"Sort by": "Trier par", +"Ascending": "Ascendant", +"Descending": "Descendant", +"Column {0}": "Colonne {0}", +"Row {0}": "Ligne {0}", +"Spellcheck...": "V\u00e9rification orthographique...", +"Misspelled word": "Mot mal orthographi\u00e9", +"Suggestions": "Suggestions", +"Change": "Changement", +"Finding word suggestions": "Trouver des suggestions de mots", +"Success": "Succ\u00e8s", +"Repair": "R\u00e9paration", +"Issue {0} of {1}": " {0} Erreur sur {1}", +"Images must be marked as decorative or have an alternative text description": "Les images doivent \u00eatre marqu\u00e9es comme d\u00e9coratives ou avoir une description textuelle alternative", +"Images must have an alternative text description. Decorative images are not allowed.": "Les images doivent avoir une description textuelle alternative. Les images d\u00e9coratives ne sont pas autoris\u00e9es.", +"Or provide alternative text:": "Ou fournissez un texte alternatif\u00a0:", +"Make image decorative:": "Rendre l'image d\u00e9corative\u00a0:", +"ID attribute must be unique": "L'attribut ID doit \u00eatre unique", +"Make ID unique": "Rendre l'identifiant unique", +"Keep this ID and remove all others": "Conservez cet identifiant et supprimez tous les autres", +"Remove this ID": "Supprimer cet identifiant", +"Remove all IDs": "Supprimer tous les identifiants", +"Checklist": "Liste de contr\u00f4le", "Anchor": "Ancre", "Special character": "Caract\u00e8res sp\u00e9ciaux", "Code sample": "Extrait de code", "Color": "Couleur", -"Emoticons": "Emotic\u00f4nes", "Document properties": "Propri\u00e9t\u00e9 du document", +"Image description": "Description de l'image", "Image": "Image", "Insert link": "Ins\u00e9rer un lien", "Target": "Cible", @@ -413,7 +458,5 @@ tinymce.addI18n('fr_FR',{ "Prev": "Pr\u00e9c ", "Find and replace": "Trouver et remplacer", "Whole words": "Mots entiers", -"Spellcheck": "V\u00e9rification orthographique", -"Caption": "Titre", "Insert template": "Ajouter un th\u00e8me" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/he_IL.js b/cps/static/js/libs/tinymce/langs/he_IL.js deleted file mode 100644 index c16c51ad6..000000000 --- a/cps/static/js/libs/tinymce/langs/he_IL.js +++ /dev/null @@ -1,420 +0,0 @@ -tinymce.addI18n('he_IL',{ -"Redo": "\u05d1\u05e6\u05e2 \u05e9\u05d5\u05d1", -"Undo": "\u05d1\u05d8\u05dc", -"Cut": "\u05d2\u05d6\u05d5\u05e8", -"Copy": "\u05d4\u05e2\u05ea\u05e7", -"Paste": "\u05d4\u05d3\u05d1\u05e7", -"Select all": "\u05d1\u05d7\u05e8 \u05d4\u05db\u05dc", -"New document": "\u05de\u05e1\u05de\u05da \u05d7\u05d3\u05e9", -"Ok": "\u05d0\u05d9\u05e9\u05d5\u05e8", -"Cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", -"Visual aids": "\u05e2\u05d6\u05e8\u05d9\u05dd \u05d7\u05d6\u05d5\u05ea\u05d9\u05d9\u05dd", -"Bold": "\u05de\u05d5\u05d3\u05d2\u05e9", -"Italic": "\u05e0\u05d8\u05d5\u05d9", -"Underline": "\u05e7\u05d5 \u05ea\u05d7\u05ea\u05d5\u05df", -"Strikethrough": "\u05e7\u05d5 \u05d7\u05d5\u05e6\u05d4", -"Superscript": "\u05db\u05ea\u05d1 \u05e2\u05d9\u05dc\u05d9", -"Subscript": "\u05db\u05ea\u05d1 \u05ea\u05d7\u05ea\u05d9", -"Clear formatting": "\u05e0\u05e7\u05d4 \u05e2\u05d9\u05e6\u05d5\u05d1", -"Align left": "\u05d9\u05e9\u05e8 \u05dc\u05e9\u05de\u05d0\u05dc", -"Align center": "\u05de\u05e8\u05db\u05d6", -"Align right": "\u05d9\u05e9\u05e8 \u05dc\u05d9\u05de\u05d9\u05df", -"Justify": "\u05d9\u05d9\u05e9\u05e8", -"Bullet list": "\u05e8\u05e9\u05d9\u05de\u05ea \u05ea\u05d1\u05dc\u05d9\u05d8\u05d9\u05dd", -"Numbered list": "\u05e8\u05e9\u05d9\u05de\u05d4 \u05de\u05de\u05d5\u05e1\u05e4\u05e8\u05ea", -"Decrease indent": "\u05d4\u05e7\u05d8\u05df \u05d4\u05d6\u05d7\u05d4", -"Increase indent": "\u05d4\u05d2\u05d3\u05dc \u05d4\u05d6\u05d7\u05d4", -"Close": "\u05e1\u05d2\u05d5\u05e8", -"Formats": "\u05e2\u05d9\u05e6\u05d5\u05d1\u05d9\u05dd", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da \u05d0\u05d9\u05e0\u05d5 \u05de\u05d0\u05e4\u05e9\u05e8 \u05d2\u05d9\u05e9\u05d4 \u05d9\u05e9\u05d9\u05e8\u05d4 \u05dc\u05dc\u05d5\u05d7. \u05d0\u05e0\u05d0 \u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e7\u05d9\u05e6\u05d5\u05e8\u05d9 \u05d4\u05de\u05e7\u05dc\u05d3\u05ea Ctrl+X\/C\/V \u05d1\u05de\u05e7\u05d5\u05dd.", -"Headers": "\u05db\u05d5\u05ea\u05e8\u05d5\u05ea", -"Header 1": "\u05db\u05d5\u05ea\u05e8\u05ea 1", -"Header 2": "\u05db\u05d5\u05ea\u05e8\u05ea 2", -"Header 3": "\u05db\u05d5\u05ea\u05e8\u05ea 3", -"Header 4": "\u05db\u05d5\u05ea\u05e8\u05ea 4", -"Header 5": "\u05db\u05d5\u05ea\u05e8\u05ea 5", -"Header 6": "\u05db\u05d5\u05ea\u05e8\u05ea 6", -"Headings": "\u05db\u05d5\u05ea\u05e8\u05d5\u05ea", -"Heading 1": "\u05db\u05d5\u05ea\u05e8\u05ea 1", -"Heading 2": "\u05db\u05d5\u05ea\u05e8\u05ea 2", -"Heading 3": "\u05db\u05d5\u05ea\u05e8\u05ea 3", -"Heading 4": "\u05db\u05d5\u05ea\u05e8\u05ea 4", -"Heading 5": "\u05db\u05d5\u05ea\u05e8\u05ea 5", -"Heading 6": "\u05db\u05d5\u05ea\u05e8\u05ea 6", -"Preformatted": "\u05de\u05e2\u05d5\u05e6\u05d1 \u05de\u05e8\u05d0\u05e9", -"Div": "Div", -"Pre": "Pre", -"Code": "\u05e7\u05d5\u05d3", -"Paragraph": "\u05e4\u05e1\u05e7\u05d4", -"Blockquote": "Blockquote", -"Inline": "\u05d1\u05ea\u05d5\u05da \u05e9\u05d5\u05e8\u05d4", -"Blocks": "\u05d1\u05dc\u05d5\u05e7\u05d9\u05dd", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u05d4\u05d3\u05d1\u05e7\u05d4 \u05d1\u05de\u05e6\u05d1 \u05d8\u05e7\u05e1\u05d8 \u05e8\u05d2\u05d9\u05dc. \u05ea\u05db\u05e0\u05d9\u05dd \u05d9\u05d5\u05d3\u05d1\u05e7\u05d5 \u05de\u05e2\u05ea\u05d4 \u05db\u05d8\u05e7\u05e1\u05d8 \u05e8\u05d2\u05d9\u05dc \u05e2\u05d3 \u05e9\u05ea\u05db\u05d1\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea \u05d6\u05d5.", -"Fonts": "\u05d2\u05d5\u05e4\u05e0\u05d9\u05dd", -"Font Sizes": "\u05d2\u05d5\u05d3\u05dc \u05d2\u05d5\u05e4\u05e0\u05d9\u05dd", -"Class": "\u05de\u05d7\u05dc\u05e7\u05d4", -"Browse for an image": "\u05d7\u05e4\u05e9 \u05ea\u05de\u05d5\u05e0\u05d4", -"OR": "OR", -"Drop an image here": "\u05e9\u05d7\u05e8\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05db\u05d0\u05df", -"Upload": "\u05d4\u05e2\u05dc\u05d4", -"Block": "\u05d1\u05dc\u05d5\u05e7", -"Align": "\u05d9\u05e9\u05e8", -"Default": "\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc", -"Circle": "\u05e2\u05d9\u05d2\u05d5\u05dc", -"Disc": "\u05d7\u05d9\u05e9\u05d5\u05e7", -"Square": "\u05e8\u05d9\u05d1\u05d5\u05e2", -"Lower Alpha": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05d5\u05ea \u05e7\u05d8\u05e0\u05d5\u05ea", -"Lower Greek": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05d9\u05d5\u05d5\u05e0\u05d9\u05d5\u05ea \u05e7\u05d8\u05e0\u05d5\u05ea", -"Lower Roman": "\u05e1\u05e4\u05e8\u05d5\u05ea \u05e8\u05d5\u05de\u05d9\u05d5\u05ea \u05e7\u05d8\u05e0\u05d5\u05ea", -"Upper Alpha": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05d0\u05e0\u05d2\u05dc\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc\u05d5\u05ea", -"Upper Roman": "\u05e1\u05e4\u05e8\u05d5\u05ea \u05e8\u05d5\u05de\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc\u05d5\u05ea", -"Anchor...": "\u05e2\u05d5\u05d2\u05df...", -"Name": "\u05e9\u05dd", -"Id": "\u05de\u05d6\u05d4\u05d4", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u05d4\u05de\u05d6\u05d4\u05d4 \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05d1\u05d0\u05d5\u05ea \u05d5\u05dc\u05d0\u05d7\u05e8\u05d9\u05d4 \u05e8\u05e7 \u05d0\u05d5\u05ea\u05d9\u05d5\u05ea, \u05de\u05e1\u05e4\u05e8\u05d9\u05dd, \u05de\u05e7\u05e4\u05d9\u05dd, \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea, \u05e0\u05e7\u05d5\u05d3\u05ea\u05d9\u05d9\u05dd \u05d0\u05d5 \u05e7\u05d5\u05d5\u05d9\u05dd \u05ea\u05d7\u05ea\u05d9\u05d9\u05dd.", -"You have unsaved changes are you sure you want to navigate away?": "\u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05dc\u05d0 \u05e0\u05e9\u05de\u05e8\u05d5. \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e6\u05d0\u05ea \u05de\u05d4\u05d3\u05e3?", -"Restore last draft": "\u05e9\u05d7\u05d6\u05e8 \u05d8\u05d9\u05d5\u05d8\u05d4 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d4", -"Special character...": "\u05ea\u05d5\u05d5\u05d9\u05dd \u05de\u05d9\u05d5\u05d7\u05d3\u05d9\u05dd...", -"Source code": "\u05e7\u05d5\u05d3 \u05de\u05e7\u05d5\u05e8", -"Insert\/Edit code sample": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05d3\u05d5\u05d2\u05de\u05ea \u05e7\u05d5\u05d3", -"Language": "\u05e9\u05e4\u05d4", -"Code sample...": "\u05d3\u05d5\u05d2\u05de\u05ea \u05e7\u05d5\u05d3...", -"Color Picker": "\u05d1\u05d5\u05e8\u05e8 \u05e6\u05d1\u05e2\u05d9\u05dd", -"R": "\u05d0'", -"G": "\u05d9'", -"B": "\u05db'", -"Left to right": "\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df", -"Right to left": "\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc", -"Emoticons...": "\u05e1\u05de\u05dc\u05d9 \u05d4\u05d1\u05e2\u05d4...", -"Metadata and Document Properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05de\u05d8\u05d4-\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d5\u05de\u05e1\u05de\u05da", -"Title": "\u05db\u05d5\u05ea\u05e8\u05ea", -"Keywords": "\u05de\u05d9\u05dc\u05d5\u05ea \u05de\u05e4\u05ea\u05d7", -"Description": "\u05ea\u05d9\u05d0\u05d5\u05e8", -"Robots": "\u05e8\u05d5\u05d1\u05d5\u05d8\u05d9\u05dd", -"Author": "\u05de\u05d7\u05d1\u05e8", -"Encoding": "\u05e7\u05d9\u05d3\u05d5\u05d3", -"Fullscreen": "\u05de\u05e1\u05da \u05de\u05dc\u05d0", -"Action": "\u05e4\u05e2\u05d5\u05dc\u05d4", -"Shortcut": "\u05e7\u05d9\u05e6\u05d5\u05e8", -"Help": "\u05e2\u05d6\u05e8\u05d4", -"Address": "\u05db\u05ea\u05d5\u05d1\u05ea", -"Focus to menubar": "\u05d4\u05e2\u05d1\u05e8 \u05de\u05d9\u05e7\u05d5\u05d3 \u05dc\u05e1\u05e8\u05d2\u05dc \u05d4\u05ea\u05e4\u05e8\u05d8\u05d9\u05dd", -"Focus to toolbar": "\u05d4\u05e2\u05d1\u05e8 \u05de\u05d9\u05e7\u05d5\u05d3 \u05dc\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd", -"Focus to element path": "\u05e2\u05d1\u05e8 \u05de\u05d9\u05e7\u05d5\u05d3 \u05dc\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05e4\u05e8\u05d9\u05d8", -"Focus to contextual toolbar": "\u05d4\u05e2\u05d1\u05e8 \u05de\u05d9\u05e7\u05d5\u05d3 \u05dc\u05e1\u05e8\u05d2\u05dc \u05ea\u05d5\u05db\u05df", -"Insert link (if link plugin activated)": "\u05d4\u05db\u05e0\u05e1 \u05e7\u05d9\u05e9\u05d5\u05e8 (\u05d0\u05dd \u05ea\u05d5\u05e1\u05e3 \"\u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd\" \u05e4\u05e2\u05d9\u05dc)", -"Save (if save plugin activated)": "\u05e9\u05de\u05d5\u05e8 (\u05d0\u05dd \u05ea\u05d5\u05e1\u05e3 \"\u05e9\u05de\u05d9\u05e8\u05d4\" \u05e4\u05e2\u05d9\u05dc)", -"Find (if searchreplace plugin activated)": "\u05d7\u05e4\u05e9 (\u05d0\u05dd \u05ea\u05d5\u05e1\u05e3 \"\u05d7\u05e4\u05e9 \u05d5\u05d4\u05d7\u05dc\u05e3\" \u05e4\u05e2\u05d9\u05dc)", -"Plugins installed ({0}):": "\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05de\u05d5\u05ea\u05e7\u05e0\u05d9\u05dd ({0}):", -"Premium plugins:": "\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05d1\u05ea\u05e9\u05dc\u05d5\u05dd:", -"Learn more...": "\u05dc\u05de\u05d3 \u05e2\u05d5\u05d3...", -"You are using {0}": "\u05d0\u05ea\\\u05d4 \u05de\u05e9\u05ea\u05de\u05e9\\\u05ea {0}", -"Plugins": "\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd", -"Handy Shortcuts": "\u05e7\u05d9\u05e6\u05d5\u05e8\u05d9\u05dd \u05e9\u05d9\u05de\u05d5\u05e9\u05d9\u05d9\u05dd", -"Horizontal line": "\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9", -"Insert\/edit image": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05ea\u05de\u05d5\u05e0\u05d4", -"Image description": "\u05ea\u05d9\u05d0\u05d5\u05e8 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4", -"Source": "\u05de\u05e7\u05d5\u05e8", -"Dimensions": "\u05de\u05d9\u05de\u05d3\u05d9\u05dd", -"Constrain proportions": "\u05d4\u05d2\u05d1\u05dc\u05ea \u05e4\u05e8\u05d5\u05e4\u05d5\u05e8\u05e6\u05d9\u05d5\u05ea", -"General": "\u05db\u05dc\u05dc\u05d9", -"Advanced": "\u05de\u05ea\u05e7\u05d3\u05dd", -"Style": "\u05e1\u05d2\u05e0\u05d5\u05df", -"Vertical space": "\u05de\u05e8\u05d5\u05d5\u05d7 \u05d0\u05e0\u05db\u05d9", -"Horizontal space": "\u05de\u05e8\u05d5\u05d5\u05d7 \u05d0\u05d5\u05e4\u05e7\u05d9", -"Border": "\u05de\u05e1\u05d2\u05e8\u05ea", -"Insert image": "\u05d4\u05db\u05e0\u05e1 \u05ea\u05de\u05d5\u05e0\u05d4", -"Image...": "\u05ea\u05de\u05d5\u05e0\u05d4...", -"Image list": "\u05e8\u05e9\u05d9\u05de\u05ea \u05ea\u05de\u05d5\u05e0\u05d5\u05ea", -"Rotate counterclockwise": "\u05e1\u05d5\u05d1\u05d1 \u05d1\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05e4\u05d5\u05da \u05dc\u05e9\u05e2\u05d5\u05df", -"Rotate clockwise": "\u05e1\u05d5\u05d1\u05d1 \u05d1\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05e9\u05e2\u05d5\u05df", -"Flip vertically": "\u05d4\u05e4\u05d5\u05da \u05d0\u05e0\u05db\u05d9\u05ea", -"Flip horizontally": "\u05d4\u05e4\u05d5\u05da \u05d0\u05d5\u05e4\u05e7\u05d9\u05ea", -"Edit image": "\u05e2\u05e8\u05d5\u05da \u05ea\u05de\u05d5\u05e0\u05d4", -"Image options": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05ea\u05de\u05d5\u05e0\u05d4", -"Zoom in": "\u05d4\u05d2\u05d3\u05dc \u05ea\u05e6\u05d5\u05d2\u05d4", -"Zoom out": "\u05d4\u05e7\u05d8\u05df \u05ea\u05e6\u05d5\u05d2\u05d4", -"Crop": "\u05e7\u05e6\u05e5", -"Resize": "\u05e9\u05e0\u05d4 \u05d2\u05d5\u05d3\u05dc", -"Orientation": "\u05db\u05d9\u05d5\u05d5\u05df \u05dc\u05d0\u05d5\u05e8\u05da \/ \u05dc\u05e8\u05d5\u05d7\u05d1", -"Brightness": "\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea", -"Sharpen": "\u05d7\u05d3\u05d3", -"Contrast": "\u05e0\u05d9\u05d2\u05d5\u05d3\u05d9\u05d5\u05ea", -"Color levels": "\u05e8\u05de\u05d5\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd", -"Gamma": "\u05d2\u05d0\u05de\u05d4", -"Invert": "\u05d4\u05d9\u05e4\u05d5\u05da \u05e6\u05d1\u05e2\u05d9\u05dd", -"Apply": "\u05d9\u05d9\u05e9\u05dd", -"Back": "\u05d7\u05d6\u05d5\u05e8", -"Insert date\/time": "\u05d4\u05db\u05e0\u05e1 \u05ea\u05d0\u05e8\u05d9\u05da\/\u05e9\u05e2\u05d4", -"Date\/time": "\u05ea\u05d0\u05e8\u05d9\u05da\/\u05e9\u05e2\u05d4", -"Insert\/Edit Link": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05e7\u05d9\u05e9\u05d5\u05e8", -"Insert\/edit link": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05e7\u05d9\u05e9\u05d5\u05e8", -"Text to display": "\u05d8\u05e7\u05e1\u05d8 \u05dc\u05d4\u05e6\u05d2\u05d4", -"Url": "\u05db\u05ea\u05d5\u05d1\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8", -"Open link in...": "\u05e4\u05ea\u05d7 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d1...", -"Current window": "\u05d7\u05dc\u05d5\u05df \u05e0\u05d5\u05db\u05d7\u05d9", -"None": "\u05dc\u05dc\u05d0", -"New window": "\u05d7\u05dc\u05d5\u05df \u05d7\u05d3\u05e9", -"Remove link": "\u05de\u05d7\u05e7 \u05e7\u05d9\u05e9\u05d5\u05e8", -"Anchors": "\u05e2\u05d5\u05d2\u05e0\u05d9\u05dd", -"Link...": "\u05e7\u05d9\u05e9\u05d5\u05e8...", -"Paste or type a link": "\u05d4\u05d3\u05d1\u05e7 \u05d0\u05d5 \u05d4\u05e7\u05dc\u05d3 \u05e7\u05d9\u05e9\u05d5\u05e8", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u05e0\u05e8\u05d0\u05d4 \u05e9\u05d4\u05db\u05ea\u05d5\u05d1\u05ea \u05e9\u05d4\u05db\u05e0\u05e1\u05ea \u05d4\u05d9\u05d0 \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05d0\u05ea \u05d4\u05e7\u05d9\u05d3\u05d5\u05de\u05ea :mailto?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u05e0\u05e8\u05d0\u05d4 \u05e9\u05d4\u05db\u05ea\u05d5\u05d1\u05ea \u05e9\u05d4\u05db\u05e0\u05e1\u05ea \u05d4\u05d9\u05d0 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05e7\u05d9\u05d3\u05d5\u05de\u05ea http:\/\/?", -"Link list": "\u05e8\u05e9\u05d9\u05de\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd", -"Insert video": "\u05d4\u05db\u05e0\u05e1 \u05e1\u05e8\u05d8\u05d5\u05df", -"Insert\/edit video": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05e1\u05e8\u05d8\u05d5\u05df", -"Insert\/edit media": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05de\u05d3\u05d9\u05d4", -"Alternative source": "\u05de\u05e7\u05d5\u05e8 \u05de\u05e9\u05e0\u05d9", -"Alternative source URL": "\u05db\u05ea\u05d5\u05d1\u05ea URL \u05dc\u05de\u05e7\u05d5\u05e8 \u05d7\u05dc\u05d5\u05e4\u05d9", -"Media poster (Image URL)": "\u05e4\u05d5\u05e1\u05d8\u05e8 \u05de\u05d3\u05d9\u05d4 (\u05db\u05ea\u05d5\u05d1\u05ea URL \u05dc\u05ea\u05de\u05d5\u05e0\u05d4)", -"Paste your embed code below:": "\u05d4\u05d3\u05d1\u05e7 \u05e7\u05d5\u05d3 \u05d4\u05d8\u05de\u05e2\u05d4 \u05de\u05ea\u05d7\u05ea:", -"Embed": "\u05d4\u05d8\u05de\u05e2", -"Media...": "\u05de\u05d3\u05d9\u05d4...", -"Nonbreaking space": "\u05e8\u05d5\u05d5\u05d7 (\u05dc\u05dc\u05d0 \u05e9\u05d1\u05d9\u05e8\u05ea \u05e9\u05d5\u05e8\u05d4)", -"Page break": "\u05d3\u05e3 \u05d7\u05d3\u05e9", -"Paste as text": "\u05d4\u05d3\u05d1\u05e7 \u05db\u05d8\u05e7\u05e1\u05d8", -"Preview": "\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4", -"Print...": "\u05d4\u05d3\u05e4\u05e1...", -"Save": "\u05e9\u05de\u05d9\u05e8\u05d4", -"Find": "\u05d7\u05e4\u05e9", -"Replace with": "\u05d4\u05d7\u05dc\u05e3 \u05d1", -"Replace": "\u05d4\u05d7\u05dc\u05e3", -"Replace all": "\u05d4\u05d7\u05dc\u05e3 \u05d4\u05db\u05dc", -"Previous": "\u05d4\u05e7\u05d5\u05d3\u05dd", -"Next": "\u05d4\u05d1\u05d0", -"Find and replace...": "\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d5\u05d4\u05d7\u05dc\u05e4\u05d4...", -"Could not find the specified string.": "\u05de\u05d7\u05e8\u05d5\u05d6\u05ea \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d4", -"Match case": "\u05d4\u05d1\u05d7\u05df \u05d1\u05d9\u05df \u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05e7\u05d8\u05e0\u05d5\u05ea \u05dc\u05d2\u05d3\u05d5\u05dc\u05d5\u05ea", -"Find whole words only": "\u05d7\u05e4\u05e9 \u05de\u05d9\u05dc\u05d9\u05dd \u05e9\u05dc\u05de\u05d5\u05ea \u05d1\u05dc\u05d1\u05d3", -"Spell check": "\u05d1\u05d3\u05d9\u05e7\u05ea \u05d0\u05d9\u05d5\u05ea", -"Ignore": "\u05d4\u05ea\u05e2\u05dc\u05dd", -"Ignore all": "\u05d4\u05ea\u05e2\u05dc\u05dd \u05de\u05d4\u05db\u05dc", -"Finish": "\u05e1\u05d9\u05d9\u05dd", -"Add to Dictionary": "\u05d4\u05d5\u05e1\u05e3 \u05dc\u05de\u05d9\u05dc\u05d5\u05df", -"Insert table": "\u05d4\u05db\u05e0\u05e1 \u05d8\u05d1\u05dc\u05d4", -"Table properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05d8\u05d1\u05dc\u05d4", -"Delete table": "\u05de\u05d7\u05e7 \u05d8\u05d1\u05dc\u05d4", -"Cell": "\u05ea\u05d0", -"Row": "\u05e9\u05d5\u05e8\u05d4", -"Column": "\u05e2\u05de\u05d5\u05d3\u05d4", -"Cell properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05ea\u05d0", -"Merge cells": "\u05de\u05d6\u05d2 \u05ea\u05d0\u05d9\u05dd", -"Split cell": "\u05e4\u05e6\u05dc \u05ea\u05d0", -"Insert row before": "\u05d4\u05d5\u05e1\u05e3 \u05e9\u05d5\u05e8\u05d4 \u05dc\u05e4\u05e0\u05d9", -"Insert row after": "\u05d4\u05d5\u05e1\u05e3 \u05e9\u05d5\u05e8\u05d4 \u05d0\u05d7\u05e8\u05d9", -"Delete row": "\u05de\u05d7\u05e7 \u05e9\u05d5\u05e8\u05d4", -"Row properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05e9\u05d5\u05e8\u05d4", -"Cut row": "\u05d2\u05d6\u05d5\u05e8 \u05e9\u05d5\u05e8\u05d4", -"Copy row": "\u05d4\u05e2\u05ea\u05e7 \u05e9\u05d5\u05e8\u05d4", -"Paste row before": "\u05d4\u05d3\u05d1\u05e7 \u05e9\u05d5\u05e8\u05d4 \u05dc\u05e4\u05e0\u05d9", -"Paste row after": "\u05d4\u05e2\u05ea\u05e7 \u05e9\u05d5\u05e8\u05d4 \u05d0\u05d7\u05e8\u05d9", -"Insert column before": "\u05d4\u05e2\u05ea\u05e7 \u05e2\u05de\u05d5\u05d3\u05d4 \u05dc\u05e4\u05e0\u05d9", -"Insert column after": "\u05d4\u05e2\u05ea\u05e7 \u05e2\u05de\u05d5\u05d3\u05d4 \u05d0\u05d7\u05e8\u05d9", -"Delete column": "\u05de\u05d7\u05e7 \u05e2\u05de\u05d5\u05d3\u05d4", -"Cols": "\u05e2\u05de\u05d5\u05d3\u05d5\u05ea", -"Rows": "\u05e9\u05d5\u05e8\u05d5\u05ea", -"Width": "\u05e8\u05d5\u05d7\u05d1", -"Height": "\u05d2\u05d5\u05d1\u05d4", -"Cell spacing": "\u05e9\u05d5\u05dc\u05d9\u05d9\u05dd \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9\u05dd \u05dc\u05ea\u05d0", -"Cell padding": "\u05e9\u05d5\u05dc\u05d9\u05d9\u05dd \u05e4\u05e0\u05d9\u05de\u05d9\u05d9\u05dd \u05dc\u05ea\u05d0", -"Show caption": "\u05d4\u05e6\u05d2 \u05db\u05ea\u05d5\u05d1\u05d9\u05ea", -"Left": "\u05e9\u05de\u05d0\u05dc", -"Center": "\u05de\u05e8\u05db\u05d6", -"Right": "\u05d9\u05de\u05d9\u05df", -"Cell type": "\u05e1\u05d5\u05d2 \u05ea\u05d0", -"Scope": "\u05d4\u05d9\u05e7\u05e3", -"Alignment": "\u05d9\u05d9\u05e9\u05d5\u05e8", -"H Align": "\u05d9\u05d9\u05e9\u05d5\u05e8 \u05d0\u05d5\u05e4\u05e7\u05d9", -"V Align": "\u05d9\u05d9\u05e9\u05d5\u05e8 \u05d0\u05e0\u05db\u05d9", -"Top": "\u05e2\u05dc\u05d9\u05d5\u05df", -"Middle": "\u05d0\u05de\u05e6\u05e2", -"Bottom": "\u05ea\u05d7\u05ea\u05d9\u05ea", -"Header cell": "\u05db\u05d5\u05ea\u05e8\u05ea \u05dc\u05ea\u05d0", -"Row group": "\u05e7\u05d9\u05d1\u05d5\u05e5 \u05e9\u05d5\u05e8\u05d5\u05ea", -"Column group": "\u05e7\u05d9\u05d1\u05d5\u05e5 \u05e2\u05de\u05d5\u05d3\u05d5\u05ea", -"Row type": "\u05e1\u05d5\u05d2 \u05e9\u05d5\u05e8\u05d4", -"Header": "\u05db\u05d5\u05ea\u05e8\u05ea", -"Body": "\u05d2\u05d5\u05e3 \u05d4\u05d8\u05d1\u05dc\u05d0", -"Footer": "\u05db\u05d5\u05ea\u05e8\u05ea \u05ea\u05d7\u05ea\u05d5\u05e0\u05d4", -"Border color": "\u05e6\u05d1\u05e2 \u05d2\u05d1\u05d5\u05dc", -"Insert template...": "\u05d4\u05db\u05e0\u05e1 \u05ea\u05d1\u05e0\u05d9\u05ea...", -"Templates": "\u05ea\u05d1\u05e0\u05d9\u05d5\u05ea", -"Template": "\u05ea\u05d1\u05e0\u05d9\u05ea", -"Text color": "\u05e6\u05d1\u05e2 \u05d4\u05db\u05ea\u05d1", -"Background color": "\u05e6\u05d1\u05e2 \u05e8\u05e7\u05e2", -"Custom...": "\u05de\u05d5\u05ea\u05d0\u05dd \u05d0\u05d9\u05e9\u05d9\u05ea...", -"Custom color": "\u05e6\u05d1\u05e2 \u05de\u05d5\u05ea\u05d0\u05dd \u05d0\u05d9\u05e9\u05d9\u05ea", -"No color": "\u05dc\u05dc\u05d0 \u05e6\u05d1\u05e2", -"Remove color": "\u05d4\u05e1\u05e8 \u05e6\u05d1\u05e2", -"Table of Contents": "\u05ea\u05d5\u05db\u05df \u05e2\u05e0\u05d9\u05d9\u05e0\u05d9\u05dd", -"Show blocks": "\u05d4\u05e6\u05d2 \u05ea\u05d9\u05d1\u05d5\u05ea", -"Show invisible characters": "\u05d4\u05e6\u05d2 \u05ea\u05d5\u05d5\u05d9\u05dd \u05dc\u05d0 \u05e0\u05e8\u05d0\u05d9\u05dd", -"Word count": "\u05e1\u05e4\u05d9\u05e8\u05ea \u05de\u05d9\u05dc\u05d9\u05dd", -"Count": "\u05e1\u05e4\u05d9\u05e8\u05d4", -"Document": "\u05de\u05e1\u05de\u05da", -"Selection": "\u05d1\u05d7\u05d9\u05e8\u05d4", -"Words": "\u05de\u05d9\u05dc\u05d9\u05dd", -"Words: {0}": "\u05de\u05d9\u05dc\u05d9\u05dd: {0}", -"{0} words": "{0} \u05de\u05d9\u05dc\u05d9\u05dd", -"File": "\u05e7\u05d5\u05d1\u05e5", -"Edit": "\u05e2\u05e8\u05d9\u05db\u05d4", -"Insert": "\u05d4\u05d5\u05e1\u05e4\u05d4", -"View": "\u05ea\u05e6\u05d5\u05d2\u05d4", -"Format": "\u05e4\u05d5\u05e8\u05de\u05d8", -"Table": "\u05d8\u05d1\u05dc\u05d4", -"Tools": "\u05db\u05dc\u05d9\u05dd", -"Powered by {0}": "\u05de\u05d5\u05e4\u05e2\u05dc \u05e2\"\u05d9 {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u05ea\u05d9\u05d1\u05ea \u05e2\u05e8\u05d9\u05db\u05d4 \u05d7\u05db\u05de\u05d4. \u05dc\u05d7\u05e5 Alt-F9 \u05dc\u05ea\u05e4\u05e8\u05d9\u05d8. Alt-F10 \u05dc\u05ea\u05e6\u05d5\u05d2\u05ea \u05db\u05e4\u05ea\u05d5\u05e8\u05d9\u05dd, Alt-0 \u05dc\u05e2\u05d6\u05e8\u05d4", -"Image title": "\u05db\u05d5\u05ea\u05e8\u05ea \u05ea\u05de\u05d5\u05e0\u05d4", -"Border width": "\u05e8\u05d5\u05d7\u05d1 \u05d2\u05d1\u05d5\u05dc", -"Border style": "\u05e1\u05d2\u05e0\u05d5\u05df \u05d2\u05d1\u05d5\u05dc", -"Error": "\u05e9\u05d2\u05d9\u05d0\u05d4", -"Warn": "\u05d0\u05d6\u05d4\u05e8\u05d4", -"Valid": "\u05d7\u05d5\u05e7\u05d9", -"To open the popup, press Shift+Enter": "\u05db\u05d3\u05d9 \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d0\u05ea \u05d4\u05e4\u05e8\u05d9\u05d8 \u05d4\u05de\u05d5\u05e7\u05e4\u05e5, \u05d4\u05e7\u05e9 \u05e2\u05dc Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "\u05d0\u05d6\u05d5\u05e8 \u05d8\u05e7\u05e1\u05d8 \u05e2\u05e9\u05d9\u05e8. \u05d4\u05e7\u05e9 \u05e2\u05dc ALT-0 \u05dc\u05e2\u05d6\u05e8\u05d4.", -"System Font": "\u05d2\u05d5\u05e4\u05df \u05de\u05e2\u05e8\u05db\u05ea", -"Failed to upload image: {0}": "\u05db\u05e9\u05dc \u05d1\u05d4\u05e2\u05dc\u05d0\u05ea \u05ea\u05de\u05d5\u05e0\u05d4: {0}", -"Failed to load plugin: {0} from url {1}": "\u05db\u05e9\u05dc \u05d1\u05d8\u05e2\u05d9\u05e0\u05ea \u05d9\u05d9\u05e9\u05d5\u05dd Plugin: {0} \u05de\u05db\u05ea\u05d5\u05d1\u05ea URL\u200f {1}", -"Failed to load plugin url: {0}": "\u05db\u05e9\u05dc \u05d1\u05d8\u05e2\u05d9\u05e0\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05d9\u05d9\u05e9\u05d5\u05dd Plugin\u200f: {0}", -"Failed to initialize plugin: {0}": "\u05db\u05e9\u05dc \u05d1\u05d0\u05ea\u05d7\u05d5\u05dc \u05d9\u05d9\u05e9\u05d5\u05dd Plugin\u200f: {0}", -"example": "\u05d3\u05d5\u05d2\u05de\u05d4", -"Search": "\u05d7\u05e4\u05e9", -"All": "\u05d4\u05db\u05dc", -"Currency": "\u05de\u05d8\u05d1\u05e2", -"Text": "\u05d8\u05e7\u05e1\u05d8", -"Quotations": "\u05e9\u05d0\u05dc\u05d5\u05ea", -"Mathematical": "\u05de\u05ea\u05de\u05d8\u05d9", -"Extended Latin": "\u05dc\u05d8\u05d9\u05e0\u05d9\u05ea \u05de\u05d5\u05e8\u05d7\u05d1\u05ea", -"Symbols": "\u05e1\u05de\u05dc\u05d9\u05dd", -"Arrows": "\u05d7\u05d9\u05e6\u05d9\u05dd", -"User Defined": "\u05de\u05d5\u05d2\u05d3\u05e8 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d4\u05de\u05e9\u05ea\u05de\u05e9", -"dollar sign": "\u05e1\u05d9\u05de\u05df \u05d3\u05d5\u05dc\u05e8", -"currency sign": "\u05e1\u05d9\u05de\u05df \u05de\u05d8\u05d1\u05e2", -"euro-currency sign": "\u05e1\u05d9\u05de\u05df \u05de\u05d8\u05d1\u05e2 \u05d0\u05d9\u05e8\u05d5", -"colon sign": "\u05e1\u05d9\u05de\u05df \u05e7\u05d5\u05dc\u05d5\u05df", -"cruzeiro sign": "\u05e1\u05d9\u05de\u05df \u05e7\u05e8\u05d5\u05d6\u05e8\u05d5", -"french franc sign": "\u05e1\u05d9\u05de\u05df \u05e4\u05e8\u05e0\u05e7 \u05e6\u05e8\u05e4\u05ea\u05d9", -"lira sign": "\u05e1\u05d9\u05de\u05df \u05dc\u05d9\u05e8\u05d4", -"mill sign": "\u05e1\u05d9\u05de\u05df \u05de\u05d9\u05dc", -"naira sign": "\u05e1\u05d9\u05de\u05df \u05e0\u05d0\u05d9\u05e8\u05d4", -"peseta sign": "\u05e1\u05d9\u05de\u05df \u05e4\u05d6\u05d8\u05d4", -"rupee sign": "\u05e1\u05d9\u05de\u05df \u05e8\u05d5\u05e4\u05d9", -"won sign": "\u05e1\u05d9\u05de\u05df \u05d5\u05d5\u05df", -"new sheqel sign": "\u05e1\u05d9\u05de\u05df \u05e9\u05e7\u05dc \u05d7\u05d3\u05e9", -"dong sign": "\u05e1\u05d9\u05de\u05df \u05d3\u05d5\u05e0\u05d2", -"kip sign": "\u05e1\u05d9\u05de\u05df \u05e7\u05d9\u05e4", -"tugrik sign": "\u05e1\u05d9\u05de\u05df \u05d8\u05d5\u05d2\u05e8\u05d9\u05e7", -"drachma sign": "\u05e1\u05d9\u05de\u05df \u05d3\u05e8\u05db\u05de\u05d4", -"german penny symbol": "\u05e1\u05de\u05dc \u05e4\u05e0\u05d9 \u05d2\u05e8\u05de\u05e0\u05d9", -"peso sign": "\u05e1\u05d9\u05de\u05df \u05e4\u05d6\u05d5", -"guarani sign": "\u05e1\u05d9\u05de\u05df \u05d2\u05d5\u05d0\u05e8\u05e0\u05d9\u05ea", -"austral sign": "\u05e1\u05d9\u05de\u05df \u05d0\u05d5\u05e1\u05d8\u05e8\u05dc", -"hryvnia sign": "\u05e1\u05d9\u05de\u05df \u05e8\u05d9\u05d1\u05e0\u05d9\u05d4", -"cedi sign": "\u05e1\u05d9\u05de\u05df \u05e1\u05d3\u05d9", -"livre tournois sign": "\u05e1\u05d9\u05de\u05df \u05dc\u05d1\u05e8\u05d4 \u05d8\u05d5\u05e8\u05e0\u05d5", -"spesmilo sign": "\u05e1\u05d9\u05de\u05df \u05e1\u05e4\u05e1\u05de\u05d9\u05dc\u05d5", -"tenge sign": "\u05e1\u05d9\u05de\u05df \u05d8\u05e0\u05d2\u05d4", -"indian rupee sign": "\u05e1\u05d9\u05de\u05df \u05e8\u05d5\u05e4\u05d9 \u05d4\u05d5\u05d3\u05d9", -"turkish lira sign": "\u05e1\u05d9\u05de\u05df \u05dc\u05d9\u05e8\u05d4 \u05d8\u05d5\u05e8\u05e7\u05d9\u05ea", -"nordic mark sign": "\u05e1\u05d9\u05de\u05df \u05de\u05d0\u05e8\u05e7 \u05e1\u05e7\u05e0\u05d3\u05d9\u05e0\u05d1\u05d9", -"manat sign": "\u05e1\u05d9\u05de\u05df \u05de\u05d0\u05e0\u05d0\u05d8", -"ruble sign": "\u05e1\u05d9\u05de\u05df \u05e8\u05d5\u05d1\u05dc", -"yen character": "\u05ea\u05d5 \u05d9\u05df", -"yuan character": "\u05ea\u05d5 \u05d9\u05d5\u05d0\u05df", -"yuan character, in hong kong and taiwan": "\u05ea\u05d5 \u05d9\u05d5\u05d0\u05df, \u05d1\u05d4\u05d5\u05e0\u05d2 \u05e7\u05d5\u05e0\u05d2 \u05d5\u05d1\u05d8\u05d9\u05d9\u05d5\u05d5\u05d0\u05df", -"yen\/yuan character variant one": "\u05de\u05e9\u05ea\u05e0\u05d4 \u05d0\u05d7\u05d3 \u05e9\u05dc \u05ea\u05d5 \u05d9\u05d5\u05d0\u05df\/\u05d9\u05df", -"Loading emoticons...": "\u05d8\u05d5\u05e2\u05df \u05e1\u05de\u05dc\u05d9 \u05d4\u05d1\u05e2\u05d4...", -"Could not load emoticons": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05d8\u05e2\u05d5\u05df \u05e1\u05de\u05dc\u05d9 \u05d4\u05d1\u05e2\u05d4", -"People": "\u05d0\u05e0\u05e9\u05d9\u05dd", -"Animals and Nature": "\u05d1\u05e2\u05dc\u05d9-\u05d7\u05d9\u05d9\u05dd \u05d5\u05d8\u05d1\u05e2", -"Food and Drink": "\u05d0\u05d5\u05db\u05dc \u05d5\u05e9\u05ea\u05d9\u05d9\u05d4", -"Activity": "\u05e4\u05e2\u05d9\u05dc\u05d5\u05ea", -"Travel and Places": "\u05e0\u05e1\u05d9\u05e2\u05d4 \u05d5\u05de\u05e7\u05d5\u05de\u05d5\u05ea", -"Objects": "\u05d0\u05d5\u05d1\u05d9\u05d9\u05e7\u05d8\u05d9\u05dd", -"Flags": "\u05d3\u05d2\u05dc\u05d9\u05dd", -"Characters": "\u05ea\u05d5\u05d5\u05d9\u05dd", -"Characters (no spaces)": "\u05ea\u05d5\u05d5\u05d9\u05dd (\u05dc\u05dc\u05d0 \u05e8\u05d5\u05d5\u05d7\u05d9\u05dd)", -"{0} characters": "{0} \u05ea\u05d5\u05d5\u05d9\u05dd", -"Error: Form submit field collision.": "\u05e9\u05d2\u05d9\u05d0\u05d4: \u05d4\u05ea\u05e0\u05d2\u05e9\u05d5\u05ea \u05d1\u05e9\u05d3\u05d4 \u05e9\u05dc\u05d9\u05d7\u05ea \u05d8\u05d5\u05e4\u05e1.", -"Error: No form element found.": "\u05e9\u05d2\u05d9\u05d0\u05d4: \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 \u05e8\u05db\u05d9\u05d1 \u05d8\u05d5\u05e4\u05e1.", -"Update": "\u05e2\u05d3\u05db\u05df", -"Color swatch": "\u05d3\u05d5\u05d2\u05de\u05d0\u05d5\u05ea \u05e6\u05d1\u05e2", -"Turquoise": "\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6", -"Green": "\u05d9\u05e8\u05d5\u05e7", -"Blue": "\u05db\u05d7\u05d5\u05dc", -"Purple": "\u05e1\u05d2\u05d5\u05dc", -"Navy Blue": "\u05db\u05d7\u05d5\u05dc \u05e6\u05d9", -"Dark Turquoise": "\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6 \u05db\u05d4\u05d4", -"Dark Green": "\u05d9\u05e8\u05d5\u05e7 \u05db\u05d4\u05d4", -"Medium Blue": "\u05db\u05d7\u05d5\u05dc \u05d1\u05d9\u05e0\u05d5\u05e0\u05d9", -"Medium Purple": "\u05e1\u05d2\u05d5\u05dc \u05d1\u05d9\u05e0\u05d5\u05e0\u05d9", -"Midnight Blue": "\u05db\u05d7\u05d5\u05dc \u05d7\u05e6\u05d5\u05ea", -"Yellow": "\u05e6\u05d4\u05d5\u05d1", -"Orange": "\u05db\u05ea\u05d5\u05dd", -"Red": "\u05d0\u05d3\u05d5\u05dd", -"Light Gray": "\u05d0\u05e4\u05d5\u05e8 \u05d1\u05d4\u05d9\u05e8", -"Gray": "\u05d0\u05e4\u05d5\u05e8", -"Dark Yellow": "\u05e6\u05d4\u05d5\u05d1 \u05db\u05d4\u05d4", -"Dark Orange": "\u05db\u05ea\u05d5\u05dd \u05db\u05d4\u05d4", -"Dark Red": "\u05d0\u05d3\u05d5\u05dd \u05db\u05d4\u05d4", -"Medium Gray": "\u05d0\u05e4\u05d5\u05e8 \u05d1\u05d9\u05e0\u05d5\u05e0\u05d9", -"Dark Gray": "\u05d0\u05e4\u05d5\u05e8 \u05db\u05d4\u05d4", -"Light Green": "\u05d9\u05e8\u05d5\u05e7 \u05d1\u05d4\u05d9\u05e8", -"Light Yellow": "\u05e6\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d9\u05e8", -"Light Red": "\u05d0\u05d3\u05d5\u05dd \u05d1\u05d4\u05d9\u05e8", -"Light Purple": "\u05e1\u05d2\u05d5\u05dc \u05d1\u05d4\u05d9\u05e8", -"Light Blue": "\u05db\u05d7\u05d5\u05dc \u05d1\u05d4\u05d9\u05e8", -"Dark Purple": "\u05e1\u05d2\u05d5\u05dc \u05db\u05d4\u05d4", -"Dark Blue": "\u05db\u05d7\u05d5\u05dc \u05db\u05d4\u05d4", -"Black": "\u05e9\u05d7\u05d5\u05e8", -"White": "\u05dc\u05d1\u05df", -"Switch to or from fullscreen mode": "\u05d4\u05d7\u05dc\u05e3 \u05dc\u05de\u05e6\u05d1 \u05de\u05e1\u05da \u05de\u05dc\u05d0 \u05d0\u05d5 \u05e6\u05d0 \u05de\u05de\u05e0\u05d5", -"Open help dialog": "\u05e4\u05ea\u05d7 \u05ea\u05d9\u05d1\u05ea \u05d3\u05d5-\u05e9\u05d9\u05d7 \u05e9\u05dc \u05e2\u05d6\u05e8\u05d4", -"history": "\u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4", -"styles": "\u05e1\u05d2\u05e0\u05d5\u05e0\u05d5\u05ea", -"formatting": "\u05e2\u05d9\u05e6\u05d5\u05d1", -"alignment": "\u05d9\u05d9\u05e9\u05d5\u05e8", -"indentation": "\u05d4\u05d6\u05d7\u05d4", -"permanent pen": "\u05e2\u05d8 \u05e7\u05d1\u05d5\u05e2", -"comments": "\u05d4\u05e2\u05e8\u05d5\u05ea", -"Format Painter": "\u05e6\u05d9\u05d9\u05e8 \u05e2\u05d9\u05e6\u05d5\u05d1", -"Insert\/edit iframe": "\u05d4\u05db\u05e0\u05e1\/\u05e2\u05e8\u05d5\u05da \u05d7\u05dc\u05d5\u05df \u05de\u05e1\u05d2\u05e8\u05ea", -"Capitalization": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05e8\u05d9\u05e9\u05d9\u05d5\u05ea", -"lowercase": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05e7\u05d8\u05e0\u05d5\u05ea", -"UPPERCASE": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05e8\u05d9\u05e9\u05d9\u05d5\u05ea", -"Title Case": "\u05d0\u05d5\u05ea\u05d9\u05d5\u05ea \u05db\u05d5\u05ea\u05e8\u05ea", -"Permanent Pen Properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05e2\u05d8 \u05e7\u05d1\u05d5\u05e2\u05d9\u05dd", -"Permanent pen properties...": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05e2\u05d8 \u05e7\u05d1\u05d5\u05e2\u05d9\u05dd...", -"Font": "\u05d2\u05d5\u05e4\u05df", -"Size": "\u05d2\u05d5\u05d3\u05dc", -"More...": "\u05e2\u05d5\u05d3...", -"Spellcheck Language": "\u05e9\u05e4\u05ea \u05d1\u05d3\u05d9\u05e7\u05ea \u05d0\u05d9\u05d5\u05ea", -"Select...": "\u05d1\u05d7\u05e8...", -"Preferences": "\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea", -"Yes": "\u05db\u05df", -"No": "\u05dc\u05d0", -"Keyboard Navigation": "\u05e0\u05d9\u05d5\u05d5\u05d8 \u05d1\u05de\u05e7\u05dc\u05d3\u05ea", -"Version": "\u05d2\u05e8\u05e1\u05d4", -"Anchor": "\u05de\u05e7\u05d5\u05dd \u05e2\u05d9\u05d2\u05d5\u05df", -"Special character": "\u05ea\u05d5\u05d5\u05d9\u05dd \u05de\u05d9\u05d5\u05d7\u05d3\u05d9\u05dd", -"Code sample": "\u05d3\u05d5\u05d2\u05de\u05ea \u05e7\u05d5\u05d3", -"Color": "\u05e6\u05d1\u05e2", -"Emoticons": "\u05de\u05d7\u05d5\u05d5\u05ea", -"Document properties": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05de\u05e1\u05de\u05da", -"Image": "\u05ea\u05de\u05d5\u05e0\u05d4", -"Insert link": "\u05d4\u05db\u05e0\u05e1 \u05e7\u05d9\u05e9\u05d5\u05e8", -"Target": "\u05de\u05d8\u05e8\u05d4", -"Link": "\u05e7\u05d9\u05e9\u05d5\u05e8", -"Poster": "\u05e4\u05d5\u05e1\u05d8\u05e8", -"Media": "\u05de\u05d3\u05d9\u05d4", -"Print": "\u05d4\u05d3\u05e4\u05e1", -"Prev": "\u05e7\u05d5\u05d3\u05dd", -"Find and replace": "\u05d7\u05e4\u05e9 \u05d5\u05d4\u05d7\u05dc\u05e3", -"Whole words": "\u05de\u05d9\u05dc\u05d4 \u05e9\u05dc\u05de\u05d4", -"Spellcheck": "\u05d1\u05d5\u05d3\u05e7 \u05d0\u05d9\u05d5\u05ea", -"Caption": "\u05db\u05d9\u05ea\u05d5\u05d1", -"Insert template": "\u05d4\u05db\u05e0\u05e1 \u05ea\u05d1\u05e0\u05d9\u05ea", -"_dir": "rtl" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/hu_HU.js b/cps/static/js/libs/tinymce/langs/hu_HU.js deleted file mode 100644 index 038b83856..000000000 --- a/cps/static/js/libs/tinymce/langs/hu_HU.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('hu_HU',{ -"Redo": "Ism\u00e9t", -"Undo": "Visszavon\u00e1s", -"Cut": "Kiv\u00e1g\u00e1s", -"Copy": "M\u00e1sol\u00e1s", -"Paste": "Beilleszt\u00e9s", -"Select all": "Minden kijel\u00f6l\u00e9se", -"New document": "\u00daj dokumentum", -"Ok": "Rendben", -"Cancel": "M\u00e9gse", -"Visual aids": "Vizu\u00e1lis seg\u00e9deszk\u00f6z\u00f6k", -"Bold": "F\u00e9lk\u00f6v\u00e9r", -"Italic": "D\u0151lt", -"Underline": "Al\u00e1h\u00fazott", -"Strikethrough": "\u00c1th\u00fazott", -"Superscript": "Fels\u0151 index", -"Subscript": "Als\u00f3 index", -"Clear formatting": "Form\u00e1z\u00e1s t\u00f6rl\u00e9se", -"Align left": "Balra igaz\u00edt", -"Align center": "K\u00f6z\u00e9pre igaz\u00edt", -"Align right": "Jobbra igaz\u00edt", -"Justify": "Sorkiz\u00e1rt", -"Bullet list": "Listajeles lista", -"Numbered list": "Sz\u00e1mozott lista", -"Decrease indent": "Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se", -"Increase indent": "Beh\u00faz\u00e1s n\u00f6vel\u00e9se", -"Close": "Bez\u00e1r", -"Formats": "Form\u00e1tumok", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "A b\u00f6ng\u00e9sz\u0151d nem t\u00e1mogatja a k\u00f6zvetlen hozz\u00e1f\u00e9r\u00e9st a v\u00e1g\u00f3laphoz. K\u00e9rlek, haszn\u00e1ld a Ctrl+X\/C\/V billenty\u0171ket.", -"Headers": "C\u00edmsorok", -"Header 1": "C\u00edmsor 1", -"Header 2": "C\u00edmsor 2", -"Header 3": "C\u00edmsor 3", -"Header 4": "C\u00edmsor 4", -"Header 5": "C\u00edmsor 5", -"Header 6": "C\u00edmsor 6", -"Headings": "Fejl\u00e9cek", -"Heading 1": "1. fejl\u00e9c", -"Heading 2": "2. fejl\u00e9c", -"Heading 3": "3. fejl\u00e9c", -"Heading 4": "4. fejl\u00e9c", -"Heading 5": "5. fejl\u00e9c", -"Heading 6": "6. fejl\u00e9c", -"Preformatted": "El\u0151form\u00e1zott", -"Div": "Div", -"Pre": "Pre", -"Code": "K\u00f3d", -"Paragraph": "Bekezd\u00e9s", -"Blockquote": "Id\u00e9zetblokk", -"Inline": "Foly\u00f3 sz\u00f6veg", -"Blocks": "Blokkok", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Beilleszt\u00e9s mostant\u00f3l egyszer\u0171 sz\u00f6veg m\u00f3dban. A tartalmak mostant\u00f3l egyszer\u0171 sz\u00f6vegk\u00e9nt lesznek beillesztve, am\u00edg nem kapcsolod ki ezt az opci\u00f3t.", -"Fonts": "Bet\u0171t\u00edpusok", -"Font Sizes": "Bet\u0171m\u00e9retek", -"Class": "Oszt\u00e1ly", -"Browse for an image": "K\u00e9p keres\u00e9se tall\u00f3z\u00e1ssal", -"OR": "VAGY", -"Drop an image here": "H\u00fazz ide egy k\u00e9pet", -"Upload": "Felt\u00f6lt\u00e9s", -"Block": "Blokk", -"Align": "Igaz\u00edt\u00e1s", -"Default": "Alap\u00e9rtelmezett", -"Circle": "K\u00f6r", -"Disc": "Pont", -"Square": "N\u00e9gyzet", -"Lower Alpha": "Kisbet\u0171", -"Lower Greek": "Kis g\u00f6r\u00f6g sz\u00e1m", -"Lower Roman": "Kis r\u00f3mai sz\u00e1m", -"Upper Alpha": "Nagybet\u0171", -"Upper Roman": "Nagy r\u00f3mai sz\u00e1m", -"Anchor...": "Horgony...", -"Name": "N\u00e9v", -"Id": "Azonos\u00edt\u00f3", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Az azonos\u00edt\u00f3nak bet\u0171vel kell kezd\u0151dnie, azut\u00e1n csak bet\u0171ket, sz\u00e1mokat, gondolatjeleket, pontokat, kett\u0151spontokat vagy al\u00e1h\u00faz\u00e1st tartalmazhat.", -"You have unsaved changes are you sure you want to navigate away?": "Nem mentett m\u00f3dos\u00edt\u00e1said vannak, biztos hogy el akarsz navig\u00e1lni?", -"Restore last draft": "Utols\u00f3 piszkozat vissza\u00e1ll\u00edt\u00e1sa", -"Special character...": "Speci\u00e1lis karakter...", -"Source code": "Forr\u00e1sk\u00f3d", -"Insert\/Edit code sample": "K\u00f3dminta besz\u00far\u00e1sa\/szerkeszt\u00e9se", -"Language": "Nyelv", -"Code sample...": "K\u00f3dminta...", -"Color Picker": "Sz\u00ednv\u00e1laszt\u00f3", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Balr\u00f3l jobbra", -"Right to left": "Jobbr\u00f3l balra", -"Emoticons...": "Hangulatjelek...", -"Metadata and Document Properties": "Metaadatok \u00e9s a dokumentum tulajdons\u00e1gai", -"Title": "C\u00edm", -"Keywords": "Kulcsszavak", -"Description": "Le\u00edr\u00e1s", -"Robots": "Robotok", -"Author": "Szerz\u0151", -"Encoding": "K\u00f3dol\u00e1s", -"Fullscreen": "Teljes k\u00e9perny\u0151", -"Action": "M\u0171velet", -"Shortcut": "Parancsikon", -"Help": "S\u00fag\u00f3", -"Address": "C\u00edm", -"Focus to menubar": "F\u00f3kusz a men\u00fcre", -"Focus to toolbar": "F\u00f3kusz az eszk\u00f6zt\u00e1rra", -"Focus to element path": "F\u00f3kusz az elemek \u00fatvonal\u00e1ra", -"Focus to contextual toolbar": "F\u00f3kusz a k\u00f6rnyezetf\u00fcgg\u0151 eszk\u00f6zt\u00e1rra", -"Insert link (if link plugin activated)": "Hivatkoz\u00e1s besz\u00far\u00e1sa (ha a hivatkoz\u00e1s b\u0151v\u00edtm\u00e9ny enged\u00e9lyezett)", -"Save (if save plugin activated)": "Ment\u00e9s (ha a ment\u00e9s b\u0151v\u00edtm\u00e9ny enged\u00e9lyezett)", -"Find (if searchreplace plugin activated)": "Keres\u00e9s (ha a keres\u00e9s \u00e9s csere b\u0151v\u00edtm\u00e9ny enged\u00e9lyezett)", -"Plugins installed ({0}):": "Telep\u00edtett b\u0151v\u00edtm\u00e9nyek ({0}):", -"Premium plugins:": "Pr\u00e9mium b\u0151v\u00edtm\u00e9nyek:", -"Learn more...": "Tudj meg t\u00f6bbet...", -"You are using {0}": "Haszn\u00e1latban: {0}", -"Plugins": "Pluginek", -"Handy Shortcuts": "Hasznos linkek", -"Horizontal line": "V\u00edzszintes vonal", -"Insert\/edit image": "K\u00e9p beilleszt\u00e9se\/szerkeszt\u00e9se", -"Image description": "K\u00e9p le\u00edr\u00e1sa", -"Source": "Forr\u00e1s", -"Dimensions": "M\u00e9retek", -"Constrain proportions": "M\u00e9retar\u00e1ny", -"General": "\u00c1ltal\u00e1nos", -"Advanced": "Halad\u00f3", -"Style": "St\u00edlus", -"Vertical space": "Vertik\u00e1lis hely", -"Horizontal space": "Horizont\u00e1lis hely", -"Border": "Szeg\u00e9ly", -"Insert image": "K\u00e9p beilleszt\u00e9se", -"Image...": "K\u00e9p...", -"Image list": "K\u00e9p lista", -"Rotate counterclockwise": "Forgat\u00e1s az \u00f3ramutat\u00f3 j\u00e1r\u00e1s\u00e1val ellent\u00e9tesen", -"Rotate clockwise": "Forgat\u00e1s az \u00f3ramutat\u00f3 j\u00e1r\u00e1s\u00e1val megegyez\u0151en", -"Flip vertically": "F\u00fcgg\u0151leges t\u00fckr\u00f6z\u00e9s", -"Flip horizontally": "V\u00edzszintes t\u00fckr\u00f6z\u00e9s", -"Edit image": "K\u00e9p szerkeszt\u00e9se", -"Image options": "K\u00e9p be\u00e1ll\u00edt\u00e1sok", -"Zoom in": "Nagy\u00edt\u00e1s", -"Zoom out": "Kicsiny\u00edt\u00e9s", -"Crop": "K\u00e9p v\u00e1g\u00e1s", -"Resize": "\u00c1tm\u00e9retez\u00e9s", -"Orientation": "K\u00e9p t\u00e1jol\u00e1s", -"Brightness": "F\u00e9nyer\u0151", -"Sharpen": "\u00c9less\u00e9g", -"Contrast": "Kontraszt", -"Color levels": "Sz\u00ednszint", -"Gamma": "Gamma", -"Invert": "Inverz k\u00e9p", -"Apply": "Ment\u00e9s", -"Back": "Vissza", -"Insert date\/time": "D\u00e1tum\/id\u0151 beilleszt\u00e9se", -"Date\/time": "D\u00e1tum\/id\u0151", -"Insert\/Edit Link": "Hivatkoz\u00e1s beilleszt\u00e9se\/szerkeszt\u00e9se", -"Insert\/edit link": "Hivatkoz\u00e1s beilleszt\u00e9se\/szerkeszt\u00e9se", -"Text to display": "Megjelen\u0151 sz\u00f6veg", -"Url": "Url", -"Open link in...": "Hivatkoz\u00e1s megnyit\u00e1sa...", -"Current window": "Jelenlegi ablak", -"None": "Nincs", -"New window": "\u00daj ablak", -"Remove link": "Hivatkoz\u00e1s t\u00f6rl\u00e9se", -"Anchors": "Horgonyok", -"Link...": "Hivatkoz\u00e1s...", -"Paste or type a link": "Hivatkoz\u00e1s be\u00edr\u00e1sa vagy beilleszt\u00e9se", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "A megadott URL email c\u00edmnek t\u0171nik. Szeretn\u00e9d hozz\u00e1adni a sz\u00fcks\u00e9ges mailto: el\u0151tagot?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "A megadott URL k\u00fcls\u0151 c\u00edmnek t\u0171nik. Szeretn\u00e9d hozz\u00e1adni a sz\u00fcks\u00e9ges http:\/\/ el\u0151tagot?", -"Link list": "Hivatkoz\u00e1slista", -"Insert video": "Vide\u00f3 beilleszt\u00e9se", -"Insert\/edit video": "Vide\u00f3 beilleszt\u00e9se\/szerkeszt\u00e9se", -"Insert\/edit media": "M\u00e9dia besz\u00far\u00e1sa\/beilleszt\u00e9se", -"Alternative source": "Alternat\u00edv forr\u00e1s", -"Alternative source URL": "Alternat\u00edv forr\u00e1s URL", -"Media poster (Image URL)": "M\u00e9dia poszter (k\u00e9p URL)", -"Paste your embed code below:": "Illeszd be a be\u00e1gyaz\u00f3 k\u00f3dot alulra:", -"Embed": "Be\u00e1gyaz\u00e1s", -"Media...": "M\u00e9dia...", -"Nonbreaking space": "Nem t\u00f6rhet\u0151 sz\u00f3k\u00f6z", -"Page break": "Oldalt\u00f6r\u00e9s", -"Paste as text": "Beilleszt\u00e9s sz\u00f6vegk\u00e9nt", -"Preview": "El\u0151n\u00e9zet", -"Print...": "Nyomtat\u00e1s...", -"Save": "Ment\u00e9s", -"Find": "Keres\u00e9s", -"Replace with": "Csere erre", -"Replace": "Csere", -"Replace all": "Az \u00f6sszes cser\u00e9je", -"Previous": "El\u0151z\u0151", -"Next": "K\u00f6vetkez\u0151", -"Find and replace...": "Keres\u00e9s \u00e9s csere...", -"Could not find the specified string.": "A be\u00edrt kifejez\u00e9s nem tal\u00e1lhat\u00f3.", -"Match case": "Kis \u00e9s nagybet\u0171k megk\u00fcl\u00f6nb\u00f6ztet\u00e9se", -"Find whole words only": "Csak teljes szavak keres\u00e9se", -"Spell check": "Helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s", -"Ignore": "Figyelmen k\u00edv\u00fcl hagy", -"Ignore all": "Mindent figyelmen k\u00edv\u00fcl hagy", -"Finish": "Befejez\u00e9s", -"Add to Dictionary": "Sz\u00f3t\u00e1rhoz ad", -"Insert table": "T\u00e1bl\u00e1zat beilleszt\u00e9se", -"Table properties": "T\u00e1bl\u00e1zat tulajdons\u00e1gok", -"Delete table": "T\u00e1bl\u00e1zat t\u00f6rl\u00e9se", -"Cell": "Cella", -"Row": "Sor", -"Column": "Oszlop", -"Cell properties": "Cella tulajdons\u00e1gok", -"Merge cells": "Cell\u00e1k egyes\u00edt\u00e9se", -"Split cell": "Cell\u00e1k sz\u00e9tv\u00e1laszt\u00e1sa", -"Insert row before": "Sor besz\u00far\u00e1sa el\u00e9", -"Insert row after": "Sor besz\u00far\u00e1sa m\u00f6g\u00e9", -"Delete row": "Sor t\u00f6rl\u00e9se", -"Row properties": "Sor tulajdons\u00e1gai", -"Cut row": "Sor kiv\u00e1g\u00e1sa", -"Copy row": "Sor m\u00e1sol\u00e1sa", -"Paste row before": "Sor beilleszt\u00e9se el\u00e9", -"Paste row after": "Sor beilleszt\u00e9se m\u00f6g\u00e9", -"Insert column before": "Oszlop besz\u00far\u00e1sa el\u00e9", -"Insert column after": "Oszlop besz\u00far\u00e1sa m\u00f6g\u00e9", -"Delete column": "Oszlop t\u00f6rl\u00e9se", -"Cols": "Oszlopok", -"Rows": "Sorok", -"Width": "Sz\u00e9less\u00e9g", -"Height": "Magass\u00e1g", -"Cell spacing": "Cell\u00e1k t\u00e1vols\u00e1ga", -"Cell padding": "Cella m\u00e9rete", -"Show caption": "C\u00edm megjelen\u00edt\u00e9se", -"Left": "Bal", -"Center": "K\u00f6z\u00e9p", -"Right": "Jobb", -"Cell type": "Cella t\u00edpusa", -"Scope": "Hat\u00f3k\u00f6r", -"Alignment": "Igaz\u00edt\u00e1s", -"H Align": "V\u00edzszintes igaz\u00edt\u00e1s", -"V Align": "F\u00fcgg\u0151leges igaz\u00edt\u00e1s", -"Top": "Fel\u00fcl", -"Middle": "K\u00f6z\u00e9pen", -"Bottom": "Alul", -"Header cell": "Fejl\u00e9c cella", -"Row group": "Sor csoport", -"Column group": "Oszlop csoport", -"Row type": "Sor t\u00edpus", -"Header": "Fejl\u00e9c", -"Body": "Sz\u00f6vegt\u00f6rzs", -"Footer": "L\u00e1bl\u00e9c", -"Border color": "Szeg\u00e9ly sz\u00edne", -"Insert template...": "Sablon besz\u00far\u00e1sa...", -"Templates": "Sablonok", -"Template": "Sablon", -"Text color": "Sz\u00f6veg sz\u00edne", -"Background color": "H\u00e1tt\u00e9r sz\u00edn", -"Custom...": "Egy\u00e9ni...", -"Custom color": "Egy\u00e9ni sz\u00edn", -"No color": "Nincs sz\u00edn", -"Remove color": "Sz\u00edn t\u00f6rl\u00e9se", -"Table of Contents": "Tartalomjegyz\u00e9k", -"Show blocks": "Blokkok mutat\u00e1sa", -"Show invisible characters": "L\u00e1thatatlan karakterek mutat\u00e1sa", -"Word count": "Szavak sz\u00e1ma", -"Count": "Sz\u00e1m", -"Document": "Dokumentum", -"Selection": "Kiv\u00e1laszt\u00e1s", -"Words": "Szavak", -"Words: {0}": "Szavak: {0}", -"{0} words": "{0} sz\u00f3", -"File": "F\u00e1jl", -"Edit": "Szerkeszt\u00e9s", -"Insert": "Beilleszt\u00e9s", -"View": "N\u00e9zet", -"Format": "Form\u00e1tum", -"Table": "T\u00e1bl\u00e1zat", -"Tools": "Eszk\u00f6z\u00f6k", -"Powered by {0}": "\u00dczemelteti: {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text ter\u00fclet. Nyomj ALT-F9-et a men\u00fch\u00f6z. Nyomj ALT-F10-et az eszk\u00f6zt\u00e1rhoz. Nyomj ALT-0-t a s\u00fag\u00f3hoz", -"Image title": "K\u00e9p c\u00edme", -"Border width": "Szeg\u00e9ly vastags\u00e1ga", -"Border style": "Szeg\u00e9ly st\u00edlusa", -"Error": "Hiba", -"Warn": "Figyelmeztet\u00e9s", -"Valid": "\u00c9rv\u00e9nyes", -"To open the popup, press Shift+Enter": "A felugr\u00f3 ablak megnyit\u00e1s\u00e1hoz nyomja meg a Shift+Enter billenty\u0171t", -"Rich Text Area. Press ALT-0 for help.": "Vizu\u00e1lis szerkeszt\u0151 ter\u00fclet. Nyomjon ALT-0-t a s\u00fag\u00f3hoz.", -"System Font": "Rendszer-bet\u0171t\u00edpus", -"Failed to upload image: {0}": "Nem siker\u00fclt felt\u00f6lteni a k\u00e9pet: {0}", -"Failed to load plugin: {0} from url {1}": "Nem siker\u00fclt bet\u00f6lteni a be\u00e9p\u00fcl\u0151 modult: {0} err\u0151l a webc\u00edmr\u0151l: {1}", -"Failed to load plugin url: {0}": "Nem siker\u00fclt bet\u00f6lteni a be\u00e9p\u00fcl\u0151 modul url-\u00e9t: {0}", -"Failed to initialize plugin: {0}": "Nem siker\u00fclt inicializ\u00e1lni a be\u00e9p\u00fcl\u0151 modult: {0}", -"example": "p\u00e9lda", -"Search": "Keres\u00e9s", -"All": "Minden", -"Currency": "P\u00e9nznem", -"Text": "Sz\u00f6veg", -"Quotations": "Id\u00e9z\u0151jelek", -"Mathematical": "Matematikai", -"Extended Latin": "B\u0151v\u00edtett latin", -"Symbols": "Szimb\u00f3lumok", -"Arrows": "Nyilak", -"User Defined": "Felhaszn\u00e1l\u00f3 \u00e1ltal meghat\u00e1rozott", -"dollar sign": "doll\u00e1r jel", -"currency sign": "valuta jel", -"euro-currency sign": "euro-valuta jel", -"colon sign": "kett\u0151spont", -"cruzeiro sign": "cruzeiro jel", -"french franc sign": "francia frank jel", -"lira sign": "l\u00edra jel", -"mill sign": "mill jel", -"naira sign": "naira jel", -"peseta sign": "peseta jel", -"rupee sign": "r\u00fapia jel", -"won sign": "won jel", -"new sheqel sign": "\u00faj shekel jel", -"dong sign": "dong jel", -"kip sign": "kip jel", -"tugrik sign": "tugrik jel", -"drachma sign": "drachma jel", -"german penny symbol": "n\u00e9met penny jel", -"peso sign": "peso jel", -"guarani sign": "guarani jel", -"austral sign": "austral jel", -"hryvnia sign": "hrivnya jel", -"cedi sign": "cedi jel", -"livre tournois sign": "livre tournois jel", -"spesmilo sign": "spesmilo jel", -"tenge sign": "tenge jel", -"indian rupee sign": "r\u00fapel jel", -"turkish lira sign": "t\u00f6r\u00f6k l\u00edra jel", -"nordic mark sign": "\u00e9szaki m\u00e1rka jel", -"manat sign": "manat jel", -"ruble sign": "rubel jel", -"yen character": "jen karakter", -"yuan character": "j\u00fcan karakter", -"yuan character, in hong kong and taiwan": "hongkongi \u00e9s tajvani j\u00fcan karakter", -"yen\/yuan character variant one": "jen\/j\u00fcan karaktervari\u00e1ns", -"Loading emoticons...": "Hangulatjelek bet\u00f6lt\u00e9se...", -"Could not load emoticons": "Nem siker\u00fclt a hangulatjelek bet\u00f6lt\u00e9se", -"People": "Emberek", -"Animals and Nature": "\u00c1llatok \u00e9s term\u00e9szet", -"Food and Drink": "\u00c9tel, ital", -"Activity": "Tev\u00e9kenys\u00e9gek", -"Travel and Places": "Utaz\u00e1s \u00e9s helyek", -"Objects": "T\u00e1rgyak", -"Flags": "Z\u00e1szl\u00f3k", -"Characters": "Karakterek", -"Characters (no spaces)": "Karakterek (sz\u00f3k\u00f6z\u00f6k n\u00e9lk\u00fcl)", -"{0} characters": "{0} karakter", -"Error: Form submit field collision.": "Hiba: \u00dctk\u00f6z\u00e9s t\u00f6rt\u00e9nt az \u0171rlap elk\u00fcld\u00e9sekor.", -"Error: No form element found.": "Hiba: Nem tal\u00e1lhat\u00f3 \u0171rlap elem.", -"Update": "Friss\u00edt\u00e9s", -"Color swatch": "Sz\u00ednpaletta", -"Turquoise": "T\u00fcrkiz", -"Green": "Z\u00f6ld", -"Blue": "K\u00e9k", -"Purple": "Lila", -"Navy Blue": "Tengerk\u00e9k", -"Dark Turquoise": "S\u00f6t\u00e9tt\u00fcrkiz", -"Dark Green": "S\u00f6t\u00e9tz\u00f6ld", -"Medium Blue": "Kir\u00e1lyk\u00e9k", -"Medium Purple": "K\u00f6z\u00e9plila", -"Midnight Blue": "\u00c9jf\u00e9lk\u00e9k", -"Yellow": "S\u00e1rga", -"Orange": "Narancss\u00e1rga", -"Red": "Piros", -"Light Gray": "Vil\u00e1gossz\u00fcrke", -"Gray": "Sz\u00fcrke", -"Dark Yellow": "S\u00f6t\u00e9ts\u00e1rga", -"Dark Orange": "S\u00f6t\u00e9t narancss\u00e1rga", -"Dark Red": "S\u00f6t\u00e9tv\u00f6r\u00f6s", -"Medium Gray": "K\u00f6z\u00e9psz\u00fcrke", -"Dark Gray": "S\u00f6t\u00e9tsz\u00fcrke", -"Light Green": "Vil\u00e1gosz\u00f6ld", -"Light Yellow": "Vil\u00e1goss\u00e1rga", -"Light Red": "Vil\u00e1gospiros", -"Light Purple": "Vil\u00e1goslila", -"Light Blue": "Vil\u00e1gosk\u00e9k", -"Dark Purple": "S\u00f6t\u00e9tlila", -"Dark Blue": "S\u00f6t\u00e9tk\u00e9k", -"Black": "Fekete", -"White": "Feh\u00e9r", -"Switch to or from fullscreen mode": "Teljes vagy norm\u00e1l k\u00e9perny\u0151s m\u00f3dra v\u00e1lt\u00e1s", -"Open help dialog": "S\u00fag\u00f3ablak megnyit\u00e1sa", -"history": "el\u0151zm\u00e9nyek", -"styles": "st\u00edlusok", -"formatting": "form\u00e1z\u00e1s", -"alignment": "igaz\u00edt\u00e1s", -"indentation": "beh\u00faz\u00e1s", -"permanent pen": "sz\u00f6vegkiemel\u0151", -"comments": "megjegyz\u00e9sek", -"Format Painter": "Form\u00e1tumm\u00e1sol\u00f3", -"Insert\/edit iframe": "iframe besz\u00far\u00e1sa\/szerkeszt\u00e9se", -"Capitalization": "Nagybet\u0171s \u00edr\u00e1s", -"lowercase": "kisbet\u0171s", -"UPPERCASE": "NAGYBET\u0170S", -"Title Case": "C\u00edm szerinti \u00edr\u00e1sm\u00f3d", -"Permanent Pen Properties": "Tart\u00f3s toll tulajdons\u00e1gai", -"Permanent pen properties...": "Tart\u00f3s toll tulajdons\u00e1gai...", -"Font": "Bet\u0171t\u00edpus", -"Size": "M\u00e9ret", -"More...": "Tov\u00e1bbiak...", -"Spellcheck Language": "Helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s nyelve", -"Select...": "V\u00e1lasszon...", -"Preferences": "Preferenci\u00e1k", -"Yes": "Igen", -"No": "Nem", -"Keyboard Navigation": "Billenty\u0171zettel val\u00f3 navig\u00e1l\u00e1s", -"Version": "Verzi\u00f3", -"Anchor": "Horgony", -"Special character": "Speci\u00e1lis karakter", -"Code sample": "K\u00f3d p\u00e9lda", -"Color": "Sz\u00edn", -"Emoticons": "Vigyorok", -"Document properties": "Dokumentum tulajdons\u00e1gai", -"Image": "K\u00e9p", -"Insert link": "Hivatkoz\u00e1s beilleszt\u00e9se", -"Target": "C\u00e9l", -"Link": "Hivatkoz\u00e1s", -"Poster": "El\u0151n\u00e9zeti k\u00e9p", -"Media": "M\u00e9dia", -"Print": "Nyomtat\u00e1s", -"Prev": "El\u0151z\u0151", -"Find and replace": "Keres\u00e9s \u00e9s csere", -"Whole words": "Csak ha ez a teljes sz\u00f3", -"Spellcheck": "Helyes\u00edr\u00e1s ellen\u0151rz\u00e9s", -"Caption": "Felirat", -"Insert template": "Sablon beilleszt\u00e9se" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/it_IT.js b/cps/static/js/libs/tinymce/langs/it_IT.js deleted file mode 100644 index 73b332267..000000000 --- a/cps/static/js/libs/tinymce/langs/it_IT.js +++ /dev/null @@ -1,370 +0,0 @@ -tinymce.addI18n('it_IT',{ -"Redo": "Ripristina", -"Undo": "Annulla", -"Cut": "Taglia", -"Copy": "Copia", -"Paste": "Incolla", -"Select all": "Seleziona tutto", -"New document": "Nuovo documento", -"Ok": "OK", -"Cancel": "Annulla", -"Visual aids": "Aiuti visivi", -"Bold": "Grassetto", -"Italic": "Corsivo", -"Underline": "Sottolineato", -"Strikethrough": "Barrato", -"Superscript": "Apice", -"Subscript": "Pedice", -"Clear formatting": "Cancella la formattazione", -"Align left": "Allinea a sinistra", -"Align center": "Allinea al centro", -"Align right": "Allinea a destra", -"Justify": "Giustifica", -"Bullet list": "Elenco puntato", -"Numbered list": "Elenco numerato", -"Decrease indent": "Riduci rientro", -"Increase indent": "Aumenta rientro", -"Close": "Chiudi", -"Formats": "Formati", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il browser non supporta l'accesso diretto alla cartella degli appunti. Usare i tasti di scelta rapida Ctrl+X\/C\/V.", -"Headers": "Intestazioni", -"Header 1": "Intestazione 1", -"Header 2": "Intestazione 2", -"Header 3": "Intestazione 3", -"Header 4": "Intestazione 4", -"Header 5": "Intestazione 5", -"Header 6": "Intestazione 6", -"Headings": "Titoli", -"Heading 1": "Titolo 1", -"Heading 2": "Titolo 2", -"Heading 3": "Titolo 3", -"Heading 4": "Titolo 4", -"Heading 5": "Titolo 5", -"Heading 6": "Titolo 6", -"Preformatted": "Preformattato", -"Div": "Div", -"Pre": "Pre", -"Code": "Codice", -"Paragraph": "Paragrafo", -"Blockquote": "Blockquote", -"Inline": "In linea", -"Blocks": "Blocchi", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti saranno incollati come testo normale se non viene disattivata questa opzione.", -"Fonts": "Caratteri", -"Font Sizes": "Dimensioni caratteri", -"Class": "Classe", -"Browse for an image": "Cerca un'immagine", -"OR": "OPPURE", -"Drop an image here": "Rilasciare un'immagine qui", -"Upload": "Carica", -"Block": "Blocco", -"Align": "Allinea", -"Default": "Predefinito", -"Circle": "Circolo", -"Disc": "Disco", -"Square": "Quadrato", -"Lower Alpha": "Alfabetico minuscolo", -"Lower Greek": "Greco minuscolo", -"Lower Roman": "Romano minuscolo", -"Upper Alpha": "Alfabetico maiuscolo", -"Upper Roman": "Romano maiuscolo", -"Anchor...": "Ancoraggio...", -"Name": "Nome", -"Id": "ID", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'ID dovrebbe cominciare con una lettera, seguita unicamente da lettere, numeri, linee, punti, due punti o caratteri di sottolineatura.", -"You have unsaved changes are you sure you want to navigate away?": "Ci sono modifiche non salvate, si \u00e8 sicuro di volere uscire?", -"Restore last draft": "Ripristina l'ultima bozza", -"Special characters...": "Caratteri speciali...", -"Source code": "Codice sorgente", -"Insert\/Edit code sample": "Inserisci\/modifica esempio di codice", -"Language": "Lingua", -"Code sample...": "Esempio di codice...", -"Color Picker": "Selezione colori", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Da sinistra a destra", -"Right to left": "Da destra a sinistra", -"Emoticons...": "Emoticon...", -"Metadata and Document Properties": "Metadata e propriet\u00e0 del documento", -"Title": "Titolo", -"Keywords": "Parole chiave", -"Description": "Descrizione", -"Robots": "Robot", -"Author": "Autore", -"Encoding": "Codifica", -"Fullscreen": "A tutto schermo", -"Action": "Azione", -"Shortcut": "Collegamento", -"Help": "Guida", -"Address": "Indirizzo", -"Focus to menubar": "Imposta stato attivo per la barra dei menu", -"Focus to toolbar": "Imposta stato attivo per la barra degli strumenti", -"Focus to element path": "Imposta stato attivo per il percorso dell'elemento", -"Focus to contextual toolbar": "Imposta stato attivo per la barra degli strumenti contestuale", -"Insert link (if link plugin activated)": "Inserisci un collegamento (se \u00e8 attivato l'apposito plugin)", -"Save (if save plugin activated)": "Salva (se \u00e8 attivato l'apposito plugin)", -"Find (if searchreplace plugin activated)": "Trova (se \u00e8 attivato l'apposito plugin)", -"Plugins installed ({0}):": "Plugin installati ({0}):", -"Premium plugins:": "Plugin Premium:", -"Learn more...": "Maggiori informazioni...", -"You are using {0}": "Si sta utilizzando {0}", -"Plugins": "Plugin", -"Handy Shortcuts": "Scorciatoie utili", -"Horizontal line": "Linea orizzontale", -"Insert\/edit image": "Inserisci\/modifica immagine", -"Image description": "Descrizione immagine", -"Source": "Fonte", -"Dimensions": "Dimensioni", -"Constrain proportions": "Mantieni proporzioni", -"General": "Generali", -"Advanced": "Avanzate", -"Style": "Stile", -"Vertical space": "Spazio verticale", -"Horizontal space": "Spazio orizzontale", -"Border": "Bordo", -"Insert image": "Inserisci immagine", -"Image...": "Immagine...", -"Image list": "Elenco immagini", -"Rotate counterclockwise": "Ruota in senso antiorario", -"Rotate clockwise": "Ruota in senso orario", -"Flip vertically": "Rifletti verticalmente", -"Flip horizontally": "Rifletti orizzontalmente", -"Edit image": "Modifica immagine", -"Image options": "Opzioni immagine", -"Zoom in": "Ingrandisci", -"Zoom out": "Zoom indietro", -"Crop": "Ritaglia", -"Resize": "Ridimensiona", -"Orientation": "Orientamento", -"Brightness": "Luminosit\u00e0", -"Sharpen": "Nitidezza", -"Contrast": "Contrasto", -"Color levels": "Livelli di colore", -"Gamma": "Gamma", -"Invert": "Inverti", -"Apply": "Applica", -"Back": "Indietro", -"Insert date\/time": "Inserisci data\/ora", -"Date\/time": "Data\/ora", -"Insert\/Edit Link": "Inserisci\/modifica collegamento", -"Insert\/edit link": "Inserisci\/modifica collegamento", -"Text to display": "Testo da visualizzare", -"Url": "URL", -"Open link in...": "Apri collegamento in...", -"Current window": "Finestra corrente", -"None": "Nessuno", -"New window": "Nuova finestra", -"Remove link": "Rimuovi collegamento", -"Anchors": "Ancoraggi", -"Link...": "Collegamento...", -"Paste or type a link": "Incolla o digita un collegamento", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Si vuole aggiungere il necessario prefisso mailto:?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Si vuole aggiungere il necessario prefisso http:\/\/?", -"Link list": "Elenco collegamenti", -"Insert video": "Inserisci video", -"Insert\/edit video": "Inserisci\/modifica video", -"Insert\/edit media": "Inserisci\/modifica oggetti multimediali", -"Alternative source": "Sorgente alternativa", -"Alternative source URL": "URL sorgente alternativa", -"Media poster (Image URL)": "Poster dell'oggetto multimediale (URL dell'immagine)", -"Paste your embed code below:": "Incolla il codice d'incorporamento di seguito:", -"Embed": "Incorpora", -"Media...": "Oggetto multimediale...", -"Nonbreaking space": "Spazio indivisibile", -"Page break": "Interruzione di pagina", -"Paste as text": "Incolla senza formattazioni", -"Preview": "Anteprima", -"Print...": "Stampa...", -"Save": "Salva", -"Find": "Trova", -"Replace with": "Sostituisci con", -"Replace": "Sostituisci", -"Replace all": "Sostituisci tutto", -"Previous": "Indietro", -"Next": "Avanti", -"Find and replace...": "Trova e sostituisci...", -"Could not find the specified string.": "Impossibile trovare la stringa specificata.", -"Match case": "Maiuscole\/minuscole", -"Find whole words only": "Trova solo parole intere", -"Spell check": "Controllo ortografia", -"Ignore": "Ignora", -"Ignore all": "Ignora tutto", -"Finish": "Fine", -"Add to Dictionary": "Aggiungi al dizionario", -"Insert table": "Inserisci tabella", -"Table properties": "Propriet\u00e0 della tabella", -"Delete table": "Elimina tabella", -"Cell": "Cella", -"Row": "Riga", -"Column": "Colonna", -"Cell properties": "Propriet\u00e0 cella", -"Merge cells": "Unisci le celle", -"Split cell": "Dividi la cella", -"Insert row before": "Inserisci riga prima", -"Insert row after": "Inserisci riga dopo", -"Delete row": "Elimina riga", -"Row properties": "Propriet\u00e0 della riga", -"Cut row": "Taglia riga", -"Copy row": "Copia riga", -"Paste row before": "Incolla riga prima", -"Paste row after": "Incolla riga dopo", -"Insert column before": "Inserisci colonna prima", -"Insert column after": "Inserisci colonna dopo", -"Delete column": "Elimina colonna", -"Cols": "Colonne", -"Rows": "Righe", -"Width": "Larghezza", -"Height": "Altezza", -"Cell spacing": "Spaziatura tra celle", -"Cell padding": "Spaziatura interna celle", -"Show caption": "Mostra didascalia", -"Left": "Sinistra", -"Center": "Centro", -"Right": "Destra", -"Cell type": "Tipo di cella", -"Scope": "Ambito", -"Alignment": "Allineamento", -"H Align": "Allineamento H", -"V Align": "Allineamento V", -"Top": "In alto", -"Middle": "Centrato", -"Bottom": "In basso", -"Header cell": "Cella d'intestazione", -"Row group": "Gruppo di righe", -"Column group": "Gruppo di colonne", -"Row type": "Tipo di riga", -"Header": "Intestazione", -"Body": "Corpo", -"Footer": "Pi\u00e8 di pagina", -"Border color": "Colore del bordo", -"Insert template...": "Inserisci modello...", -"Templates": "Modelli", -"Template": "Modello", -"Text color": "Colore testo", -"Background color": "Colore dello sfondo", -"Custom...": "Personalizzato...", -"Custom color": "Colore personalizzato", -"No color": "Nessun colore", -"Remove color": "Rimuovi colore", -"Table of Contents": "Sommario", -"Show blocks": "Mostra blocchi", -"Show invisible characters": "Mostra caratteri invisibili", -"Word count": "Conteggio parole", -"Words: {0}": "Parole: {0}", -"{0} words": "{0} parole", -"File": "File", -"Edit": "Modifica", -"Insert": "Inserisci", -"View": "Visualizza", -"Format": "Formato", -"Table": "Tabella", -"Tools": "Strumenti", -"Powered by {0}": "Con tecnologia {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Area di testo RTF. Premere ALT-F9 per il menu. Premere ALT-F10 per la barra degli strumenti. Premere ALT-0 per la guida.", -"Image title": "Titolo immagine", -"Border width": "Larghezza del bordo", -"Border style": "Stile del bordo", -"Error": "Errore", -"Warn": "Avviso", -"Valid": "Valido", -"To open the popup, press Shift+Enter": "Per aprire il popup, premere Shift+Invio", -"Rich Text Area. Press ALT-0 for help.": "Area di testo RTF. Premere ALT-0 per la guida.", -"System Font": "Carattere di sistema", -"Failed to upload image: {0}": "Caricamento immagine fallito: {0}", -"Failed to load plugin: {0} from url {1}": "Caricamento plugin fallito: {0} dall'URL {1}", -"Failed to load plugin url: {0}": "Caricamento URL plugin fallito: {0}", -"Failed to initialize plugin: {0}": "Inizializzazione plugin fallita: {0}", -"example": "esempio", -"Search": "Cerca", -"All": "Tutto", -"Currency": "Valuta", -"Text": "Testo", -"Quotations": "Citazioni", -"Mathematical": "Caratteri matematici", -"Extended Latin": "Latino esteso", -"Symbols": "Simboli", -"Arrows": "Frecce", -"User Defined": "Definito dall'utente", -"dollar sign": "simbolo del dollaro", -"currency sign": "simbolo di valuta", -"euro-currency sign": "simbolo dell'euro", -"colon sign": "simbolo del col\u00f3n", -"cruzeiro sign": "simbolo del cruzeiro", -"french franc sign": "simbolo del franco francese", -"lira sign": "simbolo della lira", -"mill sign": "simbolo del mill", -"naira sign": "simbolo della naira", -"peseta sign": "simbolo della peseta", -"rupee sign": "simbolo della rup\u00eca", -"won sign": "simbolo del won", -"new sheqel sign": "simbolo del nuovo shekel", -"dong sign": "simbolo del dong", -"kip sign": "simbolo del kip", -"tugrik sign": "simbolo del tugrik", -"drachma sign": "simbolo della dracma", -"german penny symbol": "simbolo del pfennig tedesco", -"peso sign": "simbolo del peso", -"guarani sign": "simbolo del guaran\u00ec", -"austral sign": "simbolo dell'austral", -"hryvnia sign": "simbolo della hryvnia", -"cedi sign": "simbolo del cedi", -"livre tournois sign": "simbolo della lira di Tours", -"spesmilo sign": "simbolo dello spesmilo", -"tenge sign": "simbolo del tenge", -"indian rupee sign": "simbolo della rup\u00eca indiana", -"turkish lira sign": "simbolo della lira turca", -"nordic mark sign": "simbolo del marco nordico", -"manat sign": "simbolo del manat", -"ruble sign": "simbolo del rublo", -"yen character": "simbolo dello yen", -"yuan character": "simbolo dello yuan", -"yuan character, in hong kong and taiwan": "simbolo dello yuan, Hong Kong e Taiwan", -"yen\/yuan character variant one": "simbolo yen\/yuan variante uno", -"Loading emoticons...": "Caricamento emoticon in corso", -"Could not load emoticons": "Impossibile caricare emoticon", -"People": "Persone", -"Animals and Nature": "Animali e natura", -"Food and Drink": "Cibi e bevande", -"Activity": "Attivit\u00e0", -"Travel and Places": "Viaggi e luoghi", -"Objects": "Oggetti", -"Flags": "Bandiere", -"Characters": "Caratteri", -"Characters (no spaces)": "Caratteri (senza spazi)", -"Error: Form submit field collision.": "Errore: Conflitto di campi nel modulo inviato.", -"Error: No form element found.": "Errore: Nessun elemento di modulo trovato.", -"Update": "Aggiorna", -"Color swatch": "Campione di colore", -"Turquoise": "Turchese", -"Green": "Verde", -"Blue": "Blu", -"Purple": "Viola", -"Navy Blue": "Blu scuro", -"Dark Turquoise": "Turchese scuro", -"Dark Green": "Verde scuro", -"Medium Blue": "Blu medio", -"Medium Purple": "Viola medio", -"Midnight Blue": "Blu notte", -"Yellow": "Giallo", -"Orange": "Arancio", -"Red": "Rosso", -"Light Gray": "Grigio chiaro", -"Gray": "Grigio", -"Dark Yellow": "Giallo scuro", -"Dark Orange": "Arancio scuro", -"Dark Red": "Rosso scuro", -"Medium Gray": "Grigio medio", -"Dark Gray": "Grigio scuro", -"Black": "Nero", -"White": "Bianco", -"Switch to or from fullscreen mode": "Attiva\/disattiva la modalit\u00e0 schermo intero", -"Open help dialog": "Apri la finestra di aiuto", -"history": "cronologia", -"styles": "stili", -"formatting": "formattazione", -"alignment": "allineamento", -"indentation": "indentazione", -"permanent pen": "penna indelebile", -"comments": "commenti" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ko_KR.js b/cps/static/js/libs/tinymce/langs/ko_KR.js deleted file mode 100644 index 08b685131..000000000 --- a/cps/static/js/libs/tinymce/langs/ko_KR.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('ko_KR',{ -"Redo": "\ub2e4\uc2dc \uc2e4\ud589", -"Undo": "\uc2e4\ud589 \ucde8\uc18c", -"Cut": "\uc798\ub77c\ub0b4\uae30", -"Copy": "\ubcf5\uc0ac", -"Paste": "\ubd99\uc5ec\ub123\uae30", -"Select all": "\uc804\uccb4\uc120\ud0dd", -"New document": "\uc0c8 \ubb38\uc11c", -"Ok": "\ud655\uc778", -"Cancel": "\ucde8\uc18c", -"Visual aids": "\uc2dc\uac01\uad50\uc7ac", -"Bold": "\uad75\uac8c", -"Italic": "\uae30\uc6b8\uc784\uaf34", -"Underline": "\ubc11\uc904", -"Strikethrough": "\ucde8\uc18c\uc120", -"Superscript": "\uc704 \ucca8\uc790", -"Subscript": "\uc544\ub798 \ucca8\uc790", -"Clear formatting": "\uc11c\uc2dd \uc9c0\uc6b0\uae30", -"Align left": "\uc67c\ucabd \ub9de\ucda4", -"Align center": "\uac00\uc6b4\ub370 \ub9de\ucda4", -"Align right": "\uc624\ub978\ucabd \ub9de\ucda4", -"Justify": "\uc591\ucabd \ub9de\ucda4", -"Bullet list": "\uae00\uba38\ub9ac \uae30\ud638 \ubaa9\ub85d", -"Numbered list": "\ubc88\ud638 \ub9e4\uae30\uae30 \ubaa9\ub85d", -"Decrease indent": "\ub0b4\uc5b4\uc4f0\uae30", -"Increase indent": "\ub4e4\uc5ec\uc4f0\uae30", -"Close": "\ub2eb\uae30", -"Formats": "\uc11c\uc2dd", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\ube0c\ub77c\uc6b0\uc800\uac00 \ud074\ub9bd\ubcf4\ub4dc \uc811\uadfc\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Ctrl+X\/C\/V \ub2e8\ucd95\ud0a4\ub97c \uc774\uc6a9\ud558\uc2ed\uc2dc\uc624.", -"Headers": "\uba38\ub9ac\uae00", -"Header 1": "\uba38\ub9ac\uae00 1", -"Header 2": "\uba38\ub9ac\uae00 2", -"Header 3": "\uba38\ub9ac\uae00 3", -"Header 4": "\uba38\ub9ac\uae00 4", -"Header 5": "\uba38\ub9ac\uae00 5", -"Header 6": "\uba38\ub9ac\uae00 6", -"Headings": "\uc81c\ubaa9", -"Heading 1": "\uc81c\ubaa9 1", -"Heading 2": "\uc81c\ubaa9 2", -"Heading 3": "\uc81c\ubaa9 3", -"Heading 4": "\uc81c\ubaa9 4", -"Heading 5": "\uc81c\ubaa9 5", -"Heading 6": "\uc81c\ubaa9 6", -"Preformatted": "\uc11c\uc2dd \ubbf8\uc124\uc815", -"Div": "Div", -"Pre": "Pre", -"Code": "\ucf54\ub4dc", -"Paragraph": "\ub2e8\ub77d", -"Blockquote": "\uc778\uc6a9\ubb38", -"Inline": "\uc778\ub77c\uc778", -"Blocks": "\ube14\ub85d", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\uc2a4\ud0c0\uc77c\ubcf5\uc0ac \ub044\uae30. \uc774 \uc635\uc158\uc744 \ub044\uae30 \uc804\uc5d0\ub294 \ubcf5\uc0ac \uc2dc, \uc2a4\ud0c0\uc77c\uc774 \ubcf5\uc0ac\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.", -"Fonts": "\uae00\uaf34", -"Font Sizes": "\uae00\uaf34 \ud06c\uae30", -"Class": "\ud074\ub798\uc2a4", -"Browse for an image": "\uc774\ubbf8\uc9c0 \ucc3e\uae30", -"OR": "\ub610\ub294", -"Drop an image here": "\uc5ec\uae30\ub85c \uc774\ubbf8\uc9c0 \ub04c\uc5b4\uc624\uae30", -"Upload": "\uc5c5\ub85c\ub4dc", -"Block": "\ube14\ub85d", -"Align": "\uc815\ub82c", -"Default": "\uae30\ubcf8", -"Circle": "\uc6d0", -"Disc": "\uc6d0\ubc18", -"Square": "\uc0ac\uac01", -"Lower Alpha": "\uc54c\ud30c\ubcb3 \uc18c\ubb38\uc790", -"Lower Greek": "\uadf8\ub9ac\uc2a4\uc5b4 \uc18c\ubb38\uc790", -"Lower Roman": "\ub85c\ub9c8\uc790 \uc18c\ubb38\uc790", -"Upper Alpha": "\uc54c\ud30c\ubcb3 \uc18c\ubb38\uc790", -"Upper Roman": "\ub85c\ub9c8\uc790 \ub300\ubb38\uc790", -"Anchor...": "\uc575\ucee4...", -"Name": "\uc774\ub984", -"Id": "\uc544\uc774\ub514", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\uc544\uc774\ub514\ub294 \ubb38\uc790, \uc22b\uc790, \ub300\uc2dc, \uc810, \ucf5c\ub860 \ub610\ub294 \ubc11\uc904\ub85c \uc2dc\uc791\ud574\uc57c\ud569\ub2c8\ub2e4.", -"You have unsaved changes are you sure you want to navigate away?": "\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc815\ubcf4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud398\uc774\uc9c0\ub97c \ubc97\uc5b4\ub098\uc2dc\uaca0\uc2b5\ub2c8\uae4c?", -"Restore last draft": "\ub9c8\uc9c0\ub9c9 \ucd08\uc548 \ubcf5\uc6d0", -"Special character...": "\ud2b9\uc218 \ubb38\uc790...", -"Source code": "\uc18c\uc2a4\ucf54\ub4dc", -"Insert\/Edit code sample": "\ucf54\ub4dc\uc0d8\ud50c \uc0bd\uc785\/\ud3b8\uc9d1", -"Language": "\uc5b8\uc5b4", -"Code sample...": "\ucf54\ub4dc \uc0d8\ud50c...", -"Color Picker": "\uc0c9 \uc120\ud0dd\uae30", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd", -"Right to left": "\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd", -"Emoticons...": "\uc774\ubaa8\ud2f0\ucf58...", -"Metadata and Document Properties": "\uba54\ud0c0\ub370\uc774\ud130\uc640 \ubb38\uc11c \uc18d\uc131", -"Title": "\uc81c\ubaa9", -"Keywords": "\ud0a4\uc6cc\ub4dc", -"Description": "\uc124\uba85", -"Robots": "\ub85c\ubd07", -"Author": "\uc800\uc790", -"Encoding": "\uc778\ucf54\ub529", -"Fullscreen": "\uc804\uccb4\ud654\uba74", -"Action": "\ub3d9\uc791", -"Shortcut": "\ub2e8\ucd95\ud0a4", -"Help": "\ub3c4\uc6c0\ub9d0", -"Address": "\uc8fc\uc18c", -"Focus to menubar": "\uba54\ub274\uc5d0 \ud3ec\ucee4\uc2a4", -"Focus to toolbar": "\ud234\ubc14\uc5d0 \ud3ec\ucee4\uc2a4", -"Focus to element path": "element path\uc5d0 \ud3ec\ucee4\uc2a4", -"Focus to contextual toolbar": "\ucf04\ud14d\uc2a4\ud2b8 \ud234\ubc14\uc5d0 \ud3ec\ucee4\uc2a4", -"Insert link (if link plugin activated)": "\ub9c1\ud06c \uc0bd\uc785 (link \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)", -"Save (if save plugin activated)": "\uc800\uc7a5 (save \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)", -"Find (if searchreplace plugin activated)": "\ucc3e\uae30(searchreplace \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)", -"Plugins installed ({0}):": "\uc124\uce58\ub41c \ud50c\ub7ec\uadf8\uc778 ({0}):", -"Premium plugins:": "\uace0\uae09 \ud50c\ub7ec\uadf8\uc778", -"Learn more...": "\uc880 \ub354 \uc0b4\ud3b4\ubcf4\uae30", -"You are using {0}": "{0}\ub97c \uc0ac\uc6a9\uc911", -"Plugins": "\ud50c\ub7ec\uadf8\uc778", -"Handy Shortcuts": "\ub2e8\ucd95\ud0a4", -"Horizontal line": "\uac00\ub85c", -"Insert\/edit image": "\uc774\ubbf8\uc9c0 \uc0bd\uc785\/\uc218\uc815", -"Image description": "\uc774\ubbf8\uc9c0 \uc124\uba85", -"Source": "\uc18c\uc2a4", -"Dimensions": "\ud06c\uae30", -"Constrain proportions": "\uc791\uc5c5 \uc81c\ud55c", -"General": "\uc77c\ubc18", -"Advanced": "\uace0\uae09", -"Style": "\uc2a4\ud0c0\uc77c", -"Vertical space": "\uc218\uc9c1 \uacf5\ubc31", -"Horizontal space": "\uc218\ud3c9 \uacf5\ubc31", -"Border": "\ud14c\ub450\ub9ac", -"Insert image": "\uc774\ubbf8\uc9c0 \uc0bd\uc785", -"Image...": "\uc774\ubbf8\uc9c0...", -"Image list": "\uc774\ubbf8\uc9c0 \ubaa9\ub85d", -"Rotate counterclockwise": "\uc2dc\uacc4\ubc18\ub300\ubc29\ud5a5\uc73c\ub85c \ud68c\uc804", -"Rotate clockwise": "\uc2dc\uacc4\ubc29\ud5a5\uc73c\ub85c \ud68c\uc804", -"Flip vertically": "\uc218\uc9c1 \ub4a4\uc9d1\uae30", -"Flip horizontally": "\uc218\ud3c9 \ub4a4\uc9d1\uae30", -"Edit image": "\uc774\ubbf8\uc9c0 \ud3b8\uc9d1", -"Image options": "\uc774\ubbf8\uc9c0 \uc635\uc158", -"Zoom in": "\ud655\ub300", -"Zoom out": "\ucd95\uc18c", -"Crop": "\uc790\ub974\uae30", -"Resize": "\ud06c\uae30 \uc870\uc808", -"Orientation": "\ubc29\ud5a5", -"Brightness": "\ubc1d\uae30", -"Sharpen": "\uc120\uba85\ud558\uac8c", -"Contrast": "\ub300\ube44", -"Color levels": "\uc0c9\uc0c1\ub808\ubca8", -"Gamma": "\uac10\ub9c8", -"Invert": "\ubc18\uc804", -"Apply": "\uc801\uc6a9", -"Back": "\ub4a4\ub85c", -"Insert date\/time": "\ub0a0\uc9dc\/\uc2dc\uac04\uc0bd\uc785", -"Date\/time": "\ub0a0\uc9dc\/\uc2dc\uac04", -"Insert\/Edit Link": "\ub9c1\ud06c \uc0bd\uc785\/\ud3b8\uc9d1", -"Insert\/edit link": "\ub9c1\ud06c \uc0bd\uc785\/\uc218\uc815", -"Text to display": "\ubcf8\ubb38", -"Url": "\uc8fc\uc18c", -"Open link in...": "...\uc5d0\uc11c \ub9c1\ud06c \uc5f4\uae30", -"Current window": "\ud604\uc7ac \ucc3d", -"None": "\uc5c6\uc74c", -"New window": "\uc0c8\ucc3d", -"Remove link": "\ub9c1\ud06c\uc0ad\uc81c", -"Anchors": "\ucc45\uac08\ud53c", -"Link...": "\ub9c1\ud06c...", -"Paste or type a link": "\ub9c1\ud06c\ub97c \ubd99\uc5ec\ub123\uac70\ub098 \uc785\ub825\ud558\uc138\uc694", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\ud604\uc7ac E-mail\uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc168\uc2b5\ub2c8\ub2e4. E-mail \uc8fc\uc18c\uc5d0 \ub9c1\ud06c\ub97c \uac78\uae4c\uc694?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\ud604\uc7ac \uc6f9\uc0ac\uc774\ud2b8 \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc168\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uc8fc\uc18c\uc5d0 \ub9c1\ud06c\ub97c \uac78\uae4c\uc694?", -"Link list": "\ub9c1\ud06c \ub9ac\uc2a4\ud2b8", -"Insert video": "\ube44\ub514\uc624 \uc0bd\uc785", -"Insert\/edit video": "\ube44\ub514\uc624 \uc0bd\uc785\/\uc218\uc815", -"Insert\/edit media": "\ubbf8\ub514\uc5b4 \uc0bd\uc785\/\uc218\uc815", -"Alternative source": "\ub300\uccb4 \uc18c\uc2a4", -"Alternative source URL": "\ub300\uccb4 \uc6d0\ubcf8 URL", -"Media poster (Image URL)": "\ub300\ud45c \uc774\ubbf8\uc9c0(\uc774\ubbf8\uc9c0 URL)", -"Paste your embed code below:": "\uc544\ub798\uc5d0 \ucf54\ub4dc\ub97c \ubd99\uc5ec\ub123\uc73c\uc138\uc694:", -"Embed": "\uc0bd\uc785", -"Media...": "\ubbf8\ub514\uc5b4...", -"Nonbreaking space": "\ub744\uc5b4\uc4f0\uae30", -"Page break": "\ud398\uc774\uc9c0 \uad6c\ubd84\uc790", -"Paste as text": "\ud14d\uc2a4\ud2b8\ub85c \ubd99\uc5ec\ub123\uae30", -"Preview": "\ubbf8\ub9ac\ubcf4\uae30", -"Print...": "\uc778\uc1c4...", -"Save": "\uc800\uc7a5", -"Find": "\ucc3e\uae30", -"Replace with": "\uad50\uccb4", -"Replace": "\uad50\uccb4", -"Replace all": "\uc804\uccb4 \uad50\uccb4", -"Previous": "\uc774\uc804", -"Next": "\ub2e4\uc74c", -"Find and replace...": "\ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30...", -"Could not find the specified string.": "\ubb38\uc790\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", -"Match case": "\ub300\uc18c\ubb38\uc790 \uc77c\uce58", -"Find whole words only": "\ubaa8\ub450 \uc77c\uce58\ud558\ub294 \ubb38\uc790 \ucc3e\uae30", -"Spell check": "\ub9de\ucda4\ubc95 \uac80\uc0ac", -"Ignore": "\ubb34\uc2dc", -"Ignore all": "\uc804\uccb4\ubb34\uc2dc", -"Finish": "\uc644\ub8cc", -"Add to Dictionary": "\uc0ac\uc804\uc5d0 \ucd94\uac00", -"Insert table": "\ud14c\uc774\ube14 \uc0bd\uc785", -"Table properties": "\ud14c\uc774\ube14 \uc18d\uc131", -"Delete table": "\ud14c\uc774\ube14 \uc0ad\uc81c", -"Cell": "\uc140", -"Row": "\uc5f4", -"Column": "\ud589", -"Cell properties": "\uc140 \uc18d", -"Merge cells": "\uc140 \ud569\uce58\uae30", -"Split cell": "\uc140 \ub098\ub204\uae30", -"Insert row before": "\uc774\uc804\uc5d0 \ud589 \uc0bd\uc785", -"Insert row after": "\ub2e4\uc74c\uc5d0 \ud589 \uc0bd\uc785", -"Delete row": "\ud589 \uc9c0\uc6b0\uae30", -"Row properties": "\ud589 \uc18d\uc131", -"Cut row": "\ud589 \uc798\ub77c\ub0b4\uae30", -"Copy row": "\ud589 \ubcf5\uc0ac", -"Paste row before": "\uc774\uc804\uc5d0 \ud589 \ubd99\uc5ec\ub123\uae30", -"Paste row after": "\ub2e4\uc74c\uc5d0 \ud589 \ubd99\uc5ec\ub123\uae30", -"Insert column before": "\uc774\uc804\uc5d0 \ud589 \uc0bd\uc785", -"Insert column after": "\ub2e4\uc74c\uc5d0 \uc5f4 \uc0bd\uc785", -"Delete column": "\uc5f4 \uc9c0\uc6b0\uae30", -"Cols": "\uc5f4", -"Rows": "\ud589", -"Width": "\ub113\uc774", -"Height": "\ub192\uc774", -"Cell spacing": "\uc140 \uac04\uaca9", -"Cell padding": "\uc140 \uc548\ucabd \uc5ec\ubc31", -"Show caption": "\ucea1\uc158 \ud45c\uc2dc", -"Left": "\uc67c\ucabd", -"Center": "\uac00\uc6b4\ub370", -"Right": "\uc624\ub978\ucabd", -"Cell type": "\uc140 \ud0c0\uc785", -"Scope": "\ubc94\uc704", -"Alignment": "\uc815\ub82c", -"H Align": "\uac00\ub85c \uc815\ub82c", -"V Align": "\uc138\ub85c \uc815\ub82c", -"Top": "\uc0c1\ub2e8", -"Middle": "\uc911\uac04", -"Bottom": "\ud558\ub2e8", -"Header cell": "\ud5e4\ub354 \uc140", -"Row group": "\ud589 \uadf8\ub8f9", -"Column group": "\uc5f4 \uadf8\ub8f9", -"Row type": "\ud589 \ud0c0\uc785", -"Header": "\ud5e4\ub354", -"Body": "\ubc14\ub514", -"Footer": "\ud478\ud130", -"Border color": "\ud14c\ub450\ub9ac \uc0c9", -"Insert template...": "\ud15c\ud50c\ub9bf \uc0bd\uc785...", -"Templates": "\ud15c\ud50c\ub9bf", -"Template": "\ud15c\ud50c\ub9bf", -"Text color": "\ubb38\uc790 \uc0c9\uae54", -"Background color": "\ubc30\uacbd\uc0c9", -"Custom...": "\uc9c1\uc811 \uc0c9\uae54 \uc9c0\uc815\ud558\uae30", -"Custom color": "\uc9c1\uc811 \uc9c0\uc815\ud55c \uc0c9\uae54", -"No color": "\uc0c9\uc0c1 \uc5c6\uc74c", -"Remove color": "\uc0c9 \uc81c\uac70", -"Table of Contents": "\ubaa9\ucc28", -"Show blocks": "\ube14\ub7ed \ubcf4\uc5ec\uc8fc\uae30", -"Show invisible characters": "\uc548\ubcf4\uc774\ub294 \ubb38\uc790 \ubcf4\uc774\uae30", -"Word count": "\ub2e8\uc5b4 \uc218", -"Count": "\uac1c\uc218", -"Document": "\ubb38\uc11c", -"Selection": "\uc120\ud0dd", -"Words": "\ub2e8\uc5b4", -"Words: {0}": "\ub2e8\uc5b4: {0}", -"{0} words": "{0} \ub2e8\uc5b4", -"File": "\ud30c\uc77c", -"Edit": "\uc218\uc815", -"Insert": "\uc0bd\uc785", -"View": "\ubcf4\uae30", -"Format": "\ud3ec\ub9f7", -"Table": "\ud14c\uc774\ube14", -"Tools": "\ub3c4\uad6c", -"Powered by {0}": "Powered by {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\uc11c\uc2dd \uc788\ub294 \ud14d\uc2a4\ud2b8 \ud3b8\uc9d1\uae30 \uc785\ub2c8\ub2e4. ALT-F9\ub97c \ub204\ub974\uba74 \uba54\ub274, ALT-F10\ub97c \ub204\ub974\uba74 \ud234\ubc14, ALT-0\uc744 \ub204\ub974\uba74 \ub3c4\uc6c0\ub9d0\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.", -"Image title": "\uc774\ubbf8\uc9c0 \uc81c\ubaa9", -"Border width": "\ud14c\ub450\ub9ac \ub450\uaed8", -"Border style": "\ud14c\ub450\ub9ac \uc2a4\ud0c0\uc77c", -"Error": "\uc624\ub958", -"Warn": "\uacbd\uace0", -"Valid": "\uc720\ud6a8\ud568", -"To open the popup, press Shift+Enter": "\ud31d\uc5c5\uc744 \uc5f4\ub824\uba74 Shift+Enter\ub97c \ub204\ub974\uc2ed\uc2dc\uc624.", -"Rich Text Area. Press ALT-0 for help.": "\uc11c\uc2dd \uc788\ub294 \ud14d\uc2a4\ud2b8 \uc601\uc5ed. ALT-0\uc744 \ub204\ub974\uba74 \ub3c4\uc6c0\ub9d0\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.", -"System Font": "\uc2dc\uc2a4\ud15c \uae00\uaf34", -"Failed to upload image: {0}": "\uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc \uc2e4\ud328: {0}", -"Failed to load plugin: {0} from url {1}": "\ud50c\ub7ec\uadf8\uc778 \ub85c\ub4dc \uc2e4\ud328: URL: {1}\uc5d0\uc11c\uc758 {0}", -"Failed to load plugin url: {0}": "\ud50c\ub7ec\uadf8\uc778 URL \ub85c\ub4dc \uc2e4\ud328: {0}", -"Failed to initialize plugin: {0}": "\ud50c\ub7ec\uadf8\uc778 \ucd08\uae30\ud654 \uc2e4\ud328: {0}", -"example": "\uc608\uc81c", -"Search": "\uac80\uc0c9", -"All": "\ubaa8\ub450", -"Currency": "\ud1b5\ud654", -"Text": "\ud14d\uc2a4\ud2b8", -"Quotations": "\uc778\uc6a9\ubb38", -"Mathematical": "\uc218\ud559", -"Extended Latin": "\ud655\uc7a5 \ub77c\ud2f4\uc5b4", -"Symbols": "\uae30\ud638", -"Arrows": "\ud654\uc0b4\ud45c", -"User Defined": "\uc0ac\uc6a9\uc790 \uc815\uc758", -"dollar sign": "\ub2ec\ub7ec \uae30\ud638", -"currency sign": "\ud1b5\ud654 \uae30\ud638", -"euro-currency sign": "\uc720\ub85c\ud654 \uae30\ud638", -"colon sign": "\ucf5c\ub860 \uae30\ud638", -"cruzeiro sign": "\ud06c\ub8e8\uc81c\uc774\ub8e8 \uae30\ud638", -"french franc sign": "\ud504\ub791\uc2a4 \ud504\ub791 \uae30\ud638", -"lira sign": "\ub9ac\ub77c \uae30\ud638", -"mill sign": "\ubc00 \uae30\ud638", -"naira sign": "\ub098\uc774\ub77c \uae30\ud638", -"peseta sign": "\ud398\uc138\ud0c0 \uae30\ud638", -"rupee sign": "\ub8e8\ud53c \uae30\ud638", -"won sign": "\uc6d0 \uae30\ud638", -"new sheqel sign": "\ub274 \uc138\ucf08 \uae30\ud638", -"dong sign": "\ub3d9 \uae30\ud638", -"kip sign": "\ud0b5 \uae30\ud638", -"tugrik sign": "\ud22c\uadf8\ub9ac\ud06c \uae30\ud638", -"drachma sign": "\ub4dc\ub77c\ud06c\ub9c8 \uae30\ud638", -"german penny symbol": "\ub3c5\uc77c \ud398\ub2c8 \uae30\ud638", -"peso sign": "\ud398\uc18c \uae30\ud638", -"guarani sign": "\uacfc\ub77c\ub2c8 \uae30\ud638", -"austral sign": "\uc544\uc6b0\uc2a4\ud2b8\ub784 \uae30\ud638", -"hryvnia sign": "\uadf8\ub9ac\ube0c\ub098 \uae30\ud638", -"cedi sign": "\uc138\ub514 \uae30\ud638", -"livre tournois sign": "\ub9ac\ube0c\ub974 \ud2b8\ub974\ub204\uc544 \uae30\ud638", -"spesmilo sign": "\uc2a4\ud398\uc2a4\ubc00\ub85c \uae30\ud638", -"tenge sign": "\ud161\uac8c \uae30\ud638", -"indian rupee sign": "\uc778\ub3c4 \ub8e8\ud53c \uae30\ud638", -"turkish lira sign": "\ud130\ud0a4 \ub9ac\ub77c \uae30\ud638", -"nordic mark sign": "\ub178\ub974\ub515 \ub9c8\ub974\ud06c \uae30\ud638", -"manat sign": "\ub9c8\ub098\ud2b8 \uae30\ud638", -"ruble sign": "\ub8e8\ube14 \uae30\ud638", -"yen character": "\uc5d4 \uae30\ud638", -"yuan character": "\uc704\uc548 \uae30\ud638", -"yuan character, in hong kong and taiwan": "\ub300\ub9cc \uc704\uc548 \uae30\ud638", -"yen\/yuan character variant one": "\uc5d4\/\uc704\uc548 \ubb38\uc790 \ubcc0\ud615", -"Loading emoticons...": "\uc774\ubaa8\ud2f0\ucf58 \ubd88\ub7ec\uc624\ub294 \uc911...", -"Could not load emoticons": "\uc774\ubaa8\ud2f0\ucf58\uc744 \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c", -"People": "\uc0ac\ub78c", -"Animals and Nature": "\ub3d9\ubb3c\uacfc \uc790\uc5f0", -"Food and Drink": "\uc74c\uc2dd\uacfc \uc74c\ub8cc", -"Activity": "\ud65c\ub3d9", -"Travel and Places": "\uc5ec\ud589\uacfc \uc7a5\uc18c", -"Objects": "\ubb3c\uac74", -"Flags": "\uae43\ubc1c", -"Characters": "\ubb38\uc790", -"Characters (no spaces)": "\ubb38\uc790(\uacf5\ubc31 \uc5c6\uc74c)", -"{0} characters": "{0} \ubb38\uc790", -"Error: Form submit field collision.": "\uc624\ub958: \uc591\uc2dd \uc81c\ucd9c \ud544\ub4dc \ubd88\uc77c\uce58", -"Error: No form element found.": "\uc624\ub958: \uc591\uc2dd \ud56d\ubaa9 \uc5c6\uc74c", -"Update": "\uc5c5\ub370\uc774\ud2b8", -"Color swatch": "\uc0c9\uc0c1 \uacac\ubcf8", -"Turquoise": "\uccad\ub85d\uc0c9", -"Green": "\ucd08\ub85d\uc0c9", -"Blue": "\ud30c\ub780\uc0c9", -"Purple": "\ubcf4\ub77c\uc0c9", -"Navy Blue": "\ub0a8\uc0c9", -"Dark Turquoise": "\uc9c4\ud55c \uccad\ub85d\uc0c9", -"Dark Green": "\uc9c4\ud55c \ucd08\ub85d\uc0c9", -"Medium Blue": "\uc911\uac04 \ud30c\ub780\uc0c9", -"Medium Purple": "\uc911\uac04 \ubcf4\ub77c\uc0c9", -"Midnight Blue": "\uc9c4\ud55c \ud30c\ub780\uc0c9", -"Yellow": "\ub178\ub780\uc0c9", -"Orange": "\uc8fc\ud669\uc0c9", -"Red": "\ube68\uac04\uc0c9", -"Light Gray": "\ubc1d\uc740 \ud68c\uc0c9", -"Gray": "\ud68c\uc0c9", -"Dark Yellow": "\uc9c4\ud55c \ub178\ub780\uc0c9", -"Dark Orange": "\uc9c4\ud55c \uc8fc\ud669\uc0c9", -"Dark Red": "\uc9c4\ud55c \ube68\uac04\uc0c9", -"Medium Gray": "\uc911\uac04 \ud68c\uc0c9", -"Dark Gray": "\uc9c4\ud55c \ud68c\uc0c9", -"Light Green": "\ubc1d\uc740 \ub179\uc0c9", -"Light Yellow": "\ubc1d\uc740 \ub178\ub780\uc0c9", -"Light Red": "\ubc1d\uc740 \ube68\uac04\uc0c9", -"Light Purple": "\ubc1d\uc740 \ubcf4\ub77c\uc0c9", -"Light Blue": "\ubc1d\uc740 \ud30c\ub780\uc0c9", -"Dark Purple": "\uc9c4\ud55c \ubcf4\ub77c\uc0c9", -"Dark Blue": "\uc9c4\ud55c \ud30c\ub780\uc0c9", -"Black": "\uac80\uc740\uc0c9", -"White": "\ud770\uc0c9", -"Switch to or from fullscreen mode": "\uc804\uccb4 \ud654\uba74\uc73c\ub85c\/\uc5d0\uc11c \uc804\ud658", -"Open help dialog": "\ub3c4\uc6c0\ub9d0 \ub300\ud654\ucc3d \uc5f4\uae30", -"history": "\uae30\ub85d", -"styles": "\uc2a4\ud0c0\uc77c", -"formatting": "\ud3ec\ub9f7\ud305", -"alignment": "\uc815\ub82c", -"indentation": "\ub4e4\uc5ec\uc4f0\uae30", -"permanent pen": "\uc720\uc131\ud39c", -"comments": "\uc8fc\uc11d", -"Format Painter": "\uc11c\uc2dd \ubcf5\uc0ac", -"Insert\/edit iframe": "\uc544\uc774\ud504\ub808\uc784 \uc0bd\uc785\/\ud3b8\uc9d1", -"Capitalization": "\ub300\ubb38\uc790\ud654", -"lowercase": "\uc18c\ubb38\uc790", -"UPPERCASE": "\ub300\ubb38\uc790", -"Title Case": "\uc81c\ubaa9\uc744 \ub300\ubb38\uc790\ud654", -"Permanent Pen Properties": "\uc601\uad6c \ud39c \ud2b9\uc131", -"Permanent pen properties...": "\uc601\uad6c \ud39c \ud2b9\uc131...", -"Font": "\uae00\uaf34", -"Size": "\ud06c\uae30", -"More...": "\ub354 \ubcf4\uae30...", -"Spellcheck Language": "\ub9de\ucda4\ubc95 \uac80\uc0ac \uc5b8\uc5b4", -"Select...": "\uc120\ud0dd...", -"Preferences": "\ud658\uacbd\uc124\uc815", -"Yes": "\ub124", -"No": "\uc544\ub2c8\uc624", -"Keyboard Navigation": "\ud0a4 \uc120\ud0dd", -"Version": "\ubc84\uc804", -"Anchor": "\uc575\ucee4", -"Special character": "\ud2b9\uc218\ubb38\uc790", -"Code sample": "\ucf54\ub4dc\uc0d8\ud50c", -"Color": "\uc0c9\uc0c1", -"Emoticons": "\uc774\ubaa8\ud2f0\ucf58", -"Document properties": "\ubb38\uc11c \uc18d\uc131", -"Image": "\uc774\ubbf8\uc9c0", -"Insert link": "\ub9c1\ud06c \uc0bd\uc785 ", -"Target": "\ub300\uc0c1", -"Link": "\ub9c1\ud06c", -"Poster": "\ud3ec\uc2a4\ud130", -"Media": "\ubbf8\ub514\uc5b4", -"Print": "\ucd9c\ub825", -"Prev": "\uc774\uc804", -"Find and replace": "\ucc3e\uc544\uc11c \uad50\uccb4", -"Whole words": "\uc804\uccb4 \ub2e8\uc5b4", -"Spellcheck": "\ubb38\ubc95\uccb4\ud06c", -"Caption": "\ucea1\uc158", -"Insert template": "\ud15c\ud50c\ub9bf \uc0bd\uc785" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/nb_NO.js b/cps/static/js/libs/tinymce/langs/nb_NO.js deleted file mode 100644 index b76a2efd1..000000000 --- a/cps/static/js/libs/tinymce/langs/nb_NO.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('nb_NO',{ -"Redo": "Gj\u00f8r om", -"Undo": "Angre", -"Cut": "Klipp ut", -"Copy": "Kopier", -"Paste": "Lim inn", -"Select all": "Marker alt", -"New document": "Nytt dokument", -"Ok": "Ok", -"Cancel": "Avbryt", -"Visual aids": "Visuelle hjelpemidler", -"Bold": "Fet", -"Italic": "Kursiv", -"Underline": "Understreking", -"Strikethrough": "Gjennomstreking", -"Superscript": "Hevet skrift", -"Subscript": "Senket skrift", -"Clear formatting": "Fjern formateringer", -"Align left": "Venstrejuster", -"Align center": "Midtstill", -"Align right": "H\u00f8yrejuster", -"Justify": "Blokkjuster", -"Bullet list": "Punktliste", -"Numbered list": "Nummerliste", -"Decrease indent": "Reduser innrykk", -"Increase indent": "\u00d8k innrykk", -"Close": "Lukk", -"Formats": "Stiler", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Nettleseren din st\u00f8tter ikke direkte tilgang til utklippsboken. Bruk istedet tastatursnarveiene Ctrl+X\/C\/V.", -"Headers": "Overskrifter", -"Header 1": "Overskrift 1", -"Header 2": "Overskrift 2", -"Header 3": "Overskrift 3", -"Header 4": "Overskrift 4", -"Header 5": "Overskrift 5", -"Header 6": "Overskrift 6", -"Headings": "Overskrifter", -"Heading 1": "Overskrift 1", -"Heading 2": "Overskrift 2", -"Heading 3": "Overskrift 3", -"Heading 4": "Overskrift 4", -"Heading 5": "Overskrift 5", -"Heading 6": "Overskrift 6", -"Preformatted": "Forh\u00e5ndsformatert", -"Div": "Div", -"Pre": "Pre", -"Code": "Kode", -"Paragraph": "Avsnitt", -"Blockquote": "Blockquote", -"Inline": "Innkapslet", -"Blocks": "Blokker", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Lim inn er n\u00e5 i ren-tekst modus. Kopiert innhold vil bli limt inn som ren tekst inntil du sl\u00e5r av dette valget.", -"Fonts": "Fonter", -"Font Sizes": "Fontst\u00f8rrelser", -"Class": "Klasse", -"Browse for an image": "S\u00f8k etter bilde", -"OR": "OR", -"Drop an image here": "Slipp et bilde her", -"Upload": "Last opp", -"Block": "Blokk", -"Align": "Juster", -"Default": "Normal", -"Circle": "\u00c5pen sirkel", -"Disc": "Fylt sirkel", -"Square": "Fylt firkant", -"Lower Alpha": "Minuskler", -"Lower Greek": "Greske minuskler", -"Lower Roman": "Romerske minuskler", -"Upper Alpha": "Versaler", -"Upper Roman": "Romerske versaler", -"Anchor...": "Lenke", -"Name": "Navn", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id burde starte med en bokstav, bare fulgt av bokstaver, nummer, streker, punktum, koloner eller understreker.", -"You have unsaved changes are you sure you want to navigate away?": "Du har ikke arkivert endringene. Vil du fortsette uten \u00e5 arkivere?", -"Restore last draft": "Gjenopprett siste utkast", -"Special character...": "Spesialtegn...", -"Source code": "Kildekode", -"Insert\/Edit code sample": "Sett inn\/endre kodeeksempel", -"Language": "Spr\u00e5k", -"Code sample...": "Kodeeksempel", -"Color Picker": "Fargevelger", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Venstre til h\u00f8yre", -"Right to left": "H\u00f8yre til venstre", -"Emoticons...": "Emoticons..", -"Metadata and Document Properties": "Metadata og dokumentverdier", -"Title": "Tittel", -"Keywords": "N\u00f8kkelord", -"Description": "Beskrivelse", -"Robots": "Roboter", -"Author": "Forfatter", -"Encoding": "Tegnkoding", -"Fullscreen": "Fullskjerm", -"Action": "Handling", -"Shortcut": "Snarvei", -"Help": "Hjelp", -"Address": "Adresse", -"Focus to menubar": "Fokus p\u00e5 menylinje", -"Focus to toolbar": "Fokus p\u00e5 verkt\u00f8ylinje", -"Focus to element path": "Fokus p\u00e5 elementsti", -"Focus to contextual toolbar": "Fokus p\u00e5 kontekstuell verkt\u00f8ylinje", -"Insert link (if link plugin activated)": "Sett inn lenke (dersom lenketillegg er aktivert)", -"Save (if save plugin activated)": "Lagre (dersom lagretillegg er aktivert)", -"Find (if searchreplace plugin activated)": "Finn (dersom tillegg for s\u00f8k og erstatt er aktivert)", -"Plugins installed ({0}):": "Installerte tillegg ({0}):", -"Premium plugins:": "Premiumtillegg:", -"Learn more...": "Les mer ...", -"You are using {0}": "Du bruker {0}", -"Plugins": "Tillegg", -"Handy Shortcuts": "Nyttige snarveier", -"Horizontal line": "Horisontal linje", -"Insert\/edit image": "Sett inn\/endre bilde", -"Image description": "Bildebeskrivelse", -"Source": "Bildelenke", -"Dimensions": "Dimensjoner", -"Constrain proportions": "Behold proporsjoner", -"General": "Generelt", -"Advanced": "Avansert", -"Style": "Stil", -"Vertical space": "Vertikal marg", -"Horizontal space": "Horisontal marg", -"Border": "Ramme", -"Insert image": "Sett inn bilde", -"Image...": "Bilde...", -"Image list": "Bildeliste", -"Rotate counterclockwise": "Roter mot venstre", -"Rotate clockwise": "Roter mot h\u00f8yre", -"Flip vertically": "Speilvend vertikalt", -"Flip horizontally": "Speilvend horisontalt", -"Edit image": "Rediger bilde", -"Image options": "Bilde innstillinger", -"Zoom in": "Zoom inn", -"Zoom out": "Zoom ut", -"Crop": "Beskj\u00e6r", -"Resize": "Skaler", -"Orientation": "Orientering", -"Brightness": "Lysstyrke", -"Sharpen": "Skarphet", -"Contrast": "Kontrast", -"Color levels": "Fargeniv\u00e5", -"Gamma": "Gamma", -"Invert": "Inverter", -"Apply": "Utf\u00f8r", -"Back": "Tilbake", -"Insert date\/time": "Sett inn dato\/tid", -"Date\/time": "Dato\/tid", -"Insert\/Edit Link": "Sett inn \/ Rediger lenke", -"Insert\/edit link": "Sett inn\/endre lenke", -"Text to display": "Tekst som skal vises", -"Url": "Url", -"Open link in...": "\u00c5pne lenke i..", -"Current window": "N\u00e5v\u00e6rende vindu", -"None": "Ingen", -"New window": "Nytt vindu", -"Remove link": "Fjern lenke", -"Anchors": "Anker", -"Link...": "Lenke...", -"Paste or type a link": "Lim inn eller skriv en lenke", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Oppgitte URL ser ut til \u00e5 v\u00e6re en epost-adresse. \u00d8nsker du \u00e5 sette inn p\u00e5krevet mailto: prefiks forran epost-adressen?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Oppgitt URL ser ut til \u00e5 v\u00e6re en e-postadresse. \u00d8nsker du \u00e5 sette inn p\u00e5krevd mailto:-prefiks foran e-postadressen?", -"Link list": "Lenkeliste", -"Insert video": "Sett inn video", -"Insert\/edit video": "Sett inn\/rediger video", -"Insert\/edit media": "Sett inn\/endre media", -"Alternative source": "Alternativ kilde", -"Alternative source URL": "Alternativ kilde URL", -"Media poster (Image URL)": "Mediaposter (bilde-URL)", -"Paste your embed code below:": "Lim inn inkluderings-koden nedenfor", -"Embed": "Inkluder", -"Media...": "Media..", -"Nonbreaking space": "Hardt mellomrom", -"Page break": "Sideskifte", -"Paste as text": "Lim inn som tekst", -"Preview": "Forh\u00e5ndsvisning", -"Print...": "Skriv ut...", -"Save": "Arkiver", -"Find": "Finn", -"Replace with": "Erstatt med", -"Replace": "Erstatt", -"Replace all": "Erstatt alle", -"Previous": "Forrige", -"Next": "Neste", -"Find and replace...": "Finn og erstatt...", -"Could not find the specified string.": "Kunne ikke finne den spesifiserte teksten", -"Match case": "Match store og sm\u00e5 bokstaver", -"Find whole words only": "Finn kun hele ord", -"Spell check": "Stavekontroll", -"Ignore": "Ignorer", -"Ignore all": "Ignorer alle", -"Finish": "Avslutt", -"Add to Dictionary": "Legg til i ordliste", -"Insert table": "Sett inn tabell", -"Table properties": "Tabell egenskaper", -"Delete table": "Slett tabell", -"Cell": "Celle", -"Row": "Rad", -"Column": "Kolonne", -"Cell properties": "Celle egenskaper", -"Merge cells": "Sl\u00e5 sammen celler", -"Split cell": "Splitt celle", -"Insert row before": "Sett inn rad f\u00f8r", -"Insert row after": "Sett in rad etter", -"Delete row": "Slett rad", -"Row properties": "Rad egenskaper", -"Cut row": "Klipp ut rad", -"Copy row": "Kopier rad", -"Paste row before": "Lim inn rad f\u00f8r", -"Paste row after": "Lim inn rad etter", -"Insert column before": "Sett inn kolonne f\u00f8r", -"Insert column after": "Sett inn kolonne etter", -"Delete column": "Slett kolonne", -"Cols": "Kolonner", -"Rows": "Rader", -"Width": "Bredde", -"Height": "H\u00f8yde", -"Cell spacing": "Celleavstand", -"Cell padding": "Cellemarg", -"Show caption": "Vis bildetekst", -"Left": "Venstre", -"Center": "Midtstilt", -"Right": "H\u00f8yre", -"Cell type": "Celletype", -"Scope": "Omfang", -"Alignment": "Justering", -"H Align": "H Justering", -"V Align": "V Justering", -"Top": "Topp", -"Middle": "Midten", -"Bottom": "Bunn", -"Header cell": "Topptekst-celle", -"Row group": "Radgruppe", -"Column group": "Kolonnegruppe", -"Row type": "Rad-type", -"Header": "Topptekst", -"Body": "Br\u00f8dtekst", -"Footer": "Bunntekst", -"Border color": "Rammefarge", -"Insert template...": "Sett inn mal..", -"Templates": "Maler", -"Template": "Mal", -"Text color": "Tekstfarge", -"Background color": "Bakgrunnsfarge", -"Custom...": "Tilpass...", -"Custom color": "Tilpasset farge", -"No color": "Ingen farge", -"Remove color": "Fjern farge", -"Table of Contents": "Innholdsfortegnelse", -"Show blocks": "Vis blokker", -"Show invisible characters": "Vis skjulte tegn", -"Word count": "Ordtelling", -"Count": "Opptelling", -"Document": "Dokument", -"Selection": "Utvalg", -"Words": "Ord", -"Words: {0}": "Antall ord: {0}", -"{0} words": "{0} ord", -"File": "Arkiv", -"Edit": "Rediger", -"Insert": "Sett inn", -"View": "Vis", -"Format": "Format", -"Table": "Tabell", -"Tools": "Verkt\u00f8y", -"Powered by {0}": "Redigert med {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Tekstredigering. Tast ALT-F9 for meny. Tast ALT-F10 for verkt\u00f8ys-rader. Tast ALT-0 for hjelp.", -"Image title": "Bildetittel", -"Border width": "Bordbredde", -"Border style": "Bordstil", -"Error": "Feil", -"Warn": "Advarsel", -"Valid": "Gyldig", -"To open the popup, press Shift+Enter": "For \u00e5 \u00e5pne popup, trykk Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "Rik-tekstomr\u00e5de. Trykk ALT-0 for hjelp.", -"System Font": "Systemfont", -"Failed to upload image: {0}": "Opplasting av bilde feilet: {0}", -"Failed to load plugin: {0} from url {1}": "Kunne ikke laste tillegg: {0} from url {1}", -"Failed to load plugin url: {0}": "Kunne ikke laste tillegg url: {0}", -"Failed to initialize plugin: {0}": "Kunne ikke initialisere tillegg: {0}", -"example": "eksempel", -"Search": "S\u00f8k", -"All": "Alle", -"Currency": "Valuta", -"Text": "Tekst", -"Quotations": "Sitater", -"Mathematical": "Matematisk", -"Extended Latin": "Utvidet latin", -"Symbols": "Symboler", -"Arrows": "Piler", -"User Defined": "Brukerdefinert", -"dollar sign": "dollartegn", -"currency sign": "valutasymbol", -"euro-currency sign": "Euro-valutasymbol", -"colon sign": "kolon-symbol", -"cruzeiro sign": "cruzeiro-symbol", -"french franc sign": "franske franc-symbol", -"lira sign": "lire-symbol", -"mill sign": "mill-symbol", -"naira sign": "naira-symbol", -"peseta sign": "peseta-symbol", -"rupee sign": "rupee-symbol", -"won sign": "won-symbol", -"new sheqel sign": "Ny sheqel-symbol", -"dong sign": "dong-symbol", -"kip sign": "kip-symbol", -"tugrik sign": "tugrik-symbol", -"drachma sign": "drachma-symbol", -"german penny symbol": "tysk penny-symbol", -"peso sign": "peso-symbol", -"guarani sign": "quarani-symbol", -"austral sign": "austral-symbol", -"hryvnia sign": "hryvina-symbol", -"cedi sign": "credi-symbol", -"livre tournois sign": "livre tournois-symbol", -"spesmilo sign": "spesmilo-symbol", -"tenge sign": "tenge-symbol", -"indian rupee sign": "indisk rupee-symbol", -"turkish lira sign": "tyrkisk lire-symbol", -"nordic mark sign": "nordisk mark-symbol", -"manat sign": "manat-symbol", -"ruble sign": "ruble-symbol", -"yen character": "yen-symbol", -"yuan character": "yuan-symbol", -"yuan character, in hong kong and taiwan": "yuan-symbol, i Hongkong og Taiwan", -"yen\/yuan character variant one": "yen\/yuan-symbol variant en", -"Loading emoticons...": "Laster emoticons..", -"Could not load emoticons": "Kunne ikke laste emoticons", -"People": "Mennesker", -"Animals and Nature": "Dyr og natur", -"Food and Drink": "Mat og drikke", -"Activity": "Aktivitet", -"Travel and Places": "Reise og steder", -"Objects": "Objekter", -"Flags": "Flagg", -"Characters": "Tegn", -"Characters (no spaces)": "Tegn (uten mellomrom)", -"{0} characters": "{0} tegn", -"Error: Form submit field collision.": "Feil: Skjemafelt innsendingskollisjon.", -"Error: No form element found.": "Feil: Intet skjemafelt funnet.", -"Update": "Oppdater", -"Color swatch": "Fargepalett", -"Turquoise": "Turkis", -"Green": "Gr\u00f8nn", -"Blue": "Bl\u00e5", -"Purple": "Lilla", -"Navy Blue": "Marinebl\u00e5", -"Dark Turquoise": "M\u00f8rk turkis", -"Dark Green": "M\u00f8rkegr\u00f8nn", -"Medium Blue": "Mellombl\u00e5", -"Medium Purple": "Medium lilla", -"Midnight Blue": "Midnattbl\u00e5", -"Yellow": "Gul", -"Orange": "Oransje", -"Red": "R\u00f8d", -"Light Gray": "Lys gr\u00e5", -"Gray": "Gr\u00e5", -"Dark Yellow": "M\u00f8rk gul", -"Dark Orange": "M\u00f8rk oransje", -"Dark Red": "M\u00f8rker\u00f8d", -"Medium Gray": "Medium gr\u00e5", -"Dark Gray": "M\u00f8rk gr\u00e5", -"Light Green": "Lys gr\u00f8nn", -"Light Yellow": "Lys gul", -"Light Red": "Lys r\u00f8d", -"Light Purple": "Lys lilla", -"Light Blue": "Lys bl\u00e5", -"Dark Purple": "M\u00f8rk lilla", -"Dark Blue": "M\u00f8rk bl\u00e5", -"Black": "Svart", -"White": "Hvit", -"Switch to or from fullscreen mode": "Bytt til eller fra fullskjermmodus", -"Open help dialog": "\u00c5pne hjelp-dialog", -"history": "historikk", -"styles": "stiler", -"formatting": "formatering", -"alignment": "justering", -"indentation": "innrykk", -"permanent pen": "permanent penn", -"comments": "kommentarer", -"Format Painter": "Kopier format", -"Insert\/edit iframe": "Sett inn \/ rediger iframe", -"Capitalization": "Store\/sm\u00e5 bokstaver", -"lowercase": "sm\u00e5 bokstaver", -"UPPERCASE": "STORE BOKSTAVER", -"Title Case": "Tittelbokstav", -"Permanent Pen Properties": "Permanente egenskaper for penn", -"Permanent pen properties...": "Permanente egenskaper for penn...", -"Font": "Skrift", -"Size": "St\u00f8rrelse", -"More...": "Mer...", -"Spellcheck Language": "Stavekontroller spr\u00e5k", -"Select...": "Velg...", -"Preferences": "Innstillinger", -"Yes": "Ja", -"No": "Nei", -"Keyboard Navigation": "Navigering med tastaturet", -"Version": "Versjon", -"Anchor": "Anker", -"Special character": "Spesialtegn", -"Code sample": "Kodeeksempel", -"Color": "Farge", -"Emoticons": "Hum\u00f8rfjes", -"Document properties": "Dokumentegenskaper", -"Image": "Bilde", -"Insert link": "Sett inn lenke", -"Target": "M\u00e5l", -"Link": "Lenke", -"Poster": "Plakatbilde", -"Media": "Media", -"Print": "Skriv ut", -"Prev": "Forrige", -"Find and replace": "Finn og erstatt", -"Whole words": "Hele ord", -"Spellcheck": "Stavekontroll", -"Caption": "Tittel", -"Insert template": "Sett inn mal" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/pl.js b/cps/static/js/libs/tinymce/langs/pl.js index 63ae27f6f..80f390994 100644 --- a/cps/static/js/libs/tinymce/langs/pl.js +++ b/cps/static/js/libs/tinymce/langs/pl.js @@ -85,6 +85,7 @@ tinymce.addI18n('pl',{ "B": "B", "Left to right": "Od lewej do prawej", "Right to left": "Od prawej do lewej", +"Emoticons": "Ikony emocji", "Emoticons...": "Emotikony...", "Metadata and Document Properties": "Metadane i w\u0142a\u015bciwo\u015bci dokumentu", "Title": "Tytu\u0142", @@ -113,7 +114,9 @@ tinymce.addI18n('pl',{ "Handy Shortcuts": "Przydatne skr\u00f3ty", "Horizontal line": "Pozioma linia", "Insert\/edit image": "Wstaw\/edytuj obrazek", -"Image description": "Opis obrazka", +"Alternative description": "Alternatywny opis", +"Accessibility": "Dost\u0119pno\u015b\u0107", +"Image is decorative": "Obraz jest dekoracyjny", "Source": "\u0179r\u00f3d\u0142o", "Dimensions": "Wymiary", "Constrain proportions": "Zachowaj proporcje", @@ -147,7 +150,6 @@ tinymce.addI18n('pl',{ "Back": "Cofnij", "Insert date\/time": "Wstaw dat\u0119\/czas", "Date\/time": "Data\/Czas", -"Insert\/Edit Link": "Wstaw\/Edytuj \u0142\u0105cze", "Insert\/edit link": "Wstaw\/edytuj \u0142\u0105cze", "Text to display": "Tekst do wy\u015bwietlenia", "Url": "URL", @@ -155,12 +157,14 @@ tinymce.addI18n('pl',{ "Current window": "Bie\u017c\u0105ce okno", "None": "\u017baden", "New window": "Nowe okno", +"Open link": "Otw\u00f3rz \u0142\u0105cze", "Remove link": "Usu\u0144 \u0142\u0105cze", "Anchors": "Kotwice", "Link...": "\u0141\u0105cze...", "Paste or type a link": "Wklej lub wpisz adres \u0142\u0105cza", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL, kt\u00f3ry wprowadzi\u0142e\u015b wygl\u0105da na adres e-mail. Czy chcesz doda\u0107 mailto: jako prefiks?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL, kt\u00f3ry wprowadzi\u0142e\u015b wygl\u0105da na link zewn\u0119trzny. Czy chcesz doda\u0107 http:\/\/ jako prefiks?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Wprowadzony przez Ciebie adres URL wydaje si\u0119 by\u0107 \u0142\u0105czem zewn\u0119trznym. Czy chcesz doda\u0107 wymagany prefiks https:\/\/?", "Link list": "Lista link\u00f3w", "Insert video": "Wstaw wideo", "Insert\/edit video": "Wstaw\/edytuj wideo", @@ -183,11 +187,15 @@ tinymce.addI18n('pl',{ "Replace all": "Zamie\u0144 wszystko", "Previous": "Poprzedni", "Next": "Nast.", +"Find and Replace": "Znajd\u017a i Zamie\u0144", "Find and replace...": "Znajd\u017a i zamie\u0144...", "Could not find the specified string.": "Nie znaleziono szukanego tekstu.", "Match case": "Dopasuj wielko\u015b\u0107 liter", "Find whole words only": "Znajd\u017a tylko ca\u0142e wyrazy", -"Spell check": "Sprawd\u017a pisowni\u0119", +"Find in selection": "Znajd\u017a w zaznaczeniu", +"Spellcheck": "Sprawdzanie pisowni", +"Spellcheck Language": "J\u0119zyk sprawdzania pisowni", +"No misspellings found.": "Brak b\u0142\u0119d\u00f3w pisowni", "Ignore": "Ignoruj", "Ignore all": "Ignoruj wszystko", "Finish": "Zako\u0144cz", @@ -218,6 +226,7 @@ tinymce.addI18n('pl',{ "Height": "Wysoko\u015b\u0107", "Cell spacing": "Odst\u0119py kom\u00f3rek", "Cell padding": "Dope\u0142nienie kom\u00f3rki", +"Caption": "Tytu\u0142", "Show caption": "Poka\u017c podpis", "Left": "Lewo", "Center": "\u015arodek", @@ -377,7 +386,21 @@ tinymce.addI18n('pl',{ "formatting": "formatowanie", "alignment": "wyr\u00f3wnanie", "indentation": "wci\u0119cie", -"permanent pen": "marker", +"Font": "Font", +"Size": "Rozmiar", +"More...": "Wi\u0119cej...", +"Select...": "Wybierz...", +"Preferences": "Ustawienia", +"Yes": "Tak", +"No": "Nie", +"Keyboard Navigation": "Nawigacja za pomoc\u0105 klawiatury", +"Version": "Wersja", +"Code view": "Widok kodu", +"Open popup menu for split buttons": "Otw\u00f3rz menu podr\u0119czne dla przycisk\u00f3w", +"List Properties": "Ustawienia Listy", +"List properties...": "Ustawienia listy...", +"Start list at number": "Rozpocznij numeracj\u0119 od", +"Line height": "Wysoko\u015b\u0107 Linii", "comments": "komentarze", "Format Painter": "Malarz format\u00f3w", "Insert\/edit iframe": "Wstaw\/edytuj iframe", @@ -385,24 +408,46 @@ tinymce.addI18n('pl',{ "lowercase": "ma\u0142e litery", "UPPERCASE": "WIELKIE LITERY", "Title Case": "Jak Nazwy W\u0142asne", +"permanent pen": "marker", "Permanent Pen Properties": "W\u0142a\u015bciwo\u015bci markera", "Permanent pen properties...": "W\u0142a\u015bciwo\u015bci markera...", -"Font": "Font", -"Size": "Rozmiar", -"More...": "Wi\u0119cej...", -"Spellcheck Language": "J\u0119zyk sprawdzania pisowni", -"Select...": "Wybierz...", -"Preferences": "Ustawienia", -"Yes": "Tak", -"No": "Nie", -"Keyboard Navigation": "Nawigacja za pomoc\u0105 klawiatury", -"Version": "Wersja", +"case change": "Zmie\u0144 wielko\u015b\u0107", +"page embed": "strona osadzona", +"Advanced sort...": "Sortowanie zaawansowane...", +"Advanced Sort": "Sortowanie Zaawansowane", +"Sort table by column ascending": "Sortuj tabel\u0119 po kolumnie rosn\u0105co", +"Sort table by column descending": "Sortuj tabel\u0119 po kolumnie malej\u0105co", +"Sort": "Sortuj", +"Order": "Kolejno\u015b\u0107", +"Sort by": "Sortuj wed\u0142ug", +"Ascending": "Rosn\u0105co", +"Descending": "Malej\u0105co", +"Column {0}": "Kolumna {0}", +"Row {0}": "Wiersz {0}", +"Spellcheck...": "Sprawd\u017a pisowni\u0119...", +"Misspelled word": "B\u0142\u0119dna pisownia", +"Suggestions": "Sugestie", +"Change": "Zmie\u0144", +"Finding word suggestions": "Wyszukiwanie propozycji s\u0142\u00f3w", +"Success": "Sukces", +"Repair": "Napraw", +"Issue {0} of {1}": "Problem {0} z {1}", +"Images must be marked as decorative or have an alternative text description": "Obrazy musz\u0105 by\u0107 oznaczone jako dekoracyjne lub posiada\u0107 alternatywny opis tekstowy.", +"Images must have an alternative text description. Decorative images are not allowed.": "Obrazki musz\u0105 mie\u0107 tekst alternatywny. Dekoracyjne obrazy nie s\u0105 dozwolone.", +"Or provide alternative text:": "lub dodaj tekst alternatywny:", +"Make image decorative:": "Uczy\u0144 obraz dekoracyjnym:", +"ID attribute must be unique": "ID atrybutu musi by\u0107 unikalny", +"Make ID unique": "Utw\u00f3rz unikalny ID", +"Keep this ID and remove all others": "Zachowaj to ID oraz usu\u0144 inne", +"Remove this ID": "Usu\u0144 to ID", +"Remove all IDs": "Usu\u0144 wszystkie ID", +"Checklist": "Checklista", "Anchor": "Kotwica", "Special character": "Znak specjalny", "Code sample": "Przyk\u0142ad kodu \u017ar\u00f3d\u0142owego", "Color": "Kolor", -"Emoticons": "Ikony emocji", "Document properties": "W\u0142a\u015bciwo\u015bci dokumentu", +"Image description": "Opis obrazka", "Image": "Obraz", "Insert link": "Wstaw \u0142\u0105cze", "Target": "Cel", @@ -413,7 +458,5 @@ tinymce.addI18n('pl',{ "Prev": "Poprz.", "Find and replace": "Znajd\u017a i zamie\u0144", "Whole words": "Ca\u0142e s\u0142owa", -"Spellcheck": "Sprawdzanie pisowni", -"Caption": "Tytu\u0142", "Insert template": "Wstaw szablon" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/pt_BR.js b/cps/static/js/libs/tinymce/langs/pt_BR.js index e7dd33c2e..49ca0ce4a 100644 --- a/cps/static/js/libs/tinymce/langs/pt_BR.js +++ b/cps/static/js/libs/tinymce/langs/pt_BR.js @@ -85,6 +85,7 @@ tinymce.addI18n('pt_BR',{ "B": "B", "Left to right": "Da esquerda para a direita", "Right to left": "Da direita para a esquerda", +"Emoticons": "Emoticons", "Emoticons...": "Emojis...", "Metadata and Document Properties": "Metadados e Propriedades do Documento", "Title": "T\u00edtulo", @@ -113,7 +114,9 @@ tinymce.addI18n('pt_BR',{ "Handy Shortcuts": "Atalhos \u00fateis", "Horizontal line": "Linha horizontal", "Insert\/edit image": "Inserir\/editar imagem", -"Image description": "Inserir descri\u00e7\u00e3o", +"Alternative description": "Descri\u00e7\u00e3o alternativa", +"Accessibility": "Acessibilidade", +"Image is decorative": "A imagem \u00e9 decorativa", "Source": "Endere\u00e7o da imagem", "Dimensions": "Dimens\u00f5es", "Constrain proportions": "Manter propor\u00e7\u00f5es", @@ -147,7 +150,6 @@ tinymce.addI18n('pt_BR',{ "Back": "Voltar", "Insert date\/time": "Inserir data\/hora", "Date\/time": "data\/hora", -"Insert\/Edit Link": "Inserir\/Editar Link", "Insert\/edit link": "Inserir\/editar link", "Text to display": "Texto para mostrar", "Url": "Url", @@ -155,12 +157,14 @@ tinymce.addI18n('pt_BR',{ "Current window": "Janela atual", "None": "Nenhum", "New window": "Nova janela", +"Open link": "Abrir link", "Remove link": "Remover link", "Anchors": "\u00c2ncoras", "Link...": "Link...", "Paste or type a link": "Cole ou digite um Link", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "A URL que voc\u00ea informou parece ser um link externo. Deseja incluir o prefixo http:\/\/?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "A URL informada parece ser um link externo. Voc\u00ea quer adicionar o prefixo necess\u00e1rio https:\/\/ ?", "Link list": "Lista de Links", "Insert video": "Inserir v\u00eddeo", "Insert\/edit video": "Inserir\/editar v\u00eddeo", @@ -183,11 +187,15 @@ tinymce.addI18n('pt_BR',{ "Replace all": "Substituir tudo", "Previous": "Anterior", "Next": "Pr\u00f3ximo", +"Find and Replace": "Localizar e substituir", "Find and replace...": "Encontrar e substituir...", "Could not find the specified string.": "N\u00e3o foi poss\u00edvel encontrar o termo especificado", "Match case": "Diferenciar mai\u00fasculas e min\u00fasculas", "Find whole words only": "Encontrar somente palavras inteiras", -"Spell check": "Verifica\u00e7\u00e3o ortogr\u00e1fica", +"Find in selection": "Localizar na sele\u00e7\u00e3o", +"Spellcheck": "Corretor ortogr\u00e1fico", +"Spellcheck Language": "Idioma de verifica\u00e7\u00e3o ortogr\u00e1fica", +"No misspellings found.": "Sem erros ortogr\u00e1ficos", "Ignore": "Ignorar", "Ignore all": "Ignorar tudo", "Finish": "Finalizar", @@ -218,6 +226,7 @@ tinymce.addI18n('pt_BR',{ "Height": "Altura", "Cell spacing": "Espa\u00e7amento da c\u00e9lula", "Cell padding": "Espa\u00e7amento interno da c\u00e9lula", +"Caption": "Legenda", "Show caption": "Mostrar descri\u00e7\u00e3o", "Left": "Esquerdo", "Center": "Centro", @@ -377,7 +386,21 @@ tinymce.addI18n('pt_BR',{ "formatting": "formata\u00e7\u00e3o", "alignment": "alinhamento", "indentation": "indenta\u00e7\u00e3o", -"permanent pen": "caneta permanente", +"Font": "Fonte", +"Size": "Tamanho", +"More...": "Mais...", +"Select...": "Selecionar...", +"Preferences": "Prefer\u00eancias", +"Yes": "Sim", +"No": "N\u00e3o", +"Keyboard Navigation": "Navega\u00e7\u00e3o por Teclado", +"Version": "Vers\u00e3o", +"Code view": "Ver c\u00f3digo", +"Open popup menu for split buttons": "Abrir menu popup para bot\u00f5es com divis\u00e3o", +"List Properties": "Listar Propriedades", +"List properties...": "Listar propriedades...", +"Start list at number": "Iniciar a lista no n\u00famero", +"Line height": "Altura da linha", "comments": "coment\u00e1rios", "Format Painter": "Pincel de Formata\u00e7\u00e3o", "Insert\/edit iframe": "Inserir\/editar iframe", @@ -385,24 +408,46 @@ tinymce.addI18n('pt_BR',{ "lowercase": "min\u00fasculos", "UPPERCASE": "MAI\u00daSCULAS", "Title Case": "T\u00edtulo do caso", +"permanent pen": "caneta permanente", "Permanent Pen Properties": "Propriedades da caneta permanente", "Permanent pen properties...": "Propriedades de caneta permanentes...", -"Font": "Fonte", -"Size": "Tamanho", -"More...": "Mais...", -"Spellcheck Language": "Idioma de verifica\u00e7\u00e3o ortogr\u00e1fica", -"Select...": "Selecionar...", -"Preferences": "Prefer\u00eancias", -"Yes": "Sim", -"No": "N\u00e3o", -"Keyboard Navigation": "Navega\u00e7\u00e3o por Teclado", -"Version": "Vers\u00e3o", +"case change": "mudar caixa", +"page embed": "embutir p\u00e1gina", +"Advanced sort...": "Ordena\u00e7\u00e3o avan\u00e7ada...", +"Advanced Sort": "Ordena\u00e7\u00e3o Avan\u00e7ada...", +"Sort table by column ascending": "Ordenar tabela por coluna ascendente", +"Sort table by column descending": "Ordenar tabela por coluna descendente", +"Sort": "Ordenar", +"Order": "Ordem", +"Sort by": "Ordenar por", +"Ascending": "Ascendente", +"Descending": "Descendente", +"Column {0}": "Coluna {0}", +"Row {0}": "Linha {0}", +"Spellcheck...": "Verifica\u00e7\u00e3o ortogr\u00e1fica", +"Misspelled word": "Palavra com erro ortogr\u00e1fico", +"Suggestions": "Sugest\u00f5es", +"Change": "Mudar", +"Finding word suggestions": "Encontrando sugest\u00f5es de palavras", +"Success": "Sucesso", +"Repair": "Reparo", +"Issue {0} of {1}": "Problema {0} de {1}", +"Images must be marked as decorative or have an alternative text description": "Imagens precisam ser marcadas como decorativas ou terem uma descri\u00e7\u00e3o alternativa de texto", +"Images must have an alternative text description. Decorative images are not allowed.": "Imagens precisam ter uma descri\u00e7\u00e3o alternativa de texto. Imagens decorativas n\u00e3o s\u00e3o permitidas.", +"Or provide alternative text:": "Ou informe um texto alternativo:", +"Make image decorative:": "Fa\u00e7a imagem decorativa:", +"ID attribute must be unique": "O atributo ID precisa ser \u00fanico", +"Make ID unique": "Fa\u00e7a um ID \u00fanico", +"Keep this ID and remove all others": "Mantenha esse ID e remova todos os outros", +"Remove this ID": "Remova esse ID", +"Remove all IDs": "Remova todos os IDs", +"Checklist": "Lista de checagem", "Anchor": "\u00c2ncora", "Special character": "Caracteres especiais", "Code sample": "Exemplo de c\u00f3digo", "Color": "Cor", -"Emoticons": "Emoticons", "Document properties": "Propriedades do documento", +"Image description": "Inserir descri\u00e7\u00e3o", "Image": "Imagem", "Insert link": "Inserir link", "Target": "Alvo", @@ -413,7 +458,5 @@ tinymce.addI18n('pt_BR',{ "Prev": "Anterior", "Find and replace": "Localizar e substituir", "Whole words": "Palavras inteiras", -"Spellcheck": "Corretor ortogr\u00e1fico", -"Caption": "Legenda", "Insert template": "Inserir modelo" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/pt_PT.js b/cps/static/js/libs/tinymce/langs/pt_PT.js deleted file mode 100644 index a3ec7dfc5..000000000 --- a/cps/static/js/libs/tinymce/langs/pt_PT.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('pt_PT',{ -"Redo": "Refazer", -"Undo": "Anular", -"Cut": "Cortar", -"Copy": "Copiar", -"Paste": "Colar", -"Select all": "Selecionar tudo", -"New document": "Novo documento", -"Ok": "Ok", -"Cancel": "Cancelar", -"Visual aids": "Ajuda visual", -"Bold": "Negrito", -"Italic": "It\u00e1lico", -"Underline": "Sublinhado", -"Strikethrough": "Rasurado", -"Superscript": "Superior \u00e0 linha", -"Subscript": "Inferior \u00e0 linha", -"Clear formatting": "Limpar formata\u00e7\u00e3o", -"Align left": "Alinhar \u00e0 esquerda", -"Align center": "Alinhar ao centro", -"Align right": "Alinhar \u00e0 direita", -"Justify": "Justificar", -"Bullet list": "Lista com marcas", -"Numbered list": "Lista numerada", -"Decrease indent": "Diminuir avan\u00e7o", -"Increase indent": "Aumentar avan\u00e7o", -"Close": "Fechar", -"Formats": "Formatos", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "O seu navegador n\u00e3o suporta acesso direto \u00e0 \u00e1rea de transfer\u00eancia. Por favor, use os atalhos Ctrl+X\/C\/V do seu teclado.", -"Headers": "Cabe\u00e7alhos", -"Header 1": "Cabe\u00e7alho 1", -"Header 2": "Cabe\u00e7alho 2", -"Header 3": "Cabe\u00e7alho 3", -"Header 4": "Cabe\u00e7alho 4", -"Header 5": "Cabe\u00e7alho 5", -"Header 6": "Cabe\u00e7alho 6", -"Headings": "T\u00edtulos", -"Heading 1": "T\u00edtulo 1", -"Heading 2": "T\u00edtulo 2", -"Heading 3": "T\u00edtulo 3", -"Heading 4": "T\u00edtulo 4", -"Heading 5": "T\u00edtulo 5", -"Heading 6": "T\u00edtulo 6", -"Preformatted": "Pr\u00e9-formatado", -"Div": "Div", -"Pre": "Pre", -"Code": "C\u00f3digo", -"Paragraph": "Par\u00e1grafo", -"Blockquote": "Blockquote", -"Inline": "Inline", -"Blocks": "Blocos", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "O comando colar est\u00e1 em modo de texto simples. O conte\u00fado ser\u00e1 colado como texto simples at\u00e9 desativar esta op\u00e7\u00e3o.", -"Fonts": "Tipos de letra", -"Font Sizes": "Tamanhos dos tipos de letra", -"Class": "Classe", -"Browse for an image": "Procurar uma imagem", -"OR": "OU", -"Drop an image here": "Largar aqui uma imagem", -"Upload": "Carregar", -"Block": "Bloco", -"Align": "Alinhar", -"Default": "Padr\u00e3o", -"Circle": "C\u00edrculo", -"Disc": "Disco", -"Square": "Quadrado", -"Lower Alpha": "a. b. c. ...", -"Lower Greek": "\\u03b1. \\u03b2. \\u03b3. ...", -"Lower Roman": "i. ii. iii. ...", -"Upper Alpha": "A. B. C. ...", -"Upper Roman": "I. II. III. ...", -"Anchor...": "\u00c2ncora...", -"Name": "Nome", -"Id": "ID", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "O ID deve come\u00e7ar com uma letra, seguido apenas por letras, n\u00fameros, pontos, dois pontos, tra\u00e7os ou sobtra\u00e7os.", -"You have unsaved changes are you sure you want to navigate away?": "Existem altera\u00e7\u00f5es que ainda n\u00e3o foram guardadas. Tem a certeza que pretende sair?", -"Restore last draft": "Restaurar o \u00faltimo rascunho", -"Special character...": "Car\u00e1ter especial...", -"Source code": "C\u00f3digo fonte", -"Insert\/Edit code sample": "Inserir\/editar amostra de c\u00f3digo", -"Language": "Idioma", -"Code sample...": "Amostra de c\u00f3digo...", -"Color Picker": "Seletor de cores", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Da esquerda para a direita", -"Right to left": "Da direita para a esquerda", -"Emoticons...": "\u00cdcones expressivos...", -"Metadata and Document Properties": "Metadados e propriedades do documento", -"Title": "T\u00edtulo", -"Keywords": "Palavras-chave", -"Description": "Descri\u00e7\u00e3o", -"Robots": "Rob\u00f4s", -"Author": "Autor", -"Encoding": "Codifica\u00e7\u00e3o", -"Fullscreen": "Ecr\u00e3 completo", -"Action": "A\u00e7\u00e3o", -"Shortcut": "Atalho", -"Help": "Ajuda", -"Address": "Endere\u00e7o", -"Focus to menubar": "Foco na barra de menu", -"Focus to toolbar": "Foco na barra de ferramentas", -"Focus to element path": "Foco no caminho do elemento", -"Focus to contextual toolbar": "Foco na barra de contexto", -"Insert link (if link plugin activated)": "Inserir hiperliga\u00e7\u00e3o (se o plugin de liga\u00e7\u00f5es estiver ativado)", -"Save (if save plugin activated)": "Guardar (se o plugin de guardar estiver ativado)", -"Find (if searchreplace plugin activated)": "Pesquisar (se o plugin pesquisar e substituir estiver ativado)", -"Plugins installed ({0}):": "Plugins instalados ({0}):", -"Premium plugins:": "Plugins comerciais:", -"Learn more...": "Saiba mais...", -"You are using {0}": "Est\u00e1 a usar {0}", -"Plugins": "Plugins", -"Handy Shortcuts": "Atalhos \u00fateis", -"Horizontal line": "Linha horizontal", -"Insert\/edit image": "Inserir\/editar imagem", -"Image description": "Descri\u00e7\u00e3o da imagem", -"Source": "Localiza\u00e7\u00e3o", -"Dimensions": "Dimens\u00f5es", -"Constrain proportions": "Manter propor\u00e7\u00f5es", -"General": "Geral", -"Advanced": "Avan\u00e7ado", -"Style": "Estilo", -"Vertical space": "Espa\u00e7amento vertical", -"Horizontal space": "Espa\u00e7amento horizontal", -"Border": "Contorno", -"Insert image": "Inserir imagem", -"Image...": "Imagem...", -"Image list": "Lista de imagens", -"Rotate counterclockwise": "Rota\u00e7\u00e3o anti-hor\u00e1ria", -"Rotate clockwise": "Rota\u00e7\u00e3o hor\u00e1ria", -"Flip vertically": "Inverter verticalmente", -"Flip horizontally": "Inverter horizontalmente", -"Edit image": "Editar imagem", -"Image options": "Op\u00e7\u00f5es de imagem", -"Zoom in": "Mais zoom", -"Zoom out": "Menos zoom", -"Crop": "Recortar", -"Resize": "Redimensionar", -"Orientation": "Orienta\u00e7\u00e3o", -"Brightness": "Brilho", -"Sharpen": "Mais nitidez", -"Contrast": "Contraste", -"Color levels": "N\u00edveis de cor", -"Gamma": "Gama", -"Invert": "Inverter", -"Apply": "Aplicar", -"Back": "Voltar", -"Insert date\/time": "Inserir data\/hora", -"Date\/time": "Data\/hora", -"Insert\/Edit Link": "Inserir\/editar liga\u00e7\u00e3o", -"Insert\/edit link": "Inserir\/editar liga\u00e7\u00e3o", -"Text to display": "Texto a exibir", -"Url": "URL", -"Open link in...": "Abrir liga\u00e7\u00e3o em...", -"Current window": "Janela atual", -"None": "Nenhum", -"New window": "Nova janela", -"Remove link": "Remover liga\u00e7\u00e3o", -"Anchors": "\u00c2ncora", -"Link...": "Liga\u00e7\u00e3o...", -"Paste or type a link": "Copiar ou escrever uma hiperliga\u00e7\u00e3o", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "O URL que indicou parece ser um endere\u00e7o de email. Quer adicionar o prefixo mailto: tal como necess\u00e1rio?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "O URL que indicou parece ser um endere\u00e7o web. Quer adicionar o prefixo http:\/\/ tal como necess\u00e1rio?", -"Link list": "Lista de liga\u00e7\u00f5es", -"Insert video": "Inserir v\u00eddeo", -"Insert\/edit video": "Inserir\/editar v\u00eddeo", -"Insert\/edit media": "Inserir\/editar media", -"Alternative source": "Localiza\u00e7\u00e3o alternativa", -"Alternative source URL": "URL da origem alternativa", -"Media poster (Image URL)": "Publicador de media (URL da imagem)", -"Paste your embed code below:": "Colar c\u00f3digo para embeber:", -"Embed": "Embeber", -"Media...": "Media...", -"Nonbreaking space": "Espa\u00e7o n\u00e3o quebr\u00e1vel", -"Page break": "Quebra de p\u00e1gina", -"Paste as text": "Colar como texto", -"Preview": "Pr\u00e9-visualizar", -"Print...": "Imprimir...", -"Save": "Guardar", -"Find": "Pesquisar", -"Replace with": "Substituir por", -"Replace": "Substituir", -"Replace all": "Substituir tudo", -"Previous": "Anterior", -"Next": "Pr\u00f3ximo", -"Find and replace...": "Localizar e substituir...", -"Could not find the specified string.": "N\u00e3o foi poss\u00edvel localizar o termo especificado.", -"Match case": "Diferenciar mai\u00fasculas e min\u00fasculas", -"Find whole words only": "Localizar apenas palavras inteiras", -"Spell check": "Verifica\u00e7\u00e3o ortogr\u00e1fica", -"Ignore": "Ignorar", -"Ignore all": "Ignorar tudo", -"Finish": "Concluir", -"Add to Dictionary": "Adicionar ao dicion\u00e1rio", -"Insert table": "Inserir tabela", -"Table properties": "Propriedades da tabela", -"Delete table": "Eliminar tabela", -"Cell": "C\u00e9lula", -"Row": "Linha", -"Column": "Coluna", -"Cell properties": "Propriedades da c\u00e9lula", -"Merge cells": "Unir c\u00e9lulas", -"Split cell": "Dividir c\u00e9lula", -"Insert row before": "Inserir linha antes", -"Insert row after": "Inserir linha depois", -"Delete row": "Eliminar linha", -"Row properties": "Propriedades da linha", -"Cut row": "Cortar linha", -"Copy row": "Copiar linha", -"Paste row before": "Colar linha antes", -"Paste row after": "Colar linha depois", -"Insert column before": "Inserir coluna antes", -"Insert column after": "Inserir coluna depois", -"Delete column": "Eliminar coluna", -"Cols": "Colunas", -"Rows": "Linhas", -"Width": "Largura", -"Height": "Altura", -"Cell spacing": "Espa\u00e7amento entre c\u00e9lulas", -"Cell padding": "Espa\u00e7amento interno da c\u00e9lula", -"Show caption": "Mostrar legenda", -"Left": "Esquerda", -"Center": "Centro", -"Right": "Direita", -"Cell type": "Tipo de c\u00e9lula", -"Scope": "Escopo", -"Alignment": "Alinhamento", -"H Align": "Alinhamento H", -"V Align": "Alinhamento V", -"Top": "Superior", -"Middle": "Meio", -"Bottom": "Inferior", -"Header cell": "C\u00e9lula de cabe\u00e7alho", -"Row group": "Agrupar linha", -"Column group": "Agrupar coluna", -"Row type": "Tipo de linha", -"Header": "Cabe\u00e7alho", -"Body": "Corpo", -"Footer": "Rodap\u00e9", -"Border color": "Cor de contorno", -"Insert template...": "Inserir modelo...", -"Templates": "Modelos", -"Template": "Tema", -"Text color": "Cor do texto", -"Background color": "Cor de fundo", -"Custom...": "Personalizada...", -"Custom color": "Cor personalizada", -"No color": "Sem cor", -"Remove color": "Remover cor", -"Table of Contents": "\u00cdndice", -"Show blocks": "Mostrar blocos", -"Show invisible characters": "Mostrar caracteres invis\u00edveis", -"Word count": "Contagem de palavras", -"Count": "Contagem", -"Document": "Documento", -"Selection": "Sele\u00e7\u00e3o", -"Words": "Palavras", -"Words: {0}": "Palavras: {0}", -"{0} words": "{0} palavras", -"File": "Ficheiro", -"Edit": "Editar", -"Insert": "Inserir", -"View": "Ver", -"Format": "Formatar", -"Table": "Tabela", -"Tools": "Ferramentas", -"Powered by {0}": "Criado em {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Caixa de texto formatado. Pressione ALT-F9 para exibir o menu. Pressione ALT-F10 para exibir a barra de ferramentas. Pressione ALT-0 para exibir a ajuda", -"Image title": "T\u00edtulo da imagem", -"Border width": "Largura do limite", -"Border style": "Estilo do limite", -"Error": "Erro", -"Warn": "Aviso", -"Valid": "V\u00e1lido", -"To open the popup, press Shift+Enter": "Para abrir o pop-up, prima Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "\u00c1rea de texto formatado. Prima ALT-0 para exibir a ajuda.", -"System Font": "Tipo de letra do sistema", -"Failed to upload image: {0}": "Falha ao carregar imagem: {0}", -"Failed to load plugin: {0} from url {1}": "Falha ao carregar plugin: {0} do URL {1}", -"Failed to load plugin url: {0}": "Falha ao carregar o URL do plugin: {0}", -"Failed to initialize plugin: {0}": "Falha ao inicializar plugin: {0}", -"example": "exemplo", -"Search": "Pesquisar", -"All": "Tudo", -"Currency": "Moeda", -"Text": "Texto", -"Quotations": "Aspas", -"Mathematical": "Matem\u00e1tico", -"Extended Latin": "Carateres latinos estendidos", -"Symbols": "S\u00edmbolos", -"Arrows": "Setas", -"User Defined": "Definido pelo utilizador", -"dollar sign": "cifr\u00e3o", -"currency sign": "sinal monet\u00e1rio", -"euro-currency sign": "sinal monet\u00e1rio do euro", -"colon sign": "sinal de dois pontos", -"cruzeiro sign": "sinal de cruzeiro", -"french franc sign": "sinal de franco franc\u00eas", -"lira sign": "sinal de lira", -"mill sign": "sinal de por mil", -"naira sign": "sinal de naira", -"peseta sign": "sinal de peseta", -"rupee sign": "sinal de r\u00fapia", -"won sign": "sinal de won", -"new sheqel sign": "sinal de novo sheqel", -"dong sign": "sinal de dong", -"kip sign": "sinal kip", -"tugrik sign": "sinal tugrik", -"drachma sign": "sinal drachma", -"german penny symbol": "sinal de penny alem\u00e3o", -"peso sign": "sinal de peso", -"guarani sign": "sinal de guarani", -"austral sign": "sinal de austral", -"hryvnia sign": "sinal hryvnia", -"cedi sign": "sinal de cedi", -"livre tournois sign": "sinal de libra de tours", -"spesmilo sign": "sinal de spesmilo", -"tenge sign": "sinal de tengue", -"indian rupee sign": "sinal de rupia indiana", -"turkish lira sign": "sinal de lira turca", -"nordic mark sign": "sinal de marca n\u00f3rdica", -"manat sign": "sinal manat", -"ruble sign": "sinal de rublo", -"yen character": "sinal de iene", -"yuan character": "sinal de iuane", -"yuan character, in hong kong and taiwan": "sinal de iuane, em Hong Kong e Taiwan", -"yen\/yuan character variant one": "variante um de sinal de iene\/iuane", -"Loading emoticons...": "A carregar \u00edcones expressivos...", -"Could not load emoticons": "N\u00e3o foi poss\u00edvel carregar \u00edcones expressivos", -"People": "Pessoas", -"Animals and Nature": "Animais e natureza", -"Food and Drink": "Comida e bebida", -"Activity": "Atividade", -"Travel and Places": "Viagens e lugares", -"Objects": "Objetos", -"Flags": "Bandeiras", -"Characters": "Carateres", -"Characters (no spaces)": "Carateres (sem espa\u00e7os)", -"{0} characters": "{0} carateres", -"Error: Form submit field collision.": "Erro: conflito no campo de submiss\u00e3o de formul\u00e1rio.", -"Error: No form element found.": "Erro: nenhum elemento de formul\u00e1rio encontrado.", -"Update": "Atualizar", -"Color swatch": "Cole\u00e7\u00e3o de cores", -"Turquoise": "Turquesa", -"Green": "Verde", -"Blue": "Azul", -"Purple": "P\u00farpura", -"Navy Blue": "Azul-atl\u00e2ntico", -"Dark Turquoise": "Turquesa escuro", -"Dark Green": "Verde escuro", -"Medium Blue": "Azul interm\u00e9dio", -"Medium Purple": "P\u00farpura interm\u00e9dio", -"Midnight Blue": "Azul muito escuro", -"Yellow": "Amarelo", -"Orange": "Laranja", -"Red": "Vermelho", -"Light Gray": "Cinzento claro", -"Gray": "Cinzento", -"Dark Yellow": "Amarelo escuro", -"Dark Orange": "Laranja escuro", -"Dark Red": "Vermelho escuro", -"Medium Gray": "Cinzento m\u00e9dio", -"Dark Gray": "Cinzento escuro", -"Light Green": "Verde claro", -"Light Yellow": "Amarelo claro", -"Light Red": "Vermelho claro", -"Light Purple": "P\u00farpura claro", -"Light Blue": "Azul claro", -"Dark Purple": "P\u00farpura escuro", -"Dark Blue": "Azul escuro", -"Black": "Preto", -"White": "Branco", -"Switch to or from fullscreen mode": "Entrar ou sair do modo de ecr\u00e3 inteiro", -"Open help dialog": "Abrir caixa de di\u00e1logo Ajuda", -"history": "hist\u00f3rico", -"styles": "estilos", -"formatting": "formata\u00e7\u00e3o", -"alignment": "alinhamento", -"indentation": "avan\u00e7o", -"permanent pen": "caneta permanente", -"comments": "coment\u00e1rios", -"Format Painter": "Pincel de formata\u00e7\u00e3o", -"Insert\/edit iframe": "Inserir\/editar iframe", -"Capitalization": "Capitaliza\u00e7\u00e3o", -"lowercase": "min\u00fasculas", -"UPPERCASE": "MAI\u00daSCULAS", -"Title Case": "Iniciais mai\u00fasculas", -"Permanent Pen Properties": "Propriedades da Caneta Permanente", -"Permanent pen properties...": "Propriedades da caneta permanente...", -"Font": "Tipo de letra", -"Size": "Tamanho", -"More...": "Mais...", -"Spellcheck Language": "Idioma de verifica\u00e7\u00e3o lingu\u00edstica", -"Select...": "Selecionar...", -"Preferences": "Prefer\u00eancias", -"Yes": "Sim", -"No": "N\u00e3o", -"Keyboard Navigation": "Navega\u00e7\u00e3o com teclado", -"Version": "Vers\u00e3o", -"Anchor": "\u00c2ncora", -"Special character": "Car\u00e1cter especial", -"Code sample": "Amostra de c\u00f3digo", -"Color": "Cor", -"Emoticons": "Emo\u00e7\u00f5es", -"Document properties": "Propriedades do documento", -"Image": "Imagem", -"Insert link": "Inserir liga\u00e7\u00e3o", -"Target": "Alvo", -"Link": "Liga\u00e7\u00e3o", -"Poster": "Autor", -"Media": "Media", -"Print": "Imprimir", -"Prev": "Anterior", -"Find and replace": "Pesquisar e substituir", -"Whole words": "Palavras completas", -"Spellcheck": "Corretor ortogr\u00e1fico", -"Caption": "Legenda", -"Insert template": "Inserir modelo" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ro.js b/cps/static/js/libs/tinymce/langs/ro.js index 717f4e805..dc812b4ae 100644 --- a/cps/static/js/libs/tinymce/langs/ro.js +++ b/cps/static/js/libs/tinymce/langs/ro.js @@ -85,6 +85,7 @@ tinymce.addI18n('ro',{ "B": "B", "Left to right": "St\u00e2nga la dreapta", "Right to left": "Dreapta la st\u00e2nga", +"Emoticons": "Emoticoane", "Emoticons...": "Emoticoane\u2026", "Metadata and Document Properties": "Meta date \u0219i Propriet\u0103\u021bi Document", "Title": "Titlu", @@ -113,7 +114,9 @@ tinymce.addI18n('ro',{ "Handy Shortcuts": "Comenzi rapide accesibile", "Horizontal line": "Linie orizontal\u0103", "Insert\/edit image": "Inserare\/editarea imaginilor", -"Image description": "Descrierea imaginii", +"Alternative description": "Descriere alternativ\u0103", +"Accessibility": "Accesibilitate", +"Image is decorative": "Imaginea este decorativ\u0103", "Source": "Surs\u0103", "Dimensions": "Dimensiuni", "Constrain proportions": "Constr\u00e2nge propor\u021biile", @@ -147,7 +150,6 @@ tinymce.addI18n('ro',{ "Back": "\u00cenapoi", "Insert date\/time": "Insereaz\u0103 data\/ora", "Date\/time": "Data\/ora", -"Insert\/Edit Link": "Inserare\/Editare link", "Insert\/edit link": "Inserare\/editare link", "Text to display": "Text de afi\u0219at", "Url": "Url", @@ -155,12 +157,14 @@ tinymce.addI18n('ro',{ "Current window": "Fereastra curent\u0103", "None": "Nici unul", "New window": "Fereastr\u0103 nou\u0103", +"Open link": "Deschide leg\u0103tur\u0103", "Remove link": "\u0218terge link-ul", "Anchors": "Ancor\u0103", "Link...": "Link\u2026", "Paste or type a link": "Introduce\u021bi un link", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL-ul introdus pare s\u0103 fie o adres\u0103 de e-mail. Dori\u021bi s\u0103 ad\u0103uga\u021bi prefixul mailto: ?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL-ul introdus pare s\u0103 fie o adres\u0103 web. Dori\u021bi s\u0103 ad\u0103uga\u021bi prefixul http:\/\/ ?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Adresa URL pe care a\u021bi introdus-o pare a fi un leg\u0103tur\u0103 extern\u0103. Dori\u021bi s\u0103 ad\u0103uga\u021bi prefixul https:\/\/ necesar?", "Link list": "List\u0103 linkuri", "Insert video": "Inserare video", "Insert\/edit video": "Inserare\/editare video", @@ -183,11 +187,15 @@ tinymce.addI18n('ro',{ "Replace all": "\u00cenlocuie\u015fte toate", "Previous": "Anterior", "Next": "Precedent", +"Find and Replace": "G\u0103si\u021bi \u0219i \u00eenlocui\u021bi", "Find and replace...": "C\u0103utare \u0219i \u00eenlocuire\u2026", "Could not find the specified string.": "Nu am putut g\u0103si \u0219irul specificat.", "Match case": "Distinge majuscule\/minuscule", "Find whole words only": "G\u0103se\u0219te doar cuvintele \u00eentregi", -"Spell check": "Verificare ortografic\u0103", +"Find in selection": "G\u0103si\u021bi \u00een selec\u021bie", +"Spellcheck": "Verificarea ortografic\u0103", +"Spellcheck Language": "Verificare ortografic\u0103 a limbii", +"No misspellings found.": "Nu s-au g\u0103sit gre\u0219eli de ortografie.", "Ignore": "Ignor\u0103", "Ignore all": "Ignor\u0103 toate", "Finish": "Finalizeaz\u0103", @@ -218,6 +226,7 @@ tinymce.addI18n('ro',{ "Height": "\u00cen\u0103l\u0163ime", "Cell spacing": "Spa\u021biere celule", "Cell padding": "Spa\u021biere", +"Caption": "Titlu", "Show caption": "Afi\u0219are captur\u0103", "Left": "St\u00e2nga", "Center": "Centru", @@ -377,7 +386,21 @@ tinymce.addI18n('ro',{ "formatting": "formatare", "alignment": "aliniere", "indentation": "indentare", -"permanent pen": "stilou permanent", +"Font": "Font", +"Size": "Dimensiuni", +"More...": "Mai multe...", +"Select...": "Selectare...", +"Preferences": "Preferin\u021be", +"Yes": "Da", +"No": "Nu", +"Keyboard Navigation": "Navigare de la tastatur\u0103", +"Version": "Versiune", +"Code view": "Vizualizare cod", +"Open popup menu for split buttons": "Deschide\u021bi meniul pop-up pentru butoanele divizate", +"List Properties": "Propriet\u0103\u021bi list\u0103", +"List properties...": "Propriet\u0103\u021bi list\u0103...", +"Start list at number": "\u00cencepe\u021bi lista la num\u0103rul", +"Line height": "\u00cen\u0103l\u021bimea liniei", "comments": "comentarii", "Format Painter": "Descriptor de formate", "Insert\/edit iframe": "Inserare\/editare icadru", @@ -385,23 +408,45 @@ tinymce.addI18n('ro',{ "lowercase": "litere mici", "UPPERCASE": "MAJUSCULE", "Title Case": "Ini\u021bial\u0103 majuscul\u0103", +"permanent pen": "stilou permanent", "Permanent Pen Properties": "Propriet\u0103\u021bile stiloului permanent", "Permanent pen properties...": "Propriet\u0103\u021bile stiloului permanent...", -"Font": "Font", -"Size": "Dimensiuni", -"More...": "Mai multe...", -"Spellcheck Language": "Verificare ortografic\u0103 a limbii", -"Select...": "Selectare...", -"Preferences": "Preferin\u021be", -"Yes": "Da", -"No": "Nu", -"Keyboard Navigation": "Navigare de la tastatur\u0103", -"Version": "Versiune", +"case change": "schimbarea cazului", +"page embed": "\u00eencorporare pagin\u0103", +"Advanced sort...": "Sortare avansat\u0103...", +"Advanced Sort": "Sortare avansat\u0103", +"Sort table by column ascending": "Sorta\u021bi tabelul dup\u0103 coloan\u0103 cresc\u0103toare", +"Sort table by column descending": "Sorta\u021bi tabelul dup\u0103 coloan\u0103 descresc\u0103toare", +"Sort": "Sortare", +"Order": "Ordonare", +"Sort by": "Soreaz\u0103 dup\u0103", +"Ascending": "Cresc\u0103tor", +"Descending": "Descresc\u0103tor", +"Column {0}": "Coloan\u0103 {0}", +"Row {0}": "R\u00e2nd {0}", +"Spellcheck...": "Verificare a ortografiei...", +"Misspelled word": "Cuv\u00e2nt scris gre\u0219it", +"Suggestions": "Sugestii", +"Change": "Schimbare", +"Finding word suggestions": "G\u0103se\u0219te sugestii de cuvinte", +"Success": "Succes", +"Repair": "Repar\u0103", +"Issue {0} of {1}": "Num\u0103rul {0} din {1}", +"Images must be marked as decorative or have an alternative text description": "Imaginile trebuie s\u0103 fie marcate ca decorative sau s\u0103 aib\u0103 o descriere alternativ\u0103 a textului", +"Images must have an alternative text description. Decorative images are not allowed.": "Imaginile trebuie s\u0103 aib\u0103 o descriere alternativ\u0103 a textului. Imaginile decorative nu sunt permise.", +"Or provide alternative text:": "Sau furniza\u021bi un text alternativ:", +"Make image decorative:": "Face\u021bi imaginea decorativ\u0103:", +"ID attribute must be unique": "Atributul ID trebuie s\u0103 fie unic", +"Make ID unique": "Face\u021bi ID-ul unic", +"Keep this ID and remove all others": "P\u0103stra\u021bi acest ID \u0219i elimina\u021bi pe toate celelalte", +"Remove this ID": "Elimina\u021bi acest ID", +"Remove all IDs": "Elimina\u021bi toate ID-urile", +"Checklist": "Lista de verificare", "Anchor": "Ancor\u0103", "Special character": "Caractere speciale", "Color": "Culoare", -"Emoticons": "Emoticoane", "Document properties": "Propriet\u0103\u021bi document", +"Image description": "Descrierea imaginii", "Image": "Imagine", "Insert link": "Inserare link", "Link": "Link", @@ -412,7 +457,5 @@ tinymce.addI18n('ro',{ "Whole words": "Doar cuv\u00eentul \u00eentreg", "Find and replace": "Caut\u0103 \u015fi \u00eenlocuie\u015fte", "Prev": "Anterior", -"Spellcheck": "Verificarea ortografic\u0103", -"Caption": "Titlu", "Insert template": "Insereaz\u0103 \u0219ablon" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ro_RO.js b/cps/static/js/libs/tinymce/langs/ro_RO.js deleted file mode 100644 index 6df227397..000000000 --- a/cps/static/js/libs/tinymce/langs/ro_RO.js +++ /dev/null @@ -1,370 +0,0 @@ -tinymce.addI18n('ro_RO',{ -"Redo": "Refacere", -"Undo": "Anulare", -"Cut": "Decupare", -"Copy": "Copiere", -"Paste": "Lipire", -"Select all": "Selecteaz\u0103 tot", -"New document": "Document nou", -"Ok": "Ok", -"Cancel": "Revocare", -"Visual aids": "Ajutoare vizuale", -"Bold": "Aldin", -"Italic": "Cursiv", -"Underline": "Subliniere", -"Strikethrough": "T\u0103iere", -"Superscript": "Exponent", -"Subscript": "Indice", -"Clear formatting": "\u00cendep\u0103rtare formatare", -"Align left": "Aliniere st\u00e2nga", -"Align center": "Aliniere centru", -"Align right": "Aliniere dreapta", -"Justify": "Aliniere st\u00e2nga-dreapta", -"Bullet list": "List\u0103 marcatori", -"Numbered list": "List\u0103 numerotat\u0103", -"Decrease indent": "Mic\u0219orare indent", -"Increase indent": "M\u0103rire indent", -"Close": "\u00cenchidere", -"Formats": "Formate", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Browser-ul dumneavoastr\u0103 nu are acces direct la clipboard. V\u0103 rug\u0103m s\u0103 folosi\u021bi \u00een schimb scurt\u0103turile de tastatur\u0103 Ctrl+X\/C\/V.", -"Headers": "Antete", -"Header 1": "Antet 1", -"Header 2": "Antet 2", -"Header 3": "Antet 3", -"Header 4": "Antet 4", -"Header 5": "Antet 5", -"Header 6": "Antet 6", -"Headings": "Rubrici", -"Heading 1": "Titlu 1", -"Heading 2": "Titlu 2", -"Heading 3": "Titlu 3", -"Heading 4": "Titlu 4", -"Heading 5": "Titlu 5", -"Heading 6": "Titlu 6", -"Preformatted": "Preformatat", -"Div": "Div", -"Pre": "Pre", -"Code": "Cod", -"Paragraph": "Paragraf", -"Blockquote": "Blockquote", -"Inline": "\u00cen linie", -"Blocks": "Blocuri", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Lipirea este \u00een mod text simplu. Con\u021binutul va fi lipit ca text simplu p\u00e2n\u0103 dezactiva\u021bi aceast\u0103 op\u021biune.", -"Fonts": "Fonturi", -"Font Sizes": "Dimensiuni font", -"Class": "Clas\u0103", -"Browse for an image": "C\u0103uta\u021bi o imagine", -"OR": "SAU", -"Drop an image here": "Glisa\u021bi o imagine aici", -"Upload": "\u00cenc\u0103rcare", -"Block": "Sec\u021biune", -"Align": "Aliniere", -"Default": "Implicit", -"Circle": "Cerc", -"Disc": "Disc", -"Square": "P\u0103trat", -"Lower Alpha": "Litere mici", -"Lower Greek": "Grecesc mic", -"Lower Roman": "Cifre romane mici", -"Upper Alpha": "Litere mari", -"Upper Roman": "Cifre romane mari", -"Anchor...": "Ancor\u0103\u2026", -"Name": "Nume", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id-ul ar trebui s\u0103 \u00eenceap\u0103 cu o liter\u0103, urmat\u0103 doar de litere, numere, cratime, puncte, virgule sau sublinieri.", -"You have unsaved changes are you sure you want to navigate away?": "Ave\u021bi modific\u0103ri nesalvate. Sigur dori\u021bi s\u0103 naviga\u021bi \u00een alt\u0103 parte?", -"Restore last draft": "Restabili\u021bi ultima ciorn\u0103", -"Special characters...": "Caractere speciale\u2026", -"Source code": "Cod surs\u0103", -"Insert\/Edit code sample": "Inserare\/Editare mostr\u0103 cod", -"Language": "Limb\u0103", -"Code sample...": "Mostr\u0103 cod\u2026", -"Color Picker": "Selector culori", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "St\u00e2nga la dreapta", -"Right to left": "Dreapta la st\u00e2nga", -"Emoticons...": "Emoticoane\u2026", -"Metadata and Document Properties": "Meta date \u0219i Propriet\u0103\u021bi Document", -"Title": "Titlu", -"Keywords": "Cuvinte cheie", -"Description": "Descriere", -"Robots": "Robo\u0163i", -"Author": "Autor", -"Encoding": "Codare", -"Fullscreen": "Ecran complet", -"Action": "Ac\u0163iune", -"Shortcut": "Comand\u0103 rapid\u0103", -"Help": "Ajutor", -"Address": "Adres\u0103", -"Focus to menubar": "Centrare pe bara de meniuri", -"Focus to toolbar": "Centrare pe bara de unelte", -"Focus to element path": "Centrare pe calea elementului", -"Focus to contextual toolbar": "Centrare pe bara de unelte contextual\u0103", -"Insert link (if link plugin activated)": "Inserare link (dac\u0103 modulul de link-uri este activat)", -"Save (if save plugin activated)": "Salvare (dac\u0103 modulul de salvare este activat)", -"Find (if searchreplace plugin activated)": "C\u0103utare (dac\u0103 modulul de c\u0103utare \u0219i \u00eenlocuire este activat)", -"Plugins installed ({0}):": "Module instalate ({0}):", -"Premium plugins:": "Module premium:", -"Learn more...": "Afla\u021bi mai multe\u2026", -"You are using {0}": "Folosi\u021bi {0}", -"Plugins": "Inserturi", -"Handy Shortcuts": "Comenzi rapide accesibile", -"Horizontal line": "Linie orizontal\u0103", -"Insert\/edit image": "Inserare\/editare imagini", -"Image description": "Descriere imagine", -"Source": "Surs\u0103", -"Dimensions": "Dimensiuni", -"Constrain proportions": "Restric\u021bionare propor\u021bii", -"General": "General", -"Advanced": "Complex", -"Style": "Stil", -"Vertical space": "Spa\u0163iu vertical", -"Horizontal space": "Spa\u0163iu orizontal", -"Border": "Chenar", -"Insert image": "Inserare imagine", -"Image...": "Imagine\u2026", -"Image list": "List\u0103 de imagini", -"Rotate counterclockwise": "Rotire invers sensului acelor de ceasornic", -"Rotate clockwise": "Rotire \u00een sensul acelor de ceasornic", -"Flip vertically": "Inversare vertical\u0103", -"Flip horizontally": "Inversare orizontal\u0103", -"Edit image": "Editare imagine", -"Image options": "Op\u021biuni imagine", -"Zoom in": "Apropiere", -"Zoom out": "Dep\u0103rtare", -"Crop": "Decupare", -"Resize": "Redimensionare", -"Orientation": "Orientare", -"Brightness": "Luminozitate", -"Sharpen": "Accentuare", -"Contrast": "Contrast", -"Color levels": "Niveluri culori", -"Gamma": "Gamma", -"Invert": "Inversare", -"Apply": "Aplicare", -"Back": "\u00cenapoi", -"Insert date\/time": "Inserare dat\u0103\/or\u0103", -"Date\/time": "Dat\u0103\/or\u0103", -"Insert\/Edit Link": "Inserare\/Editare link", -"Insert\/edit link": "Inserare\/editare link", -"Text to display": "Text de afi\u0219at", -"Url": "Url", -"Open link in...": "Deschide link \u00een\u2026", -"Current window": "Fereastra curent\u0103", -"None": "Nu se utilizeaz\u0103 (acest c\u00e2mp)", -"New window": "Fereastr\u0103 nou\u0103", -"Remove link": "Eliminare link", -"Anchors": "Ancore", -"Link...": "Link\u2026", -"Paste or type a link": "Lipi\u021bi sau scrie\u021bi un link", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL-ul introdus pare a fi o adres\u0103 de e-mail. Dori\u021bi s\u0103 ad\u0103uga\u021bi prefixul mailto: necesar?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL-ul introdus pare a fi un link extern. Dori\u021bi s\u0103 ad\u0103uga\u021bi prefixul http:\/\/ necesar?", -"Link list": "List\u0103 linkuri", -"Insert video": "Inserare video", -"Insert\/edit video": "Inserare\/editare video", -"Insert\/edit media": "Inserare\/editare media", -"Alternative source": "Surs\u0103 alternativ\u0103", -"Alternative source URL": "URL surs\u0103 alternativ\u0103", -"Media poster (Image URL)": "Poster media (URL imagine)", -"Paste your embed code below:": "Lipi\u021bi codul de \u00eencorporare mai jos:", -"Embed": "\u00cencorporare", -"Media...": "Media\u2026", -"Nonbreaking space": "Spa\u021biu f\u0103r\u0103 \u00eentreruperi", -"Page break": "\u00centrerupere de pagin\u0103", -"Paste as text": "Lipire ca text", -"Preview": "Previzualizare", -"Print...": "Tip\u0103rire\u2026", -"Save": "Salvare", -"Find": "G\u0103sire", -"Replace with": "\u00cenlocuire cu", -"Replace": "\u00cenlocuire", -"Replace all": "\u00cenlocuire peste tot", -"Previous": "Anterior", -"Next": "Urm\u0103torul", -"Find and replace...": "C\u0103utare \u0219i \u00eenlocuire\u2026", -"Could not find the specified string.": "Nu s-a g\u0103sit \u0219irul indicat.", -"Match case": "Potrivire litere mari \u0219i mici", -"Find whole words only": "G\u0103se\u0219te doar cuvintele \u00eentregi", -"Spell check": "Verificare ortografic\u0103", -"Ignore": "Ignorare", -"Ignore all": "Ignor\u0103 tot", -"Finish": "Finalizare", -"Add to Dictionary": "Ad\u0103ugare \u00een Dic\u021bionar", -"Insert table": "Inserare tabel", -"Table properties": "Propriet\u0103\u021bi tabel", -"Delete table": "Eliminare tabel", -"Cell": "Celul\u0103", -"Row": "R\u00e2nd", -"Column": "Coloan\u0103", -"Cell properties": "Propriet\u0103\u021bi celul\u0103", -"Merge cells": "\u00cembinare celule", -"Split cell": "Scindare celul\u0103", -"Insert row before": "Inserare r\u00e2nd \u00eenainte", -"Insert row after": "Inserare r\u00e2nd dup\u0103", -"Delete row": "Eliminare r\u00e2nd", -"Row properties": "Propriet\u0103\u021bi r\u00e2nd", -"Cut row": "Decupare r\u00e2nd", -"Copy row": "Copiere r\u00e2nd", -"Paste row before": "Lipire r\u00e2nd \u00eenainte", -"Paste row after": "Lipire r\u00e2nd dup\u0103", -"Insert column before": "Inserare coloan\u0103 \u00eenainte", -"Insert column after": "Inserare coloan\u0103 dup\u0103", -"Delete column": "Eliminare coloan\u0103", -"Cols": "Coloane", -"Rows": "R\u00e2nduri", -"Width": "L\u0103\u021bime", -"Height": "\u00cen\u0103l\u021bime", -"Cell spacing": "Spa\u021biere celul\u0103", -"Cell padding": "Spa\u021biere \u00een celul\u0103", -"Show caption": "Afi\u0219are captur\u0103", -"Left": "St\u00e2nga", -"Center": "Centru", -"Right": "Dreapta", -"Cell type": "Tip celul\u0103", -"Scope": "Domeniu", -"Alignment": "Aliniere", -"H Align": "Aliniere O", -"V Align": "Aliniere V", -"Top": "Sus", -"Middle": "Mijloc", -"Bottom": "Jos", -"Header cell": "Celul\u0103 de antet", -"Row group": "Grupare r\u00e2nduri", -"Column group": "Grup coloane", -"Row type": "Tip r\u00e2nd", -"Header": "Antet", -"Body": "Corp", -"Footer": "Subsol de pagin\u0103", -"Border color": "Culoare chenar", -"Insert template...": "Inserare \u0219ablon\u2026", -"Templates": "\u0218abloane", -"Template": "\u0218ablon", -"Text color": "Culoare text", -"Background color": "Culoare fundal", -"Custom...": "Particularizare...", -"Custom color": "Culoare personalizat\u0103", -"No color": "F\u0103r\u0103 culoare", -"Remove color": "Eliminare culoare", -"Table of Contents": "Cuprins", -"Show blocks": "Arat\u0103 rubricile", -"Show invisible characters": "Arat\u0103 caracterele invizibile", -"Word count": "Num\u0103r\u0103toare cuvinte", -"Words: {0}": "Cuvinte: {0}", -"{0} words": "{0} cuvinte", -"File": "Fi\u0219ier", -"Edit": "Editare", -"Insert": "Inserare", -"View": "Vizualizare", -"Format": "Formatare", -"Table": "Tabel", -"Tools": "Unelte", -"Powered by {0}": "Sus\u021binut de {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zon\u0103 Text Formatat. Ap\u0103sa\u021bi ALT-F9 pentru a accesa meniul. Ap\u0103sa\u021bi ALT-F10 pentru a accesa bara de unelte. Ap\u0103sa\u021bi ALT-0 pentru ajutor", -"Image title": "Titlu imagine", -"Border width": "Grosime chenar", -"Border style": "Stil chenar", -"Error": "Eroare", -"Warn": "Aten\u021bionare", -"Valid": "Valid", -"To open the popup, press Shift+Enter": "Pentru a deschide fereastra popup, ap\u0103sa\u021bi Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "Zon\u0103 Text Formatat. Ap\u0103sa\u021bi ALT-0 pentru ajutor.", -"System Font": "Font Sistem", -"Failed to upload image: {0}": "Nu s-a putut \u00eenc\u0103rca imaginea: {0}", -"Failed to load plugin: {0} from url {1}": "Nu s-a putut \u00eenc\u0103rca modulul: {0} de la URL-ul {1}", -"Failed to load plugin url: {0}": "Nu s-a putut \u00eenc\u0103rca URL-ul modulului: {0}", -"Failed to initialize plugin: {0}": "Nu s-a putut ini\u021bializa modulul: {0}", -"example": "exemplu", -"Search": "C\u0103utare", -"All": "Tot", -"Currency": "Moned\u0103", -"Text": "Text", -"Quotations": "Ghilimele", -"Mathematical": "Simboluri matematice", -"Extended Latin": "Simboluri alfabet latin extins", -"Symbols": "Simboluri", -"Arrows": "S\u0103ge\u021bi", -"User Defined": "Definite de utilizator", -"dollar sign": "simbol dolar", -"currency sign": "simbol moned\u0103", -"euro-currency sign": "simbol euro", -"colon sign": "dou\u0103 puncte", -"cruzeiro sign": "simbol cruzeiro", -"french franc sign": "simbol franc francez", -"lira sign": "simbol lir\u0103", -"mill sign": "simbol mill", -"naira sign": "simbol naira", -"peseta sign": "simbol peset\u0103", -"rupee sign": "simbol rupie", -"won sign": "simbol won", -"new sheqel sign": "simbol shekel nou", -"dong sign": "simbol dong", -"kip sign": "simbol kip", -"tugrik sign": "simbol tugrik", -"drachma sign": "simbol drahm\u0103", -"german penny symbol": "simbol peni german", -"peso sign": "simbol peso", -"guarani sign": "simbol guarani", -"austral sign": "simbol austral", -"hryvnia sign": "simbol grivn\u0103", -"cedi sign": "simbol cedi", -"livre tournois sign": "simbol livr\u0103 tournois", -"spesmilo sign": "simbol spesmilo", -"tenge sign": "simbol tenge", -"indian rupee sign": "simbol rupie indian\u0103", -"turkish lira sign": "simbol lir\u0103 turceasc\u0103", -"nordic mark sign": "simbol marc\u0103 nordic\u0103", -"manat sign": "simbol manat", -"ruble sign": "simbol rubl\u0103", -"yen character": "simbol yen", -"yuan character": "simbol yuan", -"yuan character, in hong kong and taiwan": "simbol yuan \u00een Hong Kong \u0219i Taiwan", -"yen\/yuan character variant one": "simbol yen\/yuan prima variant\u0103", -"Loading emoticons...": "Se \u00eencarc\u0103 emoticoanele\u2026", -"Could not load emoticons": "Nu s-au putut \u00eenc\u0103rca emoticoanele", -"People": "Persoane", -"Animals and Nature": "Animale \u0219i natur\u0103", -"Food and Drink": "M\u00e2ncare \u0219i b\u0103uturi", -"Activity": "Activit\u0103\u021bi", -"Travel and Places": "C\u0103l\u0103torii \u0219i loca\u021bii", -"Objects": "Obiecte", -"Flags": "Steaguri", -"Characters": "Caractere", -"Characters (no spaces)": "Caractere (f\u0103r\u0103 spa\u021bii)", -"Error: Form submit field collision.": "Eroare: Coliziune c\u00e2mpuri la trimiterea formularului.", -"Error: No form element found.": "Eroare: Niciun element de formular g\u0103sit.", -"Update": "Actualizare", -"Color swatch": "Mostr\u0103 de culori", -"Turquoise": "Turcoaz", -"Green": "Verde", -"Blue": "Albastru", -"Purple": "Mov", -"Navy Blue": "Albastru marin", -"Dark Turquoise": "Turcoaz \u00eenchis", -"Dark Green": "Verde \u00eenchis", -"Medium Blue": "Albastru mediu", -"Medium Purple": "Mov mediu", -"Midnight Blue": "Albastru \u00eenchis", -"Yellow": "Galben", -"Orange": "Portocaliu", -"Red": "Ro\u0219u", -"Light Gray": "Gri deschis", -"Gray": "Gri", -"Dark Yellow": "Galben \u00eenchis", -"Dark Orange": "Portocaliu \u00eenchis", -"Dark Red": "Ro\u0219u \u00eenchis", -"Medium Gray": "Gri mediu", -"Dark Gray": "Gri \u00eenchis", -"Black": "Negru", -"White": "Alb", -"Switch to or from fullscreen mode": "Comutare pe sau de la modul ecran complet", -"Open help dialog": "Deschide dialogul de ajutor", -"history": "istoric", -"styles": "stiluri", -"formatting": "formatare", -"alignment": "aliniere", -"indentation": "indentare", -"permanent pen": "stilou permanent", -"comments": "comentarii" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/sl.js b/cps/static/js/libs/tinymce/langs/sl.js index 25fc73d7d..3a4bb3424 100644 --- a/cps/static/js/libs/tinymce/langs/sl.js +++ b/cps/static/js/libs/tinymce/langs/sl.js @@ -85,6 +85,7 @@ tinymce.addI18n('sl',{ "B": "B", "Left to right": "Od leve proti desni", "Right to left": "Od desne proti levi", +"Emoticons": "\u010custveni simboli", "Emoticons...": "\u010custveni simboli ...", "Metadata and Document Properties": "Metapodatki in lastnosti dokumenta", "Title": "Naslov", @@ -113,7 +114,9 @@ tinymce.addI18n('sl',{ "Handy Shortcuts": "Uporabne bli\u017enjice", "Horizontal line": "Vodoravna \u010drta", "Insert\/edit image": "Vstavi\/uredi sliko", -"Image description": "Opis slike", +"Alternative description": "Nadomestni opis", +"Accessibility": "Dostopnost", +"Image is decorative": "Slika je okrasna", "Source": "Pot", "Dimensions": "Dimenzije", "Constrain proportions": "Obdr\u017ei razmerje", @@ -147,7 +150,6 @@ tinymce.addI18n('sl',{ "Back": "Nazaj", "Insert date\/time": "Vstavi datum\/\u010das", "Date\/time": "Datum\/\u010das", -"Insert\/Edit Link": "Vstavi\/uredi povezavo", "Insert\/edit link": "Vstavi\/uredi povezavo", "Text to display": "Besedilo za prikaz", "Url": "Povezava", @@ -155,12 +157,14 @@ tinymce.addI18n('sl',{ "Current window": "Trenutno okno", "None": "Brez", "New window": "Novo okno", +"Open link": "Odpri povezavo", "Remove link": "Odstrani povezavo", "Anchors": "Sidra", "Link...": "Povezava ...", "Paste or type a link": "Prilepite ali vnesite povezavo", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Vneseni URL predstavlja e-po\u0161tni naslov. Ali \u017eelite dodati potrebno predpono \"mailto:\"?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Vneseni URL predstavlja zunanjo povezavo. Ali \u017eelite dodati predpono \"http:\/\/\"?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "Vneseni URL naslov predstavlja zunanjo povezavo. Ali mu \u017eelite dodati predpono https:\/\/ ?", "Link list": "Seznam povezav", "Insert video": "Vstavi video", "Insert\/edit video": "Vstavi\/uredi video", @@ -183,11 +187,15 @@ tinymce.addI18n('sl',{ "Replace all": "Zamenjaj vse", "Previous": "Prej\u0161nja", "Next": "Naslednja", +"Find and Replace": "Najdi in zamenjaj", "Find and replace...": "Najdi in zamenjaj ...", "Could not find the specified string.": "Iskanje ni vrnilo rezultatov.", "Match case": "Ujemanje malih in velikih \u010drk", "Find whole words only": "I\u0161\u010di samo cele besede", -"Spell check": "\u010crkovanje", +"Find in selection": "I\u0161\u010di v izboru", +"Spellcheck": "\u010crkovalnik", +"Spellcheck Language": "Jezik \u010drkovalnika", +"No misspellings found.": "Ni najdenih napak v \u010drkovanju.", "Ignore": "Prezri", "Ignore all": "Prezri vse", "Finish": "Zaklju\u010di", @@ -218,6 +226,7 @@ tinymce.addI18n('sl',{ "Height": "Vi\u0161ina", "Cell spacing": "Razmik med celicami", "Cell padding": "Polnilo med celicami", +"Caption": "Naslov", "Show caption": "Poka\u017ei napis", "Left": "Leva", "Center": "Sredinska", @@ -377,7 +386,21 @@ tinymce.addI18n('sl',{ "formatting": "oblikovanje", "alignment": "poravnava", "indentation": "zamik", -"permanent pen": "permanentno pisalo", +"Font": "Pisava", +"Size": "Velikost", +"More...": "Ve\u010d ...", +"Select...": "Izberi ...", +"Preferences": "Preference", +"Yes": "Da", +"No": "Ne", +"Keyboard Navigation": "Krmarjenje s tipkovnico", +"Version": "Razli\u010dica", +"Code view": "Prikaz kode", +"Open popup menu for split buttons": "Odpri pojavni meni za razdeljene gumbe", +"List Properties": "Lastnosti seznama", +"List properties...": "Lastnosti seznama...", +"Start list at number": "Za\u010dni seznam s \u0161tevilko", +"Line height": "Vi\u0161ina vrstice", "comments": "komentarji", "Format Painter": "Preslikovalnik Oblik", "Insert\/edit iframe": "Vstavi\/uredi iFrame", @@ -385,16 +408,38 @@ tinymce.addI18n('sl',{ "lowercase": "male \u010drke", "UPPERCASE": "VELIKE \u010cRKE", "Title Case": "Velike za\u010detnice naslovov", +"permanent pen": "permanentno pisalo", "Permanent Pen Properties": "Lastnosti permanentnega pisala", "Permanent pen properties...": "Lastnosti permanentnega pisala ...", -"Font": "Pisava", -"Size": "Velikost", -"More...": "Ve\u010d ...", -"Spellcheck Language": "Jezik \u010drkovalnika", -"Select...": "Izberi ...", -"Preferences": "Preference", -"Yes": "Da", -"No": "Ne", -"Keyboard Navigation": "Krmarjenje s tipkovnico", -"Version": "Razli\u010dica" +"case change": "sprememba male\/velike \u010drke", +"page embed": "vstavi stran", +"Advanced sort...": "Napredno razvr\u0161\u010danje", +"Advanced Sort": "Napredno razvr\u0161\u010danje...", +"Sort table by column ascending": "Razvrsti tabelo po stolpcu nara\u0161\u010dajo\u010de", +"Sort table by column descending": "Razvrsti tabelo po stolpcu padajo\u010de", +"Sort": "Razvrsti", +"Order": "Vrstni red", +"Sort by": "Razvrsti po", +"Ascending": "Nara\u0161\u010dajo\u010de", +"Descending": "Padajo\u010de", +"Column {0}": "Stolpec {0}", +"Row {0}": "Vrstica {0}", +"Spellcheck...": "\u010crkovalnik...", +"Misspelled word": "\u00b8Nepravilno \u010drkovana beseda", +"Suggestions": "Predlogi", +"Change": "Spremeni", +"Finding word suggestions": "Iskanje predlogov besed", +"Success": "Uspe\u0161no", +"Repair": "Popravi", +"Issue {0} of {1}": "Te\u017eava {0} od {1}", +"Images must be marked as decorative or have an alternative text description": "Slike morajo biti ozna\u010dene kot okrasne ali morajo imeti nadomestni opis v obliki besedila", +"Images must have an alternative text description. Decorative images are not allowed.": "Slike morajo imeti nadomestni opis v obliki besedila. Okrasne slike niso dovoljene.", +"Or provide alternative text:": "Ali podajte nadomestno besedilo:", +"Make image decorative:": "Dolo\u010di sliko kot okrasno:", +"ID attribute must be unique": "ID atribut mora biti edinstven", +"Make ID unique": "Ustvari edinstven ID", +"Keep this ID and remove all others": "Obdr\u017ei ta ID in odstrani vse ostale", +"Remove this ID": "Odstrani ta ID", +"Remove all IDs": "Odstrani vse IDje", +"Checklist": "Seznam preverjanj" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/sl_SI.js b/cps/static/js/libs/tinymce/langs/sl_SI.js deleted file mode 100644 index 3665d9cb2..000000000 --- a/cps/static/js/libs/tinymce/langs/sl_SI.js +++ /dev/null @@ -1,388 +0,0 @@ -tinymce.addI18n('sl_SI',{ -"Redo": "Ponovno uveljavi", -"Undo": "Razveljavi", -"Cut": "Izre\u017ei", -"Copy": "Kopiraj", -"Paste": "Prilepi", -"Select all": "Izberi vse", -"New document": "Nov dokument", -"Ok": "V redu", -"Cancel": "Prekli\u010di", -"Visual aids": "Vizualni pripomo\u010dki", -"Bold": "Krepko", -"Italic": "Po\u0161evno", -"Underline": "Pod\u010drtano", -"Strikethrough": "Pre\u010drtano", -"Superscript": "Nadpisano", -"Subscript": "Podpisano", -"Clear formatting": "Odstrani oblikovanje", -"Align left": "Leva poravnava", -"Align center": "Sredinska poravnava", -"Align right": "Desna poravnava", -"Justify": "Obojestranska poravnava", -"Bullet list": "Ozna\u010den seznam", -"Numbered list": "O\u0161tevil\u010den seznam", -"Decrease indent": "Zmanj\u0161aj zamik", -"Increase indent": "Pove\u010daj zamik", -"Close": "Zapri", -"Formats": "Oblika", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Varnostne nastavitve brskalnika ne dopu\u0161\u010dajo direktnega dostopa do odlo\u017ei\u0161\u010da. Uporabite kombinacijo tipk Ctrl + X\/C\/V na tipkovnici.", -"Headers": "Naslovi", -"Header 1": "Naslov 1", -"Header 2": "Naslov 2", -"Header 3": "Naslov 3", -"Header 4": "Naslov 4", -"Header 5": "Naslov 5", -"Header 6": "Naslov 6", -"Headings": "Naslovi", -"Heading 1": "Naslov 1", -"Heading 2": "Naslov 2", -"Heading 3": "Naslov 3", -"Heading 4": "Naslov 4", -"Heading 5": "Naslov 5", -"Heading 6": "Naslov 6", -"Preformatted": "Predformatirano", -"Div": "Div", -"Pre": "Pre", -"Code": "Koda", -"Paragraph": "Odstavek", -"Blockquote": "Blockquote", -"Inline": "Med besedilom", -"Blocks": "Bloki", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Odlagali\u0161\u010de je zdaj v tekstovnem na\u010dinu. Vsebina bo preslikana kot golo besedilo brez oblike, dokler te mo\u017enosti ne izklju\u010dite.", -"Fonts": "Pisave", -"Font Sizes": "Velikosti pisave", -"Class": "Razred", -"Browse for an image": "Prebrskaj za sliko", -"OR": "ALI", -"Drop an image here": "Spusti sliko sem", -"Upload": "Nalo\u017ei", -"Block": "Blok", -"Align": "Poravnava", -"Default": "Privzeto", -"Circle": "Pikica", -"Disc": "Kroglica", -"Square": "Kvadratek", -"Lower Alpha": "Male tiskane \u010drke", -"Lower Greek": "Male gr\u0161ke \u010drke", -"Lower Roman": "Male rimske \u0161tevilke", -"Upper Alpha": "Velike tiskane \u010drke", -"Upper Roman": "Velike rimske \u0161tevilke", -"Anchor...": "Sidro ...", -"Name": "Naziv zaznamka", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id se mora za\u010deti s \u010drko, sledijo samo \u010drke, \u0161tevilke, pomi\u0161ljaj, pike, dvopi\u010dje ali pod\u010drtaj.", -"You have unsaved changes are you sure you want to navigate away?": "Imate neshranjene spremembe. Ste prepri\u010dati, da \u017eelite zapustiti stran?", -"Restore last draft": "Obnovi zadnji osnutek", -"Special characters...": "Posebni znaki ...", -"Source code": "Izvorna koda", -"Insert\/Edit code sample": "Vstavi\/Uredi vzor\u010dno kodo", -"Language": "Jezik", -"Code sample...": "Vzor\u010dna koda ...", -"Color Picker": "Izbirnik barve", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Od leve proti desni", -"Right to left": "Od desne proti levi", -"Emoticons...": "\u010custveni simboli ...", -"Metadata and Document Properties": "Metapodatki in lastnosti dokumenta", -"Title": "Naslov", -"Keywords": "Klju\u010dne besede", -"Description": "Opis", -"Robots": "Robotki", -"Author": "Avtor", -"Encoding": "Kodiranje", -"Fullscreen": "\u010cez cel zaslon", -"Action": "Dejanje", -"Shortcut": "Bli\u017enjica", -"Help": "Pomo\u010d", -"Address": "Naslov", -"Focus to menubar": "Poudarek na menijski vrstici", -"Focus to toolbar": "Poudarek na orodni vrstici", -"Focus to element path": "Poudarek na poti elementa", -"Focus to contextual toolbar": "Poudarek na kontekstualni orodni vrstici", -"Insert link (if link plugin activated)": "Vstavi povezavo (\u010de je aktiviran vti\u010dnik za povezavo)", -"Save (if save plugin activated)": "Shrani (\u010de je aktiviran vti\u010dnik za shranjevanje)", -"Find (if searchreplace plugin activated)": "I\u0161\u010di (\u010de je aktiviran vti\u010dnik za iskanje\/zamenjavo)", -"Plugins installed ({0}):": "Name\u0161\u010deni vti\u010dniki ({0}):", -"Premium plugins:": "Premium vti\u010dniki:", -"Learn more...": "Ve\u010d ...", -"You are using {0}": "Uporabljate {0}", -"Plugins": "Vti\u010dniki", -"Handy Shortcuts": "Uporabne bli\u017enjice", -"Horizontal line": "Vodoravna \u010drta", -"Insert\/edit image": "Vstavi\/uredi sliko", -"Image description": "Opis slike", -"Source": "Pot", -"Dimensions": "Dimenzije", -"Constrain proportions": "Obdr\u017ei razmerje", -"General": "Splo\u0161no", -"Advanced": "Napredno", -"Style": "Slog", -"Vertical space": "Navpi\u010dni prostor", -"Horizontal space": "Vodoravni prostor", -"Border": "Obroba", -"Insert image": "Vnesi sliko", -"Image...": "Slika ...", -"Image list": "Seznam slik", -"Rotate counterclockwise": "Zavrti v nasprotni smeri urnega kazalca", -"Rotate clockwise": "Zavrti v smeri urinega kazalca", -"Flip vertically": "Obrni navpi\u010dno", -"Flip horizontally": "Obrni vodoravno", -"Edit image": "Uredi sliko", -"Image options": "Mo\u017enosti slike", -"Zoom in": "Pove\u010daj", -"Zoom out": "Pomanj\u0161aj", -"Crop": "Obre\u017ei", -"Resize": "Spremeni velikost", -"Orientation": "Usmerjenost", -"Brightness": "Svetlost", -"Sharpen": "Izostri", -"Contrast": "Kontrast", -"Color levels": "Barvni nivo", -"Gamma": "Gama", -"Invert": "Obrni", -"Apply": "Uporabi", -"Back": "Nazaj", -"Insert date\/time": "Vstavi datum\/\u010das", -"Date\/time": "Datum\/\u010das", -"Insert\/Edit Link": "Vstavi\/uredi povezavo", -"Insert\/edit link": "Vstavi\/uredi povezavo", -"Text to display": "Prikazno besedilo", -"Url": "Povezava", -"Open link in...": "Odpri povezavo v ...", -"Current window": "Trenutno okno", -"None": "Brez", -"New window": "Novo okno", -"Remove link": "Odstrani povezavo", -"Anchors": "Sidra", -"Link...": "Povezava ...", -"Paste or type a link": "Prilepite ali vnesite povezavo", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Vne\u0161eni URL predstavlja e-po\u0161tni naslov. Ali \u017eelite dodati potrebno \"mailto:\" predpono?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Vne\u0161eni URL predstavlja zunanjo povezavo. Ali \u017eelite dodati \"http:\/\/\" predpono?", -"Link list": "Seznam povezav", -"Insert video": "Vstavi video", -"Insert\/edit video": "Vstavi\/uredi video", -"Insert\/edit media": "Vstavi\/uredi medij", -"Alternative source": "Nadomestni vir", -"Alternative source URL": "Nadomestni vir URL", -"Media poster (Image URL)": "Medijski poster (URL slike)", -"Paste your embed code below:": "Prilepite kodo za vdelavo:", -"Embed": "Vdelaj", -"Media...": "Mediji ...", -"Nonbreaking space": "Nedeljivi presledek", -"Page break": "Prelom strani", -"Paste as text": "Vnesi kot besedilo", -"Preview": "Predogled", -"Print...": "Natisni ...", -"Save": "Shrani", -"Find": "I\u0161\u010di", -"Replace with": "Zamenjaj z", -"Replace": "Zamenjaj", -"Replace all": "Zamenjaj vse", -"Previous": "Prej\u0161nja", -"Next": "Naprej", -"Find and replace...": "Najdi in zamenjaj ...", -"Could not find the specified string.": "Iskanje ni vrnilo rezultatov.", -"Match case": "Ujemanje malih in velikih \u010drk", -"Find whole words only": "I\u0161\u010di samo cele besede", -"Spell check": "\u010crkovanje", -"Ignore": "Prezri", -"Ignore all": "Prezri vse", -"Finish": "Zaklju\u010di", -"Add to Dictionary": "Dodaj v slovar", -"Insert table": "Vstavi tabelo", -"Table properties": "Lastnosti tabele", -"Delete table": "Izbri\u0161i tabelo", -"Cell": "Celica", -"Row": "Vrstica", -"Column": "Stolpec", -"Cell properties": "Lastnosti celice", -"Merge cells": "Zdru\u017ei celice", -"Split cell": "Razdeli celico", -"Insert row before": "Vstavi vrstico pred", -"Insert row after": "Vstavi vrstico za", -"Delete row": "Izbri\u0161i vrstico", -"Row properties": "Lastnosti vrstice", -"Cut row": "Izre\u017ei vrstico", -"Copy row": "Kopiraj vrstico", -"Paste row before": "Prilepi vrstico pred", -"Paste row after": "Prilepi vrstico za", -"Insert column before": "Vstavi stolpec pred", -"Insert column after": "Vstavi stolpec za", -"Delete column": "Izbri\u0161i stolpec", -"Cols": "Stolpci", -"Rows": "Vrstice", -"Width": "\u0160irina", -"Height": "Vi\u0161ina", -"Cell spacing": "Razmik med celicami", -"Cell padding": "Polnilo med celicami", -"Show caption": "Poka\u017ei napis", -"Left": "Levo", -"Center": "Sredinsko", -"Right": "Desno", -"Cell type": "Tip celice", -"Scope": "Obseg", -"Alignment": "Poravnava", -"H Align": "Horizontalna poravnava", -"V Align": "Vertikalna poravnava", -"Top": "Vrh", -"Middle": "Sredina", -"Bottom": "Dno", -"Header cell": "Celica glave", -"Row group": "Grupiranje vrstic", -"Column group": "Grupiranje stolpcev", -"Row type": "Tip vrstice", -"Header": "Glava", -"Body": "Vsebina", -"Footer": "Noga", -"Border color": "Barva obrobe", -"Insert template...": "Vstavi predlogo ...", -"Templates": "Predloge", -"Template": "Predloga", -"Text color": "Barva besedila", -"Background color": "Barva ozadja", -"Custom...": "Po meri ...", -"Custom color": "Barva po meri", -"No color": "Brezbarvno", -"Remove color": "Odstrani barvo", -"Table of Contents": "Kazalo", -"Show blocks": "Prika\u017ei bloke", -"Show invisible characters": "Prika\u017ei skrite znake", -"Word count": "\u0160tevilo besed", -"Words: {0}": "Besed: {0}", -"{0} words": "{0} besed", -"File": "Datoteka", -"Edit": "Uredi", -"Insert": "Vstavi", -"View": "Pogled", -"Format": "Oblika", -"Table": "Tabela", -"Tools": "Orodja", -"Powered by {0}": "Uporablja tehnologijo {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Bogato besedilo. Pritisnite ALT-F9 za meni. Pritisnite ALT-F10 za orodno vrstico. Pritisnite ALT-0 za pomo\u010d", -"Image title": "Naslov slike", -"Border width": "\u0160irina obrobe", -"Border style": "Slog obrobe", -"Error": "Napaka", -"Warn": "Opozorilo", -"Valid": "Veljavno", -"To open the popup, press Shift+Enter": "Za odpiranje pojavnega okna pritisnite Shift + Enter.", -"Rich Text Area. Press ALT-0 for help.": "Bogato besedilo. Pritisnite ALT-0 za pomo\u010d.", -"System Font": "Sistemska pisava", -"Failed to upload image: {0}": "Napaka nalaganja slike: {0}", -"Failed to load plugin: {0} from url {1}": "Napaka nalaganja vti\u010dnika: {0} z url {1}", -"Failed to load plugin url: {0}": "Napaka nalaganja url: {0}", -"Failed to initialize plugin: {0}": "Napaka inicializacije vti\u010dnika: {0}", -"example": "primer", -"Search": "Iskanje", -"All": "Vse", -"Currency": "Valuta", -"Text": "Besedilo", -"Quotations": "Citati", -"Mathematical": "Matemati\u010dno", -"Extended Latin": "Raz\u0161irjena latinica", -"Symbols": "Simboli", -"Arrows": "Pu\u0161\u010dice", -"User Defined": "Uporabnik dolo\u010den", -"dollar sign": "znak za dolar", -"currency sign": "znak za valuto", -"euro-currency sign": "znak za evro", -"colon sign": "znak za dvopi\u010dje", -"cruzeiro sign": "znak za cruzeiro", -"french franc sign": "znak za francoski frank", -"lira sign": "znak za liro", -"mill sign": "znak za mill", -"naira sign": "znak za nairo", -"peseta sign": "znak za peseto", -"rupee sign": "znak za rupijo", -"won sign": "znak za won", -"new sheqel sign": "znak za novi \u0161ekl", -"dong sign": "znak za dong", -"kip sign": "znak za kip", -"tugrik sign": "znak za tugrik", -"drachma sign": "znak za drahmo", -"german penny symbol": "znak za nem\u0161ki peni", -"peso sign": "znak za peso", -"guarani sign": "znak za guarani", -"austral sign": "znak za austral", -"hryvnia sign": "znak za hrivnijo", -"cedi sign": "znak za cedi", -"livre tournois sign": "znak za livre tournois", -"spesmilo sign": "znak za spesmilo", -"tenge sign": "znak za tenge", -"indian rupee sign": "znak za indijsko rupijo", -"turkish lira sign": "znak za tur\u0161ko liro", -"nordic mark sign": "znak za nordijsko marko", -"manat sign": "znak za manat", -"ruble sign": "znak za rubelj", -"yen character": "znak za jen", -"yuan character": "znak za yuan", -"yuan character, in hong kong and taiwan": "znak za yuan, v Hongkongu in na Tajvanu", -"yen\/yuan character variant one": "znak za jen\/yuan, prva razli\u010dica", -"Loading emoticons...": "Nalaganje \u010dustvenih simbolov ...", -"Could not load emoticons": "\u010custvenih simbolov ni mogo\u010de nalo\u017eiti.", -"People": "Ljudje", -"Animals and Nature": "\u017divali in narava", -"Food and Drink": "Hrana in pija\u010da", -"Activity": "Dejavnost", -"Travel and Places": "Potovanja in kraji", -"Objects": "Predmeti", -"Flags": "Zastave", -"Characters": "Znaki", -"Characters (no spaces)": "Znaki (brez presledkov)", -"Error: Form submit field collision.": "Napaka: navzkri\u017eje polja za oddajo obrazca", -"Error: No form element found.": "Napaka: elementa oblike ni mogo\u010de najti", -"Update": "Posodobitev", -"Color swatch": "Vzorec barv", -"Turquoise": "Turkizna", -"Green": "Zelena", -"Blue": "Modra", -"Purple": "\u0160krlatna", -"Navy Blue": "Mornarsko modra", -"Dark Turquoise": "Temno turkizna", -"Dark Green": "Temno zelena", -"Medium Blue": "Srednje modra", -"Medium Purple": "Srednje \u0161krlatna", -"Midnight Blue": "Polno\u010dno modra", -"Yellow": "Rumena", -"Orange": "Oran\u017ena", -"Red": "Rde\u010da", -"Light Gray": "Svetlo siva", -"Gray": "Siva", -"Dark Yellow": "Temno rumena", -"Dark Orange": "Temno oran\u017ena", -"Dark Red": "Temno rde\u010da", -"Medium Gray": "Srednje siva", -"Dark Gray": "Temno siva", -"Black": "\u010crna", -"White": "Bela", -"Switch to or from fullscreen mode": "Preklopi v ali iz celozaslonskega na\u010dina", -"Open help dialog": "Odpri pogovorno okno za pomo\u010d", -"history": "zgodovina", -"styles": "slogi", -"formatting": "oblikovanje", -"alignment": "poravnava", -"indentation": "zamik", -"permanent pen": "permanentno pisalo", -"comments": "komentarji", -"Anchor": "Zaznamek", -"Special character": "Posebni znaki", -"Color": "Barva", -"Emoticons": "Sme\u0161ki", -"Document properties": "Lastnosti dokumenta", -"Image": "Slika", -"Insert link": "Vstavi povezavo", -"Link": "Povezava", -"Target": "Cilj", -"Media": "Medij", -"Poster": "Poster", -"Print": "Natisni", -"Whole words": "Cele besede", -"Find and replace": "Poi\u0161\u010di in zamenjaj", -"Prev": "Nazaj", -"Spellcheck": "Preverjanje \u010drkovanja", -"Caption": "Naslov", -"Insert template": "Vstavi predlogo" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/sq.js b/cps/static/js/libs/tinymce/langs/sq.js new file mode 100644 index 000000000..5286da631 --- /dev/null +++ b/cps/static/js/libs/tinymce/langs/sq.js @@ -0,0 +1,219 @@ +tinymce.addI18n('sq',{ +"Cut": "prerje", +"Heading 5": "titull 5", +"Header 2": "titull 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Shfletuesi juaj nuk supurton qasje t\u00eb drejtp\u00ebrdrejt\u00eb n\u00eb clipboard. Ju lutemi p\u00ebrdorni Ctrl+X\/C\/V shkurtesat e tastier\u00ebs n\u00eb vend. ", +"Heading 4": "titull 4", +"Div": "ndarje", +"Heading 2": "titull 2", +"Paste": "ngjit", +"Close": "Mbylle", +"Font Family": "soj g\u00ebrmave", +"Pre": "para", +"Align right": "Radhit djathtas", +"New document": "Dokument i ri", +"Blockquote": "citat", +"Numbered list": "list\u00eb e num\u00ebruara", +"Heading 1": "titull 1", +"Headings": "titull", +"Increase indent": "rrit gjurm\u00eb", +"Formats": "form\u00eb", +"Headers": "titull", +"Select all": "Selektoj t\u00eb gjitha", +"Header 3": "titull 3", +"Blocks": "bllok", +"Undo": "Anuloj", +"Strikethrough": "Vij\u00eb nga", +"Bullet list": "list\u00eb plumb", +"Header 1": "titull 1", +"Superscript": "indeks i sip\u00ebrm", +"Clear formatting": "spastroj formate", +"Font Sizes": "p\u00ebrmasa e germave", +"Subscript": "Indeksin e", +"Header 6": "titull 6", +"Redo": "rib\u00ebj", +"Paragraph": "paragraf", +"Ok": "Ok", +"Bold": "i zi", +"Code": "kod", +"Italic": "kursiv", +"Align center": "Radhit n\u00eb mes", +"Header 5": "titull 5", +"Heading 6": "titull 6", +"Heading 3": "titull 3", +"Decrease indent": "ulja gjurm\u00eb", +"Header 4": "titull 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.", +"Underline": "n\u00ebnvizoj", +"Cancel": "Moho", +"Justify": "justifikuar", +"Inline": "nj\u00ebshkolon\u00eb", +"Copy": "kopjoj", +"Align left": "Radhit majtas", +"Visual aids": "ndihm\u00ebsit vizuale", +"Lower Greek": "Lower Greek", +"Square": "Katror", +"Default": "Default", +"Lower Alpha": "Lower Alpha", +"Circle": "Rreth", +"Disc": "Disc", +"Upper Alpha": "Upper Alpha", +"Upper Roman": "Upper Roman", +"Lower Roman": "Lower Roman", +"Name": "Emri", +"Anchor": "Anchor", +"You have unsaved changes are you sure you want to navigate away?": "You have unsaved changes are you sure you want to navigate away?", +"Restore last draft": "Restore last draft", +"Special character": "Karakter i veqant", +"Source code": "Kodi burimor", +"B": "Kalt\u00ebr", +"R": "Kuqe", +"G": "Gjelb\u00ebr", +"Color": "Ngjyra", +"Right to left": "Nga e djathta n\u00eb t\u00eb majt\u00eb", +"Left to right": "Nga e majta n\u00eb t\u00eb djatht\u00eb", +"Emoticons": "Emoticons", +"Robots": "Robot\u00ebt", +"Document properties": "Vetit\u00eb e dokumentit", +"Title": "Titulli", +"Keywords": "Fjal\u00ebt kyqe", +"Encoding": "Encoding", +"Description": "Description", +"Author": "Autori", +"Fullscreen": "Fullscreen", +"Horizontal line": "Vij\u00eb horizontale", +"Horizontal space": "Hapsir\u00eb horizontale", +"Insert\/edit image": "Shto\/ndrysho imazh", +"General": "General", +"Advanced": "T\u00eb p\u00ebrparuar", +"Source": "Burimi", +"Border": "Border", +"Constrain proportions": "Constrain proportions", +"Vertical space": "Hapsir\u00eb vertikale", +"Image description": "P\u00ebrshkrimi i imazhit", +"Style": "Stili", +"Dimensions": "Dimensions", +"Insert image": "Shto imazh", +"Zoom in": "Zoom in", +"Contrast": "Contrast", +"Back": "Back", +"Gamma": "Gamma", +"Flip horizontally": "Flip horizontally", +"Resize": "Resize", +"Sharpen": "Sharpen", +"Zoom out": "Zoom out", +"Image options": "Image options", +"Apply": "Apply", +"Brightness": "Brightness", +"Rotate clockwise": "Rotate clockwise", +"Rotate counterclockwise": "Rotate counterclockwise", +"Edit image": "Edit image", +"Color levels": "Color levels", +"Crop": "Crop", +"Orientation": "Orientation", +"Flip vertically": "Flip vertically", +"Invert": "Invert", +"Insert date\/time": "Insert date\/time", +"Remove link": "Remove link", +"Url": "Url", +"Text to display": "Text to display", +"Anchors": "Anchors", +"Insert link": "Insert link", +"New window": "New window", +"None": "None", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?", +"Target": "Target", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?", +"Insert\/edit link": "Insert\/edit link", +"Insert\/edit video": "Insert\/edit video", +"Poster": "Poster", +"Alternative source": "Alternative source", +"Paste your embed code below:": "Paste your embed code below:", +"Insert video": "Insert video", +"Embed": "Embed", +"Nonbreaking space": "Nonbreaking space", +"Page break": "Page break", +"Paste as text": "Paste as text", +"Preview": "Preview", +"Print": "Print", +"Save": "Save", +"Could not find the specified string.": "Could not find the specified string.", +"Replace": "Replace", +"Next": "Next", +"Whole words": "Whole words", +"Find and replace": "Find and replace", +"Replace with": "Replace with", +"Find": "Find", +"Replace all": "Replace all", +"Match case": "Match case", +"Prev": "Prev", +"Spellcheck": "Spellcheck", +"Finish": "Finish", +"Ignore all": "Ignore all", +"Ignore": "Ignore", +"Add to Dictionary": "Add to Dictionary", +"Insert row before": "Insert row before", +"Rows": "Rows", +"Height": "Height", +"Paste row after": "Paste row after", +"Alignment": "Alignment", +"Border color": "Border color", +"Column group": "Column group", +"Row": "Row", +"Insert column before": "Insert column before", +"Split cell": "Split cell", +"Cell padding": "Cell padding", +"Cell spacing": "Cell spacing", +"Row type": "Row type", +"Insert table": "Insert table", +"Body": "Body", +"Caption": "Caption", +"Footer": "Footer", +"Delete row": "Delete row", +"Paste row before": "Paste row before", +"Scope": "Scope", +"Delete table": "Delete table", +"H Align": "H Align", +"Top": "Top", +"Header cell": "Header cell", +"Column": "Column", +"Row group": "Row group", +"Cell": "Cell", +"Middle": "Middle", +"Cell type": "Cell type", +"Copy row": "Copy row", +"Row properties": "Row properties", +"Table properties": "Table properties", +"Bottom": "Bottom", +"V Align": "V Align", +"Header": "Header", +"Right": "Right", +"Insert column after": "Insert column after", +"Cols": "Cols", +"Insert row after": "Insert row after", +"Width": "Width", +"Cell properties": "Cell properties", +"Left": "Left", +"Cut row": "Cut row", +"Delete column": "Delete column", +"Center": "Center", +"Merge cells": "Merge cells", +"Insert template": "Insert template", +"Templates": "Templates", +"Background color": "Background color", +"Custom...": "Custom...", +"Custom color": "Custom color", +"No color": "No color", +"Text color": "Text color", +"Show blocks": "Show blocks", +"Show invisible characters": "Show invisible characters", +"Words: {0}": "Words: {0}", +"Insert": "Insert", +"File": "File", +"Edit": "Edit", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help", +"Tools": "Tools", +"View": "View", +"Table": "Table", +"Format": "Format" +}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/sv_SE.js b/cps/static/js/libs/tinymce/langs/sv_SE.js deleted file mode 100644 index 6d78400a4..000000000 --- a/cps/static/js/libs/tinymce/langs/sv_SE.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('sv_SE',{ -"Redo": "G\u00f6r om", -"Undo": "\u00c5ngra", -"Cut": "Klipp ut", -"Copy": "Kopiera", -"Paste": "Klistra in", -"Select all": "Markera allt", -"New document": "Nytt dokument", -"Ok": "Ok", -"Cancel": "Avbryt", -"Visual aids": "Visuella hj\u00e4lpmedel", -"Bold": "Fet", -"Italic": "Kursiv", -"Underline": "Understruken", -"Strikethrough": "Genomstruken", -"Superscript": "Upph\u00f6jd", -"Subscript": "Neds\u00e4nkt", -"Clear formatting": "Rensa formatering", -"Align left": "V\u00e4nsterjustera", -"Align center": "Centrera", -"Align right": "H\u00f6gerjustera", -"Justify": "Verifiera", -"Bullet list": "Punktlista", -"Numbered list": "Nummerlista", -"Decrease indent": "Minska indrag", -"Increase indent": "\u00d6ka indrag", -"Close": "St\u00e4ng", -"Formats": "Format", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Din webbl\u00e4sare st\u00f6djer inte direkt \u00e5tkomst till klippboken. Anv\u00e4nd kortkommandona Ctrl\u00a0+\u00a0X\/C\/V i st\u00e4llet.", -"Headers": "Rubriker", -"Header 1": "Rubrik 1", -"Header 2": "Rubrik 2", -"Header 3": "Rubrik 3", -"Header 4": "Rubrik 4", -"Header 5": "Rubrik 5", -"Header 6": "Rubrik 6", -"Headings": "Rubriker", -"Heading 1": "Rubrik 1", -"Heading 2": "Rubrik 2", -"Heading 3": "Rubrik 3", -"Heading 4": "Rubrik 4", -"Heading 5": "Rubrik 5", -"Heading 6": "Rubrik 6", -"Preformatted": "F\u00f6rformaterad", -"Div": "Div", -"Pre": "Pre", -"Code": "Kod", -"Paragraph": "Avsnitt", -"Blockquote": "Blockquote", -"Inline": "Inline", -"Blocks": "Block", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Klistra in \u00e4r nu i textl\u00e4ge. Inneh\u00e5ll kommer att konverteras till text tills du sl\u00e5r av detta l\u00e4ge.", -"Fonts": "Typsnitt", -"Font Sizes": "Teckenstorlek", -"Class": "Klass", -"Browse for an image": "Bl\u00e4ddra efter en bild", -"OR": "OR", -"Drop an image here": "Sl\u00e4pp en bild h\u00e4r", -"Upload": "Ladda upp", -"Block": "Block", -"Align": "Justera", -"Default": "Original", -"Circle": "Cirkel", -"Disc": "Disk", -"Square": "Fyrkant", -"Lower Alpha": "Gemener", -"Lower Greek": "Grekiska gemener", -"Lower Roman": "Romerska gemener", -"Upper Alpha": "Versaler", -"Upper Roman": "Romerska versaler", -"Anchor...": "Ankare...", -"Name": "Namn", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id skall b\u00f6rja med en bokstav och f\u00f6ljande tecken ska vara bokst\u00e4ver, nummer, punkter, understr\u00e4ck eller kolon.", -"You have unsaved changes are you sure you want to navigate away?": "Du har f\u00f6r\u00e4ndringar som du inte har sparat. \u00c4r du s\u00e4ker p\u00e5 att du vill navigera vidare?", -"Restore last draft": "\u00c5terst\u00e4ll senaste utkast", -"Special character...": "Specialtecken...", -"Source code": "K\u00e4llkod", -"Insert\/Edit code sample": "Infoga\/Redigera k\u00e5d exempel", -"Language": "Spr\u00e5k", -"Code sample...": "Kodexempel...", -"Color Picker": "F\u00e4rgv\u00e4ljare", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "V\u00e4nster till h\u00f6ger", -"Right to left": "H\u00f6ger till v\u00e4nster", -"Emoticons...": "Emoticons...", -"Metadata and Document Properties": "Metadata och dokumentegenskaper", -"Title": "Titel", -"Keywords": "Nyckelord", -"Description": "Beskrivning", -"Robots": "Robotar", -"Author": "F\u00f6rfattare", -"Encoding": "Encoding", -"Fullscreen": "Fullsk\u00e4rm", -"Action": "H\u00e4ndelse", -"Shortcut": "Kortkommando", -"Help": "Hj\u00e4lp", -"Address": "Adress", -"Focus to menubar": "Fokusera p\u00e5 menyrad", -"Focus to toolbar": "Fokusera p\u00e5 verktygsrad", -"Focus to element path": "Fokusera p\u00e5 elements\u00f6kv\u00e4gsrad", -"Focus to contextual toolbar": "Fokusera p\u00e5 den kontextuella verktygsraden", -"Insert link (if link plugin activated)": "Infoga l\u00e4nk (om link-pluginet \u00e4r aktiverat)", -"Save (if save plugin activated)": "Spara (om save-pluginet \u00e4r aktiverat)", -"Find (if searchreplace plugin activated)": "S\u00f6k (om searchreplace-pluginet \u00e4r aktiverat)", -"Plugins installed ({0}):": "Installerade plugins ({0}):", -"Premium plugins:": "Premiumplugins:", -"Learn more...": "L\u00e4s mer...", -"You are using {0}": "Du anv\u00e4nder {0}", -"Plugins": "Plugins", -"Handy Shortcuts": "Kortkommandon", -"Horizontal line": "Horisontell linje", -"Insert\/edit image": "Infoga\/redigera bild", -"Image description": "Bildbeskrivning", -"Source": "K\u00e4lla", -"Dimensions": "Dimensioner", -"Constrain proportions": "Begr\u00e4nsa proportioner", -"General": "Generella", -"Advanced": "Avancerat", -"Style": "Stil", -"Vertical space": "Vertikaltutrymme", -"Horizontal space": "Horisontellt utrymme", -"Border": "Ram", -"Insert image": "Infoga bild", -"Image...": "Bild...", -"Image list": "Bildlista", -"Rotate counterclockwise": "Rotera moturs", -"Rotate clockwise": "Rotera medurs", -"Flip vertically": "Spegelv\u00e4nd vertikalt", -"Flip horizontally": "Spegelv\u00e4nd horisontellt", -"Edit image": "Redigera bild", -"Image options": "Bild inst\u00e4llningar", -"Zoom in": "Zooma in", -"Zoom out": "Zooma ut", -"Crop": "Besk\u00e4r", -"Resize": "Skala om", -"Orientation": "Orientera", -"Brightness": "Ljusstyrka", -"Sharpen": "Sk\u00e4rpa", -"Contrast": "Kontrast", -"Color levels": "F\u00e4rgniv\u00e5er", -"Gamma": "Gamma", -"Invert": "Invertera", -"Apply": "Applicera", -"Back": "Tillbaka", -"Insert date\/time": "Infoga datum\/tid", -"Date\/time": "Datum\/tid", -"Insert\/Edit Link": "Infoga\/redigera l\u00e4nk", -"Insert\/edit link": "Infoga\/redigera l\u00e4nk", -"Text to display": "Text att visa", -"Url": "Url", -"Open link in...": "\u00d6ppna l\u00e4nk i...", -"Current window": "Nuvarande f\u00f6nster", -"None": "Ingen", -"New window": "Nytt f\u00f6nster", -"Remove link": "Ta bort l\u00e4nk", -"Anchors": "Bokm\u00e4rken", -"Link...": "L\u00e4nk...", -"Paste or type a link": "Klistra in eller skriv en l\u00e4nk", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Urlen du angav verkar vara en epost adress. Vill du l\u00e4gga till ett mailto: prefix?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Urlen du angav verkar vara en extern l\u00e4nk. Vill du l\u00e4gga till http:\/\/ prefixet?", -"Link list": "L\u00e4nklista", -"Insert video": "Infoga video", -"Insert\/edit video": "Infoga\/redigera video", -"Insert\/edit media": "Infoga\/redigera media", -"Alternative source": "Alternativ k\u00e4lla", -"Alternative source URL": "Alternativ k\u00e4llwebbadress", -"Media poster (Image URL)": "Mediaposter (bildwebbadress)", -"Paste your embed code below:": "Klistra in din inb\u00e4ddningskod nedan:", -"Embed": "Inb\u00e4ddning", -"Media...": "Media...", -"Nonbreaking space": "Avbrottsfritt mellanrum", -"Page break": "Sidbrytning", -"Paste as text": "Klistra in som text", -"Preview": "F\u00f6rhandsgranska", -"Print...": "Skriv ut...", -"Save": "Spara", -"Find": "S\u00f6k", -"Replace with": "Ers\u00e4tt med", -"Replace": "Ers\u00e4tt", -"Replace all": "Ers\u00e4tt alla", -"Previous": "F\u00f6reg\u00e5ende", -"Next": "N\u00e4sta", -"Find and replace...": "S\u00f6k och ers\u00e4tt...", -"Could not find the specified string.": "Kunde inte hitta den specifierade st\u00e4ngen.", -"Match case": "Matcha gemener\/versaler", -"Find whole words only": "Hitta endast hela ord", -"Spell check": "Stavningskontroll", -"Ignore": "Ignorera", -"Ignore all": "Ignorera alla", -"Finish": "Avsluta", -"Add to Dictionary": "L\u00e4gg till i ordlista", -"Insert table": "Infoga tabell", -"Table properties": "Tabellegenskaper", -"Delete table": "Radera tabell", -"Cell": "Cell", -"Row": "Rad", -"Column": "Kolumn", -"Cell properties": "Cellegenskaper", -"Merge cells": "Sammanfoga celler", -"Split cell": "Bryt is\u00e4r celler", -"Insert row before": "Infoga rad f\u00f6re", -"Insert row after": "Infoga rad efter", -"Delete row": "Radera rad", -"Row properties": "Radegenskaper", -"Cut row": "Klipp ut rad", -"Copy row": "Kopiera rad", -"Paste row before": "Klista in rad f\u00f6re", -"Paste row after": "Klistra in rad efter", -"Insert column before": "Infoga kolumn f\u00f6re", -"Insert column after": "Infoga kolumn efter", -"Delete column": "Radera kolumn", -"Cols": "Kolumner", -"Rows": "Rader", -"Width": "Bredd", -"Height": "H\u00f6jd", -"Cell spacing": "Cellmellanrum", -"Cell padding": "Cellpaddning", -"Show caption": "Visa bildtext", -"Left": "V\u00e4nster", -"Center": "Centrum", -"Right": "H\u00f6ger", -"Cell type": "Celltyp", -"Scope": "Omf\u00e5ng", -"Alignment": "Justering", -"H Align": "H-justering", -"V Align": "V-justering", -"Top": "Toppen", -"Middle": "Mitten", -"Bottom": "Botten", -"Header cell": "Huvudcell", -"Row group": "Radgrupp", -"Column group": "Kolumngrupp", -"Row type": "Radtyp", -"Header": "Huvud", -"Body": "Kropp", -"Footer": "Fot", -"Border color": "Ramf\u00e4rg", -"Insert template...": "Infoga mall...", -"Templates": "Mallar", -"Template": "Mall", -"Text color": "Textf\u00e4rg", -"Background color": "Bakgrundsf\u00e4rg", -"Custom...": "Anpassad...", -"Custom color": "Anpassad f\u00e4rg", -"No color": "Ingen f\u00e4rg", -"Remove color": "Ta bort f\u00e4rg", -"Table of Contents": "Inneh\u00e5llsf\u00f6rteckning", -"Show blocks": "Visa block", -"Show invisible characters": "Visa onsynliga tecken", -"Word count": "Ordantal", -"Count": "Antal", -"Document": "Dokument", -"Selection": "Val", -"Words": "Ord", -"Words: {0}": "Ord: {0}", -"{0} words": "{0} ord", -"File": "Fil", -"Edit": "Redigera", -"Insert": "Infoga", -"View": "Visa", -"Format": "Format", -"Table": "Tabell", -"Tools": "Verktyg", -"Powered by {0}": "Powered by {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Textredigerare. Tryck ALT-F9 f\u00f6r menyn. Tryck ALT-F10 f\u00f6r verktygsrader. Tryck ALT-0 f\u00f6r hj\u00e4lp.", -"Image title": "Bildtitel", -"Border width": "Kantlinjebredd", -"Border style": "Kantlinjestil", -"Error": "Fel", -"Warn": "Varning", -"Valid": "Giltig", -"To open the popup, press Shift+Enter": "Tryck p\u00e5 Shift\u00a0+\u00a0Enter f\u00f6r att \u00f6ppna popup-f\u00f6nstret", -"Rich Text Area. Press ALT-0 for help.": "Omr\u00e5de med formaterad text. Tryck p\u00e5 ALT-0 f\u00f6r hj\u00e4lp.", -"System Font": "Systemtypsnitt", -"Failed to upload image: {0}": "Kunde inte ladda upp bild: {0}", -"Failed to load plugin: {0} from url {1}": "Kunde inte l\u00e4sa in insticksprogram: {0} fr\u00e5n webbadress {1}", -"Failed to load plugin url: {0}": "Kunde inte l\u00e4sa in webbadress f\u00f6r insticksprogram: {0}", -"Failed to initialize plugin: {0}": "Kunde inte initiera insticksprogram: {0}", -"example": "exempel", -"Search": "S\u00f6k", -"All": "Alla", -"Currency": "Valuta", -"Text": "Text", -"Quotations": "Citattecken", -"Mathematical": "Matematiskt", -"Extended Latin": "Ut\u00f6kad latin", -"Symbols": "Symboler", -"Arrows": "Pilar", -"User Defined": "Anv\u00e4ndardefinierade", -"dollar sign": "dollartecken", -"currency sign": "valutatecken", -"euro-currency sign": "eurotecken", -"colon sign": "kolon", -"cruzeiro sign": "cruzeirotecken", -"french franc sign": "franctecken", -"lira sign": "liratecken", -"mill sign": "milltecken", -"naira sign": "nairatecken", -"peseta sign": "pesetastecken", -"rupee sign": "rupeetecken", -"won sign": "wontecken", -"new sheqel sign": "schekeltecken", -"dong sign": "dongtecken", -"kip sign": "kiptecken", -"tugrik sign": "tugriktecken", -"drachma sign": "drachmertecken", -"german penny symbol": "tecken f\u00f6r tysk penny", -"peso sign": "pesotecken", -"guarani sign": "guaranitecken", -"austral sign": "australtecken", -"hryvnia sign": "hryvniatecken", -"cedi sign": "ceditecken", -"livre tournois sign": "tecken f\u00f6r livre tournois", -"spesmilo sign": "spesmilotecken", -"tenge sign": "tengetecken", -"indian rupee sign": "tecken f\u00f6r indisk rupee", -"turkish lira sign": "tecken f\u00f6r turkisk lira", -"nordic mark sign": "tecken f\u00f6r nordisk mark", -"manat sign": "manattecken", -"ruble sign": "rubeltecken", -"yen character": "yentecken", -"yuan character": "yuantecken", -"yuan character, in hong kong and taiwan": "yuantecken i Hongkong och Taiwan", -"yen\/yuan character variant one": "yen-\/yuantecken variant ett", -"Loading emoticons...": "L\u00e4ser in emoticons...", -"Could not load emoticons": "Kunde inte l\u00e4sa in emoticons", -"People": "M\u00e4nniskor", -"Animals and Nature": "Djur och natur", -"Food and Drink": "Mat och dryck", -"Activity": "Aktivitet", -"Travel and Places": "Resa och platser", -"Objects": "F\u00f6rem\u00e5l", -"Flags": "Flaggor", -"Characters": "Tecken", -"Characters (no spaces)": "Tecken (inga mellanrum)", -"{0} characters": "{0} tecken", -"Error: Form submit field collision.": "Fel: Kollision f\u00e4lt f\u00f6r s\u00e4ndning av formul\u00e4r.", -"Error: No form element found.": "Fel: Inget formul\u00e4relement hittades.", -"Update": "Uppdatera", -"Color swatch": "F\u00e4rgpalett", -"Turquoise": "Turkos", -"Green": "Gr\u00f6n", -"Blue": "Bl\u00e5", -"Purple": "Lila", -"Navy Blue": "M\u00f6rkbl\u00e5", -"Dark Turquoise": "M\u00f6rkturkos", -"Dark Green": "M\u00f6rkgr\u00f6n", -"Medium Blue": "Mellanbl\u00e5", -"Medium Purple": "Mellanlila", -"Midnight Blue": "Midnattsbl\u00e5", -"Yellow": "Gul", -"Orange": "Orange", -"Red": "R\u00f6d", -"Light Gray": "Ljusgr\u00e5", -"Gray": "Gr\u00e5", -"Dark Yellow": "M\u00f6rkgul", -"Dark Orange": "M\u00f6rkorange", -"Dark Red": "M\u00f6rkr\u00f6d", -"Medium Gray": "Mellangr\u00e5", -"Dark Gray": "M\u00f6rkgr\u00e5", -"Light Green": "Ljusgr\u00f6n", -"Light Yellow": "Ljusgul", -"Light Red": "Ljusr\u00f6d", -"Light Purple": "Ljuslila", -"Light Blue": "Ljusbl\u00e5", -"Dark Purple": "M\u00f6rklila", -"Dark Blue": "M\u00f6rkbl\u00e5", -"Black": "Svart", -"White": "Vit", -"Switch to or from fullscreen mode": "V\u00e4xla till eller fr\u00e5n fullsk\u00e4rmsl\u00e4ge", -"Open help dialog": "\u00d6ppna hj\u00e4lpdialogrutan", -"history": "historik", -"styles": "stilar", -"formatting": "formatering", -"alignment": "justering", -"indentation": "indragning", -"permanent pen": "permanent penna", -"comments": "kommentarer", -"Format Painter": "H\u00e4mta format", -"Insert\/edit iframe": "Infoga\/redigera iframe", -"Capitalization": "Versaler", -"lowercase": "gemener", -"UPPERCASE": "VERSALER", -"Title Case": "Inledande versal", -"Permanent Pen Properties": "Permanenta pennegenskaper", -"Permanent pen properties...": "Permanenta pennegenskaper\u00a0\u2026", -"Font": "Teckensnitt", -"Size": "Storlek", -"More...": "Mer...", -"Spellcheck Language": "Spr\u00e5k f\u00f6r stavningskontroll", -"Select...": "V\u00e4lj...", -"Preferences": "Inst\u00e4llningar", -"Yes": "Ja", -"No": "Nej", -"Keyboard Navigation": "Tangentbordsnavigering", -"Version": "Version", -"Anchor": "Ankare", -"Special character": "Specialtecken", -"Code sample": "K\u00e5dexempel", -"Color": "F\u00e4rg", -"Emoticons": "Emoticons", -"Document properties": "Dokumentegenskaper", -"Image": "Bild", -"Insert link": "Infoga l\u00e4nk", -"Target": "M\u00e5l", -"Link": "L\u00e4nk", -"Poster": "Affish", -"Media": "Media", -"Print": "Skriv ut", -"Prev": "F\u00f6reg\u00e5ende", -"Find and replace": "S\u00f6k och ers\u00e4tt", -"Whole words": "Hela ord", -"Spellcheck": "R\u00e4ttstava", -"Caption": "Rubrik", -"Insert template": "Infoga mall" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ta.js b/cps/static/js/libs/tinymce/langs/ta.js index 9149acd9e..31ff4c769 100644 --- a/cps/static/js/libs/tinymce/langs/ta.js +++ b/cps/static/js/libs/tinymce/langs/ta.js @@ -85,6 +85,7 @@ tinymce.addI18n('ta',{ "B": "B", "Left to right": "\u0b87\u0b9f\u0bae\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0bb5\u0bb2\u0bae\u0bcd", "Right to left": "\u0bb5\u0bb2\u0bae\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0b87\u0b9f\u0bae\u0bcd", +"Emoticons": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd", "Emoticons...": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd", "Metadata and Document Properties": "\u0bae\u0bc0\u0ba4\u0bcd\u0ba4\u0bb0\u0bb5\u0bc1 \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b86\u0bb5\u0ba3\u0baa\u0bcd \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", "Title": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", @@ -113,7 +114,9 @@ tinymce.addI18n('ta',{ "Handy Shortcuts": "\u0b8e\u0bb3\u0bbf\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0bc8\u0baf\u0bbe\u0bb3\u0b95\u0bcd\u0b95\u0bc2\u0b9f\u0bbf\u0baf \u0b95\u0bc1\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0bb4\u0bbf\u0b95\u0bb3\u0bcd", "Horizontal line": "\u0b95\u0bbf\u0b9f\u0bc8 \u0b95\u0bcb\u0b9f\u0bc1", "Insert\/edit image": "\u0baa\u0b9f\u0bae\u0bcd \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Image description": "\u0baa\u0b9f \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd", +"Alternative description": "\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd", +"Accessibility": "\u0b85\u0ba3\u0bc1\u0b95\u0bb2\u0bcd\u0ba4\u0ba9\u0bcd\u0bae\u0bc8", +"Image is decorative": "\u0baa\u0b9f\u0bae\u0bcd \u0b85\u0bb2\u0b99\u0bcd\u0b95\u0bbe\u0bb0\u0bae\u0bbe\u0ba9\u0ba4\u0bc1", "Source": "\u0bae\u0bc2\u0bb2\u0bae\u0bcd", "Dimensions": "\u0baa\u0bb0\u0bbf\u0bae\u0bbe\u0ba3\u0b99\u0bcd\u0b95\u0bb3\u0bcd", "Constrain proportions": "\u0bb5\u0bbf\u0b95\u0bbf\u0ba4\u0bbe\u0b9a\u0bcd\u0b9a\u0bbe\u0bb0\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0b9f\u0bcd\u0b9f\u0bc1\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", @@ -147,7 +150,6 @@ tinymce.addI18n('ta',{ "Back": "\u0baa\u0bbf\u0ba9\u0bcd", "Insert date\/time": "\u0ba4\u0bc7\u0ba4\u0bbf\/\u0ba8\u0bc7\u0bb0\u0bae\u0bcd \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95", "Date\/time": "\u0ba4\u0bc7\u0ba4\u0bbf\/\u0ba8\u0bc7\u0bb0\u0bae\u0bcd", -"Insert\/Edit Link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", "Insert\/edit link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", "Text to display": "\u0b95\u0bbe\u0b9f\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bbf\u0baf \u0b89\u0bb0\u0bc8", "Url": "\u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", @@ -155,12 +157,14 @@ tinymce.addI18n('ta',{ "Current window": "\u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b9a\u0bbe\u0bb3\u0bb0\u0bae\u0bcd", "None": "\u0b8f\u0ba4\u0bc1\u0bae\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", "New window": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b9a\u0bbe\u0bb3\u0bb0\u0bae\u0bcd", +"Open link": "\u0ba4\u0bbf\u0bb1\u0ba8\u0bcd\u0ba4 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1", "Remove link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", "Anchors": "\u0ba8\u0b99\u0bcd\u0b95\u0bc2\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd", "Link...": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1...", "Paste or type a link": "\u0b92\u0bb0\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95 \u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bbf\u0b9f\u0bc1\u0b95", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bcd\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf (URL) \u0b92\u0bb0\u0bc1 \u0bae\u0bbf\u0ba9\u0bcd-\u0b85\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf \u0baa\u0bcb\u0bb2\u0bcd \u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1. \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 mailto: \u0bae\u0bc1\u0ba9\u0bcd-\u0b92\u0b9f\u0bcd\u0b9f\u0bc8\u0ba4\u0bcd (prefix) \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bbe?", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bcd\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf (URL) \u0b92\u0bb0\u0bc1 \u0bb5\u0bc6\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bc1\u0bb1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 (external link) \u0baa\u0bcb\u0bb2\u0bcd \u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1. \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 http:\/\/ \u0bae\u0bc1\u0ba9\u0bcd-\u0b92\u0b9f\u0bcd\u0b9f\u0bc8\u0ba4\u0bcd (prefix) \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bbe?", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bcd\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf (URL) \u0b92\u0bb0\u0bc1 \u0bb5\u0bc6\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bc1\u0bb1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 (external link) \u0baa\u0bcb\u0bb2\u0bcd \u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1. \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 https:\/\/ \u0bae\u0bc1\u0ba9\u0bcd-\u0b92\u0b9f\u0bcd\u0b9f\u0bc8 (prefix) \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95 \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bb3\u0bbe?", "Link list": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0baa\u0bcd \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", "Insert video": "\u0b95\u0bbe\u0ba3\u0bca\u0bb3\u0bbf \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95", "Insert\/edit video": "\u0b95\u0bbe\u0ba3\u0bca\u0bb3\u0bbf \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", @@ -183,11 +187,15 @@ tinymce.addI18n('ta',{ "Replace all": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", "Previous": "\u0bae\u0bc1\u0ba8\u0bcd\u0ba4\u0bc8\u0baf", "Next": "\u0b85\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4", +"Find and Replace": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", "Find and replace...": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95...", "Could not find the specified string.": "\u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bcd\u0b9f \u0b9a\u0bb0\u0bae\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", "Match case": "\u0bb5\u0b9f\u0bbf\u0bb5\u0ba4\u0bcd\u0ba4\u0bc8 \u0baa\u0bca\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", "Find whole words only": "\u0bae\u0bc1\u0bb4\u0bc1 \u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0b9f\u0bcd\u0b9f\u0bc1\u0bae\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95", -"Spell check": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1", +"Find in selection": "\u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bbf\u0bb2\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95", +"Spellcheck": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0baf\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95", +"Spellcheck Language": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1 \u0bae\u0bca\u0bb4\u0bbf", +"No misspellings found.": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0b95\u0bb3\u0bcd \u0b95\u0bbe\u0ba3\u0baa\u0bcd\u0baa\u0b9f\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8.", "Ignore": "\u0baa\u0bc1\u0bb1\u0b95\u0bcd\u0b95\u0ba3\u0bbf\u0b95\u0bcd\u0b95", "Ignore all": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0baa\u0bc1\u0bb1\u0b95\u0bcd\u0b95\u0ba3\u0bbf\u0b95\u0bcd\u0b95", "Finish": "\u0bae\u0bc1\u0b9f\u0bbf\u0b95\u0bcd\u0b95", @@ -218,6 +226,7 @@ tinymce.addI18n('ta',{ "Height": "\u0b89\u0baf\u0bb0\u0bae\u0bcd", "Cell spacing": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf", "Cell padding": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0ba8\u0bbf\u0bb0\u0baa\u0bcd\u0baa\u0bb2\u0bcd", +"Caption": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", "Show caption": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", "Left": "\u0b87\u0b9f\u0bae\u0bcd", "Center": "\u0bae\u0bc8\u0baf\u0bae\u0bcd", @@ -377,7 +386,21 @@ tinymce.addI18n('ta',{ "formatting": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", "alignment": "\u0b9a\u0bc0\u0bb0\u0bae\u0bc8\u0bb5\u0bc1", "indentation": "\u0b89\u0bb3\u0bcd\u0ba4\u0bb3\u0bcd\u0bb3\u0bc1\u0ba4\u0bb2\u0bcd", -"permanent pen": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe", +"Font": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", +"Size": "\u0b85\u0bb3\u0bb5\u0bc1", +"More...": "\u0bae\u0bc7\u0bb2\u0bc1\u0bae\u0bcd...", +"Select...": "\u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0b95...", +"Preferences": "\u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0b99\u0bcd\u0b95\u0bb3\u0bcd", +"Yes": "\u0b86\u0bae\u0bcd", +"No": "\u0b87\u0bb2\u0bcd\u0bb2\u0bc8", +"Keyboard Navigation": "\u0bb5\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0bb2\u0b95\u0bc8 \u0bb5\u0bb4\u0bbf\u0b9a\u0bcd\u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", +"Version": "\u0baa\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0bc1", +"Code view": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1 \u0ba8\u0bcb\u0b95\u0bcd\u0b95\u0bc1", +"Open popup menu for split buttons": "\u0baa\u0bbf\u0bb3\u0bb5\u0bc1 \u0baa\u0bca\u0ba4\u0bcd\u0ba4\u0bbe\u0ba9\u0bcd\u0b95\u0bb3\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0bae\u0bc7\u0bb2\u0bcd\u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1 \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0ba4\u0bbf\u0bb1\u0b95\u0bcd\u0b95", +"List Properties": "\u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bbf\u0b9f\u0bc1\u0b95", +"List properties...": "\u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bbf\u0b9f\u0bc1\u0b95..", +"Start list at number": "\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bc8 \u0b87\u0ba8\u0bcd\u0ba4 \u0b8e\u0ba3\u0bcd\u0ba3\u0bbf\u0bb2\u0bcd \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bc1\u0b95", +"Line height": "\u0bb5\u0bb0\u0bbf \u0b89\u0baf\u0bb0\u0bae\u0bcd", "comments": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bb3\u0bcd", "Format Painter": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0baa\u0bc2\u0b9a\u0bbe\u0bb3\u0ba9\u0bcd", "Insert\/edit iframe": "iframe \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", @@ -385,24 +408,46 @@ tinymce.addI18n('ta',{ "lowercase": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bc6\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", "UPPERCASE": "\u0baa\u0bc7\u0bb0\u0bc6\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", "Title Case": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bcd", +"permanent pen": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe", "Permanent Pen Properties": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", "Permanent pen properties...": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd...", -"Font": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", -"Size": "\u0b85\u0bb3\u0bb5\u0bc1", -"More...": "\u0bae\u0bc7\u0bb2\u0bc1\u0bae\u0bcd...", -"Spellcheck Language": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1 \u0bae\u0bca\u0bb4\u0bbf", -"Select...": "\u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0b95...", -"Preferences": "\u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Yes": "\u0b86\u0bae\u0bcd", -"No": "\u0b87\u0bb2\u0bcd\u0bb2\u0bc8", -"Keyboard Navigation": "\u0bb5\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0bb2\u0b95\u0bc8 \u0bb5\u0bb4\u0bbf\u0b9a\u0bcd\u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", -"Version": "\u0baa\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0bc1", +"case change": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bae\u0bcd", +"page embed": "\u0baa\u0b95\u0bcd\u0b95\u0bae\u0bcd \u0b89\u0b9f\u0bcd\u0baa\u0bca\u0ba4\u0bbf\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", +"Advanced sort...": "\u0bae\u0bc7\u0bae\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baf\u0bbe\u0b95\u0bcd\u0b95\u0bae\u0bcd...", +"Advanced Sort": "\u0bae\u0bc7\u0bae\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baf\u0bbe\u0b95\u0bcd\u0b95\u0bae\u0bcd", +"Sort table by column ascending": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8\u0baf\u0bc8 \u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b8f\u0bb1\u0bc1\u0bae\u0bc1\u0b95\u0bae\u0bbe\u0b95 \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", +"Sort table by column descending": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8\u0baf\u0bc8 \u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b87\u0bb1\u0b99\u0bcd\u0b95\u0bc1\u0bae\u0bc1\u0b95\u0bae\u0bbe\u0b95 \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", +"Sort": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", +"Order": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0bae\u0bc1\u0bb1\u0bc8", +"Sort by": "\u0b87\u0ba4\u0ba9\u0bbe\u0bb2\u0bcd \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", +"Ascending": "\u0b8f\u0bb1\u0bc1\u0bae\u0bc1\u0b95\u0bae\u0bcd", +"Descending": "\u0b87\u0bb1\u0b99\u0bcd\u0b95\u0bc1\u0bae\u0bc1\u0b95\u0bae\u0bcd", +"Column {0}": "\u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 {0}", +"Row {0}": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 {0}", +"Spellcheck...": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0baf\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95...", +"Misspelled word": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0baf\u0bc1\u0bb3\u0bcd\u0bb3 \u0b9a\u0bca\u0bb2\u0bcd", +"Suggestions": "\u0baa\u0bb0\u0bbf\u0ba8\u0bcd\u0ba4\u0bc1\u0bb0\u0bc8\u0b95\u0bb3\u0bcd", +"Change": "\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", +"Finding word suggestions": "\u0b9a\u0bca\u0bb2\u0bcd \u0baa\u0bb0\u0bbf\u0ba8\u0bcd\u0ba4\u0bc1\u0bb0\u0bc8\u0b95\u0bb3\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bb1\u0bbf\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1", +"Success": "\u0bb5\u0bc6\u0bb1\u0bcd\u0bb1\u0bbf", +"Repair": "\u0b9a\u0bb0\u0bbf \u0b9a\u0bc6\u0baf\u0bcd\u0b95", +"Issue {0} of {1}": "\u0baa\u0bbf\u0bb0\u0b9a\u0bcd\u0b9a\u0bbf\u0ba9\u0bc8 {0} \/ {1}", +"Images must be marked as decorative or have an alternative text description": "\u0baa\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b85\u0bb2\u0b99\u0bcd\u0b95\u0bbe\u0bb0\u0bae\u0bbe\u0b95 \u0b95\u0bc1\u0bb1\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd \u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0b89\u0bb0\u0bc8 \u0bb5\u0bbf\u0bb3\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b95\u0bca\u0ba3\u0bcd\u0b9f\u0bbf\u0bb0\u0bc1\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd", +"Images must have an alternative text description. Decorative images are not allowed.": "\u0baa\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0b89\u0bb0\u0bc8 \u0bb5\u0bbf\u0bb3\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b95\u0bca\u0ba3\u0bcd\u0b9f\u0bbf\u0bb0\u0bc1\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd. \u0b85\u0bb2\u0b99\u0bcd\u0b95\u0bbe\u0bb0\u0baa\u0bcd \u0baa\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0b85\u0ba9\u0bc1\u0bae\u0ba4\u0bbf\u0baf\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8.", +"Or provide alternative text:": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bc8 \u0bb5\u0bb4\u0b99\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", +"Make image decorative:": "\u0baa\u0b9f\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0bb2\u0b99\u0bcd\u0b95\u0bbe\u0bb0\u0bae\u0bbe\u0ba9\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bc1\u0b95", +"ID attribute must be unique": "ID \u0baa\u0ba3\u0bcd\u0baa\u0bc1 \u0ba4\u0ba9\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1\u0bb5\u0bae\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd", +"Make ID unique": "ID-\u0baf\u0bc8 \u0ba4\u0ba9\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1\u0bb5\u0bae\u0bbe\u0b95\u0bcd\u0b95\u0bc1\u0b95", +"Keep this ID and remove all others": "\u0b87\u0ba8\u0bcd\u0ba4 ID-\u0baf\u0bc8 \u0bb5\u0bc8\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bcd\u0b95\u0bca\u0ba3\u0bcd\u0b9f\u0bc1 \u0bae\u0bb1\u0bcd\u0bb1 \u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bb5\u0bc1\u0bae\u0bcd", +"Remove this ID": "\u0b87\u0ba8\u0bcd\u0ba4 ID \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", +"Remove all IDs": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc1 ID-\u0b95\u0bb3\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", +"Checklist": "\u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1 \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", "Anchor": "\u0ba8\u0b99\u0bcd\u0b95\u0bc2\u0bb0\u0bae\u0bcd", "Special character": "\u0b9a\u0bbf\u0bb1\u0baa\u0bcd\u0baa\u0bc1 \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", "Code sample": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1 \u0bae\u0bbe\u0ba4\u0bbf\u0bb0\u0bbf", "Color": "\u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"Emoticons": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd", "Document properties": "\u0b86\u0bb5\u0ba3\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", +"Image description": "\u0baa\u0b9f \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd", "Image": "\u0baa\u0b9f\u0bae\u0bcd", "Insert link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95", "Target": "\u0b87\u0bb2\u0b95\u0bcd\u0b95\u0bc1", @@ -413,7 +458,5 @@ tinymce.addI18n('ta',{ "Prev": "\u0bae\u0bc1\u0ba8\u0bcd\u0ba4\u0bc8\u0baf", "Find and replace": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", "Whole words": "\u0bae\u0bc1\u0bb4\u0bc1 \u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd", -"Spellcheck": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0baf\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95", -"Caption": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", "Insert template": "\u0bb5\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1\u0bb0\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ta_IN.js b/cps/static/js/libs/tinymce/langs/ta_IN.js deleted file mode 100644 index d738e6a6c..000000000 --- a/cps/static/js/libs/tinymce/langs/ta_IN.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('ta_IN',{ -"Redo": "\u0bae\u0bc0\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0b95", -"Undo": "\u0b9a\u0bc6\u0baf\u0bb2\u0bcd\u0ba4\u0bb5\u0bbf\u0bb0\u0bcd\u0b95\u0bcd\u0b95", -"Cut": "\u0bb5\u0bc6\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Copy": "\u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95", -"Paste": "\u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Select all": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0b95", -"New document": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b86\u0bb5\u0ba3\u0bae\u0bcd", -"Ok": "\u0b9a\u0bb0\u0bbf", -"Cancel": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0b95", -"Visual aids": "\u0b95\u0bbe\u0b9f\u0bcd\u0b9a\u0bbf\u0ba4\u0bcd \u0ba4\u0bc1\u0ba3\u0bc8\u0baf\u0ba9\u0bcd\u0b95\u0bb3\u0bcd", -"Bold": "\u0ba4\u0b9f\u0bbf\u0baa\u0bcd\u0baa\u0bc1", -"Italic": "\u0b9a\u0bbe\u0baf\u0bcd\u0bb5\u0bc1", -"Underline": "\u0b85\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bcb\u0b9f\u0bc1", -"Strikethrough": "\u0ba8\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bcb\u0b9f\u0bc1", -"Superscript": "\u0bae\u0bc7\u0bb2\u0bcd\u0b92\u0b9f\u0bcd\u0b9f\u0bc1", -"Subscript": "\u0b95\u0bc0\u0bb4\u0bcd\u0b92\u0b9f\u0bcd\u0b9f\u0bc1", -"Clear formatting": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95", -"Align left": "\u0b87\u0b9f\u0ba4\u0bc1 \u0b9a\u0bc0\u0bb0\u0bae\u0bc8", -"Align center": "\u0bae\u0bc8\u0baf \u0b9a\u0bc0\u0bb0\u0bae\u0bc8", -"Align right": "\u0bb5\u0bb2\u0ba4\u0bc1 \u0b9a\u0bc0\u0bb0\u0bae\u0bc8", -"Justify": "\u0ba8\u0bc7\u0bb0\u0bcd\u0ba4\u0bcd\u0ba4\u0bbf \u0b9a\u0bc6\u0baf\u0bcd\u0b95", -"Bullet list": "\u0baa\u0bca\u0b9f\u0bcd\u0b9f\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", -"Numbered list": "\u0b8e\u0ba3\u0bcd\u0ba3\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", -"Decrease indent": "\u0b89\u0bb3\u0bcd\u0ba4\u0bb3\u0bcd\u0bb3\u0bc1\u0ba4\u0bb2\u0bc8 \u0b95\u0bc1\u0bb1\u0bc8\u0b95\u0bcd\u0b95", -"Increase indent": "\u0b89\u0bb3\u0bcd\u0ba4\u0bb3\u0bcd\u0bb3\u0bc1\u0ba4\u0bb2\u0bc8 \u0b85\u0ba4\u0bbf\u0b95\u0bb0\u0bbf\u0b95\u0bcd\u0b95", -"Close": "\u0bae\u0bc2\u0b9f\u0bc1\u0b95", -"Formats": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0ba8\u0b95\u0bb2\u0b95\u0ba4\u0bcd\u0ba4\u0bbf\u0bb1\u0bcd\u0b95\u0bc1 \u0ba8\u0bc7\u0bb0\u0b9f\u0bbf \u0b85\u0ba3\u0bc1\u0b95\u0bb2\u0bc8 \u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb2\u0bbe\u0bb5\u0bbf \u0b86\u0ba4\u0bb0\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8. \u0b86\u0b95\u0bb5\u0bc7 \u0bb5\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0bb2\u0b95\u0bc8 \u0b95\u0bc1\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0bb4\u0bbf\u0b95\u0bb3\u0bbe\u0ba9 Ctrl+X\/C\/V \u0b87\u0bb5\u0bb1\u0bcd\u0bb1\u0bc8 \u0ba4\u0baf\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bc1 \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95.", -"Headers": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Header 1": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 1", -"Header 2": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 2", -"Header 3": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 3", -"Header 4": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 4", -"Header 5": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 5", -"Header 6": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 6", -"Headings": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Heading 1": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 1", -"Heading 2": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 2", -"Heading 3": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 3", -"Heading 4": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 4", -"Heading 5": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 5", -"Heading 6": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 6", -"Preformatted": "\u0bae\u0bc1\u0ba9\u0bcd\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", -"Div": "\u0baa\u0bbf\u0bb0\u0bbf\u0bb5\u0bc1 (Div)", -"Pre": "\u0bae\u0bc1\u0ba9\u0bcd \u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1 (Pre)", -"Code": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1", -"Paragraph": "\u0baa\u0ba4\u0bcd\u0ba4\u0bbf", -"Blockquote": "\u0ba4\u0bca\u0b95\u0bc1\u0ba4\u0bbf \u0bae\u0bc7\u0bb1\u0bcd\u0b95\u0bcb\u0bb3\u0bcd", -"Inline": "\u0b89\u0bb3\u0bcd\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8", -"Blocks": "\u0ba4\u0bca\u0b95\u0bc1\u0ba4\u0bbf\u0b95\u0bb3\u0bcd", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u0b87\u0baf\u0bb2\u0bcd\u0baa\u0bc1 \u0b89\u0bb0\u0bc8 \u0bae\u0bc1\u0bb1\u0bc8\u0bae\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc1 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0ba4\u0bb2\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1. \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b87\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bc8 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0bb5\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0b9f\u0b95\u0bcd\u0b95\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b87\u0baf\u0bb2\u0bcd\u0baa\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b95 \u0b92\u0b9f\u0bcd\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0bae\u0bcd.", -"Fonts": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd", -"Font Sizes": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1 \u0b85\u0bb3\u0bb5\u0bc1\u0b95\u0bb3\u0bcd", -"Class": "Class", -"Browse for an image": "\u0b92\u0bb0\u0bc1 \u0baa\u0b9f\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0b89\u0bb2\u0bbe\u0bb5\u0bc1\u0b95", -"OR": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1", -"Drop an image here": "\u0b92\u0bb0\u0bc1 \u0baa\u0b9f\u0ba4\u0bcd\u0ba4\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc1 \u0b87\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd \u0baa\u0bcb\u0b9f\u0bb5\u0bc1\u0bae\u0bcd", -"Upload": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Block": "\u0ba4\u0bca\u0b95\u0bc1\u0ba4\u0bbf", -"Align": "\u0b9a\u0bc0\u0bb0\u0bae\u0bc8", -"Default": "\u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bc1", -"Circle": "\u0bb5\u0b9f\u0bcd\u0b9f\u0bae\u0bcd", -"Disc": "\u0bb5\u0b9f\u0bcd\u0b9f\u0bc1", -"Square": "\u0b9a\u0ba4\u0bc1\u0bb0\u0bae\u0bcd", -"Lower Alpha": "\u0b95\u0bc0\u0bb4\u0bcd \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", -"Lower Greek": "\u0b95\u0bc0\u0bb4\u0bcd \u0b95\u0bbf\u0bb0\u0bc7\u0b95\u0bcd\u0b95\u0bae\u0bcd", -"Lower Roman": "\u0b95\u0bc0\u0bb4\u0bcd \u0bb0\u0bcb\u0bae\u0bbe\u0ba9\u0bbf\u0baf\u0bae\u0bcd", -"Upper Alpha": "\u0bae\u0bc7\u0bb2\u0bcd \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", -"Upper Roman": "\u0bae\u0bc7\u0bb2\u0bcd \u0bb0\u0bcb\u0bae\u0bbe\u0ba9\u0bbf\u0baf\u0bae\u0bcd", -"Anchor...": "\u0ba8\u0b99\u0bcd\u0b95\u0bc2\u0bb0\u0bae\u0bcd...", -"Name": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id \u0b86\u0ba9\u0ba4\u0bc1 \u0b92\u0bb0\u0bc1 \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd; \u0b87\u0ba4\u0ba9\u0bc8\u0ba4\u0bcd \u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0ba8\u0bcd\u0ba4\u0bc1 \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd, \u0b8e\u0ba3\u0bcd\u0b95\u0bb3\u0bcd, \u0b87\u0b9f\u0bc8\u0b95\u0bcd\u0b95\u0bc7\u0bbe\u0b9f\u0bc1\u0b95\u0bb3\u0bcd (-), \u0baa\u0bc1\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bb3\u0bcd (.), \u0bae\u0bc1\u0b95\u0bcd\u0b95\u0bbe\u0bb1\u0bcd\u0baa\u0bc1\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bb3\u0bcd (:) \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b85\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc7\u0bbe\u0b9f\u0bc1\u0b95\u0bb3\u0bcd (_) \u0bae\u0b9f\u0bcd\u0b9f\u0bc1\u0bae\u0bc7 \u0b87\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bcd.", -"You have unsaved changes are you sure you want to navigate away?": "\u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bbe\u0ba4 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0ba9; \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baf\u0bbe\u0b95 \u0bb5\u0bc6\u0bb3\u0bbf\u0baf\u0bc7\u0bb1 \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bbe\u0bb3\u0bbe?", -"Restore last draft": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bb0\u0bc8\u0bb5\u0bc8 \u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95", -"Special character...": "\u0b9a\u0bbf\u0bb1\u0baa\u0bcd\u0baa\u0bc1 \u0b89\u0bb0\u0bc1...", -"Source code": "\u0bae\u0bc2\u0bb2 \u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1", -"Insert\/Edit code sample": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1 \u0bae\u0bbe\u0ba4\u0bbf\u0bb0\u0bbf \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Language": "\u0bae\u0bca\u0bb4\u0bbf", -"Code sample...": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1 \u0bae\u0bbe\u0ba4\u0bbf\u0bb0\u0bbf...", -"Color Picker": "\u0ba8\u0bbf\u0bb1\u0ba4\u0bcd \u0ba4\u0bc6\u0bb0\u0bbf\u0bb5\u0bc1", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "\u0b87\u0b9f\u0bae\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0bb5\u0bb2\u0bae\u0bcd", -"Right to left": "\u0bb5\u0bb2\u0bae\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0b87\u0b9f\u0bae\u0bcd", -"Emoticons...": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Metadata and Document Properties": "\u0bae\u0bc0\u0ba4\u0bcd\u0ba4\u0bb0\u0bb5\u0bc1 \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b86\u0bb5\u0ba3\u0baa\u0bcd \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Title": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Keywords": "\u0bae\u0bc1\u0ba4\u0ba9\u0bcd\u0bae\u0bc8\u0b9a\u0bcd\u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd", -"Description": "\u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd", -"Robots": "\u0baa\u0bca\u0bb1\u0bbf\u0baf\u0ba9\u0bcd\u0b95\u0bb3\u0bcd (Robots)", -"Author": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bbe\u0bb3\u0bb0\u0bcd", -"Encoding": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bbe\u0b95\u0bcd\u0b95\u0bae\u0bcd", -"Fullscreen": "\u0bae\u0bc1\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0bb0\u0bc8", -"Action": "\u0b9a\u0bc6\u0baf\u0bb2\u0bcd", -"Shortcut": "\u0b95\u0bc1\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0bb4\u0bbf", -"Help": "\u0b89\u0ba4\u0bb5\u0bbf", -"Address": "\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", -"Focus to menubar": "\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b95\u0bb5\u0ba9\u0bae\u0bcd \u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"Focus to toolbar": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b95\u0bb5\u0ba9\u0bae\u0bcd \u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"Focus to element path": "\u0bae\u0bc2\u0bb2\u0b95\u0baa\u0bcd \u0baa\u0bbe\u0ba4\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b95\u0bb5\u0ba9\u0bae\u0bcd \u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"Focus to contextual toolbar": "\u0b9a\u0bc2\u0bb4\u0bcd\u0ba8\u0bbf\u0bb2\u0bc8 \u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b95\u0bb5\u0ba9\u0bae\u0bcd \u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"Insert link (if link plugin activated)": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95 (\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0b9a\u0bc6\u0baf\u0bb2\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bbe\u0bb2\u0bcd)", -"Save (if save plugin activated)": "\u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95 (\u0b9a\u0bc7\u0bae\u0bbf\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0b9a\u0bc6\u0baf\u0bb2\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bbe\u0bb2\u0bcd)", -"Find (if searchreplace plugin activated)": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95 (\u0ba4\u0bc7\u0b9f\u0bbf\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bb2\u0bcd \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0b9a\u0bc6\u0baf\u0bb2\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bbe\u0bb2\u0bcd)", -"Plugins installed ({0}):": "\u0ba8\u0bbf\u0bb1\u0bc1\u0bb5\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc1\u0bb3\u0bcd\u0bb3 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf\u0b95\u0bb3\u0bcd ({0}):", -"Premium plugins:": "\u0b89\u0baf\u0bb0\u0bcd\u0bae\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf\u0b95\u0bb3\u0bcd:", -"Learn more...": "\u0bae\u0bc7\u0bb2\u0bc1\u0bae\u0bcd \u0b85\u0bb1\u0bbf\u0b95...", -"You are using {0}": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb5\u0ba4\u0bc1 {0}", -"Plugins": "\u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf\u0b95\u0bb3\u0bcd", -"Handy Shortcuts": "\u0b8e\u0bb3\u0bbf\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0bc8\u0baf\u0bbe\u0bb3\u0b95\u0bcd\u0b95\u0bc2\u0b9f\u0bbf\u0baf \u0b95\u0bc1\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0bb4\u0bbf\u0b95\u0bb3\u0bcd", -"Horizontal line": "\u0b95\u0bbf\u0b9f\u0bc8 \u0b95\u0bcb\u0b9f\u0bc1", -"Insert\/edit image": "\u0baa\u0b9f\u0bae\u0bcd \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Image description": "\u0baa\u0b9f \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd", -"Source": "\u0bae\u0bc2\u0bb2\u0bae\u0bcd", -"Dimensions": "\u0baa\u0bb0\u0bbf\u0bae\u0bbe\u0ba3\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Constrain proportions": "\u0bb5\u0bbf\u0b95\u0bbf\u0ba4\u0bbe\u0b9a\u0bcd\u0b9a\u0bbe\u0bb0\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0b9f\u0bcd\u0b9f\u0bc1\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"General": "\u0baa\u0bca\u0ba4\u0bc1", -"Advanced": "\u0bae\u0bc7\u0bae\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", -"Style": "\u0baa\u0bbe\u0ba3\u0bbf", -"Vertical space": "\u0ba8\u0bc6\u0b9f\u0bc1\u0ba4\u0bb3 \u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf", -"Horizontal space": "\u0b95\u0bbf\u0b9f\u0bc8\u0bae\u0b9f\u0bcd\u0b9f \u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf", -"Border": "\u0b95\u0bb0\u0bc8", -"Insert image": "\u0baa\u0b9f\u0bae\u0bcd \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Image...": "\u0baa\u0b9f\u0bae\u0bcd...", -"Image list": "\u0baa\u0b9f\u0baa\u0bcd \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", -"Rotate counterclockwise": "\u0b95\u0b9f\u0bbf\u0b95\u0bbe\u0bb0 \u0b8e\u0ba4\u0bbf\u0bb0\u0bcd\u0ba4\u0bbf\u0b9a\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b9a\u0bc1\u0bb4\u0bb1\u0bcd\u0bb1\u0bc1", -"Rotate clockwise": "\u0b95\u0b9f\u0bbf\u0b95\u0bbe\u0bb0\u0ba4\u0bcd\u0ba4\u0bbf\u0b9a\u0bc8\u0baf\u0bbf\u0bb2\u0bcd \u0b9a\u0bc1\u0bb4\u0bb1\u0bcd\u0bb1\u0bc1", -"Flip vertically": "\u0b9a\u0bc6\u0b99\u0bcd\u0b95\u0bc1\u0ba4\u0bcd\u0ba4\u0bbe\u0b95 \u0baa\u0bc1\u0bb0\u0b9f\u0bcd\u0b9f\u0bc1", -"Flip horizontally": "\u0b95\u0bbf\u0b9f\u0bc8\u0bae\u0b9f\u0bcd\u0b9f\u0bae\u0bbe\u0b95 \u0baa\u0bc1\u0bb0\u0b9f\u0bcd\u0b9f\u0bc1", -"Edit image": "\u0baa\u0b9f\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bca\u0b95\u0bc1", -"Image options": "\u0baa\u0b9f \u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Zoom in": "\u0baa\u0bc6\u0bb0\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bc1", -"Zoom out": "\u0b9a\u0bbf\u0bb1\u0bbf\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bc1", -"Crop": "\u0b9a\u0bc6\u0ba4\u0bc1\u0b95\u0bcd\u0b95\u0bc1", -"Resize": "\u0bae\u0bb1\u0bc1\u0b85\u0bb3\u0bb5\u0bbf\u0b9f\u0bc1", -"Orientation": "\u0ba4\u0bbf\u0b9a\u0bc8\u0baf\u0bae\u0bc8\u0bb5\u0bc1", -"Brightness": "\u0b92\u0bb3\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1", -"Sharpen": "\u0b95\u0bc2\u0bb0\u0bcd\u0bae\u0bc8\u0baf\u0bbe\u0b95\u0bcd\u0b95\u0bc1", -"Contrast": "\u0ba8\u0bbf\u0bb1\u0bae\u0bbe\u0bb1\u0bc1\u0baa\u0bbe\u0b9f\u0bc1", -"Color levels": "\u0bb5\u0ba3\u0bcd\u0ba3 \u0ba8\u0bbf\u0bb2\u0bc8\u0b95\u0bb3\u0bcd", -"Gamma": "Gamma", -"Invert": "\u0ba8\u0bc7\u0bb0\u0bcd\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1", -"Apply": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", -"Back": "\u0baa\u0bbf\u0ba9\u0bcd", -"Insert date\/time": "\u0ba4\u0bc7\u0ba4\u0bbf\/\u0ba8\u0bc7\u0bb0\u0bae\u0bcd \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Date\/time": "\u0ba4\u0bc7\u0ba4\u0bbf\/\u0ba8\u0bc7\u0bb0\u0bae\u0bcd", -"Insert\/Edit Link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Insert\/edit link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Text to display": "\u0b95\u0bbe\u0b9f\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bbf\u0baf \u0b89\u0bb0\u0bc8", -"Url": "\u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", -"Open link in...": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b87\u0ba4\u0bbf\u0bb2\u0bcd \u0ba4\u0bbf\u0bb1\u0b95\u0bcd\u0b95...", -"Current window": "\u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b9a\u0bbe\u0bb3\u0bb0\u0bae\u0bcd", -"None": "\u0b8f\u0ba4\u0bc1\u0bae\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", -"New window": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b9a\u0bbe\u0bb3\u0bb0\u0bae\u0bcd", -"Remove link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Anchors": "\u0ba8\u0b99\u0bcd\u0b95\u0bc2\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Link...": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1...", -"Paste or type a link": "\u0b92\u0bb0\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95 \u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bbf\u0b9f\u0bc1\u0b95", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bcd\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf (URL) \u0b92\u0bb0\u0bc1 \u0bae\u0bbf\u0ba9\u0bcd-\u0b85\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf \u0baa\u0bcb\u0bb2\u0bcd \u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1. \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 mailto: \u0bae\u0bc1\u0ba9\u0bcd-\u0b92\u0b9f\u0bcd\u0b9f\u0bc8\u0ba4\u0bcd (prefix) \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bbe?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bcd\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf (URL) \u0b92\u0bb0\u0bc1 \u0bb5\u0bc6\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bc1\u0bb1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 (external link) \u0baa\u0bcb\u0bb2\u0bcd \u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1. \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 http:\/\/ \u0bae\u0bc1\u0ba9\u0bcd-\u0b92\u0b9f\u0bcd\u0b9f\u0bc8\u0ba4\u0bcd (prefix) \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95 \u0bb5\u0bc7\u0ba3\u0bcd\u0b9f\u0bc1\u0bae\u0bbe?", -"Link list": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0baa\u0bcd \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bb2\u0bcd", -"Insert video": "\u0b95\u0bbe\u0ba3\u0bca\u0bb3\u0bbf \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Insert\/edit video": "\u0b95\u0bbe\u0ba3\u0bca\u0bb3\u0bbf \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Insert\/edit media": "\u0b8a\u0b9f\u0b95\u0bae\u0bcd \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Alternative source": "\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0bae\u0bc2\u0bb2\u0bae\u0bcd", -"Alternative source URL": "\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1 \u0bae\u0bc2\u0bb2 \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", -"Media poster (Image URL)": "\u0b8a\u0b9f\u0b95 \u0b9a\u0bc1\u0bb5\u0bb0\u0bca\u0b9f\u0bcd\u0b9f\u0bbf (\u0b89\u0b9f \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf)", -"Paste your embed code below:": "\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0b9f\u0bcd\u0baa\u0bc6\u0bbe\u0ba4\u0bbf \u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bcd\u0b9f\u0bc8 \u0b95\u0bc0\u0bb4\u0bc7 \u0b92\u0b9f\u0bcd\u0b9f\u0bb5\u0bc1\u0bae\u0bcd:", -"Embed": "\u0b89\u0b9f\u0bcd\u0baa\u0bca\u0ba4\u0bbf", -"Media...": "\u0b8a\u0b9f\u0b95\u0bae\u0bcd...", -"Nonbreaking space": "\u0baa\u0bbf\u0bb0\u0bbf\u0baf\u0bbe\u0ba4 \u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf", -"Page break": "\u0baa\u0b95\u0bcd\u0b95 \u0baa\u0bbf\u0bb0\u0bbf\u0baa\u0bcd\u0baa\u0bc1", -"Paste as text": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b95 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Preview": "\u0bae\u0bc1\u0ba9\u0bcd\u0ba8\u0bcb\u0b95\u0bcd\u0b95\u0bc1", -"Print...": "\u0b85\u0b9a\u0bcd\u0b9a\u0bbf\u0b9f\u0bc1\u0b95...", -"Save": "\u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95", -"Find": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95", -"Replace with": "\u0b87\u0ba4\u0ba9\u0bc1\u0b9f\u0ba9\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Replace": "\u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Replace all": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Previous": "\u0bae\u0bc1\u0ba8\u0bcd\u0ba4\u0bc8\u0baf", -"Next": "\u0b85\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4", -"Find and replace...": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95...", -"Could not find the specified string.": "\u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bcd\u0b9f \u0b9a\u0bb0\u0bae\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", -"Match case": "\u0bb5\u0b9f\u0bbf\u0bb5\u0ba4\u0bcd\u0ba4\u0bc8 \u0baa\u0bca\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95", -"Find whole words only": "\u0bae\u0bc1\u0bb4\u0bc1 \u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0b9f\u0bcd\u0b9f\u0bc1\u0bae\u0bcd \u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0b95\u0bcd\u0b95", -"Spell check": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1", -"Ignore": "\u0baa\u0bc1\u0bb1\u0b95\u0bcd\u0b95\u0ba3\u0bbf\u0b95\u0bcd\u0b95", -"Ignore all": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0baa\u0bc1\u0bb1\u0b95\u0bcd\u0b95\u0ba3\u0bbf\u0b95\u0bcd\u0b95", -"Finish": "\u0bae\u0bc1\u0b9f\u0bbf\u0b95\u0bcd\u0b95", -"Add to Dictionary": "\u0b85\u0b95\u0bb0\u0bbe\u0ba4\u0bbf\u0baf\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95", -"Insert table": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Table properties": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8 \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Delete table": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95", -"Cell": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8", -"Row": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8", -"Column": "\u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8", -"Cell properties": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Merge cells": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8\u0b95\u0bb3\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95", -"Split cell": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0baa\u0bbf\u0bb0\u0bbf\u0b95\u0bcd\u0b95", -"Insert row before": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0bae\u0bc1\u0ba9\u0bcd \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Insert row after": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0baa\u0bbf\u0ba9\u0bcd \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Delete row": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95", -"Row properties": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Cut row": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0bb5\u0bc6\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Copy row": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95", -"Paste row before": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0bae\u0bc1\u0ba9\u0bcd \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Paste row after": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0baa\u0bbf\u0ba9\u0bcd \u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b92\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Insert column before": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0bae\u0bc1\u0ba9\u0bcd \u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Insert column after": "\u0b87\u0ba4\u0bb1\u0bcd\u0b95\u0bc1 \u0baa\u0bbf\u0ba9\u0bcd \u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Delete column": "\u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95", -"Cols": "\u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", -"Rows": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", -"Width": "\u0b85\u0b95\u0bb2\u0bae\u0bcd", -"Height": "\u0b89\u0baf\u0bb0\u0bae\u0bcd", -"Cell spacing": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf", -"Cell padding": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0ba8\u0bbf\u0bb0\u0baa\u0bcd\u0baa\u0bb2\u0bcd", -"Show caption": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Left": "\u0b87\u0b9f\u0bae\u0bcd", -"Center": "\u0bae\u0bc8\u0baf\u0bae\u0bcd", -"Right": "\u0bb5\u0bb2\u0bae\u0bcd", -"Cell type": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8 \u0bb5\u0b95\u0bc8", -"Scope": "\u0bb5\u0bb0\u0bc8\u0baf\u0bc6\u0bb2\u0bcd\u0bb2\u0bc8", -"Alignment": "\u0b9a\u0bc0\u0bb0\u0bae\u0bc8\u0bb5\u0bc1", -"H Align": "\u0b95\u0bbf (H) \u0b87\u0b9a\u0bc8\u0bb5\u0bc1", -"V Align": "\u0b9a\u0bc6 (V) \u0b87\u0b9a\u0bc8\u0bb5\u0bc1", -"Top": "\u0bae\u0bc7\u0bb2\u0bcd", -"Middle": "\u0ba8\u0b9f\u0bc1", -"Bottom": "\u0bae\u0bc7\u0bb2\u0bcd", -"Header cell": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bb1\u0bc8", -"Row group": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b95\u0bc1\u0bb4\u0bc1", -"Column group": "\u0ba8\u0bc6\u0b9f\u0bc1\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0b95\u0bc1\u0bb4\u0bc1", -"Row type": "\u0bb5\u0bb0\u0bbf\u0b9a\u0bc8 \u0bb5\u0b95\u0bc8", -"Header": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Body": "\u0b89\u0b9f\u0bb2\u0bcd", -"Footer": "\u0b85\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bc1", -"Border color": "\u0b95\u0bb0\u0bc8\u0baf\u0bbf\u0ba9\u0bcd \u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"Insert template...": "\u0bb5\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1\u0bb0\u0bc1 \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95...", -"Templates": "\u0bb5\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd", -"Template": "\u0bb5\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1\u0bb0\u0bc1", -"Text color": "\u0b89\u0bb0\u0bc8\u0baf\u0bbf\u0ba9\u0bcd \u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"Background color": "\u0baa\u0bbf\u0ba9\u0bcd\u0ba9\u0ba3\u0bbf \u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"Custom...": "\u0ba4\u0ba9\u0bbf\u0baa\u0bcd\u0baa\u0baf\u0ba9\u0bcd...", -"Custom color": "\u0ba4\u0ba9\u0bbf\u0baa\u0bcd\u0baa\u0baf\u0ba9\u0bcd \u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"No color": "\u0ba8\u0bbf\u0bb1\u0bae\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8", -"Remove color": "\u0ba8\u0bbf\u0bb1\u0bae\u0bcd \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Table of Contents": "\u0baa\u0bca\u0bb0\u0bc1\u0bb3\u0b9f\u0b95\u0bcd\u0b95\u0bae\u0bcd", -"Show blocks": "\u0ba4\u0bca\u0b95\u0bc1\u0ba4\u0bbf\u0b95\u0bb3\u0bc8 \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Show invisible characters": "\u0b95\u0ba3\u0bcd\u0ba3\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0ba4\u0bcd \u0ba4\u0bc6\u0bb0\u0bbf\u0baf\u0bbe\u0ba4 \u0b89\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bc8 \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1\u0b95", -"Word count": "\u0b9a\u0bca\u0bb2\u0bcd \u0b8e\u0ba3\u0bcd\u0ba3\u0bbf\u0b95\u0bcd\u0b95\u0bc8", -"Count": "\u0b8e\u0ba3\u0bcd\u0ba3\u0bbf\u0b95\u0bcd\u0b95\u0bc8", -"Document": "\u0b86\u0bb5\u0ba3\u0bae\u0bcd", -"Selection": "\u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bc1", -"Words": "\u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd", -"Words: {0}": "\u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd: {0}", -"{0} words": "{0} \u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd", -"File": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1", -"Edit": "\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Insert": "\u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"View": "\u0ba8\u0bcb\u0b95\u0bcd\u0b95\u0bc1\u0b95", -"Format": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Table": "\u0b85\u0b9f\u0bcd\u0b9f\u0bb5\u0ba3\u0bc8", -"Tools": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0b95\u0bb3\u0bcd", -"Powered by {0}": "\u0bb5\u0bb2\u0bc1\u0bb5\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0ba4\u0bc1 {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0b89\u0baf\u0bb0\u0bcd \u0b89\u0bb0\u0bc8 \u0baa\u0b95\u0bc1\u0ba4\u0bbf. \u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc1 ALT-F9 , \u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc8\u0b95\u0bcd\u0b95\u0bc1 ALT-F10 , \u0b89\u0ba4\u0bb5\u0bbf\u0b95\u0bcd\u0b95\u0bc1 ALT-0", -"Image title": "\u0baa\u0b9f\u0ba4\u0bcd \u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Border width": "\u0b95\u0bb0\u0bc8 \u0b85\u0b95\u0bb2\u0bae\u0bcd", -"Border style": "\u0b95\u0bb0\u0bc8 \u0baa\u0bbe\u0ba3\u0bbf", -"Error": "\u0baa\u0bbf\u0bb4\u0bc8", -"Warn": "\u0b8e\u0b9a\u0bcd\u0b9a\u0bb0\u0bbf\u0b95\u0bcd\u0b95", -"Valid": "\u0b9a\u0bc6\u0bb2\u0bcd\u0bb2\u0ba4\u0bcd\u0ba4\u0b95\u0bcd\u0b95\u0ba4\u0bc1", -"To open the popup, press Shift+Enter": "\u0bae\u0bc7\u0bb2\u0bcd\u0ba4\u0bcb\u0ba9\u0bcd\u0bb1\u0bc1-\u0bb5\u0bc8\u0ba4\u0bcd \u0ba4\u0bbf\u0bb1\u0b95\u0bcd\u0b95 Shift+Enter", -"Rich Text Area. Press ALT-0 for help.": "\u0b89\u0baf\u0bb0\u0bcd \u0b89\u0bb0\u0bc8 \u0baa\u0b95\u0bc1\u0ba4\u0bbf. \u0b89\u0ba4\u0bb5\u0bbf\u0b95\u0bcd\u0b95\u0bc1 ALT-0", -"System Font": "\u0ba4\u0bca\u0b95\u0bc1\u0ba4\u0bbf \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", -"Failed to upload image: {0}": "\u0baa\u0b9f\u0bae\u0bcd \u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bb2\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0bc1\u0bb1\u0bcd\u0bb1\u0ba4\u0bc1: {0}", -"Failed to load plugin: {0} from url {1}": "\u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0ba4\u0bb2\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0bc1\u0bb1\u0bcd\u0bb1\u0ba4\u0bc1: {0} - {1} \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf\u0baf\u0bbf\u0bb2\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1", -"Failed to load plugin url: {0}": "\u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0b87\u0ba3\u0bc8\u0baf\u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf \u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0ba4\u0bb2\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0bc1\u0bb1\u0bcd\u0bb1\u0ba4\u0bc1: {0}", -"Failed to initialize plugin: {0}": "\u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bbf \u0ba4\u0bc1\u0bb5\u0b99\u0bcd\u0b95\u0bc1\u0ba4\u0bb2\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0bc1\u0bb1\u0bcd\u0bb1\u0ba4\u0bc1: {0}", -"example": "\u0b89\u0ba4\u0bbe\u0bb0\u0ba3\u0bae\u0bcd", -"Search": "\u0ba4\u0bc7\u0b9f\u0bc1\u0b95", -"All": "\u0b85\u0ba9\u0bc8\u0ba4\u0bcd\u0ba4\u0bc1\u0bae\u0bcd", -"Currency": "\u0b9a\u0bc6\u0bb2\u0bbe\u0bb5\u0ba3\u0bbf (Currency)", -"Text": "\u0b89\u0bb0\u0bc8", -"Quotations": "\u0bae\u0bc7\u0bb1\u0bcd\u0b95\u0bc7\u0bbe\u0bb3\u0bcd\u0b95\u0bb3\u0bcd", -"Mathematical": "\u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bbf\u0baf\u0bb2\u0bcd", -"Extended Latin": "\u0ba8\u0bc0\u0b9f\u0bcd\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0b87\u0bb2\u0ba4\u0bcd\u0ba4\u0bc0\u0ba9\u0bcd", -"Symbols": "\u0b87\u0b9f\u0bc1\u0b95\u0bc1\u0bb1\u0bbf\u0b95\u0bb3\u0bcd", -"Arrows": "\u0b85\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"User Defined": "\u0baa\u0baf\u0ba9\u0bb0\u0bcd \u0bb5\u0bb0\u0bc8\u0baf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4", -"dollar sign": "dollar \u0b95\u0bc1\u0bb1\u0bbf", -"currency sign": "\u0b9a\u0bc6\u0bb2\u0bbe\u0bb5\u0ba3\u0bbf\u0b95\u0bcd \u0b95\u0bc1\u0bb1\u0bbf", -"euro-currency sign": "euro-currency \u0b95\u0bc1\u0bb1\u0bbf", -"colon sign": "colon \u0b95\u0bc1\u0bb1\u0bbf", -"cruzeiro sign": "cruzeiro \u0b95\u0bc1\u0bb1\u0bbf", -"french franc sign": "french franc \u0b95\u0bc1\u0bb1\u0bbf", -"lira sign": "lira \u0b95\u0bc1\u0bb1\u0bbf", -"mill sign": "mill \u0b95\u0bc1\u0bb1\u0bbf", -"naira sign": "naira \u0b95\u0bc1\u0bb1\u0bbf", -"peseta sign": "peseta \u0b95\u0bc1\u0bb1\u0bbf", -"rupee sign": "rupee \u0b95\u0bc1\u0bb1\u0bbf", -"won sign": "won \u0b95\u0bc1\u0bb1\u0bbf", -"new sheqel sign": "new sheqel \u0b95\u0bc1\u0bb1\u0bbf", -"dong sign": "dong \u0b95\u0bc1\u0bb1\u0bbf", -"kip sign": "kip \u0b95\u0bc1\u0bb1\u0bbf", -"tugrik sign": "tugrik \u0b95\u0bc1\u0bb1\u0bbf", -"drachma sign": "drachma \u0b95\u0bc1\u0bb1\u0bbf", -"german penny symbol": "german penny \u0b87\u0b9f\u0bc1\u0b95\u0bc1\u0bb1\u0bbf", -"peso sign": "peso \u0b95\u0bc1\u0bb1\u0bbf", -"guarani sign": "guarani \u0b95\u0bc1\u0bb1\u0bbf", -"austral sign": "austral \u0b95\u0bc1\u0bb1\u0bbf", -"hryvnia sign": "hryvnia \u0b95\u0bc1\u0bb1\u0bbf", -"cedi sign": "cedi \u0b95\u0bc1\u0bb1\u0bbf", -"livre tournois sign": "livre tournois \u0b95\u0bc1\u0bb1\u0bbf", -"spesmilo sign": "spesmilo \u0b95\u0bc1\u0bb1\u0bbf", -"tenge sign": "tenge \u0b95\u0bc1\u0bb1\u0bbf", -"indian rupee sign": "indian rupee \u0b95\u0bc1\u0bb1\u0bbf", -"turkish lira sign": "turkish lira \u0b95\u0bc1\u0bb1\u0bbf", -"nordic mark sign": "nordic mark \u0b95\u0bc1\u0bb1\u0bbf", -"manat sign": "manat \u0b95\u0bc1\u0bb1\u0bbf", -"ruble sign": "ruble \u0b95\u0bc1\u0bb1\u0bbf", -"yen character": "yen \u0b89\u0bb0\u0bc1", -"yuan character": "yuan \u0b89\u0bb0\u0bc1", -"yuan character, in hong kong and taiwan": "yuan \u0b89\u0bb0\u0bc1, \u0bb9\u0bbe\u0b99\u0bcd\u0b95\u0bbe\u0b99\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0ba4\u0bbe\u0baf\u0bcd\u0bb5\u0bbe\u0ba9\u0bcd \u0b87\u0bb2\u0bcd", -"yen\/yuan character variant one": "yen\/yuan \u0b89\u0bb0\u0bc1 \u0bae\u0bbe\u0bb1\u0bc1\u0baa\u0bbe\u0b9f\u0bc1", -"Loading emoticons...": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b8f\u0bb1\u0bcd\u0bb1\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0b95\u0bbf\u0ba9\u0bcd\u0bb1\u0ba9...", -"Could not load emoticons": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bc8 \u0b8f\u0bb1\u0bcd\u0bb1 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", -"People": "\u0bae\u0b95\u0bcd\u0b95\u0bb3\u0bcd", -"Animals and Nature": "\u0bae\u0bbf\u0bb0\u0bc1\u0b95\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b87\u0baf\u0bb1\u0bcd\u0b95\u0bc8", -"Food and Drink": "\u0b89\u0ba3\u0bb5\u0bc1 \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0baa\u0bbe\u0ba9\u0bae\u0bcd", -"Activity": "\u0b9a\u0bc6\u0baf\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1", -"Travel and Places": "\u0baa\u0baf\u0ba3\u0bae\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b87\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Objects": "\u0baa\u0bca\u0bb0\u0bc1\u0b9f\u0bcd\u0b95\u0bb3\u0bcd", -"Flags": "\u0b95\u0bca\u0b9f\u0bbf\u0b95\u0bb3\u0bcd", -"Characters": "\u0b89\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd", -"Characters (no spaces)": "\u0b89\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd (\u0b87\u0b9f\u0bc8\u0bb5\u0bc6\u0bb3\u0bbf\u0b95\u0bb3\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8)", -"{0} characters": "{0} \u0b89\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bb3\u0bcd", -"Error: Form submit field collision.": "\u0baa\u0bbf\u0bb4\u0bc8: \u0baa\u0b9f\u0bbf\u0bb5\u0bae\u0bcd \u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd \u0baa\u0bc1\u0bb2\u0bae\u0bcd \u0bae\u0bcb\u0ba4\u0bb2\u0bcd.", -"Error: No form element found.": "\u0baa\u0bbf\u0bb4\u0bc8: \u0baa\u0bc1\u0bb2\u0bae\u0bcd \u0bae\u0bc2\u0bb2\u0b95\u0bae\u0bcd \u0b8e\u0ba4\u0bc1\u0bb5\u0bc1\u0bae\u0bcd \u0b95\u0bbe\u0ba3\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8.", -"Update": "\u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95", -"Color swatch": "\u0ba8\u0bbf\u0bb1\u0b9a\u0bcd \u0b9a\u0bcb\u0ba4\u0ba9\u0bc8\u0b95\u0bcd\u0b95\u0bb2\u0bb5\u0bc8", -"Turquoise": "\u0ba8\u0bc0\u0bb2\u0baa\u0bcd\u0baa\u0b9a\u0bcd\u0b9a\u0bc8", -"Green": "\u0baa\u0b9a\u0bcd\u0b9a\u0bc8", -"Blue": "\u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Purple": "\u0b8a\u0ba4\u0bbe", -"Navy Blue": "\u0b95\u0b9f\u0bb1\u0bcd\u0baa\u0b9f\u0bc8 \u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Dark Turquoise": "\u0b85\u0b9f\u0bb0\u0bcd \u0ba8\u0bc0\u0bb2\u0baa\u0bcd\u0baa\u0b9a\u0bcd\u0b9a\u0bc8", -"Dark Green": "\u0b85\u0b9f\u0bb0\u0bcd \u0baa\u0b9a\u0bcd\u0b9a\u0bc8", -"Medium Blue": "\u0ba8\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb0 \u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Medium Purple": "\u0ba8\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb0 \u0b8a\u0ba4\u0bbe", -"Midnight Blue": "\u0ba8\u0bb3\u0bcd\u0bb3\u0bbf\u0bb0\u0bb5\u0bc1 \u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Yellow": "\u0bae\u0b9e\u0bcd\u0b9a\u0bb3\u0bcd", -"Orange": "\u0b9a\u0bbf\u0bb5\u0ba8\u0bcd\u0ba4 \u0bae\u0b9e\u0bcd\u0b9a\u0bb3\u0bcd", -"Red": "\u0b9a\u0bbf\u0bb5\u0baa\u0bcd\u0baa\u0bc1", -"Light Gray": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd \u0b9a\u0bbe\u0bae\u0bcd\u0baa\u0bb2\u0bcd", -"Gray": "\u0b9a\u0bbe\u0bae\u0bcd\u0baa\u0bb2\u0bcd", -"Dark Yellow": "\u0b85\u0b9f\u0bb0\u0bcd \u0bae\u0b9e\u0bcd\u0b9a\u0bb3\u0bcd", -"Dark Orange": "\u0b85\u0b9f\u0bb0\u0bcd \u0b9a\u0bbf\u0bb5\u0ba8\u0bcd\u0ba4 \u0bae\u0b9e\u0bcd\u0b9a\u0bb3\u0bcd", -"Dark Red": "\u0b85\u0b9f\u0bb0\u0bcd \u0b9a\u0bbf\u0bb5\u0baa\u0bcd\u0baa\u0bc1", -"Medium Gray": "\u0ba8\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb0 \u0b9a\u0bbe\u0bae\u0bcd\u0baa\u0bb2\u0bcd", -"Dark Gray": "\u0b85\u0b9f\u0bb0\u0bcd \u0b9a\u0bbe\u0bae\u0bcd\u0baa\u0bb2\u0bcd", -"Light Green": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd \u0baa\u0b9a\u0bcd\u0b9a\u0bc8", -"Light Yellow": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd \u0bae\u0b9e\u0bcd\u0b9a\u0bb3\u0bcd", -"Light Red": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd\u00a0\u0b9a\u0bbf\u0bb5\u0baa\u0bcd\u0baa\u0bc1", -"Light Purple": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd \u0b8a\u0ba4\u0bbe", -"Light Blue": "\u0bb5\u0bc6\u0bb3\u0bbf\u0bb0\u0bcd \u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Dark Purple": "\u0b85\u0b9f\u0bb0\u0bcd \u0b8a\u0ba4\u0bbe", -"Dark Blue": "\u0b85\u0b9f\u0bb0\u0bcd \u0ba8\u0bc0\u0bb2\u0bae\u0bcd", -"Black": "\u0b95\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bc1", -"White": "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bc8", -"Switch to or from fullscreen mode": "\u0bae\u0bc1\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0bb0\u0bc8 \u0bae\u0bc1\u0bb1\u0bc8\u0bae\u0bc8\u0b95\u0bcd\u0b95\u0bc1\/\u0bae\u0bc1\u0bb1\u0bc8\u0bae\u0bc8\u0baf\u0bbf\u0bb2\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bc1\u0b95", -"Open help dialog": "\u0b89\u0ba4\u0bb5\u0bbf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0ba4\u0bbf\u0bb1\u0b95\u0bcd\u0b95", -"history": "\u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bc1", -"styles": "\u0baa\u0bbe\u0ba3\u0bbf\u0b95\u0bb3\u0bcd", -"formatting": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", -"alignment": "\u0b9a\u0bc0\u0bb0\u0bae\u0bc8\u0bb5\u0bc1", -"indentation": "\u0b89\u0bb3\u0bcd\u0ba4\u0bb3\u0bcd\u0bb3\u0bc1\u0ba4\u0bb2\u0bcd", -"permanent pen": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe", -"comments": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bb3\u0bcd", -"Format Painter": "\u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0baa\u0bc2\u0b9a\u0bbe\u0bb3\u0ba9\u0bcd", -"Insert\/edit iframe": "iframe \u0b9a\u0bc6\u0bb0\u0bc1\u0b95\u0bc1\u0b95\/\u0ba4\u0bca\u0b95\u0bc1\u0b95\u0bcd\u0b95", -"Capitalization": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bbe\u0b95\u0bcd\u0b95\u0bae\u0bcd", -"lowercase": "\u0b9a\u0bbf\u0bb1\u0bcd\u0bb1\u0bc6\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", -"UPPERCASE": "\u0baa\u0bc7\u0bb0\u0bc6\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", -"Title Case": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bcd", -"Permanent Pen Properties": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Permanent pen properties...": "\u0ba8\u0bbf\u0bb0\u0ba8\u0bcd\u0ba4\u0bb0\u0baa\u0bcd \u0baa\u0bc7\u0ba9\u0bbe \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd...", -"Font": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", -"Size": "\u0b85\u0bb3\u0bb5\u0bc1", -"More...": "\u0bae\u0bc7\u0bb2\u0bc1\u0bae\u0bcd...", -"Spellcheck Language": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1 \u0bae\u0bca\u0bb4\u0bbf", -"Select...": "\u0ba4\u0bc7\u0bb0\u0bcd\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0b95...", -"Preferences": "\u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Yes": "\u0b86\u0bae\u0bcd", -"No": "\u0b87\u0bb2\u0bcd\u0bb2\u0bc8", -"Keyboard Navigation": "\u0bb5\u0bbf\u0b9a\u0bc8\u0baa\u0bcd\u0baa\u0bb2\u0b95\u0bc8 \u0bb5\u0bb4\u0bbf\u0b9a\u0bcd\u0b9a\u0bc6\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd", -"Version": "\u0baa\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0bc1", -"Anchor": "\u0ba8\u0b99\u0bcd\u0b95\u0bc2\u0bb0\u0bae\u0bcd", -"Special character": "\u0b9a\u0bbf\u0bb1\u0baa\u0bcd\u0baa\u0bc1 \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0bb0\u0bc1", -"Code sample": "\u0b95\u0bc1\u0bb1\u0bbf\u0baf\u0bc0\u0b9f\u0bc1 \u0bae\u0bbe\u0ba4\u0bbf\u0bb0\u0bbf", -"Color": "\u0ba8\u0bbf\u0bb1\u0bae\u0bcd", -"Emoticons": "\u0b89\u0ba3\u0bb0\u0bcd\u0b9a\u0bcd\u0b9a\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bbf\u0bae\u0b99\u0bcd\u0b95\u0bb3\u0bcd", -"Document properties": "\u0b86\u0bb5\u0ba3\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", -"Image": "\u0baa\u0b9f\u0bae\u0bcd", -"Insert link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95", -"Target": "\u0b87\u0bb2\u0b95\u0bcd\u0b95\u0bc1", -"Link": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Poster": "\u0b9a\u0bc1\u0bb5\u0bb0\u0bca\u0b9f\u0bcd\u0b9f\u0bbf", -"Media": "\u0b8a\u0b9f\u0b95\u0bae\u0bcd", -"Print": "\u0b85\u0b9a\u0bcd\u0b9a\u0bbf\u0b9f\u0bc1\u0b95", -"Prev": "\u0bae\u0bc1\u0ba8\u0bcd\u0ba4\u0bc8\u0baf", -"Find and replace": "\u0b95\u0ba3\u0bcd\u0b9f\u0bc1\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0bc1 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1\u0b95", -"Whole words": "\u0bae\u0bc1\u0bb4\u0bc1 \u0b9a\u0bca\u0bb1\u0bcd\u0b95\u0bb3\u0bcd", -"Spellcheck": "\u0b8e\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0bb4\u0bc8\u0baf\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95", -"Caption": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bc1", -"Insert template": "\u0bb5\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bc1\u0bb0\u0bc1 \u0b9a\u0bca\u0bb0\u0bc1\u0b95\u0bc1\u0b95" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/th_TH.js b/cps/static/js/libs/tinymce/langs/th_TH.js deleted file mode 100644 index 8df0abcc6..000000000 --- a/cps/static/js/libs/tinymce/langs/th_TH.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('th_TH',{ -"Redo": "\u0e17\u0e33\u0e43\u0e2b\u0e21\u0e48\u0e2d\u0e35\u0e01", -"Undo": "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e01\u0e25\u0e31\u0e1a\u0e04\u0e37\u0e19", -"Cut": "\u0e15\u0e31\u0e14", -"Copy": "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01", -"Paste": "\u0e27\u0e32\u0e07", -"Select all": "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14", -"New document": "\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e43\u0e2b\u0e21\u0e48", -"Ok": "\u0e15\u0e01\u0e25\u0e07", -"Cancel": "\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01", -"Visual aids": "\u0e17\u0e31\u0e28\u0e19\u0e39\u0e1b\u0e01\u0e23\u0e13\u0e4c", -"Bold": "\u0e15\u0e31\u0e27\u0e2b\u0e19\u0e32", -"Italic": "\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e35\u0e22\u0e07", -"Underline": "\u0e02\u0e35\u0e14\u0e40\u0e2a\u0e49\u0e19\u0e43\u0e15\u0e49", -"Strikethrough": "\u0e02\u0e35\u0e14\u0e04\u0e23\u0e48\u0e2d\u0e21", -"Superscript": "\u0e15\u0e31\u0e27\u0e22\u0e01", -"Subscript": "\u0e15\u0e31\u0e27\u0e2b\u0e49\u0e2d\u0e22", -"Clear formatting": "\u0e25\u0e49\u0e32\u0e07\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"Align left": "\u0e08\u0e31\u0e14\u0e0a\u0e34\u0e14\u0e0b\u0e49\u0e32\u0e22", -"Align center": "\u0e08\u0e31\u0e14\u0e01\u0e36\u0e48\u0e07\u0e01\u0e25\u0e32\u0e07", -"Align right": "\u0e08\u0e31\u0e14\u0e0a\u0e34\u0e14\u0e02\u0e27\u0e32", -"Justify": "\u0e40\u0e15\u0e47\u0e21\u0e41\u0e19\u0e27", -"Bullet list": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2b\u0e31\u0e27\u0e02\u0e49\u0e2d\u0e22\u0e48\u0e2d\u0e22", -"Numbered list": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e40\u0e25\u0e02", -"Decrease indent": "\u0e25\u0e14\u0e01\u0e32\u0e23\u0e40\u0e22\u0e37\u0e49\u0e2d\u0e07", -"Increase indent": "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e40\u0e22\u0e37\u0e49\u0e2d\u0e07", -"Close": "\u0e1b\u0e34\u0e14", -"Formats": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0e40\u0e1a\u0e23\u0e32\u0e27\u0e4c\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e19\u0e31\u0e1a\u0e2a\u0e19\u0e38\u0e19\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e42\u0e14\u0e22\u0e15\u0e23\u0e07\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e04\u0e25\u0e34\u0e1b\u0e1a\u0e2d\u0e23\u0e4c\u0e14 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e43\u0e0a\u0e49\u0e41\u0e1b\u0e49\u0e19\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e25\u0e31\u0e14 Ctrl+X\/C\/V \u0e41\u0e17\u0e19", -"Headers": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27", -"Header 1": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 1", -"Header 2": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 2", -"Header 3": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 3", -"Header 4": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 4", -"Header 5": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 5", -"Header 6": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27 6", -"Headings": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07", -"Heading 1": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 1", -"Heading 2": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 2", -"Heading 3": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 3", -"Heading 4": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 4", -"Heading 5": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 5", -"Heading 6": "\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48 6", -"Preformatted": "\u0e1f\u0e2d\u0e23\u0e4c\u0e41\u0e21\u0e15\u0e44\u0e27\u0e49\u0e01\u0e48\u0e2d\u0e19", -"Div": "Div", -"Pre": "Pre", -"Code": "\u0e23\u0e2b\u0e31\u0e2a", -"Paragraph": "\u0e22\u0e48\u0e2d\u0e2b\u0e19\u0e49\u0e32", -"Blockquote": "Blockquote", -"Inline": "\u0e41\u0e1a\u0e1a\u0e2d\u0e34\u0e19\u0e44\u0e25\u0e19\u0e4c", -"Blocks": "\u0e1a\u0e25\u0e4a\u0e2d\u0e04", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u0e01\u0e32\u0e23\u0e27\u0e32\u0e07\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32 \u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e08\u0e30\u0e16\u0e39\u0e01\u0e27\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32\u0e08\u0e19\u0e01\u0e27\u0e48\u0e32\u0e04\u0e38\u0e13\u0e08\u0e30\u0e1b\u0e34\u0e14\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e19\u0e35\u0e49", -"Fonts": "\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e01\u0e29\u0e23", -"Font Sizes": "\u0e02\u0e19\u0e32\u0e14\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e01\u0e29\u0e23", -"Class": "\u0e0a\u0e31\u0e49\u0e19", -"Browse for an image": "\u0e40\u0e23\u0e35\u0e22\u0e01\u0e14\u0e39\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"OR": "OR", -"Drop an image here": "\u0e27\u0e32\u0e07\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48", -"Upload": "\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14", -"Block": "\u0e1a\u0e25\u0e47\u0e2d\u0e01", -"Align": "Align", -"Default": "\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19", -"Circle": "\u0e27\u0e07\u0e01\u0e25\u0e21", -"Disc": "\u0e14\u0e34\u0e2a\u0e01\u0e4c", -"Square": "\u0e08\u0e31\u0e15\u0e38\u0e23\u0e31\u0e2a", -"Lower Alpha": "\u0e2d\u0e31\u0e25\u0e1f\u0e32\u0e17\u0e35\u0e48\u0e15\u0e48\u0e33\u0e01\u0e27\u0e48\u0e32", -"Lower Greek": "\u0e01\u0e23\u0e35\u0e01\u0e17\u0e35\u0e48\u0e15\u0e48\u0e33\u0e01\u0e27\u0e48\u0e32", -"Lower Roman": "\u0e42\u0e23\u0e21\u0e31\u0e19\u0e17\u0e35\u0e48\u0e15\u0e48\u0e33\u0e01\u0e27\u0e48\u0e32", -"Upper Alpha": "\u0e2d\u0e31\u0e25\u0e1f\u0e32\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07\u0e01\u0e27\u0e48\u0e32", -"Upper Roman": "\u0e42\u0e23\u0e21\u0e31\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07\u0e01\u0e27\u0e48\u0e32", -"Anchor...": "\u0e08\u0e38\u0e14\u0e22\u0e36\u0e14...", -"Name": "\u0e0a\u0e37\u0e48\u0e2d", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id \u0e04\u0e27\u0e23\u0e08\u0e30\u0e02\u0e36\u0e49\u0e19\u0e15\u0e49\u0e19\u0e14\u0e49\u0e27\u0e22\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23 \u0e15\u0e32\u0e21\u0e14\u0e49\u0e27\u0e22\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23 \u0e15\u0e31\u0e27\u0e40\u0e25\u0e02 \u0e02\u0e35\u0e14\u0e01\u0e25\u0e32\u0e07 \u0e08\u0e38\u0e14 \u0e2d\u0e31\u0e12\u0e20\u0e32\u0e04 \u0e2b\u0e23\u0e37\u0e2d \u0e02\u0e35\u0e14\u0e25\u0e48\u0e32\u0e07", -"You have unsaved changes are you sure you want to navigate away?": "\u0e04\u0e38\u0e13\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e08\u0e30\u0e2d\u0e2d\u0e01\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48?", -"Restore last draft": "\u0e04\u0e37\u0e19\u0e04\u0e48\u0e32\u0e41\u0e1a\u0e1a\u0e23\u0e48\u0e32\u0e07\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14", -"Special character...": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e1e\u0e34\u0e40\u0e28\u0e29...", -"Source code": "\u0e42\u0e04\u0e49\u0e14\u0e15\u0e49\u0e19\u0e09\u0e1a\u0e31\u0e1a", -"Insert\/Edit code sample": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e42\u0e04\u0e49\u0e14", -"Language": "\u0e20\u0e32\u0e29\u0e32", -"Code sample...": "\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e42\u0e04\u0e49\u0e14...", -"Color Picker": "\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2a\u0e35", -"R": "\u0e41\u0e14\u0e07", -"G": "\u0e40\u0e02\u0e35\u0e22\u0e27", -"B": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19", -"Left to right": "\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32", -"Right to left": "\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22", -"Emoticons...": "\u0e2d\u0e35\u0e42\u0e21\u0e15\u0e34\u0e04\u0e2d\u0e19...", -"Metadata and Document Properties": "\u0e40\u0e21\u0e15\u0e32\u0e14\u0e32\u0e15\u0e49\u0e32\u0e41\u0e25\u0e30\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23", -"Title": "\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07", -"Keywords": "\u0e04\u0e33\u0e2a\u0e33\u0e04\u0e31\u0e0d", -"Description": "\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22", -"Robots": "\u0e2b\u0e38\u0e48\u0e19\u0e22\u0e19\u0e15\u0e4c", -"Author": "\u0e1c\u0e39\u0e49\u0e40\u0e02\u0e35\u0e22\u0e19", -"Encoding": "\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e23\u0e2b\u0e31\u0e2a", -"Fullscreen": "\u0e40\u0e15\u0e47\u0e21\u0e08\u0e2d", -"Action": "\u0e01\u0e32\u0e23\u0e01\u0e23\u0e30\u0e17\u0e33", -"Shortcut": "\u0e17\u0e32\u0e07\u0e25\u0e31\u0e14", -"Help": "\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d", -"Address": "\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48", -"Focus to menubar": "\u0e42\u0e1f\u0e01\u0e31\u0e2a\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e40\u0e21\u0e19\u0e39\u0e1a\u0e32\u0e23\u0e4c", -"Focus to toolbar": "\u0e42\u0e1f\u0e01\u0e31\u0e2a\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e41\u0e16\u0e1a\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d", -"Focus to element path": "\u0e42\u0e1f\u0e01\u0e31\u0e2a\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e40\u0e2a\u0e49\u0e19\u0e17\u0e32\u0e07\u0e02\u0e2d\u0e07\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a", -"Focus to contextual toolbar": "\u0e42\u0e1f\u0e01\u0e31\u0e2a\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e41\u0e16\u0e1a\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e15\u0e32\u0e21\u0e1a\u0e23\u0e34\u0e1a\u0e17", -"Insert link (if link plugin activated)": "\u0e41\u0e17\u0e23\u0e01\u0e25\u0e34\u0e07\u0e01\u0e4c (\u0e2b\u0e32\u0e01\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19\u0e25\u0e34\u0e07\u0e01\u0e4c)", -"Save (if save plugin activated)": "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 (\u0e2b\u0e32\u0e01\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01)", -"Find (if searchreplace plugin activated)": "\u0e04\u0e49\u0e19\u0e2b\u0e32 (\u0e2b\u0e32\u0e01\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19 searchreplace)", -"Plugins installed ({0}):": "\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19\u0e17\u0e35\u0e48\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e41\u0e25\u0e49\u0e27 ({0}):", -"Premium plugins:": "\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19\u0e1e\u0e23\u0e35\u0e40\u0e21\u0e35\u0e22\u0e21:", -"Learn more...": "\u0e40\u0e23\u0e35\u0e22\u0e19\u0e23\u0e39\u0e49\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21...", -"You are using {0}": "\u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e43\u0e0a\u0e49 {0}", -"Plugins": "\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19", -"Handy Shortcuts": "\u0e17\u0e32\u0e07\u0e25\u0e31\u0e14\u0e14\u0e49\u0e27\u0e22\u0e21\u0e37\u0e2d", -"Horizontal line": "\u0e40\u0e2a\u0e49\u0e19\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19", -"Insert\/edit image": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e39\u0e1b", -"Image description": "\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e23\u0e39\u0e1b", -"Source": "\u0e41\u0e2b\u0e25\u0e48\u0e07\u0e17\u0e35\u0e48\u0e21\u0e32", -"Dimensions": "\u0e02\u0e19\u0e32\u0e14", -"Constrain proportions": "\u0e08\u0e33\u0e01\u0e31\u0e14\u0e2a\u0e31\u0e14\u0e2a\u0e48\u0e27\u0e19", -"General": "\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b", -"Advanced": "\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07", -"Style": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"Vertical space": "\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07", -"Horizontal space": "\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19", -"Border": "\u0e40\u0e2a\u0e49\u0e19\u0e02\u0e2d\u0e1a", -"Insert image": "\u0e41\u0e17\u0e23\u0e01\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"Image...": "\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e...", -"Image list": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"Rotate counterclockwise": "\u0e2b\u0e21\u0e38\u0e19\u0e17\u0e27\u0e19\u0e40\u0e02\u0e47\u0e21\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32", -"Rotate clockwise": "\u0e2b\u0e21\u0e38\u0e19\u0e15\u0e32\u0e21\u0e40\u0e02\u0e47\u0e21\u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32", -"Flip vertically": "\u0e1e\u0e25\u0e34\u0e01\u0e15\u0e32\u0e21\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07", -"Flip horizontally": "\u0e1e\u0e25\u0e34\u0e01\u0e15\u0e32\u0e21\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19", -"Edit image": "\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e39\u0e1b", -"Image options": "\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"Zoom in": "\u0e02\u0e22\u0e32\u0e22\u0e40\u0e02\u0e49\u0e32", -"Zoom out": "\u0e22\u0e48\u0e2d\u0e2d\u0e2d\u0e01", -"Crop": "\u0e04\u0e23\u0e2d\u0e1b\u0e15\u0e31\u0e14", -"Resize": "\u0e1b\u0e23\u0e31\u0e1a\u0e02\u0e19\u0e32\u0e14", -"Orientation": "\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e27\u0e32\u0e07", -"Brightness": "\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e27\u0e48\u0e32\u0e07", -"Sharpen": "\u0e04\u0e27\u0e32\u0e21\u0e04\u0e21", -"Contrast": "\u0e04\u0e27\u0e32\u0e21\u0e40\u0e1b\u0e23\u0e35\u0e22\u0e1a\u0e15\u0e48\u0e32\u0e07", -"Color levels": "\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e2a\u0e35", -"Gamma": "\u0e41\u0e01\u0e21\u0e21\u0e32", -"Invert": "\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a", -"Apply": "\u0e19\u0e33\u0e44\u0e1b\u0e43\u0e0a\u0e49", -"Back": "\u0e01\u0e25\u0e31\u0e1a", -"Insert date\/time": "\u0e41\u0e17\u0e23\u0e01\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\/\u0e40\u0e27\u0e25\u0e32", -"Date\/time": "\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\/\u0e40\u0e27\u0e25\u0e32", -"Insert\/Edit Link": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e25\u0e34\u0e07\u0e01\u0e4c", -"Insert\/edit link": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e25\u0e34\u0e07\u0e01\u0e4c", -"Text to display": "\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e41\u0e2a\u0e14\u0e07", -"Url": "URL", -"Open link in...": "\u0e40\u0e1b\u0e34\u0e14\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e43\u0e19...", -"Current window": "\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19", -"None": "\u0e44\u0e21\u0e48\u0e21\u0e35", -"New window": "\u0e40\u0e1b\u0e34\u0e14\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e43\u0e2b\u0e21\u0e48", -"Remove link": "\u0e40\u0e2d\u0e32\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e2d\u0e2d\u0e01", -"Anchors": "\u0e08\u0e38\u0e14\u0e22\u0e36\u0e14", -"Link...": "\u0e25\u0e34\u0e07\u0e01\u0e4c...", -"Paste or type a link": "\u0e27\u0e32\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e49\u0e2d\u0e19\u0e25\u0e34\u0e07\u0e01\u0e4c", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL \u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e23\u0e30\u0e1a\u0e38\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e41\u0e2d\u0e14\u0e40\u0e14\u0e23\u0e2a \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2a\u0e48 mailto: \u0e19\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL \u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e23\u0e30\u0e1a\u0e38\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e20\u0e32\u0e22\u0e19\u0e2d\u0e01 \u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2a\u0e48 http:\/\/ \u0e19\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48", -"Link list": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e25\u0e34\u0e07\u0e01\u0e4c", -"Insert video": "\u0e41\u0e17\u0e23\u0e01\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d", -"Insert\/edit video": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d", -"Insert\/edit media": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2a\u0e37\u0e48\u0e2d", -"Alternative source": "\u0e41\u0e2b\u0e25\u0e48\u0e07\u0e17\u0e35\u0e48\u0e21\u0e32\u0e2a\u0e33\u0e23\u0e2d\u0e07", -"Alternative source URL": "URL \u0e41\u0e2b\u0e25\u0e48\u0e07\u0e17\u0e35\u0e48\u0e21\u0e32\u0e2a\u0e33\u0e23\u0e2d\u0e07", -"Media poster (Image URL)": "\u0e42\u0e1b\u0e2a\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e21\u0e35\u0e40\u0e14\u0e35\u0e22 (URL \u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e)", -"Paste your embed code below:": "\u0e27\u0e32\u0e07\u0e42\u0e04\u0e49\u0e14\u0e1d\u0e31\u0e07\u0e15\u0e31\u0e27\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07:", -"Embed": "\u0e1d\u0e31\u0e07", -"Media...": "\u0e21\u0e35\u0e40\u0e14\u0e35\u0e22...", -"Nonbreaking space": "\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07\u0e44\u0e21\u0e48\u0e41\u0e22\u0e01", -"Page break": "\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e48\u0e07\u0e2b\u0e19\u0e49\u0e32", -"Paste as text": "\u0e27\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21", -"Preview": "\u0e41\u0e2a\u0e14\u0e07\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07", -"Print...": "\u0e1e\u0e34\u0e21\u0e1e\u0e4c...", -"Save": "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01", -"Find": "\u0e04\u0e49\u0e19\u0e2b\u0e32", -"Replace with": "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e14\u0e49\u0e27\u0e22", -"Replace": "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48", -"Replace all": "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14", -"Previous": "\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e49", -"Next": "\u0e16\u0e31\u0e14\u0e44\u0e1b", -"Find and replace...": "\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e41\u0e25\u0e30\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48...", -"Could not find the specified string.": "\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e2a\u0e15\u0e23\u0e34\u0e07\u0e17\u0e35\u0e48\u0e23\u0e30\u0e1a\u0e38", -"Match case": "\u0e15\u0e23\u0e07\u0e15\u0e32\u0e21\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e43\u0e2b\u0e0d\u0e48-\u0e40\u0e25\u0e47\u0e01", -"Find whole words only": "\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e17\u0e31\u0e49\u0e07\u0e04\u0e33\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19", -"Spell check": "\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e33\u0e1c\u0e34\u0e14", -"Ignore": "\u0e25\u0e30\u0e40\u0e27\u0e49\u0e19", -"Ignore all": "\u0e25\u0e30\u0e40\u0e27\u0e49\u0e19\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14", -"Finish": "\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e34\u0e49\u0e19", -"Add to Dictionary": "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e43\u0e19\u0e1e\u0e08\u0e19\u0e32\u0e19\u0e38\u0e01\u0e23\u0e21", -"Insert table": "\u0e41\u0e17\u0e23\u0e01\u0e15\u0e32\u0e23\u0e32\u0e07", -"Table properties": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e15\u0e32\u0e23\u0e32\u0e07", -"Delete table": "\u0e25\u0e1a\u0e15\u0e32\u0e23\u0e32\u0e07", -"Cell": "\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Row": "\u0e41\u0e16\u0e27", -"Column": "\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c", -"Cell properties": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Merge cells": "\u0e1c\u0e2a\u0e32\u0e19\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Split cell": "\u0e41\u0e22\u0e01\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Insert row before": "\u0e41\u0e17\u0e23\u0e01\u0e41\u0e16\u0e27\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19", -"Insert row after": "\u0e41\u0e17\u0e23\u0e01\u0e41\u0e16\u0e27\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07", -"Delete row": "\u0e25\u0e1a\u0e41\u0e16\u0e27", -"Row properties": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e41\u0e16\u0e27", -"Cut row": "\u0e15\u0e31\u0e14\u0e41\u0e16\u0e27", -"Copy row": "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e41\u0e16\u0e27", -"Paste row before": "\u0e27\u0e32\u0e07\u0e41\u0e16\u0e27\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19", -"Paste row after": "\u0e27\u0e32\u0e07\u0e41\u0e16\u0e27\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07", -"Insert column before": "\u0e41\u0e17\u0e23\u0e01\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c\u0e02\u0e49\u0e32\u0e07\u0e2b\u0e19\u0e49\u0e32", -"Insert column after": "\u0e41\u0e17\u0e23\u0e01\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c\u0e02\u0e49\u0e32\u0e07\u0e2b\u0e25\u0e31\u0e07", -"Delete column": "\u0e25\u0e1a\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c", -"Cols": "\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c", -"Rows": "\u0e41\u0e16\u0e27", -"Width": "\u0e04\u0e27\u0e32\u0e21\u0e01\u0e27\u0e49\u0e32\u0e07", -"Height": "\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e39\u0e07", -"Cell spacing": "\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Cell padding": "\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07\u0e20\u0e32\u0e22\u0e43\u0e19\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Show caption": "\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e33\u0e1a\u0e23\u0e23\u0e22\u0e32\u0e22", -"Left": "\u0e0b\u0e49\u0e32\u0e22", -"Center": "\u0e01\u0e36\u0e48\u0e07\u0e01\u0e25\u0e32\u0e07", -"Right": "\u0e02\u0e27\u0e32", -"Cell type": "\u0e0a\u0e19\u0e34\u0e14\u0e02\u0e2d\u0e07\u0e40\u0e0b\u0e25\u0e25\u0e4c", -"Scope": "\u0e02\u0e2d\u0e1a\u0e40\u0e02\u0e15", -"Alignment": "\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e41\u0e19\u0e27", -"H Align": "\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e07\u0e43\u0e19\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19", -"V Align": "\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e07\u0e43\u0e19\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07", -"Top": "\u0e1a\u0e19", -"Middle": "\u0e01\u0e25\u0e32\u0e07", -"Bottom": "\u0e25\u0e48\u0e32\u0e07", -"Header cell": "\u0e40\u0e0b\u0e25\u0e25\u0e4c\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27", -"Row group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e41\u0e16\u0e27", -"Column group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4c", -"Row type": "\u0e0a\u0e19\u0e34\u0e14\u0e02\u0e2d\u0e07\u0e41\u0e16\u0e27", -"Header": "\u0e2a\u0e48\u0e27\u0e19\u0e2b\u0e31\u0e27", -"Body": "\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21", -"Footer": "\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e49\u0e32\u0e22", -"Border color": "\u0e2a\u0e35\u0e02\u0e2d\u0e1a", -"Insert template...": "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a...", -"Templates": "\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a", -"Template": "\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a", -"Text color": "\u0e2a\u0e35\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21", -"Background color": "\u0e2a\u0e35\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07", -"Custom...": "\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e2d\u0e07", -"Custom color": "\u0e2a\u0e35\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e2d\u0e07", -"No color": "\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e35", -"Remove color": "\u0e25\u0e1a\u0e2a\u0e35", -"Table of Contents": "\u0e2a\u0e32\u0e23\u0e1a\u0e31\u0e0d", -"Show blocks": "\u0e41\u0e2a\u0e14\u0e07\u0e1a\u0e25\u0e47\u0e2d\u0e01", -"Show invisible characters": "\u0e41\u0e2a\u0e14\u0e07\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e17\u0e35\u0e48\u0e21\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e40\u0e2b\u0e47\u0e19", -"Word count": "\u0e19\u0e31\u0e1a\u0e08\u0e33\u0e19\u0e27\u0e19\u0e04\u0e33", -"Count": "\u0e19\u0e31\u0e1a", -"Document": "\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23", -"Selection": "\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01", -"Words": "\u0e04\u0e33", -"Words: {0}": "\u0e04\u0e33: {0}", -"{0} words": "{0} \u0e04\u0e33", -"File": "\u0e44\u0e1f\u0e25\u0e4c", -"Edit": "\u0e41\u0e01\u0e49\u0e44\u0e02", -"Insert": "\u0e41\u0e17\u0e23\u0e01", -"View": "\u0e21\u0e38\u0e21\u0e21\u0e2d\u0e07", -"Format": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"Table": "\u0e15\u0e32\u0e23\u0e32\u0e07", -"Tools": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d", -"Powered by {0}": "\u0e02\u0e31\u0e1a\u0e40\u0e04\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e42\u0e14\u0e22 {0}", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48 Rich Text \u0e01\u0e14 ALT-F9 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e21\u0e19\u0e39 \u0e01\u0e14 ALT-F10 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e41\u0e16\u0e1a\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d \u0e01\u0e14 ALT-0 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d", -"Image title": "\u0e0a\u0e37\u0e48\u0e2d\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"Border width": "\u0e04\u0e27\u0e32\u0e21\u0e01\u0e27\u0e49\u0e32\u0e07\u0e40\u0e2a\u0e49\u0e19\u0e02\u0e2d\u0e1a", -"Border style": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e40\u0e2a\u0e49\u0e19\u0e02\u0e2d\u0e1a", -"Error": "\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14", -"Warn": "\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e40\u0e15\u0e37\u0e2d\u0e19", -"Valid": "\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07", -"To open the popup, press Shift+Enter": "\u0e01\u0e14 Shift+Enter \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e1b\u0e34\u0e14\u0e1b\u0e4a\u0e2d\u0e1a\u0e2d\u0e31\u0e1e", -"Rich Text Area. Press ALT-0 for help.": "\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48 Rich Text \u0e01\u0e14 ALT-0 \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d", -"System Font": "\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e02\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e1a", -"Failed to upload image: {0}": "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e: {0}", -"Failed to load plugin: {0} from url {1}": "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19: {0} \u0e08\u0e32\u0e01 url {1}", -"Failed to load plugin url: {0}": "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14 url \u0e02\u0e2d\u0e07\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19: {0}", -"Failed to initialize plugin: {0}": "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e1b\u0e25\u0e31\u0e4a\u0e01\u0e2d\u0e34\u0e19: {0}", -"example": "\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07", -"Search": "\u0e04\u0e49\u0e19\u0e2b\u0e32", -"All": "\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14", -"Currency": "\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19", -"Text": "\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21", -"Quotations": "\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32", -"Mathematical": "\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e04\u0e13\u0e34\u0e15\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c", -"Extended Latin": "\u0e20\u0e32\u0e29\u0e32\u0e25\u0e32\u0e15\u0e34\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e02\u0e22\u0e32\u0e22", -"Symbols": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c", -"Arrows": "\u0e25\u0e39\u0e01\u0e28\u0e23", -"User Defined": "\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e2d\u0e07", -"dollar sign": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e14\u0e2d\u0e25\u0e25\u0e48\u0e32\u0e23\u0e4c", -"currency sign": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19", -"euro-currency sign": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e22\u0e39\u0e42\u0e23", -"colon sign": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e08\u0e38\u0e14\u0e04\u0e39\u0e48", -"cruzeiro sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e04\u0e23\u0e39\u0e40\u0e0b\u0e42\u0e35\u0e23", -"french franc sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e1f\u0e23\u0e31\u0e07\u0e01\u0e4c\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a", -"lira sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e25\u0e35\u0e23\u0e32", -"mill sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e21\u0e34\u0e25\u0e25\u0e4c", -"naira sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e44\u0e19\u0e23\u0e32", -"peseta sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e40\u0e1b\u0e40\u0e0b\u0e15\u0e32", -"rupee sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e23\u0e39\u0e1b\u0e35", -"won sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e27\u0e2d\u0e19", -"new sheqel sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e19\u0e34\u0e27\u0e40\u0e0a\u0e40\u0e01\u0e25", -"dong sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e14\u0e2d\u0e07", -"kip sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e01\u0e35\u0e1a", -"tugrik sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e17\u0e39\u0e01\u0e23\u0e34\u0e01", -"drachma sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e14\u0e23\u0e31\u0e04\u0e21\u0e32", -"german penny symbol": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e40\u0e1e\u0e19\u0e19\u0e35\u0e40\u0e22\u0e2d\u0e23\u0e21\u0e31\u0e19", -"peso sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e40\u0e1b\u0e42\u0e0b", -"guarani sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e01\u0e27\u0e32\u0e23\u0e32\u0e19\u0e35", -"austral sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e2d\u0e2d\u0e2a\u0e15\u0e23\u0e31\u0e25", -"hryvnia sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e2e\u0e23\u0e34\u0e1f\u0e40\u0e19\u0e35\u0e22", -"cedi sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e40\u0e0b\u0e14\u0e35", -"livre tournois sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e1b\u0e2d\u0e19\u0e14\u0e4c\u0e15\u0e39\u0e23\u0e4c", -"spesmilo sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e2a\u0e40\u0e1b\u0e2a\u0e21\u0e34\u0e42\u0e25", -"tenge sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e40\u0e17\u0e07\u0e40\u0e08", -"indian rupee sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e23\u0e39\u0e1b\u0e35\u0e2d\u0e34\u0e19\u0e40\u0e14\u0e35\u0e22", -"turkish lira sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e25\u0e35\u0e23\u0e32\u0e15\u0e38\u0e23\u0e01\u0e35", -"nordic mark sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e21\u0e32\u0e23\u0e4c\u0e04\u0e19\u0e2d\u0e23\u0e4c\u0e14\u0e34\u0e01", -"manat sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e21\u0e32\u0e19\u0e31\u0e15", -"ruble sign": "\u0e2a\u0e31\u0e0d\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e23\u0e39\u0e40\u0e1a\u0e34\u0e25", -"yen character": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e40\u0e22\u0e19", -"yuan character": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e2b\u0e22\u0e27\u0e19", -"yuan character, in hong kong and taiwan": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e2b\u0e22\u0e27\u0e19 \u0e43\u0e19\u0e2e\u0e48\u0e2d\u0e07\u0e01\u0e07\u0e41\u0e25\u0e30\u0e44\u0e15\u0e49\u0e2b\u0e27\u0e31\u0e19", -"yen\/yuan character variant one": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e40\u0e22\u0e19\/\u0e2b\u0e22\u0e27\u0e19 \u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e17\u0e35\u0e48 1", -"Loading emoticons...": "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e41\u0e2a\u0e14\u0e07\u0e2d\u0e32\u0e23\u0e21\u0e13\u0e4c...", -"Could not load emoticons": "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22\u0e41\u0e2a\u0e14\u0e07\u0e2d\u0e32\u0e23\u0e21\u0e13\u0e4c\u0e44\u0e14\u0e49", -"People": "\u0e1c\u0e39\u0e49\u0e04\u0e19", -"Animals and Nature": "\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e41\u0e25\u0e30\u0e18\u0e23\u0e23\u0e21\u0e0a\u0e32\u0e15\u0e34", -"Food and Drink": "\u0e2d\u0e32\u0e2b\u0e32\u0e23\u0e41\u0e25\u0e30\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e14\u0e37\u0e48\u0e21", -"Activity": "\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21", -"Travel and Places": "\u0e01\u0e32\u0e23\u0e17\u0e48\u0e2d\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e27\u0e41\u0e25\u0e30\u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48", -"Objects": "\u0e27\u0e31\u0e15\u0e16\u0e38", -"Flags": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22", -"Characters": "\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23", -"Characters (no spaces)": "\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23 (\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e48\u0e2d\u0e07\u0e27\u0e48\u0e32\u0e07)", -"{0} characters": "{0} \u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30", -"Error: Form submit field collision.": "\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14: \u0e0a\u0e48\u0e2d\u0e07\u0e2a\u0e48\u0e07\u0e41\u0e1a\u0e1a\u0e1f\u0e2d\u0e23\u0e4c\u0e21\u0e02\u0e31\u0e14\u0e41\u0e22\u0e49\u0e07\u0e01\u0e31\u0e19", -"Error: No form element found.": "\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14: \u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e02\u0e2d\u0e07\u0e1f\u0e2d\u0e23\u0e4c\u0e21", -"Update": "\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e43\u0e2b\u0e49\u0e17\u0e31\u0e19\u0e2a\u0e21\u0e31\u0e22", -"Color swatch": "\u0e41\u0e16\u0e1a\u0e2a\u0e35", -"Turquoise": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19\u0e2d\u0e21\u0e40\u0e02\u0e35\u0e22\u0e27", -"Green": "\u0e40\u0e02\u0e35\u0e22\u0e27", -"Blue": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19", -"Purple": "\u0e21\u0e48\u0e27\u0e07", -"Navy Blue": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19\u0e40\u0e02\u0e49\u0e21", -"Dark Turquoise": "\u0e2a\u0e35\u0e1f\u0e49\u0e32\u0e04\u0e23\u0e32\u0e21\u0e40\u0e02\u0e49\u0e21", -"Dark Green": "\u0e40\u0e02\u0e35\u0e22\u0e27\u0e40\u0e02\u0e49\u0e21", -"Medium Blue": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19\u0e1b\u0e32\u0e19\u0e01\u0e25\u0e32\u0e07", -"Medium Purple": "\u0e2a\u0e35\u0e21\u0e48\u0e27\u0e07\u0e01\u0e25\u0e32\u0e07\u0e46", -"Midnight Blue": "\u0e2a\u0e35\u0e1f\u0e49\u0e32\u0e40\u0e02\u0e49\u0e21", -"Yellow": "\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07", -"Orange": "\u0e2a\u0e49\u0e21", -"Red": "\u0e41\u0e14\u0e07", -"Light Gray": "\u0e2a\u0e35\u0e40\u0e17\u0e32\u0e2d\u0e48\u0e2d\u0e19", -"Gray": "\u0e40\u0e17\u0e32", -"Dark Yellow": "\u0e2a\u0e35\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e40\u0e02\u0e49\u0e21", -"Dark Orange": "\u0e2a\u0e49\u0e21\u0e40\u0e02\u0e49\u0e21", -"Dark Red": "\u0e41\u0e14\u0e07\u0e40\u0e02\u0e49\u0e21", -"Medium Gray": "\u0e2a\u0e35\u0e40\u0e17\u0e32\u0e01\u0e25\u0e32\u0e07\u0e46", -"Dark Gray": "\u0e2a\u0e35\u0e40\u0e17\u0e32\u0e40\u0e02\u0e49\u0e21", -"Light Green": "\u0e40\u0e02\u0e35\u0e22\u0e27\u0e2d\u0e48\u0e2d\u0e19", -"Light Yellow": "\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07\u0e2d\u0e48\u0e2d\u0e19", -"Light Red": "\u0e41\u0e14\u0e07\u0e2d\u0e48\u0e2d\u0e19", -"Light Purple": "\u0e21\u0e48\u0e27\u0e07\u0e2d\u0e48\u0e2d\u0e19", -"Light Blue": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19\u0e2d\u0e48\u0e2d\u0e19", -"Dark Purple": "\u0e21\u0e48\u0e27\u0e07\u0e40\u0e02\u0e49\u0e21", -"Dark Blue": "\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19\u0e40\u0e02\u0e49\u0e21", -"Black": "\u0e14\u0e33", -"White": "\u0e02\u0e32\u0e27", -"Switch to or from fullscreen mode": "\u0e2a\u0e25\u0e31\u0e1a\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e08\u0e32\u0e01\u0e42\u0e2b\u0e21\u0e14\u0e40\u0e15\u0e47\u0e21\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e2d", -"Open help dialog": "\u0e40\u0e1b\u0e34\u0e14\u0e2b\u0e19\u0e49\u0e32\u0e01\u0e32\u0e23\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e2b\u0e25\u0e37\u0e2d", -"history": "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34", -"styles": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"formatting": "\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a", -"alignment": "\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e41\u0e19\u0e27", -"indentation": "\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e22\u0e48\u0e2d\u0e2b\u0e19\u0e49\u0e32", -"permanent pen": "\u0e1b\u0e32\u0e01\u0e01\u0e32\u0e40\u0e04\u0e21\u0e35\u0e0a\u0e19\u0e34\u0e14\u0e25\u0e1a\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49", -"comments": "\u0e02\u0e49\u0e2d\u0e04\u0e34\u0e14\u0e40\u0e2b\u0e47\u0e19", -"Format Painter": "\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e40\u0e1e\u0e19\u0e40\u0e15\u0e2d\u0e23\u0e4c", -"Insert\/edit iframe": "\u0e41\u0e17\u0e23\u0e01\/\u0e41\u0e01\u0e49\u0e44\u0e02 iframe", -"Capitalization": "\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e43\u0e2b\u0e0d\u0e48", -"lowercase": "\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e40\u0e25\u0e47\u0e01", -"UPPERCASE": "\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e43\u0e2b\u0e0d\u0e48", -"Title Case": "\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e2d\u0e07\u0e2b\u0e31\u0e27\u0e02\u0e49\u0e2d", -"Permanent Pen Properties": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e1b\u0e32\u0e01\u0e01\u0e32\u0e21\u0e32\u0e23\u0e4c\u0e04\u0e40\u0e01\u0e2d\u0e23\u0e4c", -"Permanent pen properties...": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e1b\u0e32\u0e01\u0e01\u0e32\u0e21\u0e32\u0e23\u0e4c\u0e04\u0e40\u0e01\u0e2d\u0e23\u0e4c...", -"Font": "\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23", -"Size": "\u0e02\u0e19\u0e32\u0e14", -"More...": "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21...", -"Spellcheck Language": "\u0e20\u0e32\u0e29\u0e32\u0e43\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e01\u0e32\u0e23\u0e2a\u0e30\u0e01\u0e14", -"Select...": "\u0e40\u0e25\u0e37\u0e2d\u0e01...", -"Preferences": "\u0e04\u0e48\u0e32\u0e01\u0e33\u0e2b\u0e19\u0e14", -"Yes": "\u0e43\u0e0a\u0e48", -"No": "\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48", -"Keyboard Navigation": "\u0e01\u0e32\u0e23\u0e19\u0e33\u0e17\u0e32\u0e07\u0e14\u0e49\u0e27\u0e22\u0e41\u0e1b\u0e49\u0e19\u0e1e\u0e34\u0e21\u0e1e\u0e4c", -"Version": "\u0e23\u0e38\u0e48\u0e19", -"Anchor": "\u0e08\u0e38\u0e14\u0e22\u0e36\u0e14", -"Special character": "\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e1e\u0e34\u0e40\u0e28\u0e29", -"Code sample": "\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e42\u0e04\u0e49\u0e14", -"Color": "\u0e2a\u0e35", -"Emoticons": "\u0e2d\u0e34\u0e42\u0e21\u0e15\u0e34\u0e04\u0e2d\u0e19", -"Document properties": "\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23", -"Image": "\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e", -"Insert link": "\u0e41\u0e17\u0e23\u0e01\u0e25\u0e34\u0e07\u0e01\u0e4c", -"Target": "\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22", -"Link": "\u0e25\u0e34\u0e07\u0e01\u0e4c", -"Poster": "\u0e42\u0e1b\u0e2a\u0e40\u0e15\u0e2d\u0e23\u0e4c", -"Media": "\u0e2a\u0e37\u0e48\u0e2d", -"Print": "\u0e1e\u0e34\u0e21\u0e1e\u0e4c", -"Prev": "\u0e01\u0e48\u0e2d\u0e19\u0e2b\u0e19\u0e49\u0e32", -"Find and replace": "\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e41\u0e25\u0e30\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48", -"Whole words": "\u0e17\u0e31\u0e49\u0e07\u0e04\u0e33", -"Spellcheck": "\u0e15\u0e23\u0e27\u0e08\u0e01\u0e32\u0e23\u0e2a\u0e30\u0e01\u0e14", -"Caption": "\u0e1b\u0e49\u0e32\u0e22\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22", -"Insert template": "\u0e41\u0e17\u0e23\u0e01\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/tr_TR.js b/cps/static/js/libs/tinymce/langs/tr_TR.js deleted file mode 100644 index 4a4327df9..000000000 --- a/cps/static/js/libs/tinymce/langs/tr_TR.js +++ /dev/null @@ -1,389 +0,0 @@ -tinymce.addI18n('tr_TR',{ -"Redo": "Yinele", -"Undo": "Geri al", -"Cut": "Kes", -"Copy": "Kopyala", -"Paste": "Yap\u0131\u015ft\u0131r", -"Select all": "T\u00fcm\u00fcn\u00fc se\u00e7", -"New document": "Yeni dok\u00fcman", -"Ok": "Tamam", -"Cancel": "\u0130ptal", -"Visual aids": "G\u00f6rsel ara\u00e7lar", -"Bold": "Kal\u0131n", -"Italic": "\u0130talik", -"Underline": "Alt\u0131 \u00e7izili", -"Strikethrough": "\u00dcst\u00fc \u00e7izgili", -"Superscript": "\u00dcst simge", -"Subscript": "Alt simge", -"Clear formatting": "Bi\u00e7imi temizle", -"Align left": "Sola hizala", -"Align center": "Ortala", -"Align right": "Sa\u011fa hizala", -"Justify": "\u0130ki yana yasla", -"Bullet list": "S\u0131ras\u0131z liste", -"Numbered list": "S\u0131ral\u0131 liste", -"Decrease indent": "Girintiyi azalt", -"Increase indent": "Girintiyi art\u0131r", -"Close": "Kapat", -"Formats": "Bi\u00e7imler", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Taray\u0131c\u0131n\u0131z panoya direk eri\u015fimi desteklemiyor. L\u00fctfen Ctrl+X\/C\/V klavye k\u0131sayollar\u0131n\u0131 kullan\u0131n.", -"Headers": "Ba\u015fl\u0131klar", -"Header 1": "Ba\u015fl\u0131k 1", -"Header 2": "Ba\u015fl\u0131k 2", -"Header 3": "Ba\u015fl\u0131k 3", -"Header 4": "Ba\u015fl\u0131k 4", -"Header 5": "Ba\u015fl\u0131k 5", -"Header 6": "Ba\u015fl\u0131k 6", -"Headings": "Ba\u015fl\u0131klar", -"Heading 1": "Ba\u015fl\u0131k 1", -"Heading 2": "Ba\u015fl\u0131k 2", -"Heading 3": "Ba\u015fl\u0131k 3", -"Heading 4": "Ba\u015fl\u0131k 4", -"Heading 5": "Ba\u015fl\u0131k 5", -"Heading 6": "Ba\u015fl\u0131k 6", -"Preformatted": "\u00d6nceden bi\u00e7imlendirilmi\u015f", -"Div": "Div", -"Pre": "Pre", -"Code": "Kod", -"Paragraph": "Paragraf", -"Blockquote": "Blockquote", -"Inline": "Sat\u0131r i\u00e7i", -"Blocks": "Bloklar", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "D\u00fcz metin modunda yap\u0131\u015ft\u0131r. Bu se\u00e7ene\u011fi kapatana kadar i\u00e7erikler d\u00fcz metin olarak yap\u0131\u015ft\u0131r\u0131l\u0131r.", -"Fonts": "Yaz\u0131 Tipleri", -"Font Sizes": "Yaz\u0131tipi B\u00fcy\u00fckl\u00fc\u011f\u00fc", -"Class": "S\u0131n\u0131f", -"Browse for an image": "Bir resim aray\u0131n", -"OR": "ya da", -"Drop an image here": "Buraya bir resim koyun", -"Upload": "Y\u00fckle", -"Block": "Blok", -"Align": "Hizala", -"Default": "Varsay\u0131lan", -"Circle": "Daire", -"Disc": "Disk", -"Square": "Kare", -"Lower Alpha": "K\u00fc\u00e7\u00fck ABC", -"Lower Greek": "K\u00fc\u00e7\u00fck Yunan alfabesi", -"Lower Roman": "K\u00fc\u00e7\u00fck Roman alfabesi", -"Upper Alpha": "B\u00fcy\u00fck ABC", -"Upper Roman": "B\u00fcy\u00fck Roman alfabesi", -"Anchor...": "\u00c7apa...", -"Name": "\u0130sim", -"Id": "Id", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id bir harf ile ba\u015flamal\u0131d\u0131r ve sadece harfleri, rakamlar\u0131, \u00e7izgileri, noktalar\u0131, virg\u00fclleri veya alt \u00e7izgileri i\u00e7ermelidir.", -"You have unsaved changes are you sure you want to navigate away?": "Kaydedilmemi\u015f de\u011fi\u015fiklikler var, sayfadan ayr\u0131lmak istedi\u011finize emin misiniz?", -"Restore last draft": "Son tasla\u011f\u0131 kurtar", -"Special characters...": "\u00d6zel karakterler...", -"Source code": "Kaynak kodu", -"Insert\/Edit code sample": "Kod \u00f6rne\u011fini Kaydet\/D\u00fczenle", -"Language": "Dil", -"Code sample...": "Kod \u00f6rne\u011fi...", -"Color Picker": "Renk Se\u00e7ici", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "Soldan sa\u011fa", -"Right to left": "Sa\u011fdan sola", -"Emoticons...": "\u0130fadeler...", -"Metadata and Document Properties": "\u00d6nbilgi ve Belge \u00d6zellikleri", -"Title": "Ba\u015fl\u0131k", -"Keywords": "Anahtar kelimeler", -"Description": "A\u00e7\u0131klama", -"Robots": "Robotlar", -"Author": "Yazar", -"Encoding": "Kodlama", -"Fullscreen": "Tam ekran", -"Action": "Eylem", -"Shortcut": "K\u0131sayol", -"Help": "Yard\u0131m", -"Address": "Adres", -"Focus to menubar": "Men\u00fc \u00e7ubu\u011funa odaklan.", -"Focus to toolbar": "Ara\u00e7 \u00e7ubu\u011funa odaklan.", -"Focus to element path": "Eleman yoluna odaklan", -"Focus to contextual toolbar": "Ba\u011flamsal ara\u00e7 \u00e7ubu\u011funa odaklan", -"Insert link (if link plugin activated)": "Link ekle (Link eklentisi aktif ise)", -"Save (if save plugin activated)": "Kaydet (Kay\u0131t eklentisi aktif ise)", -"Find (if searchreplace plugin activated)": "Bul (SearchReplace eklentisi aktif ise)", -"Plugins installed ({0}):": "Y\u00fckl\u00fc eklenti say\u0131s\u0131 : ({0}):", -"Premium plugins:": "Premium eklentileri", -"Learn more...": "Daha fazla bilgi edinin.", -"You are using {0}": "{0} kullan\u0131yorsun.", -"Plugins": "Eklentiler", -"Handy Shortcuts": "Kullan\u0131\u015fl\u0131 K\u0131sayollar", -"Horizontal line": "Yatay \u00e7izgi", -"Insert\/edit image": "Resim ekle\/d\u00fczenle", -"Image description": "Resim a\u00e7\u0131klamas\u0131", -"Source": "Kaynak", -"Dimensions": "Boyutlar", -"Constrain proportions": "En - Boy oran\u0131n\u0131 koru", -"General": "Genel", -"Advanced": "Geli\u015fmi\u015f", -"Style": "Stil", -"Vertical space": "Dikey bo\u015fluk", -"Horizontal space": "Yatay bo\u015fluk", -"Border": "\u00c7er\u00e7eve", -"Insert image": "Resim ekle", -"Image...": "Resim...", -"Image list": "Resim listesi", -"Rotate counterclockwise": "Saat y\u00f6n\u00fcn\u00fcn tersine d\u00f6nd\u00fcr", -"Rotate clockwise": "Saat y\u00f6n\u00fcnde d\u00f6nd\u00fcr", -"Flip vertically": "Dikey \u00e7evir", -"Flip horizontally": "Yatay \u00e7evir", -"Edit image": "G\u00f6r\u00fcnt\u00fcy\u00fc d\u00fczenle", -"Image options": "G\u00f6r\u00fcnt\u00fc se\u00e7enekleri", -"Zoom in": "Yak\u0131nla\u015ft\u0131r", -"Zoom out": "Uzakla\u015ft\u0131r", -"Crop": "Kes", -"Resize": "Yeniden Boyutland\u0131r", -"Orientation": "Y\u00f6n\u00fcn\u00fc Belirle", -"Brightness": "Parlakl\u0131k", -"Sharpen": "Keskinle\u015ftir", -"Contrast": "Kontrast", -"Color levels": "Renk seviyesi", -"Gamma": "Gama", -"Invert": "Tersine \u00e7evir", -"Apply": "Uygula", -"Back": "Geri", -"Insert date\/time": "Tarih \/ Zaman ekle", -"Date\/time": "Tarih\/zaman", -"Insert\/Edit Link": "Ba\u011flant\u0131 Ekle\/D\u00fczenle", -"Insert\/edit link": "Ba\u011flant\u0131 ekle\/d\u00fczenle", -"Text to display": "G\u00f6r\u00fcnen yaz\u0131", -"Url": "Url", -"Open link in...": "Ba\u011flant\u0131y\u0131 a\u00e7...", -"Current window": "Mevcut pencere", -"None": "Hi\u00e7biri", -"New window": "Yeni pencere", -"Remove link": "Ba\u011flant\u0131y\u0131 kald\u0131r", -"Anchors": "\u00c7apalar", -"Link...": "Ba\u011flant\u0131...", -"Paste or type a link": "Bir ba\u011flant\u0131 yap\u0131\u015ft\u0131r\u0131n yada yaz\u0131n.", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Girdi\u011finiz URL bir eposta adresi gibi g\u00f6z\u00fck\u00fcyor. Gerekli olan mailto: \u00f6nekini eklemek ister misiniz?", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Girdi\u011finiz URL bir d\u0131\u015f ba\u011flant\u0131 gibi g\u00f6z\u00fck\u00fcyor. Gerekli olan http:\/\/ \u00f6nekini eklemek ister misiniz?", -"Link list": "Link listesi", -"Insert video": "Video ekle", -"Insert\/edit video": "Video ekle\/d\u00fczenle", -"Insert\/edit media": "Medya ekle\/d\u00fczenle", -"Alternative source": "Alternatif kaynak", -"Alternative source URL": "Alternatif kaynak URL", -"Media poster (Image URL)": "Medya posteri (Resim URL)", -"Paste your embed code below:": "Medya g\u00f6mme kodunu buraya yap\u0131\u015ft\u0131r:", -"Embed": "G\u00f6mme", -"Media...": "Medya...", -"Nonbreaking space": "B\u00f6l\u00fcnemez bo\u015fluk", -"Page break": "Sayfa sonu", -"Paste as text": "Metin olarak yap\u0131\u015ft\u0131r", -"Preview": "\u00d6nizleme", -"Print...": "Yazd\u0131r...", -"Save": "Kaydet", -"Find": "Bul", -"Replace with": "Bununla de\u011fi\u015ftir", -"Replace": "De\u011fi\u015ftir", -"Replace all": "T\u00fcm\u00fcn\u00fc de\u011fi\u015ftir", -"Previous": "Geri", -"Next": "Sonraki", -"Find and replace...": "Bul ve de\u011fi\u015ftir...", -"Could not find the specified string.": "Herhangi bir sonu\u00e7 bulunamad\u0131.", -"Match case": "B\u00fcy\u00fck \/ K\u00fc\u00e7\u00fck harfe duyarl\u0131", -"Find whole words only": "Sadece t\u00fcm kelimeyi ara", -"Spell check": "Yaz\u0131m denetimi", -"Ignore": "Yoksay", -"Ignore all": "T\u00fcm\u00fcn\u00fc yoksay", -"Finish": "Bitir", -"Add to Dictionary": "S\u00f6zl\u00fc\u011fe ekle", -"Insert table": "Tablo ekle", -"Table properties": "Tablo \u00f6zellikleri", -"Delete table": "Tabloyu sil", -"Cell": "H\u00fccre", -"Row": "Sat\u0131r", -"Column": "S\u00fctun", -"Cell properties": "H\u00fccre \u00f6zellikleri", -"Merge cells": "H\u00fccreleri birle\u015ftir", -"Split cell": "H\u00fccreleri ay\u0131r", -"Insert row before": "\u00d6ncesine yeni sat\u0131r ekle", -"Insert row after": "Sonras\u0131na yeni sat\u0131r ekle", -"Delete row": "Sat\u0131r\u0131 sil", -"Row properties": "Sat\u0131r \u00f6zellikleri", -"Cut row": "Sat\u0131r\u0131 kes", -"Copy row": "Sat\u0131r\u0131 kopyala", -"Paste row before": "\u00d6ncesine sat\u0131r yap\u0131\u015ft\u0131r", -"Paste row after": "Sonras\u0131na sat\u0131r yap\u0131\u015ft\u0131r", -"Insert column before": "\u00d6ncesine yeni s\u00fctun ekle", -"Insert column after": "Sonras\u0131na yeni s\u00fctun ekle", -"Delete column": "S\u00fctunu sil", -"Cols": "S\u00fctunlar", -"Rows": "Sat\u0131rlar", -"Width": "Geni\u015flik", -"Height": "Y\u00fckseklik", -"Cell spacing": "H\u00fccre aral\u0131\u011f\u0131", -"Cell padding": "H\u00fccre i\u00e7 bo\u015flu\u011fu", -"Show caption": "Ba\u015fl\u0131\u011f\u0131 g\u00f6ster", -"Left": "Sol", -"Center": "Orta", -"Right": "Sa\u011f", -"Cell type": "H\u00fccre tipi", -"Scope": "Kapsam", -"Alignment": "Hizalama", -"H Align": "Yatay Hizalama", -"V Align": "Dikey Hizalama", -"Top": "\u00dcst", -"Middle": "Orta", -"Bottom": "Alt", -"Header cell": "Ba\u015fl\u0131k h\u00fccresi", -"Row group": "Sat\u0131r grubu", -"Column group": "S\u00fctun grubu", -"Row type": "Sat\u0131r tipi", -"Header": "Ba\u015fl\u0131k", -"Body": "G\u00f6vde", -"Footer": "Alt", -"Border color": "Kenarl\u0131k Rengi", -"Insert template...": "\u015eablon ekle...", -"Templates": "\u015eablonlar", -"Template": "Tema", -"Text color": "Yaz\u0131 rengi", -"Background color": "Arkaplan rengi", -"Custom...": "\u00d6zel", -"Custom color": "\u00d6zel Renk", -"No color": "Renk Yok", -"Remove color": "Rengi kald\u0131r", -"Table of Contents": "\u0130\u00e7indekiler", -"Show blocks": "Bloklar\u0131 g\u00f6r\u00fcnt\u00fcle", -"Show invisible characters": "G\u00f6r\u00fcnmez karakterleri g\u00f6ster", -"Word count": "Kelime say\u0131s\u0131", -"Words: {0}": "Kelime: {0}", -"{0} words": "{0} kelime", -"File": "Dosya", -"Edit": "D\u00fczenle", -"Insert": "Ekle", -"View": "G\u00f6r\u00fcnt\u00fcle", -"Format": "Bi\u00e7im", -"Table": "Tablo", -"Tools": "Ara\u00e7lar", -"Powered by {0}": "{0} taraf\u0131ndan yap\u0131lm\u0131\u015ft\u0131r ", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zengin Metin Alan\u0131. Men\u00fc i\u00e7in ALT-F9 k\u0131sayolunu kullan\u0131n. Ara\u00e7 \u00e7ubu\u011fu i\u00e7in ALT-F10 k\u0131sayolunu kullan\u0131n. Yard\u0131m i\u00e7in ALT-0 k\u0131sayolunu kullan\u0131n.", -"Image title": "Resim ba\u015fl\u0131\u011f\u0131", -"Border width": "Kenar geni\u015fli\u011fi", -"Border style": "Kenar sitili", -"Error": "Hata", -"Warn": "Uyar\u0131", -"Valid": "Ge\u00e7erli", -"To open the popup, press Shift+Enter": "Popup'\u0131 a\u00e7mak i\u00e7in Shift+Enter'a bas\u0131n", -"Rich Text Area. Press ALT-0 for help.": "Zengin Metin Alan\u0131. Yard\u0131m i\u00e7in Alt-0'a bas\u0131n.", -"System Font": "Sistem Yaz\u0131 Tipi", -"Failed to upload image: {0}": "Resim y\u00fcklenemedi: {0}", -"Failed to load plugin: {0} from url {1}": "Eklenti y\u00fcklenemedi: {1} url\u2019sinden {0} ", -"Failed to load plugin url: {0}": "Url eklentisi y\u00fcklenemedi: {0}", -"Failed to initialize plugin: {0}": "Eklenti ba\u015flat\u0131lamad\u0131: {0}", -"example": "\u00f6rnek", -"Search": "Ara", -"All": "T\u00fcm\u00fc", -"Currency": "Para birimi", -"Text": "Metin", -"Quotations": "Al\u0131nt\u0131", -"Mathematical": "Matematik", -"Extended Latin": "Uzat\u0131lm\u0131\u015f Latin", -"Symbols": "Semboller", -"Arrows": "Oklar", -"User Defined": "Kullan\u0131c\u0131 Tan\u0131ml\u0131", -"dollar sign": "dolar i\u015fareti", -"currency sign": "para birimi i\u015fareti", -"euro-currency sign": "euro para birimi i\u015fareti", -"colon sign": "colon i\u015fareti", -"cruzeiro sign": "cruzeiro i\u015fareti", -"french franc sign": "frans\u0131z frang\u0131 i\u015fareti", -"lira sign": "lira i\u015fareti", -"mill sign": "mill i\u015fareti", -"naira sign": "naira i\u015fareti", -"peseta sign": "peseta i\u015fareti", -"rupee sign": "rupi i\u015fareti", -"won sign": "won i\u015fareti", -"new sheqel sign": "yeni \u015fekel i\u015fareti", -"dong sign": "dong i\u015fareti", -"kip sign": "kip i\u015fareti", -"tugrik sign": "tugrik i\u015fareti", -"drachma sign": "drahma i\u015fareti", -"german penny symbol": "alman kuru\u015f sembol\u00fc", -"peso sign": "peso i\u015fareti", -"guarani sign": "guarani i\u015fareti", -"austral sign": "austral i\u015fareti", -"hryvnia sign": "hrivniya i\u015fareti", -"cedi sign": "cedi i\u015fareti", -"livre tournois sign": "livre tournois i\u015fareti", -"spesmilo sign": "spesmilo i\u015fareti", -"tenge sign": "tenge i\u015fareti", -"indian rupee sign": "hindistan rupisi i\u015fareti", -"turkish lira sign": "t\u00fcrk liras\u0131 i\u015fareti", -"nordic mark sign": "nordic i\u015fareti", -"manat sign": "manat i\u015fareti", -"ruble sign": "ruble i\u015fareti", -"yen character": "yen karakteri", -"yuan character": "yuan karakteri", -"yuan character, in hong kong and taiwan": "yuan karakteri, hong kong ve tayvan'da kullan\u0131lan", -"yen\/yuan character variant one": "yen\/yuan karakter de\u011fi\u015fkeni", -"Loading emoticons...": "\u0130fadeler y\u00fckleniyor...", -"Could not load emoticons": "\u0130fadeler y\u00fcklenemedi", -"People": "\u0130nsan", -"Animals and Nature": "Hayvanlar ve Do\u011fa", -"Food and Drink": "Yiyecek ve \u0130\u00e7ecek", -"Activity": "Etkinlik", -"Travel and Places": "Gezi ve Yerler", -"Objects": "Nesneler", -"Flags": "Bayraklar", -"Characters": "Karakter", -"Characters (no spaces)": "Karakter (bo\u015fluksuz)", -"Error: Form submit field collision.": "Hata: Form g\u00f6nderme alan\u0131 \u00e7at\u0131\u015fmas\u0131.", -"Error: No form element found.": "Hata: Form eleman\u0131 bulunamad\u0131.", -"Update": "G\u00fcncelle\u015ftir", -"Color swatch": "Renk \u00f6rne\u011fi", -"Turquoise": "Turkuaz", -"Green": "Ye\u015fil", -"Blue": "Mavi", -"Purple": "Mor", -"Navy Blue": "Lacivert", -"Dark Turquoise": "Koyu Turkuaz", -"Dark Green": "Koyu Ye\u015fil", -"Medium Blue": "Donuk Mavi", -"Medium Purple": "Orta Mor", -"Midnight Blue": "Gece Yar\u0131s\u0131 Mavisi", -"Yellow": "Sar\u0131", -"Orange": "Turuncu", -"Red": "K\u0131rm\u0131z\u0131", -"Light Gray": "A\u00e7\u0131k Gri", -"Gray": "Gri", -"Dark Yellow": "Koyu Sar\u0131", -"Dark Orange": "Koyu Turuncu", -"Dark Red": "Koyu K\u0131rm\u0131z\u0131", -"Medium Gray": "Orta Gri", -"Dark Gray": "Koyu Gri", -"Black": "Siyah", -"White": "Beyaz", -"Switch to or from fullscreen mode": "Tam ekran moduna ge\u00e7 veya \u00e7\u0131k", -"Open help dialog": "Yard\u0131m penceresini a\u00e7", -"history": "ge\u00e7mi\u015f", -"styles": "stiller", -"formatting": "bi\u00e7imlendirme", -"alignment": "hizalanma", -"indentation": "girinti", -"permanent pen": "kal\u0131c\u0131 kalem", -"comments": "yorumlar", -"Anchor": "\u00c7apa", -"Special character": "\u00d6zel karakter", -"Code sample": "Kod \u00f6rne\u011fi", -"Color": "Renk", -"Emoticons": "G\u00fcl\u00fcc\u00fckler", -"Document properties": "Dok\u00fcman \u00f6zellikleri", -"Image": "Resim", -"Insert link": "Ba\u011flant\u0131 ekle", -"Target": "Hedef", -"Link": "Ba\u011flant\u0131", -"Poster": "Poster", -"Media": "Medya", -"Print": "Yazd\u0131r", -"Prev": "\u00d6nceki", -"Find and replace": "Bul ve de\u011fi\u015ftir", -"Whole words": "Tam s\u00f6zc\u00fckler", -"Spellcheck": "Yaz\u0131m denetimi", -"Caption": "Ba\u015fl\u0131k", -"Insert template": "\u015eablon ekle" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/ug.js b/cps/static/js/libs/tinymce/langs/ug.js new file mode 100644 index 000000000..972f3ed3d --- /dev/null +++ b/cps/static/js/libs/tinymce/langs/ug.js @@ -0,0 +1,462 @@ +tinymce.addI18n('ug',{ +"Redo": "\u0642\u0627\u064a\u062a\u0627 \u0642\u0649\u0644\u0649\u0634", +"Undo": "\u0626\u0627\u0631\u0642\u0649\u063a\u0627 \u064a\u06d0\u0646\u0649\u0634", +"Cut": "\u0643\u06d0\u0633\u0649\u0634", +"Copy": "\u0643\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Paste": "\u0686\u0627\u067e\u0644\u0627\u0634", +"Select all": "\u06be\u06d5\u0645\u0645\u0649\u0646\u0649 \u062a\u0627\u0644\u0644\u0627\u0634", +"New document": "\u064a\u06d0\u06ad\u0649 \u067e\u06c8\u062a\u06c8\u0643", +"Ok": "\u062c\u06d5\u0632\u0649\u0645\u0644\u06d5\u0634", +"Cancel": "\u0642\u0627\u0644\u062f\u06c7\u0631\u06c7\u0634", +"Visual aids": "\u0626\u06d5\u0633\u0643\u06d5\u0631\u062a\u0649\u0634", +"Bold": "\u062a\u0648\u0645", +"Italic": "\u064a\u0627\u0646\u062a\u06c7", +"Underline": "\u0626\u0627\u0633\u062a\u0649 \u0633\u0649\u0632\u0649\u0642", +"Strikethrough": "\u0626\u06c6\u0686\u06c8\u0631\u06c8\u0634 \u0633\u0649\u0632\u0649\u0642\u0649", +"Superscript": "\u0626\u06c8\u0633\u062a\u06c8\u0646\u0643\u0649 \u0628\u06d5\u0644\u06af\u06d5", +"Subscript": "\u0626\u0627\u0633\u062a\u0649\u0646\u0642\u0649 \u0628\u06d5\u0644\u06af\u06d5", +"Clear formatting": "\u0641\u0648\u0631\u0645\u0627\u062a\u0646\u0649 \u062a\u0627\u0632\u0644\u0627\u0634", +"Align left": "\u0633\u0648\u0644\u063a\u0627 \u062a\u0648\u063a\u0631\u0649\u0644\u0627\u0634", +"Align center": "\u0645\u06d5\u0631\u0643\u06d5\u0632\u06af\u06d5 \u062a\u0648\u063a\u06c7\u0631\u0644\u0627\u0634", +"Align right": "\u0626\u0648\u06ad\u063a\u0627 \u062a\u0648\u063a\u06c7\u0631\u0644\u0627\u0634", +"Justify": "\u0626\u0649\u0643\u0643\u0649 \u064a\u0627\u0646\u063a\u0627 \u062a\u0648\u063a\u06c7\u0631\u0644\u0627\u0634", +"Bullet list": "\u0628\u06d5\u0644\u06af\u06d5 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643", +"Numbered list": "\u0633\u0627\u0646\u0644\u0649\u0642 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643", +"Decrease indent": "\u0626\u0627\u0644\u062f\u0649\u063a\u0627 \u0633\u06c8\u0631\u06c8\u0634", +"Increase indent": "\u0643\u06d5\u064a\u0646\u0649\u06af\u06d5 \u0633\u06c8\u0631\u06c8\u0634", +"Close": "\u062a\u0627\u0642\u0627\u0634", +"Formats": "\u0641\u0648\u0631\u0645\u0627\u062a", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0633\u0649\u0632\u0646\u0649\u06ad \u062a\u0648\u0631 \u0643\u06c6\u0631\u06af\u06c8\u0686\u0649\u06ad\u0649\u0632 \u0642\u0649\u064a\u0649\u067e \u0686\u0627\u067e\u0644\u0627\u0634 \u062a\u0627\u062e\u062a\u0649\u0633\u0649 \u0632\u0649\u064a\u0627\u0631\u06d5\u062a \u0642\u0649\u0644\u0649\u0634\u0646\u0649 \u0642\u0648\u0644\u0644\u0649\u0645\u0627\u064a\u062f\u06c7. Ctrl+X\/C\/V \u062a\u06d0\u0632\u0644\u06d5\u062a\u0645\u06d5 \u0643\u06c7\u0646\u06c7\u067e\u0643\u0649\u0633\u0649 \u0626\u0627\u0631\u0642\u0649\u0644\u0649\u0642 \u0643\u06d0\u0633\u0649\u067e \u0686\u0627\u067e\u0644\u0627\u0634 \u0645\u06d5\u0634\u063a\u06c7\u0644\u0627\u062a\u0649 \u0642\u0649\u0644\u0649\u06ad.", +"Headers": "\u0628\u06d0\u0634\u0649", +"Header 1": "\u062a\u06d0\u0645\u0627 1", +"Header 2": "\u062a\u06d0\u0645\u0627 2", +"Header 3": "\u062a\u06d0\u0645\u0627 3", +"Header 4": "\u062a\u06d0\u0645\u0627 4", +"Header 5": "\u062a\u06d0\u0645\u0627 5", +"Header 6": "\u062a\u06d0\u0645\u0627 6", +"Headings": "\u0645\u0627\u06cb\u0632\u06c7", +"Heading 1": "1 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Heading 2": "2 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Heading 3": "3 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Heading 4": "4 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Heading 5": "5 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Heading 6": "6 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0645\u0627\u06cb\u0632\u06c7", +"Preformatted": "\u0626\u0627\u0644\u062f\u0649\u0646 \u0641\u0648\u0631\u0645\u0627\u062a\u0644\u0627\u0646\u063a\u0627\u0646", +"Div": "Div", +"Pre": "Pre", +"Code": "\u0643\u0648\u062f", +"Paragraph": "\u067e\u0627\u0631\u0627\u06af\u0649\u0631\u0627 \u0641", +"Blockquote": "\u0626\u06d5\u0633\u0643\u06d5\u0631\u062a\u0649\u0634", +"Inline": "\u0626\u0649\u0686\u0643\u0649", +"Blocks": "\u0631\u0627\u064a\u0648\u0646", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u06be\u0627\u0632\u0649\u0631 \u0686\u0627\u067e\u0644\u0649\u0633\u0649\u06ad\u0649\u0632 \u0633\u0627\u067e \u062a\u06d0\u0643\u0649\u0634 \u0645\u06d5\u0632\u0645\u06c7\u0646\u0649 \u0686\u0627\u067e\u0644\u0649\u0646\u0649\u062f\u06c7. \u062a\u06d0\u0643\u0649\u0634 \u0634\u06d5\u0643\u0644\u0649\u062f\u06d5 \u0686\u0627\u067e\u0644\u0627\u0634 \u062a\u06d5\u06ad\u0634\u0649\u0643\u0649\u0646\u0649 \u062a\u0627\u0642\u0649\u06cb\u06d5\u062a\u0643\u06d5\u0646\u06af\u06d5 \u0642\u06d5\u062f\u06d5\u0631.", +"Fonts": "\u062e\u06d5\u062a \u0646\u06c7\u0633\u062e\u0649\u0644\u0649\u0631\u0649", +"Font Sizes": "\u062e\u06d5\u062a \u0686\u0648\u06ad\u0644\u06c7\u0642\u0649", +"Class": "\u062a\u06c8\u0631", +"Browse for an image": "\u0631\u06d5\u0633\u0649\u0645\u0646\u0649 \u0643\u06c6\u0631\u0633\u0649\u062a\u0649\u0634", +"OR": "\u064a\u0627\u0643\u0649", +"Drop an image here": "\u0628\u06c7 \u064a\u06d5\u0631\u062f\u0649\u0643\u0649 \u0631\u06d5\u0633\u0649\u0645\u0646\u0649 \u0626\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Upload": "\u0686\u0649\u0642\u0649\u0631\u0649\u0634", +"Block": "\u067e\u0627\u0631\u0686\u06d5", +"Align": "\u062a\u0648\u063a\u0631\u0649\u0644\u0649\u0646\u0649\u0634\u0649", +"Default": "\u0633\u06c8\u0643\u06c8\u062a", +"Circle": "\u0686\u06d5\u0645\u0628\u06d5\u0631", +"Disc": "\u062f\u06d0\u0633\u0643\u0627", +"Square": "\u0643\u06cb\u0627\u062f\u0631\u0627\u062a", +"Lower Alpha": "\u0626\u0649\u0646\u06af\u0649\u0644\u0649\u0632\u0686\u06d5 \u0643\u0649\u0686\u0649\u0643 \u064a\u06d0\u0632\u0649\u0644\u0649\u0634\u0649", +"Lower Greek": "\u06af\u0631\u06d0\u062a\u0633\u0649\u064a\u0649\u0686\u06d5 \u0643\u0649\u0686\u0649\u0643 \u064a\u06d0\u0632\u0649\u0644\u0649\u0634\u0649", +"Lower Roman": "\u0631\u0649\u0645\u0686\u06d5 \u0643\u0649\u0686\u0649\u0643 \u064a\u06d0\u0632\u0649\u0644\u0649\u0634\u0649", +"Upper Alpha": "\u0626\u0649\u0646\u06af\u0649\u0644\u0649\u0632\u0686\u06d5 \u0686\u0648\u06ad \u064a\u06d0\u0632\u0649\u0644\u0649\u0634\u0649", +"Upper Roman": "\u0631\u0649\u0645\u0686\u06d5 \u0686\u0648\u06ad \u064a\u06d0\u0632\u0649\u0644\u0649\u0634\u0649", +"Anchor...": "\u0644\u06d5\u06ad\u06af\u06d5\u0631...", +"Name": "\u0646\u0627\u0645\u0649", +"Id": "Id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "ID \u0686\u0648\u0642\u06c7\u0645 \u06be\u06d5\u0631\u0649\u067e \u0628\u0649\u0644\u06d5\u0646 \u0628\u0627\u0634\u0644\u0649\u0646\u0649\u0634\u0649 \u0643\u06d0\u0631\u06d5\u0643 \u060c \u0626\u0627\u0631\u0642\u0649\u0633\u0649 \u067e\u06d5\u0642\u06d5\u062a \u06be\u06d5\u0631\u0649\u067e \u060c \u0633\u0627\u0646 \u060c \u0626\u0627\u064a\u0631\u0649\u0634 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649 \u060c \u0686\u0649\u0643\u0649\u062a \u06cb\u06d5 \u0626\u0627\u0633\u062a\u0649 \u0633\u0649\u0632\u0649\u0642\u0649 \u062f\u0649\u0646 \u0626\u0649\u0628\u0627\u0631\u06d5\u062a .", +"You have unsaved changes are you sure you want to navigate away?": "\u0633\u0649\u0632 \u062a\u06d0\u062e\u0649 \u0645\u06d5\u0632\u0645\u06c7\u0646\u0646\u0649 \u0633\u0627\u0642\u0644\u0649\u0645\u0649\u062f\u0649\u06ad\u0649\u0632\u060c \u0626\u0627\u064a\u0631\u0649\u0644\u0627\u0645\u0633\u0649\u0632\u061f", +"Restore last draft": "\u0626\u0627\u062e\u0649\u0631\u0642\u0649 \u0643\u06c7\u067e\u0649\u064a\u0649\u06af\u06d5 \u0642\u0627\u064a\u062a\u0649\u0634", +"Special character...": "\u0626\u0627\u0644\u0627\u06be\u0649\u062f\u06d5 \u06be\u06d5\u0631\u067e-\u0628\u06d5\u0644\u06af\u0649\u0644\u06d5\u0631...", +"Source code": "\u0626\u06d5\u0633\u0644\u0649 \u0643\u0648\u062f\u0649", +"Insert\/Edit code sample": "\u0643\u0648\u062f \u0645\u0649\u0633\u0627\u0644\u0649\\\u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Language": "\u062a\u0649\u0644", +"Code sample...": "\u0626\u06c8\u0644\u06af\u06d5 \u0643\u0648\u062f...", +"Color Picker": "\u0631\u06d5\u06ad \u062a\u0627\u0644\u0644\u0649\u063a\u06c7\u0686", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u0633\u0648\u0644\u062f\u0649\u0646 \u0626\u0648\u06ad\u063a\u0627 ", +"Right to left": "\u0626\u0648\u06ad\u062f\u0649\u0646 \u0633\u0648\u0644\u063a\u0627", +"Emoticons": "\u0686\u0649\u0631\u0627\u064a \u0626\u0649\u067e\u0627\u062f\u06d5", +"Emoticons...": "\u0686\u0649\u0631\u0627\u064a \u0626\u0649\u067e\u0627\u062f\u0649\u0644\u0649\u0631\u0649...", +"Metadata and Document Properties": "\u0645\u06d0\u062a\u0627\u0645\u06d5\u0644\u06c7\u0645\u0627\u062a \u06cb\u06d5 \u06be\u06c6\u062c\u062c\u06d5\u062a \u062e\u0627\u0633\u0644\u0649\u0642\u0644\u0649\u0631\u0649", +"Title": "\u062a\u06d0\u0645\u0627", +"Keywords": "\u06be\u0627\u0644\u0642\u0649\u0644\u0649\u0642 \u0633\u06c6\u0632", +"Description": "\u062a\u06d5\u0633\u0649\u06cb\u0649\u0631", +"Robots": "\u0645\u0627\u0634\u0649\u0646\u0627 \u0626\u0627\u062f\u06d5\u0645", +"Author": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627", +"Encoding": "\u0643\u0648\u062f\u0644\u0627\u0634", +"Fullscreen": "\u067e\u06c8\u062a\u06c8\u0646 \u0626\u06d0\u0643\u0631\u0627\u0646", +"Action": "\u06be\u06d5\u0631\u0649\u0643\u06d5\u062a", +"Shortcut": "\u0642\u0649\u0633\u0642\u0627 \u064a\u0648\u0644", +"Help": "\u064a\u0627\u0631\u062f\u06d5\u0645", +"Address": "\u0626\u0627\u062f\u0649\u0631\u0649\u0633", +"Focus to menubar": "\u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643 \u0633\u0649\u062a\u0648\u0646\u0649\u063a\u0627 \u062f\u0649\u0642\u06d5\u062a", +"Focus to toolbar": "\u0642\u06c7\u0631\u0627\u0644 \u0633\u0649\u062a\u0648\u0646\u0649\u063a\u0627 \u062f\u0649\u0642\u06d5\u062a", +"Focus to element path": "\u0626\u06d0\u0644\u0649\u0645\u0649\u0646\u062a\u0644\u0627\u0631 \u064a\u0648\u0644\u0649\u063a\u0627 \u062f\u0649\u0642\u06d5\u062a", +"Focus to contextual toolbar": "\u0643\u0648\u0646\u062a\u06d0\u0643\u0649\u0633\u062a \u0642\u0648\u0631\u0627\u0644 \u0626\u0649\u0633\u062a\u0648\u0646\u0649\u063a\u0627 \u062f\u06d0\u0642\u06d5\u062a", +"Insert link (if link plugin activated)": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u06ad (\u0626\u06c7\u0644\u0627\u0646\u0645\u0627 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634 \u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0633\u0649\u0646\u0649 \u0642\u0648\u0632\u063a\u0627\u062a\u0642\u0627\u0646 \u0626\u06d5\u06be\u06cb\u0627\u0644\u062f\u0627)", +"Save (if save plugin activated)": "\u0633\u0627\u0642\u0644\u0627\u0634 (\u0633\u0627\u0642\u0644\u0627\u0634 \u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0633\u0649\u0646\u0649 \u0642\u0648\u0632\u063a\u0627\u062a\u0642\u0627\u0646 \u0626\u06d5\u06be\u06cb\u0627\u0644\u062f\u0627)", +"Find (if searchreplace plugin activated)": "\u0626\u0649\u0632\u062f\u06d5\u0634 (\u0626\u0649\u0632\u062f\u06d5\u0634 \u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0633\u0649 \u0642\u0648\u0632\u063a\u0649\u062a\u0649\u0644\u063a\u0627\u0646 \u0626\u06d5\u06be\u06cb\u0627\u0644\u062f\u0627)", +"Plugins installed ({0}):": "\u0642\u0627\u0686\u0649\u0644\u0627\u0646\u063a\u0627\u0646 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0644\u0645\u0627 ({0}):", +"Premium plugins:": "\u064a\u06c7\u0642\u0649\u0631\u0649 \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0643 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0644\u0645\u0627 :", +"Learn more...": "\u062a\u06d0\u062e\u0649\u0645\u06c7 \u0686\u06c8\u0634\u0649\u0646\u0649\u0634 ...", +"You are using {0}": "\u0626\u0649\u0634\u0644\u0649\u062a\u0649\u06cb\u0627\u062a\u0642\u0649\u0646\u0649\u06ad\u0649\u0632 {0}", +"Plugins": "\u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0644\u0645\u0627", +"Handy Shortcuts": "\u0642\u0648\u0644\u0627\u064a\u0644\u0649\u0642 \u0642\u0649\u0633\u0642\u0627 \u064a\u0648\u0644", +"Horizontal line": "\u06af\u0648\u0631\u0632\u0649\u0646\u062a\u0627\u0644 \u0642\u06c7\u0631", +"Insert\/edit image": "\u0631\u06d5\u0633\u0649\u0645 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634 \u064a\u0627\u0643\u0649 \u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Alternative description": "\u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u0686\u06c8\u0634\u06d5\u0646\u062f\u06c8\u0631\u06c8\u0634\u0649", +"Accessibility": "\u064a\u0627\u0631\u062f\u06d5\u0645\u0686\u06d5 \u0626\u0649\u0642\u062a\u0649\u062f\u0627\u0631", +"Image is decorative": "\u0628\u06d0\u0632\u06d5\u0643 \u0631\u06d5\u0633\u0649\u0645", +"Source": "\u0645\u06d5\u0646\u0628\u06d5", +"Dimensions": "\u0686\u0648\u06ad-\u0643\u0649\u0686\u0649\u0643", +"Constrain proportions": "\u0626\u06d0\u06af\u0649\u0632\u0644\u0649\u0643-\u0643\u06d5\u06ad\u0644\u0649\u0643 \u0646\u0649\u0633\u067e\u0649\u062a\u0649\u0646\u0649 \u0633\u0627\u0642\u0644\u0627\u0634", +"General": "\u0626\u0627\u062f\u06d5\u062a\u062a\u0649\u0643\u0649", +"Advanced": "\u0626\u0627\u0644\u0627\u06be\u0649\u062f\u06d5", +"Style": "\u0626\u06c7\u0633\u0644\u06c7\u067e", +"Vertical space": "\u06cb\u06d0\u0631\u062a\u0649\u0643\u0627\u0644 \u0628\u0648\u0634\u0644\u06c7\u0642", +"Horizontal space": "\u06af\u0648\u0631\u0632\u0649\u0646\u062a\u0627\u0644 \u0628\u0648\u0634\u0644\u06c7\u0642", +"Border": "\u064a\u0627\u0642\u0627", +"Insert image": "\u0631\u06d5\u0633\u0649\u0645 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Image...": "\u0631\u06d5\u0633\u0649\u0645...", +"Image list": "\u0631\u06d5\u0633\u0649\u0645 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643\u0649", +"Rotate counterclockwise": "\u200f\u200f\u0633\u0627\u0626\u06d5\u062a\u0643\u06d5 \u0642\u0627\u0631\u0634\u0649 \u0686\u06c6\u0631\u06c8\u0634", +"Rotate clockwise": "\u200f\u200f\u0633\u0627\u0626\u06d5\u062a \u064a\u06c6\u0646\u0649\u0644\u0649\u0634\u0649\u062f\u06d5 \u0686\u06c6\u0631\u06c8\u0634", +"Flip vertically": "\u06cb\u06d0\u0631\u062a\u0649\u0643\u0627\u0644 \u0626\u06c6\u0631\u06c8\u0634", +"Flip horizontally": "\u06af\u0648\u0631\u0649\u0632\u0648\u0646\u062a\u0627\u0644 \u0626\u06c6\u0631\u06c8\u0634", +"Edit image": "\u0631\u06d5\u0633\u0649\u0645 \u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Image options": "\u0631\u06d5\u0633\u0649\u0645 \u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0649\u0644\u0649\u0631\u0649", +"Zoom in": "\u064a\u06d0\u0642\u0649\u0646\u0644\u0627\u062a\u0645\u0627\u0642", +"Zoom out": "\u064a\u0649\u0631\u0627\u0642\u0644\u0627\u062a\u0645\u0627\u0642", +"Crop": "\u0642\u0649\u064a\u0649\u0634", +"Resize": "\u0686\u0648\u06ad\u0644\u06c7\u0642\u0649\u0646\u0649 \u0626\u06c6\u0632\u06af\u06d5\u0631\u062a\u0649\u0634", +"Orientation": "\u064a\u06c6\u0646\u0649\u0644\u0649\u0634", +"Brightness": "\u064a\u0648\u0631\u06c7\u0642\u0644\u06c7\u0642\u0649", +"Sharpen": "\u0626\u06c6\u062a\u0643\u06c8\u0631\u0644\u06d5\u0634\u062a\u06c8\u0631\u06c8\u0634", +"Contrast": "\u0633\u06d0\u0644\u0649\u0634\u062a\u06c7\u0631\u0645\u0627", +"Color levels": "\u0631\u06d5\u06ad \u062f\u06d5\u0631\u0649\u062c\u0649\u0644\u0649\u0631\u0649", +"Gamma": "\u06af\u0627\u0645\u0645\u0627", +"Invert": "\u062a\u06d5\u062a\u06c8\u0631", +"Apply": "\u0642\u0648\u0644\u0644\u0649\u0646\u0649\u0634", +"Back": "\u0642\u0627\u064a\u062a\u0649\u0634", +"Insert date\/time": "\u0686\u0649\u0633\u0644\u0627\/\u06cb\u0627\u0642\u0649\u062a \u0643\u0649\u0631\u06af\u06c8\u0632\u06c8\u0634", +"Date\/time": "\u0686\u06d0\u0633\u0644\u0627\\\u06cb\u0627\u0642\u0649\u062a", +"Insert\/edit link": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634 \u0642\u06c7\u0633\u062a\u06c7\u0631\u06c7\u0634\/\u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Text to display": "\u0643\u06c6\u0631\u06c8\u0646\u0649\u062f\u0649\u063a\u0627\u0646 \u0645\u06d5\u0632\u0645\u06c7\u0646", +"Url": "\u0626\u0627\u062f\u0631\u0649\u0633", +"Open link in...": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627 \u0626\u06d0\u0686\u0649\u0634 \u0626\u0648\u0631\u0646\u0649...", +"Current window": "\u0646\u06c6\u06cb\u06d5\u062a\u062a\u0649\u0643\u0649 \u0643\u06c6\u0632\u0646\u06d5\u0643", +"None": "\u064a\u0648\u0642", +"New window": "\u064a\u06d0\u06ad\u0649 \u0643\u06c6\u0632\u0646\u06d5\u0643", +"Open link": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627 \u0626\u06d0\u0686\u0649\u0634", +"Remove link": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634 \u0626\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Anchors": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634", +"Link...": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627...", +"Paste or type a link": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634 \u0686\u0627\u067e\u0644\u0627\u06ad \u064a\u0627\u0643\u0649 \u0643\u0649\u0631\u06af\u06c8\u0632\u06c8\u06ad", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0633\u0649\u0632 \u0643\u0649\u0631\u06af\u06c8\u0632\u06af\u06d5\u0646 URL \u0628\u0649\u0631 \u0626\u06d0\u0644\u062e\u06d5\u062a \u0626\u0627\u062f\u0631\u06d0\u0633\u0649\u062f\u06d5\u0643 \u0642\u0649\u0644\u0649\u067e \u062a\u06c7\u0631\u0649\u062f\u06c7\u060c\u062a\u06d5\u0644\u06d5\u067e \u0642\u0649\u0644\u0649\u0646\u063a\u0627\u0646 mailto \u0646\u0649 \u0642\u06c7\u0634\u0627\u0645\u0633\u0649\u0632\u061f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0633\u0649\u0632 \u0643\u0649\u0631\u06af\u06c8\u0632\u06af\u06d5\u0646 \u062a\u0648\u0631 \u0626\u0627\u062f\u0631\u06d0\u0633\u0649 \u0633\u0649\u0631\u062a\u0642\u0649 \u0626\u06c7\u0644\u0627\u0646\u0645\u0649\u062f\u06d5\u0643 \u0642\u0649\u0644\u0649\u067e \u062a\u06c7\u0631\u0649\u062f\u06c7 \u060c\u062a\u06d5\u0644\u06d5\u067e \u0642\u0649\u0644\u0649\u0646\u063a\u0627\u0646 http:\/\/ \u0646\u0649 \u0642\u0648\u0634\u0627\u0645\u0633\u0649\u0632\u061f", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u0633\u0649\u0632 \u0643\u0649\u0631\u06af\u06c8\u0632\u06af\u06d5\u0646 \u0626\u0627\u062f\u0631\u06d0\u0633 \u0633\u0649\u0631\u062a\u0642\u0649 \u0626\u06c7\u0644\u0627\u0646\u0645\u0649\u062f\u06d5\u0643 \u062a\u06c7\u0631\u0649\u062f\u06c7. \u062a\u06d5\u0644\u06d5\u067e \u0642\u0649\u0644\u0649\u0646\u063a\u0627\u0646 https:\/\/ \u0626\u0627\u0644\u062f\u0649 \u0642\u0648\u0634\u06c7\u0645\u0686\u0649\u0633\u0649\u0646\u0649 \u0642\u0648\u0634\u0627\u0645\u0633\u0649\u0632\u061f", +"Link list": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634 \u062a\u06c8\u0631\u0649", +"Insert video": "\u0633\u0649\u0646 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Insert\/edit video": "\u0633\u0649\u0646 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634\/\u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Insert\/edit media": "\u0645\u06d0\u062f\u0649\u064a\u0627 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634\/\u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Alternative source": "\u062a\u06d5\u0633\u06cb\u0649\u0631\u0649", +"Alternative source URL": "\u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u0645\u06d5\u0646\u0628\u06d5 \u0626\u0627\u062f\u0631\u06d0\u0633\u0649", +"Media poster (Image URL)": "\u0645\u06d0\u062f\u0649\u064a\u0627 \u0645\u06c7\u0642\u0627\u06cb\u0649\u0633\u0649 (\u0631\u06d5\u0633\u0649\u0645 \u0626\u0627\u062f\u0631\u06d0\u0633\u0649)", +"Paste your embed code below:": "\u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0627\u0642\u0686\u0649 \u0628\u0648\u0644\u063a\u0627\u0646 \u0643\u0648\u062f\u0646\u0649 \u0686\u0627\u067e\u0644\u0627\u06ad", +"Embed": "\u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Media...": "\u0645\u06d0\u062f\u0649\u064a\u0627...", +"Nonbreaking space": "\u0628\u0648\u0634\u0644\u06c7\u0642", +"Page break": "\u0628\u06d5\u062a \u0626\u0627\u062e\u0649\u0631\u0644\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Paste as text": "\u062a\u06d0\u0643\u0649\u0634 \u0634\u06d5\u0643\u0644\u0649\u062f\u06d5 \u0686\u0627\u067e\u0644\u0627\u0634", +"Preview": "\u0643\u06c6\u0631\u06c8\u0634", +"Print...": "\u0628\u06d0\u0633\u0649\u0634...", +"Save": "\u0633\u0627\u0642\u0644\u0627\u0634", +"Find": "\u0626\u0649\u0632\u062f\u06d5\u0634", +"Replace with": "\u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Replace": "\u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Replace all": "\u06be\u06d5\u0645\u0645\u0649\u0646\u0649 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Previous": "\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649", +"Next": "\u0643\u06d0\u064a\u0649\u0646\u0643\u0649\u0633\u0649", +"Find and Replace": "\u0626\u0649\u0632\u062f\u06d5\u0634 \u06cb\u06d5 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Find and replace...": "\u0626\u0649\u0632\u062f\u06d5\u0634 \u06cb\u06d5 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634...", +"Could not find the specified string.": "\u0626\u0649\u0632\u062f\u0649\u0645\u06d5\u0643\u0686\u0649 \u0628\u0648\u0644\u063a\u0627\u0646 \u0645\u06d5\u0632\u0645\u06c7\u0646\u0646\u0649 \u062a\u0627\u067e\u0627\u0644\u0645\u0649\u062f\u0649.", +"Match case": "\u0686\u0648\u06ad \u0643\u0649\u0686\u0649\u0643 \u06be\u06d5\u0631\u0649\u067e\u0646\u0649 \u067e\u06d5\u0631\u0649\u0642\u0644\u06d5\u0646\u062f\u06c8\u0631\u06c8\u0634", +"Find whole words only": "\u067e\u06c8\u062a\u06c8\u0646 \u0633\u06c6\u0632\u0646\u0649\u0644\u0627 \u0626\u0649\u0632\u062f\u06d5\u0634", +"Find in selection": "\u062a\u0627\u0644\u0644\u0627\u0646\u063a\u0627\u0646\u062f\u0649\u0646 \u0626\u0649\u0632\u062f\u06d5\u0634", +"Spellcheck": "\u0626\u0649\u0645\u0644\u0627 \u062a\u06d5\u0643\u0634\u06c8\u0631\u06c8\u0634", +"Spellcheck Language": "\u0626\u0649\u0645\u0644\u0627 \u062a\u06d5\u0643\u0634\u06c8\u0631\u06c8\u0634 \u062a\u0649\u0644\u0649", +"No misspellings found.": "\u0626\u0649\u0645\u0644\u0627 \u062e\u0627\u062a\u0627\u0644\u0649\u0642\u0649 \u062a\u06d0\u067e\u0649\u0644\u0645\u0649\u062f\u0649.", +"Ignore": "\u0626\u06c6\u062a\u0643\u06c8\u0632\u06c8\u0634", +"Ignore all": "\u06be\u06d5\u0645\u0645\u0649\u0646\u0649 \u0626\u06c6\u062a\u0643\u06c8\u0632\u06c8\u0634", +"Finish": "\u0626\u0627\u062e\u0649\u0631\u0644\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Add to Dictionary": "\u0644\u06c7\u063a\u06d5\u062a \u0642\u0648\u0634\u06c7\u0634", +"Insert table": "\u062c\u06d5\u062f\u06cb\u06d5\u0644 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Table properties": "\u062c\u06d5\u062f\u06cb\u06d5\u0644 \u062e\u0627\u0633\u0644\u0649\u0642\u0649", +"Delete table": "\u062c\u06d5\u062f\u06cb\u06d5\u0644 \u0626\u06c6\u0686\u06c8\u0631\u0634", +"Cell": "\u0643\u0627\u062a\u06d5\u0643", +"Row": "\u0642\u06c7\u0631", +"Column": "\u0631\u06d5\u062a", +"Cell properties": "\u0643\u0627\u062a\u06d5\u0643 \u062e\u0627\u0633\u0644\u0649\u0642\u0649", +"Merge cells": "\u0643\u0627\u062a\u06d5\u0643 \u0628\u0649\u0631\u0644\u06d5\u0634\u062a\u06c8\u0631\u06c8\u0634", +"Split cell": "\u0643\u0627\u062a\u06d5\u0643 \u067e\u0627\u0631\u0686\u0649\u0644\u0627\u0634", +"Insert row before": "\u0626\u0627\u0644\u062f\u0649\u063a\u0627 \u0642\u06c7\u0631 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Insert row after": "\u0626\u0627\u0631\u0642\u0649\u063a\u0627 \u0642\u06c7\u0631 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Delete row": "\u0642\u06c7\u0631 \u0626\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Row properties": "\u0642\u06c7\u0631 \u062e\u0627\u0633\u0644\u0649\u0642\u0649", +"Cut row": "\u0642\u06c7\u0631 \u0643\u06d0\u0633\u0649\u0634", +"Copy row": "\u0642\u06c7\u0631 \u0643\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Paste row before": "\u0642\u06c7\u0631 \u0626\u0627\u0644\u062f\u0649\u063a\u0627 \u0686\u0627\u067e\u0644\u0627\u0634", +"Paste row after": "\u0642\u06c7\u0631 \u0643\u06d5\u064a\u0646\u0649\u06af\u06d5 \u0686\u0627\u067e\u0644\u0627\u0634", +"Insert column before": "\u0631\u06d5\u062a \u0626\u0627\u0644\u062f\u0649\u063a\u0627 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Insert column after": "\u0631\u06d5\u062a \u0643\u06d5\u064a\u0646\u0649\u06af\u06d5 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Delete column": "\u0631\u06d5\u062a \u0626\u06c6\u0686\u06c8\u0631\u06c8\u0634", +"Cols": "\u0631\u06d5\u062a", +"Rows": "\u0642\u06c7\u0631", +"Width": "\u0643\u06d5\u06ad\u0644\u0649\u0643\u0649", +"Height": "\u0626\u06d0\u06af\u0649\u0632\u0644\u0649\u0643\u0649", +"Cell spacing": "\u0643\u0627\u062a\u06d5\u0643 \u0633\u0649\u0631\u062a\u0642\u0649 \u0626\u0627\u0631\u0649\u0644\u0649\u0642\u0649", +"Cell padding": "\u0643\u0627\u062a\u06d5\u0643 \u0626\u0649\u0686\u0643\u0649 \u0626\u0627\u0631\u0649\u0644\u0649\u0642\u0649", +"Caption": "\u0686\u06c8\u0634\u06d5\u0646\u062f\u06c8\u0631\u06c8\u0634", +"Show caption": "\u062a\u06d0\u0645\u0649\u0633\u0649\u0646\u0649 \u0643\u06c6\u0631\u0633\u0649\u062a\u0649\u0634", +"Left": "\u0633\u0648\u0644", +"Center": "\u0645\u06d5\u0631\u0643\u06d5\u0632", +"Right": "\u0626\u0648\u06ad", +"Cell type": "\u0643\u0627\u062a\u06d5\u0643 \u062a\u0649\u067e\u0649", +"Scope": "\u062f\u0627\u0626\u0649\u0631\u06d5", +"Alignment": "\u064a\u06c6\u0644\u0649\u0646\u0649\u0634\u0649", +"H Align": "\u06af\u0648\u0631\u0632\u0649\u0646\u062a\u0627\u0644 \u062a\u0648\u063a\u0631\u0649\u0644\u0627\u0634", +"V Align": "\u06cb\u06d0\u0631\u062a\u0649\u0643\u0627\u0644 \u062a\u0648\u063a\u0631\u0649\u0644\u0627\u0634", +"Top": "\u0626\u06c8\u0633\u062a\u0649", +"Middle": "\u0626\u0648\u062a\u062a\u06c7\u0631\u0633\u0649", +"Bottom": "\u0626\u0627\u0633\u062a\u0649", +"Header cell": "\u0628\u0627\u0634 \u0643\u0627\u062a\u06d5\u0643", +"Row group": "\u0642\u06c7\u0631 \u06af\u06c7\u0631\u06c7\u067e\u067e\u0649\u0633\u0649", +"Column group": "\u0631\u06d5\u062a \u06af\u06c7\u0631\u06c7\u067e\u067e\u0649\u0633\u0649", +"Row type": "\u0642\u06c7\u0631 \u062a\u0649\u067e\u0649", +"Header": "\u0628\u06d0\u0634\u0649", +"Body": "\u0628\u06d5\u062f\u0649\u0646\u0649", +"Footer": "\u067e\u06c7\u062a\u0649", +"Border color": "\u0631\u0627\u0645\u0643\u0627 \u0631\u06d5\u06ad\u06af\u0649", +"Insert template...": "\u0642\u06d0\u0644\u0649\u067e \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634...", +"Templates": "\u0626\u06c8\u0644\u06af\u0649\u0644\u06d5\u0631", +"Template": "\u0626\u06c8\u0644\u06af\u0649\u0644\u06d5\u0631", +"Text color": "\u062e\u06d5\u062a \u0631\u06d5\u06ad\u06af\u0649", +"Background color": "\u0626\u0627\u0631\u0642\u0627 \u0631\u06d5\u06ad\u06af\u0649", +"Custom...": "\u0626\u0649\u062e\u062a\u0649\u064a\u0627\u0631\u0649", +"Custom color": "\u0626\u0649\u062e\u062a\u0649\u064a\u0627\u0631\u0649 \u0631\u06d5\u06ad", +"No color": "\u0631\u06d5\u06ad \u064a\u0648\u0642", +"Remove color": "\u0631\u06d5\u06ad\u0646\u0649 \u0686\u0649\u0642\u0649\u0631\u0649\u06cb\u06d0\u062a\u0649\u0634", +"Table of Contents": "\u062c\u06d5\u062f\u06d5\u0644\u0646\u0649\u06ad \u0645\u06d5\u0632\u0645\u06c7\u0646\u0649", +"Show blocks": "\u0631\u0627\u064a\u0648\u0646 \u0643\u06c6\u0631\u0633\u0649\u062a\u0649\u0634", +"Show invisible characters": "\u0643\u06c6\u0631\u06c8\u0646\u0645\u06d5\u064a\u062f\u0649\u063a\u0627\u0646 \u06be\u06d5\u0631\u0649\u067e\u0644\u06d5\u0631\u0646\u0649 \u0643\u06c6\u0631\u0633\u0649\u062a\u0649\u0634", +"Word count": "\u0633\u06c6\u0632 \u0633\u0627\u0646\u0649", +"Count": "\u0633\u0627\u0646\u0627\u0634", +"Document": "\u06be\u06c6\u062c\u062c\u06d5\u062a", +"Selection": "\u062a\u0627\u0644\u0644\u0627\u0646\u063a\u0627\u0646", +"Words": "\u0633\u06c6\u0632\u0644\u06d5\u0631", +"Words: {0}": "\u0633\u06c6\u0632: {0}", +"{0} words": "{0} \u0633\u06c6\u0632", +"File": "\u06be\u06c6\u062c\u062c\u06d5\u062a", +"Edit": "\u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Insert": "\u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"View": "\u0643\u06c6\u0631\u06c8\u0634", +"Format": "\u0641\u0648\u0631\u0645\u0627\u062a", +"Table": "\u062c\u06d5\u062f\u06cb\u06d5\u0644", +"Tools": "\u0642\u06c7\u0631\u0627\u0644", +"Powered by {0}": "\u062a\u06d0\u062e\u0646\u0649\u0643\u0649\u062f\u0627 {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0645\u0648\u0644 \u0645\u06d5\u0632\u0645\u06c7\u0646\u0644\u06c7\u0642 \u062a\u06d0\u0643\u06d0\u0633\u0649\u062a \u0631\u0627\u0645\u0643\u0649\u0633\u0649 \u0631\u0627\u064a\u0648\u0646\u0649\u062f\u0627 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643 \u0626\u06c8\u0686\u06c8\u0646 ALT-F9 \u0646\u0649\u060c \u0642\u0648\u0631\u0627\u0644 \u0628\u0627\u0644\u062f\u0649\u0642\u0649 \u0626\u06c8\u0686\u06c8\u0646 ALT-F10 \u0646\u0649\u060c \u064a\u0627\u0631\u062f\u06d5\u0645 \u0626\u06c8\u0686\u06c8\u0646 ALT-0 \u0646\u0649 \u0628\u06d0\u0633\u0649\u06ad", +"Image title": "\u0631\u06d5\u0633\u0649\u0645 \u062a\u06d0\u0645\u0649\u0633\u0649", +"Border width": "\u06af\u0649\u0631\u06cb\u06d5\u0643 \u0643\u06d5\u06ad\u0644\u0649\u0643\u0649", +"Border style": "\u06af\u0649\u0631\u06cb\u06d5\u0643 \u0626\u06c7\u0633\u0644\u06c7\u0628\u0649", +"Error": "\u062e\u0627\u062a\u0627\u0644\u0649\u0642", +"Warn": "\u0626\u0627\u06af\u0627\u06be\u0644\u0627\u0646\u062f\u06c7\u0631\u06c7\u0634", +"Valid": "\u0626\u06c8\u0646\u06c8\u0645\u0644\u06c8\u0643", +"To open the popup, press Shift+Enter": "\u0633\u06d5\u0643\u0631\u0649\u0645\u06d5 \u0643\u06c6\u0632\u0646\u06d5\u0643\u0646\u0649 \u0626\u06d0\u0686\u0649\u0634 \u0626\u06c8\u0686\u06c8\u0646 Shift+Enter \u0646\u0649 \u0628\u06d0\u0633\u0649\u06ad", +"Rich Text Area. Press ALT-0 for help.": "\u0641\u0648\u0631\u0645\u0627\u062a\u0644\u0649\u0642 \u062a\u06d0\u0643\u0649\u0633\u062a \u0631\u0627\u064a\u0648\u0646\u0649. \u064a\u0627\u0631\u062f\u06d5\u0645 \u0626\u06c8\u0686\u06c8\u0646 ALT-0 \u0646\u0649 \u0628\u06d0\u0633\u0649\u06ad.", +"System Font": "\u0633\u0649\u0633\u062a\u06d0\u0645\u0627 \u062e\u06d5\u062a \u0646\u06c7\u0633\u062e\u0649\u0633\u0649", +"Failed to upload image: {0}": "\u0631\u06d5\u0633\u0649\u0645\u0646\u0649 \u064a\u06c8\u0643\u0644\u0649\u064a\u06d5\u0644\u0645\u0649\u062f\u0649: {0}", +"Failed to load plugin: {0} from url {1}": "\u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0646\u0649 \u064a\u06c8\u0643\u0644\u0649\u064a\u06d5\u0644\u0645\u0649\u062f\u0649: {0} \u0646\u0649\u06ad \u0645\u06d5\u0646\u0628\u06d5 \u0626\u0627\u062f\u0631\u06d0\u0633\u0649 {1}", +"Failed to load plugin url: {0}": "\u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0646\u0649 \u064a\u06c8\u0643\u0644\u0649\u064a\u06d5\u0644\u0645\u0649\u062f\u0649 \u0626\u0627\u062f\u0631\u06d0\u0633\u0649: {0}", +"Failed to initialize plugin: {0}": "\u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0649\u0646\u0649 \u062f\u06d5\u0633\u0644\u06d5\u067e\u0644\u06d5\u0634\u062a\u06c8\u0631\u06d5\u0644\u0645\u0649\u062f\u0649: {0}", +"example": "\u0645\u06d5\u0633\u0649\u0644\u06d5\u0646", +"Search": "\u0626\u0649\u0632\u062f\u06d5\u0634", +"All": "\u06be\u06d5\u0645\u0645\u06d5", +"Currency": "\u067e\u06c7\u0644", +"Text": "\u062a\u06d0\u0643\u0649\u0633\u062a", +"Quotations": "\u0646\u06d5\u0642\u0649\u0644\u0644\u06d5\u0631", +"Mathematical": "\u0645\u0627\u062a\u06d0\u0645\u0627\u062a\u0649\u0643\u0649\u0644\u0649\u0642", +"Extended Latin": "\u0643\u06d0\u06ad\u06d5\u064a\u062a\u0649\u0644\u06af\u06d5\u0646 \u0644\u0627\u062a\u0649\u0646 \u06be\u06d5\u0631\u067e\u0644\u0649\u0631\u0649", +"Symbols": "\u0628\u06d5\u0644\u06af\u0649\u0644\u06d5\u0631", +"Arrows": "\u0626\u0649\u0633\u062a\u0631\u06d0\u0644\u0643\u0649\u0644\u0627\u0631", +"User Defined": "\u0626\u0649\u0634\u0644\u06d5\u062a\u0643\u06c8\u0686\u0649 \u0628\u06d5\u0644\u06af\u0649\u0644\u0649\u06af\u06d5\u0646", +"dollar sign": "\u062f\u0648\u0644\u0644\u0627\u0631 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"currency sign": "\u067e\u06c7\u0644 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"euro-currency sign": "\u064a\u0627\u06cb\u0631\u0648 \u067e\u06c7\u0644 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"colon sign": "\u0642\u0648\u0634 \u0686\u06d0\u0643\u0649\u062a \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"cruzeiro sign": "\u0643\u0631\u06c7 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"french franc sign": "\u0641\u0649\u0631\u0627\u0646\u0633\u0649\u064a\u06d5 \u0641\u0649\u0631\u0627\u0646\u0643 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"lira sign": "\u0644\u0649\u0631\u0627 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"mill sign": "\u0645\u0649\u0644 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"naira sign": "\u0646\u0627\u064a\u0631\u0627 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"peseta sign": "\u067e\u06d0\u0633\u06d0\u062a\u0627 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"rupee sign": "\u0631\u06c7\u067e\u0649\u064a\u06d5 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"won sign": "\u06cb\u0648\u0646 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"new sheqel sign": "\u064a\u06d0\u06ad\u0649 \u0634\u0649\u0643\u0649\u0644 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"dong sign": "\u06cb\u0649\u064a\u06d0\u062a\u0646\u0627\u0645 \u062f\u0648\u06ad\u0649 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"kip sign": "\u0643\u0649\u067e \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"tugrik sign": "\u062a\u06c8\u06af\u0631\u0649\u0643 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"drachma sign": "\u062f\u0649\u0631\u0627\u062e\u0645\u0627 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"german penny symbol": "\u06af\u06d0\u0631\u0645\u0627\u0646\u0649\u064a\u06d5 \u067e\u06d0\u0646\u0646\u0649 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"peso sign": "\u067e\u06d0\u0633\u0648 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"guarani sign": "\u06af\u06c7\u0626\u0627\u0631\u0627\u0646\u0649 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"austral sign": "\u0626\u0627\u06cb\u0633\u062a\u0631\u0627\u0644\u0649\u064a\u06d5 \u067e\u06c7\u0644 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"hryvnia sign": "hryvnia \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"cedi sign": "\u0633\u06d0\u062f\u0649 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"livre tournois sign": "livre tournois \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"spesmilo sign": "spesmilo \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"tenge sign": "tenge \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"indian rupee sign": "\u06be\u0649\u0646\u062f\u0649\u0633\u062a\u0627\u0646 \u0631\u06c7\u067e\u0649\u064a\u06d5 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"turkish lira sign": "\u062a\u06c8\u0631\u0643\u0649\u064a\u06d5 \u0644\u0649\u0631\u0627 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"nordic mark sign": "\u0634\u0649\u0645\u0627\u0644\u0649\u064a \u064a\u0627\u06cb\u0631\u0648\u067e\u0627 \u0645\u0627\u0631\u0643 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"manat sign": "manat \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"ruble sign": "\u0631\u06c7\u0628\u0644\u0649 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"yen character": "\u064a\u06d0\u0646 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"yuan character": "\u064a\u06c8\u06d5\u0646 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"yuan character, in hong kong and taiwan": "\u064a\u06c8\u06d5\u0646 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649 (\u0634\u064a\u0627\u06ad\u06af\u0627\u06ad \u06cb\u06d5 \u062a\u06d5\u064a\u06cb\u06d5\u0646)", +"yen\/yuan character variant one": "\u064a\u06d0\u0646 \u06cb\u06d5 \u064a\u06c8\u06d5\u0646 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649", +"Loading emoticons...": "\u0686\u0649\u0631\u0627\u064a \u0626\u0649\u067e\u0627\u062f\u0649\u0644\u0649\u0631\u0649 \u064a\u06c8\u0643\u0644\u0649\u0646\u0649\u06cb\u0627\u062a\u0649\u062f\u06c7...", +"Could not load emoticons": "\u0686\u0649\u0631\u0627\u064a \u0626\u0649\u067e\u0627\u062f\u0649\u0644\u0649\u0631\u0649 \u064a\u06c8\u0643\u0644\u06d5\u0646\u0645\u0649\u062f\u0649", +"People": "\u0626\u0627\u062f\u06d5\u0645\u0644\u06d5\u0631", +"Animals and Nature": "\u06be\u0627\u064a\u06cb\u0627\u0646\u0644\u0627\u0631 \u06cb\u06d5 \u062a\u06d5\u0628\u0649\u0626\u06d5\u062a", +"Food and Drink": "\u064a\u06d0\u0645\u06d5\u0643-\u0626\u0649\u0686\u0645\u06d5\u0643", +"Activity": "\u067e\u0627\u0626\u0627\u0644\u0649\u064a\u06d5\u062a", +"Travel and Places": "\u0633\u0627\u064a\u0627\u06be\u06d5\u062a \u06cb\u06d5 \u062c\u0627\u064a\u0644\u0627\u0631", +"Objects": "\u0646\u06d5\u0631\u0633\u0649\u0644\u06d5\u0631", +"Flags": "\u0628\u0627\u064a\u0631\u0627\u0642\u0644\u0627\u0631", +"Characters": "\u06be\u06d5\u0631\u067e-\u0628\u06d5\u0644\u06af\u0649\u0644\u06d5\u0631", +"Characters (no spaces)": "\u06be\u06d5\u0631\u067e-\u0628\u06d5\u0644\u06af\u0649\u0644\u06d5\u0631 (\u0628\u0648\u0634\u0644\u06c7\u0642\u0646\u0649 \u0626\u06c6\u0632 \u0626\u0649\u0686\u0649\u06af\u06d5 \u0626\u0627\u0644\u0645\u0627\u064a\u062f\u06c7)", +"{0} characters": "{0} \u06be\u06d5\u0631\u067e-\u0628\u06d5\u0644\u06af\u06d5", +"Error: Form submit field collision.": "\u062e\u0627\u062a\u0627\u0644\u0649\u0642: \u0631\u0627\u0645\u0643\u0627 (form) \u064a\u0648\u0644\u0644\u0627\u0634 \u0628\u06c6\u0644\u0649\u0643\u0649 \u062a\u0648\u0642\u06c7\u0646\u06c7\u0634\u062a\u0649.", +"Error: No form element found.": "\u062e\u0627\u062a\u0627\u0644\u0649\u0642: \u0631\u0627\u0645\u0643\u0627 (form) \u0626\u06d0\u0644\u06d0\u0645\u06d0\u0646\u062a\u0649 \u062a\u06d0\u067e\u0649\u0644\u0645\u0649\u062f\u0649.", +"Update": "\u064a\u06d0\u06ad\u0649\u0644\u0627\u0634", +"Color swatch": "\u0631\u06d5\u06ad \u0626\u06c8\u0644\u06af\u0649\u0633\u0649", +"Turquoise": "\u0643\u06c6\u0643\u06c8\u0686 \u064a\u06d0\u0634\u0649\u0644", +"Green": "\u064a\u06d0\u0634\u0649\u0644", +"Blue": "\u0643\u06c6\u0643", +"Purple": "\u0628\u0649\u0646\u06d5\u067e\u0634\u06d5", +"Navy Blue": "\u062f\u06d0\u06ad\u0649\u0632 \u0643\u06c6\u0643", +"Dark Turquoise": "\u062a\u0648\u0642 \u0643\u06c6\u0643\u06c8\u0686 \u064a\u06d0\u0634\u0649\u0644", +"Dark Green": "\u062a\u0648\u0642 \u064a\u06d0\u0634\u0649\u0644", +"Medium Blue": "\u0626\u0627\u0631\u0627 \u0643\u06c6\u0643", +"Medium Purple": "\u0626\u0627\u0631\u0627 \u0628\u0649\u0646\u06d5\u067e\u0634\u06d5", +"Midnight Blue": "\u0642\u0627\u0631\u0627 \u0643\u06c6\u0643", +"Yellow": "\u0633\u06d0\u0631\u0649\u0642", +"Orange": "\u0642\u0649\u0632\u063a\u06c7\u0686 \u0633\u06d0\u0631\u0649\u0642", +"Red": "\u0642\u0649\u0632\u0649\u0644", +"Light Gray": "\u0626\u0627\u0686 \u0643\u06c8\u0644\u0631\u06d5\u06ad", +"Gray": "\u0643\u06c8\u0644\u0631\u06d5\u06ad", +"Dark Yellow": "\u062a\u0648\u0642 \u0633\u06d0\u0631\u0649\u0642", +"Dark Orange": "\u062a\u0648\u0642 \u0642\u0649\u0632\u063a\u06c7\u0686", +"Dark Red": "\u062a\u0648\u0642 \u0642\u0649\u0632\u0649\u0644", +"Medium Gray": "\u0626\u0648\u062a\u062a\u06c7\u0631\u06be\u0627\u0644 \u0643\u06c8\u0644\u0631\u06d5\u06ad", +"Dark Gray": "\u062a\u0648\u0642 \u0643\u06c8\u0644\u0631\u06d5\u06ad", +"Light Green": "\u0626\u0627\u0686 \u064a\u06d0\u0634\u0649\u0644", +"Light Yellow": "\u0626\u0627\u0686 \u0633\u06d0\u0631\u0649\u0642", +"Light Red": "\u0626\u0627\u0686 \u0642\u0649\u0632\u0649\u0644", +"Light Purple": "\u0626\u0627\u0686 \u0628\u0649\u0646\u06d5\u067e\u0634\u06d5", +"Light Blue": "\u0626\u0627\u0686 \u0643\u06c6\u0643", +"Dark Purple": "\u062a\u0648\u0642 \u0628\u0649\u0646\u06d5\u067e\u0634\u06d5", +"Dark Blue": "\u062a\u0648\u0642 \u0643\u06c6\u0643", +"Black": "\u0642\u0627\u0631\u0627", +"White": "\u0626\u0627\u0642", +"Switch to or from fullscreen mode": "\u062a\u0648\u0644\u06c7\u0642 \u0626\u06d0\u0643\u0631\u0627\u0646 \u06be\u0627\u0644\u0649\u062a\u0649\u0646\u0649 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Open help dialog": "\u064a\u0627\u0631\u062f\u06d5\u0645 \u062f\u0649\u064a\u0627\u0644\u0648\u06af\u0649\u0646\u0649 \u0626\u06d0\u0686\u0649\u0634", +"history": "\u062a\u0627\u0631\u0649\u062e\u0649\u064a \u0626\u06c7\u0686\u06c7\u0631", +"styles": "\u0626\u06c7\u0633\u0644\u06c7\u0628\u0644\u0627\u0631", +"formatting": "\u0641\u0648\u0631\u0645\u0627\u062a\u0644\u0627\u0634", +"alignment": "\u062a\u0648\u063a\u0631\u0649\u0644\u0627\u0634", +"indentation": "\u062a\u0627\u0631\u0627\u064a\u062a\u0649\u0634", +"Font": "\u062e\u06d5\u062a \u0646\u06c7\u0633\u062e\u0649\u0633\u0649", +"Size": "\u0686\u0648\u06ad\u0644\u06c7\u0642\u0649", +"More...": "\u062a\u06d0\u062e\u0649\u0645\u06c7 \u0643\u06c6\u067e...", +"Select...": "\u062a\u0627\u0644\u0644\u0627\u0634...", +"Preferences": "\u0645\u0627\u064a\u0649\u0644\u0644\u0649\u0642\u0644\u0649\u0631\u0649", +"Yes": "\u06be\u06d5\u0626\u06d5", +"No": "\u064a\u0627\u0642", +"Keyboard Navigation": "\u064a\u06c6\u062a\u0643\u0649\u0644\u0649\u0634\u0686\u0627\u0646 \u0643\u06c7\u0646\u06c7\u067e\u0643\u0627 \u062a\u0627\u062e\u062a\u0649\u0633\u0649", +"Version": "\u0646\u06d5\u0634\u0631\u0649", +"Code view": "\u0643\u0648\u062f \u0643\u06c6\u0631\u06c8\u0646\u06c8\u0634\u0649", +"Open popup menu for split buttons": "\u0628\u06c6\u0644\u06c8\u0646\u0645\u06d5 \u0643\u06c7\u0646\u06c7\u067e\u0643\u0649\u0644\u0627\u0631 \u0626\u06c8\u0686\u06c8\u0646 \u0633\u06d5\u0643\u0631\u0649\u0645\u06d5 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643 \u0626\u06d0\u0686\u0649\u0634", +"List Properties": "\u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643 \u062e\u0627\u0633\u0644\u0649\u0642\u0644\u0649\u0631\u0649", +"List properties...": "\u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643 \u062e\u0627\u0633\u0644\u0649\u0642\u0644\u0649\u0631\u0649...", +"Start list at number": "\u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643\u0646\u0649 \u0633\u0627\u0646 \u0628\u0649\u0644\u06d5\u0646 \u0628\u0627\u0634\u0644\u0627\u0634", +"Line height": "\u0642\u06c7\u0631 \u0626\u0627\u0631\u0649\u0644\u0649\u0642\u0649", +"comments": "\u0626\u0649\u0646\u0643\u0627\u0633\u0644\u0627\u0631", +"Format Painter": "\u0641\u0648\u0631\u0645\u0627\u062a \u0643\u06c6\u0686\u06c8\u0631\u06af\u06c8\u0686", +"Insert\/edit iframe": "\u0631\u0627\u0645\u0643\u0627 (iframe) \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634 \u064a\u0627\u0643\u0649 \u062a\u06d5\u06be\u0631\u0649\u0631\u0644\u06d5\u0634", +"Capitalization": "\u0686\u0648\u06ad \u06be\u06d5\u0631\u067e\u0643\u06d5 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"lowercase": "\u0643\u0649\u0686\u0649\u0643 \u06be\u06d5\u0631\u067e", +"UPPERCASE": "\u0686\u0648\u06ad \u06be\u06d5\u0631\u067e", +"Title Case": "\u062a\u06d0\u0645\u0627 \u0626\u06c7\u0633\u0644\u06c7\u0628\u0649", +"permanent pen": "\u062f\u0627\u0626\u0649\u0645\u0644\u0649\u0642 \u0642\u06d5\u0644\u06d5\u0645", +"Permanent Pen Properties": "\u062f\u0627\u0626\u0649\u0645\u0644\u0649\u0642 \u0642\u06d5\u0644\u06d5\u0645 \u062e\u0627\u0633\u0644\u0649\u0642\u0644\u0649\u0631\u0649", +"Permanent pen properties...": "\u062f\u0627\u0626\u0649\u0645\u0644\u0649\u0642 \u0642\u06d5\u0644\u06d5\u0645 \u062e\u0627\u0633\u0644\u0649\u0642\u0644\u0649\u0631\u0649...", +"case change": "\u0686\u0648\u06ad\u0644\u06c7\u0642\u0649\u0646\u0649 \u0626\u06c6\u0632\u06af\u06d5\u0631\u062a\u0649\u0634", +"page embed": "\u0642\u0649\u0633\u062a\u06c7\u0631\u0645\u0627 \u0628\u06d5\u062a", +"Advanced sort...": "\u0626\u0627\u0644\u0649\u064a \u062a\u0649\u0632\u0649\u0634...", +"Advanced Sort": "\u0626\u0627\u0644\u0649\u064a \u062a\u0649\u0632\u0649\u0634", +"Sort table by column ascending": "\u062c\u06d5\u062f\u06cb\u06d5\u0644\u0646\u0649 \u0626\u0649\u0633\u062a\u0648\u0646\u0646\u0649\u06ad \u0626\u06d0\u0634\u0649\u0634\u0649 \u0628\u0648\u064a\u0649\u0686\u06d5 \u062a\u0649\u0632\u0649\u0634", +"Sort table by column descending": "\u062c\u06d5\u062f\u06cb\u06d5\u0644\u0646\u0649 \u0626\u0649\u0633\u062a\u0648\u0646\u0646\u0649\u06ad \u0643\u06d0\u0645\u0649\u064a\u0649\u0634\u0649 \u0628\u0648\u064a\u0649\u0686\u06d5 \u062a\u0649\u0632\u0649\u0634", +"Sort": "\u062a\u0649\u0632\u0649\u0634", +"Order": "\u062a\u06d5\u0631\u062a\u0649\u067e\u0649", +"Sort by": "\u062a\u0649\u0632\u0649\u0634 \u0634\u06d5\u0643\u0644\u0649", +"Ascending": "\u0626\u06d0\u0634\u0649\u0634", +"Descending": "\u0643\u06d0\u0645\u0649\u064a\u0649\u0634", +"Column {0}": "{0} \u0626\u0649\u0633\u062a\u0648\u0646", +"Row {0}": "{0}-\u0642\u06c7\u0631", +"Spellcheck...": "\u0626\u0649\u0645\u0644\u0627 \u062a\u06d5\u0643\u0634\u06c8\u0631\u06c8\u0634...", +"Misspelled word": "\u062e\u0627\u062a\u0627 \u0633\u06c6\u0632", +"Suggestions": "\u062a\u06d5\u06cb\u0633\u0649\u064a\u06d5\u0644\u06d5\u0631", +"Change": "\u0626\u06c6\u0632\u06af\u06d5\u0631\u062a\u0649\u0634", +"Finding word suggestions": "\u062a\u06d5\u06cb\u0633\u0649\u064a\u06d5 \u0633\u06c6\u0632\u0644\u06d5\u0631\u0646\u0649 \u0626\u0649\u0632\u062f\u06d5\u0634", +"Success": "\u0626\u0648\u06ad\u06c7\u0634\u0644\u06c7\u0642 \u0628\u0648\u0644\u062f\u0649", +"Repair": "\u0626\u0648\u06ad\u0634\u0627\u0634", +"Issue {0} of {1}": "{0}-\u0645\u06d5\u0633\u0649\u0644\u06d5\u060c \u062c\u06d5\u0645\u0626\u0649\u064a {1} \u0645\u06d5\u0633\u0649\u0644\u06d5", +"Images must be marked as decorative or have an alternative text description": "\u0631\u06d5\u0633\u0649\u0645\u0644\u06d5\u0631\u0646\u0649\u06ad \u0686\u0648\u0642\u06c7\u0645 \u0628\u06d0\u0632\u06d5\u0643 \u0628\u06d5\u0644\u06af\u0649\u0633\u0649 \u064a\u0627\u0643\u0649 \u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u062a\u06d0\u0643\u0649\u0633\u062a \u0686\u06c8\u0634\u06d5\u0646\u062f\u06c8\u0631\u06c8\u0634\u0649 \u0628\u0648\u0644\u06c7\u0634\u0649 \u0643\u06d0\u0631\u06d5\u0643", +"Images must have an alternative text description. Decorative images are not allowed.": "\u0631\u06d5\u0633\u0649\u0645\u0644\u06d5\u0631\u0646\u0649\u06ad \u0686\u0648\u0642\u06c7\u0645 \u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u062a\u06d0\u0643\u0649\u0633\u062a \u0686\u06c8\u0634\u06d5\u0646\u062f\u06c8\u0631\u06c8\u0634\u0649 \u0628\u0648\u0644\u06c7\u0634\u0649 \u0643\u06d0\u0631\u06d5\u0643. \u0628\u06d0\u0632\u06d5\u0643 \u0631\u06d5\u0633\u0649\u0645\u0644\u06d5\u0631\u06af\u06d5 \u0631\u06c7\u062e\u0633\u06d5\u062a \u0642\u0649\u0644\u0649\u0646\u0645\u0627\u064a\u062f\u06c7.", +"Or provide alternative text:": "\u064a\u0627\u0643\u0649 \u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u062a\u06d0\u0643\u0649\u0633\u062a\u0646\u0649 \u0643\u0649\u0631\u06af\u06c8\u0632\u06c8\u06ad:", +"Make image decorative:": "\u0628\u06d0\u0632\u06d5\u0643 \u0631\u06d5\u0633\u0649\u0645 \u0642\u0649\u0644\u0649\u06ad:", +"ID attribute must be unique": "ID \u062e\u0627\u0633\u0644\u0649\u0642\u0649 \u0628\u0649\u0631\u062f\u0649\u0646\u0628\u0649\u0631 \u0628\u0648\u0644\u06c7\u0634\u0649 \u0643\u06d0\u0631\u06d5\u0643", +"Make ID unique": "ID \u0646\u0649 \u0628\u0649\u0631\u062f\u0649\u0646\u0628\u0649\u0631 \u0642\u0649\u0644\u0649\u0634", +"Keep this ID and remove all others": "\u0628\u06c7 ID \u062f\u0649\u0646 \u0628\u0627\u0634\u0642\u0649\u0644\u0649\u0631\u0649\u0646\u0649 \u0686\u0649\u0642\u0649\u0631\u0649\u06cb\u06d0\u062a\u0649\u0634", +"Remove this ID": "\u0628\u06c7 ID \u0646\u0649 \u0686\u0649\u0642\u0649\u0631\u0649\u06cb\u06d0\u062a\u0649\u0634", +"Remove all IDs": "\u0628\u0627\u0631\u0644\u0649\u0642 ID \u0646\u0649 \u0686\u0649\u0642\u0649\u0631\u0649\u06cb\u06d0\u062a\u0649\u0634", +"Checklist": "\u062a\u0627\u0644\u0644\u0627\u0646\u0645\u0627 \u062a\u0649\u0632\u0649\u0645\u0644\u0649\u0643", +"Anchor": "\u0626\u06c7\u0644\u0627\u0646\u0645\u0627", +"Special character": "\u0626\u0627\u0644\u0627\u06be\u0649\u062f\u06d5 \u0628\u06d5\u0644\u06af\u0649\u0644\u06d5\u0631", +"Code sample": "\u0643\u0648\u062f \u0645\u0649\u0633\u0627\u0644\u0649", +"Color": "\u0631\u06d5\u06ad", +"Document properties": "\u06be\u06c6\u062c\u062c\u06d5\u062a \u062e\u0627\u0633\u0644\u0649\u0642\u0649", +"Image description": "\u0631\u06d5\u0633\u0649\u0645 \u062a\u06d5\u0633\u06cb\u0649\u0631\u0649", +"Image": "\u0631\u06d5\u0633\u0649\u0645", +"Insert link": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634", +"Target": "\u0646\u0649\u0634\u0627\u0646", +"Link": "\u0626\u06c7\u0644\u0649\u0646\u0649\u0634", +"Poster": "\u064a\u0648\u0644\u0644\u0649\u063a\u06c7\u0686\u0649", +"Media": "\u0645\u06d0\u062f\u0649\u064a\u0627", +"Print": "\u0628\u06d0\u0633\u0649\u0634", +"Prev": "\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649\u0633\u0649", +"Find and replace": "\u0626\u0649\u0632\u062f\u06d5\u0634 \u06cb\u06d5 \u0626\u0627\u0644\u0645\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Whole words": "\u062a\u0648\u0644\u06c7\u0642 \u0645\u0627\u0633\u0644\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634", +"Insert template": "\u0626\u06c8\u0644\u06af\u06d5 \u0642\u0649\u0633\u062a\u06c7\u0631\u06c7\u0634" +}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/zh_CN.js b/cps/static/js/libs/tinymce/langs/zh_CN.js deleted file mode 100644 index 89b106c29..000000000 --- a/cps/static/js/libs/tinymce/langs/zh_CN.js +++ /dev/null @@ -1,419 +0,0 @@ -tinymce.addI18n('zh_CN',{ -"Redo": "\u91cd\u505a", -"Undo": "\u64a4\u9500", -"Cut": "\u526a\u5207", -"Copy": "\u590d\u5236", -"Paste": "\u7c98\u8d34", -"Select all": "\u5168\u9009", -"New document": "\u65b0\u6587\u4ef6", -"Ok": "\u786e\u5b9a", -"Cancel": "\u53d6\u6d88", -"Visual aids": "\u7f51\u683c\u7ebf", -"Bold": "\u7c97\u4f53", -"Italic": "\u659c\u4f53", -"Underline": "\u4e0b\u5212\u7ebf", -"Strikethrough": "\u5220\u9664\u7ebf", -"Superscript": "\u4e0a\u6807", -"Subscript": "\u4e0b\u6807", -"Clear formatting": "\u6e05\u9664\u683c\u5f0f", -"Align left": "\u5de6\u8fb9\u5bf9\u9f50", -"Align center": "\u4e2d\u95f4\u5bf9\u9f50", -"Align right": "\u53f3\u8fb9\u5bf9\u9f50", -"Justify": "\u4e24\u7aef\u5bf9\u9f50", -"Bullet list": "\u9879\u76ee\u7b26\u53f7", -"Numbered list": "\u7f16\u53f7\u5217\u8868", -"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", -"Increase indent": "\u589e\u52a0\u7f29\u8fdb", -"Close": "\u5173\u95ed", -"Formats": "\u683c\u5f0f", -"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", -"Headers": "\u6807\u9898", -"Header 1": "\u6807\u98981", -"Header 2": "\u6807\u98982", -"Header 3": "\u6807\u98983", -"Header 4": "\u6807\u98984", -"Header 5": "\u6807\u98985", -"Header 6": "\u6807\u98986", -"Headings": "\u6807\u9898", -"Heading 1": "\u6807\u98981", -"Heading 2": "\u6807\u98982", -"Heading 3": "\u6807\u98983", -"Heading 4": "\u6807\u98984", -"Heading 5": "\u6807\u98985", -"Heading 6": "\u6807\u98986", -"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", -"Div": "Div", -"Pre": "Pre", -"Code": "\u4ee3\u7801", -"Paragraph": "\u6bb5\u843d", -"Blockquote": "\u5f15\u6587\u533a\u5757", -"Inline": "\u6587\u672c", -"Blocks": "\u57fa\u5757", -"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", -"Fonts": "\u5b57\u4f53", -"Font Sizes": "\u5b57\u53f7", -"Class": "\u7c7b\u578b", -"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", -"OR": "\u6216", -"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", -"Upload": "\u4e0a\u4f20", -"Block": "\u5757", -"Align": "\u5bf9\u9f50", -"Default": "\u9ed8\u8ba4", -"Circle": "\u7a7a\u5fc3\u5706", -"Disc": "\u5b9e\u5fc3\u5706", -"Square": "\u65b9\u5757", -"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", -"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", -"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", -"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", -"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", -"Anchor...": "\u951a\u70b9...", -"Name": "\u540d\u79f0", -"Id": "\u6807\u8bc6\u7b26", -"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", -"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", -"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", -"Special character...": "\u7279\u6b8a\u5b57\u7b26...", -"Source code": "\u6e90\u4ee3\u7801", -"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", -"Language": "\u8bed\u8a00", -"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", -"Color Picker": "\u9009\u8272\u5668", -"R": "R", -"G": "G", -"B": "B", -"Left to right": "\u4ece\u5de6\u5230\u53f3", -"Right to left": "\u4ece\u53f3\u5230\u5de6", -"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", -"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", -"Title": "\u6807\u9898", -"Keywords": "\u5173\u952e\u8bcd", -"Description": "\u63cf\u8ff0", -"Robots": "\u673a\u5668\u4eba", -"Author": "\u4f5c\u8005", -"Encoding": "\u7f16\u7801", -"Fullscreen": "\u5168\u5c4f", -"Action": "\u64cd\u4f5c", -"Shortcut": "\u5feb\u6377\u952e", -"Help": "\u5e2e\u52a9", -"Address": "\u5730\u5740", -"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", -"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", -"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", -"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", -"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", -"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", -"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", -"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", -"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", -"Learn more...": "\u4e86\u89e3\u66f4\u591a...", -"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", -"Plugins": "\u63d2\u4ef6", -"Handy Shortcuts": "\u5feb\u6377\u952e", -"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", -"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", -"Image description": "\u56fe\u7247\u63cf\u8ff0", -"Source": "\u5730\u5740", -"Dimensions": "\u5927\u5c0f", -"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", -"General": "\u666e\u901a", -"Advanced": "\u9ad8\u7ea7", -"Style": "\u6837\u5f0f", -"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", -"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", -"Border": "\u8fb9\u6846", -"Insert image": "\u63d2\u5165\u56fe\u7247", -"Image...": "\u56fe\u7247...", -"Image list": "\u56fe\u7247\u5217\u8868", -"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", -"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", -"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", -"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", -"Edit image": "\u7f16\u8f91\u56fe\u7247", -"Image options": "\u56fe\u7247\u9009\u9879", -"Zoom in": "\u653e\u5927", -"Zoom out": "\u7f29\u5c0f", -"Crop": "\u88c1\u526a", -"Resize": "\u8c03\u6574\u5927\u5c0f", -"Orientation": "\u65b9\u5411", -"Brightness": "\u4eae\u5ea6", -"Sharpen": "\u9510\u5316", -"Contrast": "\u5bf9\u6bd4\u5ea6", -"Color levels": "\u989c\u8272\u5c42\u6b21", -"Gamma": "\u4f3d\u9a6c\u503c", -"Invert": "\u53cd\u8f6c", -"Apply": "\u5e94\u7528", -"Back": "\u540e\u9000", -"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", -"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", -"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", -"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", -"Text to display": "\u663e\u793a\u6587\u5b57", -"Url": "\u5730\u5740", -"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", -"Current window": "\u5f53\u524d\u7a97\u53e3", -"None": "\u65e0", -"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", -"Remove link": "\u5220\u9664\u94fe\u63a5", -"Anchors": "\u951a\u70b9", -"Link...": "\u94fe\u63a5...", -"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", -"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", -"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", -"Link list": "\u94fe\u63a5\u5217\u8868", -"Insert video": "\u63d2\u5165\u89c6\u9891", -"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", -"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", -"Alternative source": "\u955c\u50cf", -"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", -"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", -"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", -"Embed": "\u5185\u5d4c", -"Media...": "\u591a\u5a92\u4f53...", -"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", -"Page break": "\u5206\u9875\u7b26", -"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", -"Preview": "\u9884\u89c8", -"Print...": "\u6253\u5370...", -"Save": "\u4fdd\u5b58", -"Find": "\u67e5\u627e", -"Replace with": "\u66ff\u6362\u4e3a", -"Replace": "\u66ff\u6362", -"Replace all": "\u5168\u90e8\u66ff\u6362", -"Previous": "\u4e0a\u4e00\u4e2a", -"Next": "\u4e0b\u4e00\u4e2a", -"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", -"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", -"Match case": "\u533a\u5206\u5927\u5c0f\u5199", -"Find whole words only": "\u5168\u5b57\u5339\u914d", -"Spell check": "\u62fc\u5199\u68c0\u67e5", -"Ignore": "\u5ffd\u7565", -"Ignore all": "\u5168\u90e8\u5ffd\u7565", -"Finish": "\u5b8c\u6210", -"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", -"Insert table": "\u63d2\u5165\u8868\u683c", -"Table properties": "\u8868\u683c\u5c5e\u6027", -"Delete table": "\u5220\u9664\u8868\u683c", -"Cell": "\u5355\u5143\u683c", -"Row": "\u884c", -"Column": "\u5217", -"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", -"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", -"Split cell": "\u62c6\u5206\u5355\u5143\u683c", -"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", -"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", -"Delete row": "\u5220\u9664\u884c", -"Row properties": "\u884c\u5c5e\u6027", -"Cut row": "\u526a\u5207\u884c", -"Copy row": "\u590d\u5236\u884c", -"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", -"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", -"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", -"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", -"Delete column": "\u5220\u9664\u5217", -"Cols": "\u5217", -"Rows": "\u884c", -"Width": "\u5bbd", -"Height": "\u9ad8", -"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", -"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", -"Show caption": "\u663e\u793a\u6807\u9898", -"Left": "\u5de6\u5bf9\u9f50", -"Center": "\u5c45\u4e2d", -"Right": "\u53f3\u5bf9\u9f50", -"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", -"Scope": "\u8303\u56f4", -"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", -"H Align": "\u6c34\u5e73\u5bf9\u9f50", -"V Align": "\u5782\u76f4\u5bf9\u9f50", -"Top": "\u9876\u90e8\u5bf9\u9f50", -"Middle": "\u5782\u76f4\u5c45\u4e2d", -"Bottom": "\u5e95\u90e8\u5bf9\u9f50", -"Header cell": "\u8868\u5934\u5355\u5143\u683c", -"Row group": "\u884c\u7ec4", -"Column group": "\u5217\u7ec4", -"Row type": "\u884c\u7c7b\u578b", -"Header": "\u8868\u5934", -"Body": "\u8868\u4f53", -"Footer": "\u8868\u5c3e", -"Border color": "\u8fb9\u6846\u989c\u8272", -"Insert template...": "\u63d2\u5165\u6a21\u677f...", -"Templates": "\u6a21\u677f", -"Template": "\u6a21\u677f", -"Text color": "\u6587\u5b57\u989c\u8272", -"Background color": "\u80cc\u666f\u8272", -"Custom...": "\u81ea\u5b9a\u4e49...", -"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", -"No color": "\u65e0", -"Remove color": "\u79fb\u9664\u989c\u8272", -"Table of Contents": "\u5185\u5bb9\u5217\u8868", -"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", -"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", -"Word count": "\u5b57\u6570", -"Count": "\u8ba1\u6570", -"Document": "\u6587\u6863", -"Selection": "\u9009\u62e9", -"Words": "\u5355\u8bcd", -"Words: {0}": "\u5b57\u6570\uff1a{0}", -"{0} words": "{0} \u5b57", -"File": "\u6587\u4ef6", -"Edit": "\u7f16\u8f91", -"Insert": "\u63d2\u5165", -"View": "\u89c6\u56fe", -"Format": "\u683c\u5f0f", -"Table": "\u8868\u683c", -"Tools": "\u5de5\u5177", -"Powered by {0}": "\u7531{0}\u9a71\u52a8", -"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", -"Image title": "\u56fe\u7247\u6807\u9898", -"Border width": "\u8fb9\u6846\u5bbd\u5ea6", -"Border style": "\u8fb9\u6846\u6837\u5f0f", -"Error": "\u9519\u8bef", -"Warn": "\u8b66\u544a", -"Valid": "\u6709\u6548", -"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", -"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", -"System Font": "\u7cfb\u7edf\u5b57\u4f53", -"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", -"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", -"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", -"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", -"example": "\u793a\u4f8b", -"Search": "\u641c\u7d22", -"All": "\u5168\u90e8", -"Currency": "\u8d27\u5e01", -"Text": "\u6587\u5b57", -"Quotations": "\u5f15\u7528", -"Mathematical": "\u6570\u5b66", -"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", -"Symbols": "\u7b26\u53f7", -"Arrows": "\u7bad\u5934", -"User Defined": "\u81ea\u5b9a\u4e49", -"dollar sign": "\u7f8e\u5143\u7b26\u53f7", -"currency sign": "\u8d27\u5e01\u7b26\u53f7", -"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", -"colon sign": "\u5192\u53f7", -"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", -"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", -"lira sign": "\u91cc\u62c9\u7b26\u53f7", -"mill sign": "\u5bc6\u5c14\u7b26\u53f7", -"naira sign": "\u5948\u62c9\u7b26\u53f7", -"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", -"rupee sign": "\u5362\u6bd4\u7b26\u53f7", -"won sign": "\u97e9\u5143\u7b26\u53f7", -"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", -"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", -"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", -"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", -"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", -"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", -"peso sign": "\u6bd4\u7d22\u7b26\u53f7", -"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", -"austral sign": "\u6fb3\u5143\u7b26\u53f7", -"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", -"cedi sign": "\u585e\u5730\u7b26\u53f7", -"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", -"spesmilo sign": "spesmilo\u7b26\u53f7", -"tenge sign": "\u575a\u6208\u7b26\u53f7", -"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", -"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", -"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", -"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", -"ruble sign": "\u5362\u5e03\u7b26\u53f7", -"yen character": "\u65e5\u5143\u5b57\u6837", -"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", -"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", -"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", -"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", -"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", -"People": "\u4eba\u7c7b", -"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", -"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", -"Activity": "\u6d3b\u52a8", -"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", -"Objects": "\u7269\u4ef6", -"Flags": "\u65d7\u5e1c", -"Characters": "\u5b57\u7b26", -"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", -"{0} characters": "{0} \u4e2a\u5b57\u7b26", -"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", -"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", -"Update": "\u66f4\u65b0", -"Color swatch": "\u989c\u8272\u6837\u672c", -"Turquoise": "\u9752\u7eff\u8272", -"Green": "\u7eff\u8272", -"Blue": "\u84dd\u8272", -"Purple": "\u7d2b\u8272", -"Navy Blue": "\u6d77\u519b\u84dd", -"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", -"Dark Green": "\u6df1\u7eff\u8272", -"Medium Blue": "\u4e2d\u84dd\u8272", -"Medium Purple": "\u4e2d\u7d2b\u8272", -"Midnight Blue": "\u6df1\u84dd\u8272", -"Yellow": "\u9ec4\u8272", -"Orange": "\u6a59\u8272", -"Red": "\u7ea2\u8272", -"Light Gray": "\u6d45\u7070\u8272", -"Gray": "\u7070\u8272", -"Dark Yellow": "\u6697\u9ec4\u8272", -"Dark Orange": "\u6df1\u6a59\u8272", -"Dark Red": "\u6df1\u7ea2\u8272", -"Medium Gray": "\u4e2d\u7070\u8272", -"Dark Gray": "\u6df1\u7070\u8272", -"Light Green": "\u6d45\u7eff\u8272", -"Light Yellow": "\u6d45\u9ec4\u8272", -"Light Red": "\u6d45\u7ea2\u8272", -"Light Purple": "\u6d45\u7d2b\u8272", -"Light Blue": "\u6d45\u84dd\u8272", -"Dark Purple": "\u6df1\u7d2b\u8272", -"Dark Blue": "\u6df1\u84dd\u8272", -"Black": "\u9ed1\u8272", -"White": "\u767d\u8272", -"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", -"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", -"history": "\u5386\u53f2", -"styles": "\u6837\u5f0f", -"formatting": "\u683c\u5f0f\u5316", -"alignment": "\u5bf9\u9f50", -"indentation": "\u7f29\u8fdb", -"permanent pen": "\u8bb0\u53f7\u7b14", -"comments": "\u5907\u6ce8", -"Format Painter": "\u683c\u5f0f\u5237", -"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", -"Capitalization": "\u5927\u5199", -"lowercase": "\u5c0f\u5199", -"UPPERCASE": "\u5927\u5199", -"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", -"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", -"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", -"Font": "\u5b57\u4f53", -"Size": "\u5b57\u53f7", -"More...": "\u66f4\u591a...", -"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", -"Select...": "\u9009\u62e9...", -"Preferences": "\u9996\u9009\u9879", -"Yes": "\u662f", -"No": "\u5426", -"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", -"Version": "\u7248\u672c", -"Anchor": "\u951a\u70b9", -"Special character": "\u7279\u6b8a\u7b26\u53f7", -"Code sample": "\u4ee3\u7801\u793a\u4f8b", -"Color": "\u989c\u8272", -"Emoticons": "\u8868\u60c5", -"Document properties": "\u6587\u6863\u5c5e\u6027", -"Image": "\u56fe\u7247", -"Insert link": "\u63d2\u5165\u94fe\u63a5", -"Target": "\u6253\u5f00\u65b9\u5f0f", -"Link": "\u94fe\u63a5", -"Poster": "\u5c01\u9762", -"Media": "\u5a92\u4f53", -"Print": "\u6253\u5370", -"Prev": "\u4e0a\u4e00\u4e2a", -"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", -"Whole words": "\u5168\u5b57\u5339\u914d", -"Spellcheck": "\u62fc\u5199\u68c0\u67e5", -"Caption": "\u6807\u9898", -"Insert template": "\u63d2\u5165\u6a21\u677f" -}); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/langs/zh_Hans_CN.js b/cps/static/js/libs/tinymce/langs/zh_Hans_CN.js index f9d8b5cfd..2a784f579 100644 --- a/cps/static/js/libs/tinymce/langs/zh_Hans_CN.js +++ b/cps/static/js/libs/tinymce/langs/zh_Hans_CN.js @@ -74,7 +74,7 @@ tinymce.addI18n('zh_CN',{ "Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", "You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", "Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", -"Special characters...": "\u7279\u6b8a\u5b57\u7b26...", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", "Source code": "\u6e90\u4ee3\u7801", "Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", "Language": "\u8bed\u8a00", @@ -85,6 +85,7 @@ tinymce.addI18n('zh_CN',{ "B": "B", "Left to right": "\u4ece\u5de6\u5230\u53f3", "Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons": "\u8868\u60c5", "Emoticons...": "\u8868\u60c5\u7b26\u53f7...", "Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", "Title": "\u6807\u9898", @@ -113,7 +114,9 @@ tinymce.addI18n('zh_CN',{ "Handy Shortcuts": "\u5feb\u6377\u952e", "Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", "Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", -"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Alternative description": "\u66ff\u4ee3\u63cf\u8ff0", +"Accessibility": "\u8f85\u52a9\u529f\u80fd", +"Image is decorative": "\u56fe\u50cf\u662f\u88c5\u9970\u6027\u7684", "Source": "\u5730\u5740", "Dimensions": "\u5927\u5c0f", "Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", @@ -147,7 +150,6 @@ tinymce.addI18n('zh_CN',{ "Back": "\u540e\u9000", "Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", "Date\/time": "\u65e5\u671f\/\u65f6\u95f4", -"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", "Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", "Text to display": "\u663e\u793a\u6587\u5b57", "Url": "\u5730\u5740", @@ -155,12 +157,14 @@ tinymce.addI18n('zh_CN',{ "Current window": "\u5f53\u524d\u7a97\u53e3", "None": "\u65e0", "New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Open link": "\u6253\u5f00\u94fe\u63a5", "Remove link": "\u5220\u9664\u94fe\u63a5", "Anchors": "\u951a\u70b9", "Link...": "\u94fe\u63a5...", "Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\u3002\u60a8\u60f3\u6dfb\u52a0\u6240\u9700\u7684 https:\/\/ \u524d\u7f00\u5417\uff1f", "Link list": "\u94fe\u63a5\u5217\u8868", "Insert video": "\u63d2\u5165\u89c6\u9891", "Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", @@ -183,11 +187,15 @@ tinymce.addI18n('zh_CN',{ "Replace all": "\u5168\u90e8\u66ff\u6362", "Previous": "\u4e0a\u4e00\u4e2a", "Next": "\u4e0b\u4e00\u4e2a", +"Find and Replace": "\u67e5\u627e\u548c\u66ff\u6362", "Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", "Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", "Match case": "\u533a\u5206\u5927\u5c0f\u5199", "Find whole words only": "\u5168\u5b57\u5339\u914d", -"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Find in selection": "\u5728\u9009\u533a\u4e2d\u67e5\u627e", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"No misspellings found.": "\u6ca1\u6709\u53d1\u73b0\u62fc\u5199\u9519\u8bef", "Ignore": "\u5ffd\u7565", "Ignore all": "\u5168\u90e8\u5ffd\u7565", "Finish": "\u5b8c\u6210", @@ -218,6 +226,7 @@ tinymce.addI18n('zh_CN',{ "Height": "\u9ad8", "Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", "Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Caption": "\u6807\u9898", "Show caption": "\u663e\u793a\u6807\u9898", "Left": "\u5de6\u5bf9\u9f50", "Center": "\u5c45\u4e2d", @@ -251,6 +260,10 @@ tinymce.addI18n('zh_CN',{ "Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", "Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", "Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", "Words: {0}": "\u5b57\u6570\uff1a{0}", "{0} words": "{0} \u5b57", "File": "\u6587\u4ef6", @@ -332,6 +345,7 @@ tinymce.addI18n('zh_CN',{ "Flags": "\u65d7\u5e1c", "Characters": "\u5b57\u7b26", "Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", "Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", "Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", "Update": "\u66f4\u65b0", @@ -356,6 +370,13 @@ tinymce.addI18n('zh_CN',{ "Dark Red": "\u6df1\u7ea2\u8272", "Medium Gray": "\u4e2d\u7070\u8272", "Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", "Black": "\u9ed1\u8272", "White": "\u767d\u8272", "Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", @@ -365,14 +386,68 @@ tinymce.addI18n('zh_CN',{ "formatting": "\u683c\u5f0f\u5316", "alignment": "\u5bf9\u9f50", "indentation": "\u7f29\u8fdb", -"permanent pen": "\u8bb0\u53f7\u7b14", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Code view": "\u4ee3\u7801\u89c6\u56fe", +"Open popup menu for split buttons": "\u6253\u5f00\u5f39\u51fa\u5f0f\u83dc\u5355\uff0c\u7528\u4e8e\u62c6\u5206\u6309\u94ae", +"List Properties": "\u5217\u8868\u5c5e\u6027", +"List properties...": "\u6807\u9898\u5b57\u4f53\u5c5e\u6027", +"Start list at number": "\u4ee5\u6570\u5b57\u5f00\u59cb\u5217\u8868", +"Line height": "\u884c\u9ad8", "comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"permanent pen": "\u8bb0\u53f7\u7b14", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"case change": "\u6848\u4f8b\u66f4\u6539", +"page embed": "\u9875\u9762\u5d4c\u5165", +"Advanced sort...": "\u9ad8\u7ea7\u6392\u5e8f...", +"Advanced Sort": "\u9ad8\u7ea7\u6392\u5e8f", +"Sort table by column ascending": "\u6309\u5217\u5347\u5e8f\u8868", +"Sort table by column descending": "\u6309\u5217\u964d\u5e8f\u8868", +"Sort": "\u6392\u5e8f", +"Order": "\u6392\u5e8f", +"Sort by": "\u6392\u5e8f\u65b9\u5f0f", +"Ascending": "\u5347\u5e8f", +"Descending": "\u964d\u5e8f", +"Column {0}": "\u5217{0}", +"Row {0}": "\u884c{0}", +"Spellcheck...": "\u62fc\u5199\u68c0\u67e5...", +"Misspelled word": "\u62fc\u5199\u9519\u8bef\u7684\u5355\u8bcd", +"Suggestions": "\u5efa\u8bae", +"Change": "\u66f4\u6539", +"Finding word suggestions": "\u67e5\u627e\u5355\u8bcd\u5efa\u8bae", +"Success": "\u6210\u529f", +"Repair": "\u4fee\u590d", +"Issue {0} of {1}": "\u5171\u8ba1{1}\u95ee\u9898{0}", +"Images must be marked as decorative or have an alternative text description": "\u56fe\u50cf\u5fc5\u987b\u6807\u8bb0\u4e3a\u88c5\u9970\u6027\u6216\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0", +"Images must have an alternative text description. Decorative images are not allowed.": "\u56fe\u50cf\u5fc5\u987b\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0\u3002\u4e0d\u5141\u8bb8\u4f7f\u7528\u88c5\u9970\u56fe\u50cf\u3002", +"Or provide alternative text:": "\u6216\u63d0\u4f9b\u5907\u9009\u6587\u672c\uff1a", +"Make image decorative:": "\u4f7f\u56fe\u50cf\u88c5\u9970\uff1a", +"ID attribute must be unique": "ID \u5c5e\u6027\u5fc5\u987b\u662f\u552f\u4e00\u7684", +"Make ID unique": "\u4f7f ID \u72ec\u4e00\u65e0\u4e8c", +"Keep this ID and remove all others": "\u4fdd\u7559\u6b64 ID \u5e76\u5220\u9664\u6240\u6709\u5176\u4ed6", +"Remove this ID": "\u5220\u9664\u6b64 ID", +"Remove all IDs": "\u6e05\u9664\u5168\u90e8IDs", +"Checklist": "\u6e05\u5355", "Anchor": "\u951a\u70b9", "Special character": "\u7279\u6b8a\u7b26\u53f7", "Code sample": "\u4ee3\u7801\u793a\u4f8b", "Color": "\u989c\u8272", -"Emoticons": "\u8868\u60c5", "Document properties": "\u6587\u6863\u5c5e\u6027", +"Image description": "\u56fe\u7247\u63cf\u8ff0", "Image": "\u56fe\u7247", "Insert link": "\u63d2\u5165\u94fe\u63a5", "Target": "\u6253\u5f00\u65b9\u5f0f", @@ -383,7 +458,5 @@ tinymce.addI18n('zh_CN',{ "Prev": "\u4e0a\u4e00\u4e2a", "Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", "Whole words": "\u5168\u5b57\u5339\u914d", -"Spellcheck": "\u62fc\u5199\u68c0\u67e5", -"Caption": "\u6807\u9898", "Insert template": "\u63d2\u5165\u6a21\u677f" }); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/plugins/code/plugin.min.js b/cps/static/js/libs/tinymce/plugins/code/plugin.min.js new file mode 100644 index 000000000..d83339a21 --- /dev/null +++ b/cps/static/js/libs/tinymce/plugins/code/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",function(e){var t,o;function n(){return o.execCommand("mceCodeEditor")}return(t=e).addCommand("mceCodeEditor",function(){var n,e;e=(n=t).getContent({source_view:!0}),n.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:e},onSubmit:function(e){var t=n,o=e.getData().code;t.focus(),t.undoManager.transact(function(){t.setContent(o)}),t.selection.setCursorLocation(),t.nodeChanged(),e.close()}})}),(o=e).ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:n}),o.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:n}),{}})}(); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/content/dark/content.min.css b/cps/static/js/libs/tinymce/skins/content/dark/content.min.css deleted file mode 100644 index 07d40c265..000000000 --- a/cps/static/js/libs/tinymce/skins/content/dark/content.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} diff --git a/cps/static/js/libs/tinymce/skins/content/document/content.min.css b/cps/static/js/libs/tinymce/skins/content/document/content.min.css deleted file mode 100644 index a1feef4c1..000000000 --- a/cps/static/js/libs/tinymce/skins/content/document/content.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} diff --git a/cps/static/js/libs/tinymce/skins/content/writer/content.min.css b/cps/static/js/libs/tinymce/skins/content/writer/content.min.css deleted file mode 100644 index 0d8f5d340..000000000 --- a/cps/static/js/libs/tinymce/skins/content/writer/content.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} diff --git a/cps/static/js/libs/tinymce/skins/lightgray/content.inline.min.css b/cps/static/js/libs/tinymce/skins/lightgray/content.inline.min.css deleted file mode 100755 index db4868a0d..000000000 --- a/cps/static/js/libs/tinymce/skins/lightgray/content.inline.min.css +++ /dev/null @@ -1 +0,0 @@ -.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-content-body a[data-mce-selected],.mce-content-body code[data-mce-selected]{background:#bfe6ff}.mce-content-body hr{cursor:default}.mce-content-body{line-height:1.3} \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/lightgray/content.min.css b/cps/static/js/libs/tinymce/skins/lightgray/content.min.css deleted file mode 100755 index cfbfe204e..000000000 --- a/cps/static/js/libs/tinymce/skins/lightgray/content.min.css +++ /dev/null @@ -1 +0,0 @@ -body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-content-body a[data-mce-selected],.mce-content-body code[data-mce-selected]{background:#bfe6ff}.mce-content-body hr{cursor:default} \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.eot b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.eot deleted file mode 100755 index b144ba0bd949de3c0f87abdd78b517067169884f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9492 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 - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.ttf b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce-small.ttf deleted file mode 100755 index a983e2dc4cb30880fffe00e1f0879be4d95eb4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9304 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 diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.eot b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.eot deleted file mode 100755 index f99c13f32f5c968849f08a3d8a399157bfb0cccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17572 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 S4xrR19F>Jx9kYDL=l=i@ywbP; diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.svg b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.svg deleted file mode 100755 index 5727cea42..000000000 --- a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.ttf b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.ttf deleted file mode 100755 index 16536bfd7a292e7090b9d4e0ae61061da9bc042f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 zcmdsed3+pKo#%U1eW)dMt6P0kt97_r?e3O!v|4JFTDB#*Y}xXmC|2zFh=~(9w&DXH z@)bgc%oH|bf|&#_*9_SNi*Yh!0s%e?WH%x6nc4xe1Do*4hs`p;Ojtpd41$CYp8%7< zs!RL*y{eX4vK-Ns>n%b&QBjq``@%_j4P5!UD zFaL}&-T>EgaNp@kr283@#^6^RJo?_d@2`An0P)?7^?&@(#J&Snov{F8gRdjM_Ye}? zpL6swwq`lv%MTqpbMMck(EAbJg!X=O^u+#s-<|l$t&FYhNB-=wefLhX2iYeWTi1tp z{P@0O6IX5xIT1(u{KDjk(`PVFJVVoz&t!R)Ut-9YJ|(??l#f_G{{_o)58~wy$FLVa z8e_k_S2pGhrpa)~q_rqLaS@>2$Tc9(@?}w~fjM{->FZF>$t0x3r(34g*Q#Fgz1H?K zK2tGMH4~T#&os`o%(TvQ%&0R1Gizt|{rt(FfBqM}zxeFyM_zyN^_Sl`@`mxo?|ymj zTybtr^cJ6H)2*+u*SxQ_{*28q(MD*dVJ0ow$jz*rS%Ws7KpU!P+GlIe)jBZ0 z^7)Ga{Tp7Kam=QstSyPL!b;KfLi_KWhLxT(Fd&0DSOo(-@k9W>d?1NH9>KgK>$AFp znM~KYUSyi2ji|CQ%Vd2Hi83<{uBq^~IYY*e1+jx&XeX29$wad&90*17iSAxC(35sI zaV4qZ6%4tMmquDI@*+w&-^9c62Oo-#CCqrDvoj%0Cpr@wWQTM`c1d6LxQlVO$K&SH zjtYm#x%9h-qR5|}5=F-oV-d+EUy&U0?9)_C9(Q{m#vo0__Ady3tbZ2O|VQEJe*UW?al&uO>A%iH5(bkwN%ZyBRC>xH)%V`*e1 zU(8v0Bn4|yBAxY zDJZUp9qUbJoB$5-Pd29kG-?l(vHp30EC4p-DgcH7!rc*sQQj&^5LPO0l|*5yyj%XG z=384DwYexB^Zn-g$)D32TW)P0@Z}?`<1O2hEzRz=Yu(K)$?Yxi)seh!p!k|AP*oN6 zRo7KjH&$0yxSTG3RaKp@I$CYTA5N)i3XXRpUR77^i&j+yP^v=YN2`5xRaJfw|3A%1 zjkD7
qE0fV3qg3i>lG;3uYEKk_jlWwzK&8|i)pG_^o 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 N%EGLUS-#`*e*qFO!Ds*g diff --git a/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.woff b/cps/static/js/libs/tinymce/skins/lightgray/fonts/tinymce.woff deleted file mode 100755 index 74b50f4c3001da7fdfffd8638213dcf1a396da78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17484 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 C+YCGa diff --git a/cps/static/js/libs/tinymce/skins/lightgray/img/loader.gif b/cps/static/js/libs/tinymce/skins/lightgray/img/loader.gif deleted file mode 100755 index c69e937232b24ea30f01c68bbd2ebc798dcecfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 zcmdVcdr(tX9tZGC9yiG~=H_*Q-0%n(kWqP*D#hw{AQu8;1%gl-Hrf&{2?48KX;hHy z3Ze*zEz4t3XdUFyLbNPUYlA`|B}P=N1fqtL1*}S;87#|-W9v<#G;ul(e%d3)N(^9c$d2Dz{7}?ErjNd;{EMKkCsk21~b9Gvg zDo<7L=3Z5HNbVlZUcm1eg#o#CZCJU`3IYHwM->zCd?uYrF3vKFeM}v?f+%s?E>ly|3W25ry9#NNbTx-}0ON58dTrs^ix{_1O0Wh~SVSBlH)Ajn zPn^Gbjz}PCtN@#keR&hK&Dhl-b$kZ8^S)x#dh0{7X=X%CCJk7P1PSO>T&S8I4{#Lg zb5#)o=;!ZP*1nM{cI4@(x7o27*SA()NHmrn67aN@Pmi~(i_SnrjYnwh36aG%!@i0d zqbvfa44f|?OG4ntP|nbjhEl1)Yp6ZN@yjy zy4==QmLy%t;ps3R?~f2KfTTI|2?q8dFd6^z5GF+Xa&Y)sjG)hxit80pPcOP zJ z*LW{SyGHD%hUotV+W%I}fBLAIx!8|7#}$;clKQ+{&FjDqGQ2ZNx(lYM3*%~}ILnao zM`aui55~ZFJlu^!5rdA9Q_7H68H_;##u{x(Yn-vSfIRCb^Nqsg zGRS!Egm>h+o<}LeV4&CLReo9FrDjDvs}8?JwC)#Qs|ie=r?~xUh)&*d`Fx>FG}%X# zNdtDHBKhLPC0wpooFDAQKL%*6T|ULH$=wX!NhcasgD3d;-d$I6yRK3yN+E~C1335_iLOt+*9uvSZ`>*KA}vm}08wRq=>5l|t*Na&jR z-C1&C`nkEk#sB|@yyt-#fXngP04My zm7u$Q%EJbHp`>~`5W&L{W!6`y&}LMS;jfUpgO~7TLVMRZ9IC)IZp0A${`yp0{&wco z#1nx@XMkhqeK%7?RE7JdLr1^nwFfaJ0Q&Lv?WNJ%9}VSJsNY2+UYs2%EU0J~ayFXv zi*?7KCXQHkD)O6!0Q%4N+HTODHxJ{kQSuQX$l-rSwkwh(zMkdfzxyGwl@yHC)C4p< z&n2%8#M?)Q@mgHL1ot8`SFdSEj9ye|jHy+U8#@HoUExG=@AVkRAe_qYm4EpzK6L*& zh`)26?V#f4#_h^P9G^%>h2-H3)$QP zQovu6J9qDvsxqweDdNNa!Lb?L4_UF{tLX_nN7r0U_vF14YKcGR-*Gl} zx3oG)bzf|65dBxD-;2ZCp??K;+TuQ9onnK?==5hzbkb^r_g>z4#D8mcv8(+XdoszA zCx-qhdgxMNMotj}SiL_6V(tLcsK7(M(r(%u<}QrVfOvyK6_;~NOTlPGfX@M7S5YQF z&*$(ylJMHJt^_aQeu{C6NaTE$G3HNN@_SnN8YcaKn%`)F@~L1x+ah7-gEJPpc6w%3 zyX}r+Qk$4RHZzfH){e~F*qJ{d*L8a6n4;U?+{de0-t)mal#TVxe)3F}^UBh+zd T)6_**#cgp_+?JL9(ew3BlNF>u diff --git a/cps/static/js/libs/tinymce/skins/lightgray/img/object.gif b/cps/static/js/libs/tinymce/skins/lightgray/img/object.gif deleted file mode 100755 index cccd7f023fb80908cb33bb7d9604236cd21b7ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmV;J0B8S4Nk%w1VG#fg0J9GO<>lo+KR<78Z?v?uS65g4{r%Y3*xlXT%F4>`@9+2b z_ww@cot>Tk|Nk>HGXMYpA^8LW000jFEC2ui01*HU000C<(8)=wd#<&tyXIMjHBV`d zBSi|xsj3(;nD0kQ0aJq8eLH~x02P|t2!_J&Wqb%0io?#xDtr{background-color:#fafafa}.mce-container .mce-table-striped thead>tr th{font-weight:bold}.mce-container .mce-table-striped td,.mce-container .mce-table-striped th{padding:5px}.mce-container .mce-table-striped tr:nth-child(even){background-color:#fafafa}.mce-container .mce-table-striped tbody>tr:hover{background-color:#e1e1e1}.mce-branding-powered-by{background-color:#f0f0f0;position:absolute;right:0;bottom:0;width:91px;height:9px;margin-right:-1px;margin-bottom:-1px;border:1px solid #c5c5c5;border-width:1px 1px 0 1px;padding:6px 6px 0 6px;background-image:url('data:image/gif;base64,R0lGODlhXwAJAIABAIiIiAAAACH5BAEKAAEALAAAAABfAAkAAAJxhBGpy+2PUnzqGNpmPNJqDIZSJY4m+KXLF3At2V6xPFfuvMF6J6fINTnhTr9XcaRC6pKvFYlZjDIszaXRSA3ijlXo9AlWindaldSJthJ55XAz6+ZWbVCOdojP77p8J8vlUSI4SHEnaEiYqOhARdhIWAAAOw');background-repeat:no-repeat;background-position:center center}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#3498db}.mce-croprect-handle-move:focus{outline:1px solid #3498db}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:rgba(0,0,0,0.2);border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:rgba(0,0,0,0.2);border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#f0f0f0;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#f0f0f0;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:rgba(0,0,0,0.2);border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#f0f0f0;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:rgba(0,0,0,0.2);border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#f0f0f0;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:#fff;text-shadow:1px 1px none}.mce-sidebar-panel{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #cacaca;border:0 solid rgba(0,0,0,0.2);background-color:#f0f0f0}.mce-floatpanel{position:absolute}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;top:0;left:0;background:#FFF;border:1px solid rgba(0,0,0,0.2);border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#F0F0F0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#CCCCCC;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333333}.mce-notification .mce-progress .mce-bar-container{border-color:#CCCCCC}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #ccc}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#CCC}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:white}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #AAA;background:#EEE;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #BBB;background:#DDD;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#BBB}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#FFF}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#ffffff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#333}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#BBB} \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.inline.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.inline.min.css deleted file mode 100644 index 0a3d965c0..000000000 --- a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.inline.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.min.css deleted file mode 100644 index 07067404c..000000000 --- a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.mobile.min.css deleted file mode 100644 index 35f7dc08b..000000000 --- a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/content.mobile.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff deleted file mode 100644 index 1e3be038a607cb7c2544ed8ae3d6621f77bf4c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4624 zcmb7IeQaFC5#QN&AGUL{efE7g{=BM1W-|RaVdWQe^e?BC`eGz4^i8S3PQw?Hhd_eQHxTkckXZB zdzU((wCVGko!Qyh+1c6InRotvZ%+>+hNrBQtrFOI4t*}DZ$7=>Sr=uD3c$ZlKuKBQ z8~ervCczs9SOk2!>AAqrz+v$CC}f1JfYPDSqx->|V$6{ekbe8M#Bh3Gkg?)-Fdi3B zeB$}UFqn*$pv&q7*net~hsUOlfG7Ho2zaowY%JPRytMvu{&xRPm(h_~w##F>vqE&a5-ssH##mlfAk}44^ zXRJKd!Ifw&ce{$Y9BAg5c>e>p_Z;t!=P{izddGWie?aHLdKL3Cn9rG=d2vt;esWqH zoD}uAoi3Z~4+LABvADt+so4~t%VlyIJ{O3tm$NC+(!yenQD%NVr*btG$T3+_WX=LH z#1M2ZNEtrO+-x;l2i>M^5o%GQ@s?N+gw*19H@G~vl3Q5Zf*t6jjW0GOTmAmlWYgSS zJeiEo%~LA-FW|YAd_Em$OE#@dw)y*#@p!UtnWa);V1HY3ZBw!>(3gY{iFFa_c6iW9 zIQ@xck^{xu9_o;UyQH#ba@y?L$xW?8J35?$p1z46ZjIctZ8QCKCa29bMC1-t@pT>S zTUT1WMjQz-75d)5zJxv~@Yd)bY)ejQBx_XQiaMJ z>$5`NO3?L*ND{UQeF8%xl)$_>w9tmQpfEebzedazFeh#~d}suN+vzsqLiW~@TLhoe zk1%xEcxP2ZL)FuoXeYzb-J5goljDxPL2@@#RW)d&X#&6QO5U=04_628@ONSvtgpha zDqqmoVep`A4<+PK$V>K+T}}{8Rj+Q|UAzCtl!Fh)uXJg{x$}HMJH7LcBLzj-r{h;< zzote8Id%pcAyE;87D<8glyaFeq#k)OEDB%yA ze%CeZ!?4TEs#pj+%14DBZHn8jxaF2as6}p3+!6p-&@I>5lbP3&N$svcIF-`0R5(o2 zh7la++|;-euckH44a4BAwB++#-cZ z)kFyC=eUS-4D0t}H8LdZY!JD^sW@F85io)%=8HU)ouhEeo-K_dJ3BV+8fo0JXIjlP zZt0H`0=Yv~I|PpRZ)r5_iAYmY9V=wT@BsoN9<3vftB|}TOH;|yNk_e7(2-?y{&cSK zG=E5Nz^Ko4>KxcbY!Q13!=HBS$lM96_+0y3M1yWTAt2u5C;6MWMXbRN?RI{$eHnAx z&t=-PSjZ>Qe2V2-YGs1YWemAq zVHdG{9V$QvsY~Cgq-L*PZqMPGv|px$)K~3<%+fBtG{oIRPL_7ye$-(`C=tS)^xC}% zue73qiF&{nXJ*>-@668G!`IrAeB;ad09shzt{O?7omLE_X@H|#ozGt&64 zb-&_lLkZI8TzigPZvUr=4g2-8M6M8b9EQLgoPswYg)d)j&%gZHJO!2>(?;I*8d>aG z#oS295Kcq{uD4R2@VEG($}WWiF-6YK)kjqks%o_U{CIAVX2;tX7o|unkew5?Gn3(| zOePS^{$(;Xi4ph;`KO#;k+vaLt8n5@doi+OEvH&?*+3(WgqkT9-$b0fTHm;)r=NmR zJnJ9o>UvNR(JMoIdRBf{%kd}jmZ)b)#4>dnDfq0G(?~S%d zv50QeMR$Kzd*S$AEXdp5Fhqe0Pz zZ!oS2e!i-tWEJ2^YoVo}V7S0tV7CujimbVJtVNb#yB&<-f&xpSb@m2=wBZ|qU-_^; z?C{lk+;tlxk&Sh3Pwh(D7~kNh`O=~TMWuRUu^0=9)`CYEVwhvGWUt4Wd3`6*H)Zs>LLYQcC#*~B78EfTt7RQ*l)b{v zqntLNsC`h&zZCY{x*}gfPU4at;nfileU3>zeyLdO7;;lFIft~ zsm6#wb5Jjtv;_VxleU0<%cQON-O*ywHt`@C4fn-Y83}=|hJPOpN>1H%C#7)9etg_yG)$div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:capitalize;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:capitalize}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.mobile.min.css deleted file mode 100644 index 3a45cacf0..000000000 --- a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css deleted file mode 100644 index 9ba6e02c8..000000000 --- a/cps/static/js/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide/content.inline.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide/content.inline.min.css index 0a3d965c0..b4ab9a3a5 100644 --- a/cps/static/js/libs/tinymce/skins/ui/oxide/content.inline.min.css +++ b/cps/static/js/libs/tinymce/skins/ui/oxide/content.inline.min.css @@ -4,4 +4,4 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ */ -.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide/content.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide/content.min.css index 40b3378dc..844858d06 100644 --- a/cps/static/js/libs/tinymce/skins/ui/oxide/content.min.css +++ b/cps/static/js/libs/tinymce/skins/ui/oxide/content.min.css @@ -4,4 +4,4 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ */ -.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide/skin.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide/skin.min.css index 13037c134..f570b8e49 100644 --- a/cps/static/js/libs/tinymce/skins/ui/oxide/skin.min.css +++ b/cps/static/js/libs/tinymce/skins/ui/oxide/skin.min.css @@ -4,4 +4,4 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ */ -.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:capitalize;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:capitalize}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} +.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/cps/static/js/libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/cps/static/js/libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css index 9ba6e02c8..a0893b913 100644 --- a/cps/static/js/libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css +++ b/cps/static/js/libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css @@ -4,4 +4,4 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ */ -body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/cps/static/js/libs/tinymce/themes/inlite/theme.min.js b/cps/static/js/libs/tinymce/themes/inlite/theme.min.js deleted file mode 100755 index 25996d255..000000000 --- a/cps/static/js/libs/tinymce/themes/inlite/theme.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;i0})},e=function(b,c){var e=function(a){return"string"==typeof a?d(a,/[ ,]/):a},f=function(a,b){return a===!1?[]:b};return a.isArray(b)?b:a.isString(b)?e(b):a.isBoolean(b)?f(b,c):c},f=function(a){return function(c,d,f){var g=d in c.settings?c.settings[d]:f;return b(f,a),e(g,f)}};return{getStringOr:c(a.isString),getBoolOr:c(a.isBoolean),getNumberOr:c(a.isNumber),getHandlerOr:c(a.isFunction),getToolbarItemsOr:f(a.isArray)}}),g("7",[],function(){var a=function(a,b){return{id:a,rect:b}},b=function(a,b){for(var c=0;c",c=0;c
";e+=""}return e+="",e+=""},d=function(a){var b=a.dom.select("*[data-mce-id]");return b[0]},e=function(a,b,e){a.undoManager.transact(function(){var f,g;a.insertContent(c(b,e)),f=d(a),f.removeAttribute("data-mce-id"),g=a.dom.select("td,th",f),a.selection.setCursorLocation(g[0],0)})},f=function(a,b){a.execCommand("FormatBlock",!1,b)},g=function(b,c,d){var e,f;e=b.editorUpload.blobCache,f=e.create(a.uuid("mceu"),d,c),e.add(f),b.insertContent(b.dom.createHTML("img",{src:f.blobUri()}))},h=function(a){a.selection.collapse(!1)},i=function(a){a.focus(),b.unlinkSelection(a),h(a)},j=function(a,b,c){a.focus(),a.dom.setAttrib(b,"href",c),h(a)},k=function(a,b){a.execCommand("mceInsertLink",!1,{href:b}),h(a)},l=function(a,b){var c=a.dom.getParent(a.selection.getStart(),"a[href]");c?j(a,c,b):k(a,b)},m=function(a,b){0===b.trim().length?i(a):l(a,b)};return{insertTable:e,formatBlock:f,insertBlob:g,createLink:m,unlink:i}}),g("v",[],function(){var a=function(a){return/^www\.|\.(com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil)$/i.test(a.trim())},b=function(a){return/^https?:\/\//.test(a.trim())};return{isDomainLike:a,isAbsolute:b}}),g("l",["g","j","s","p","v"],function(a,b,c,d,e){var f=function(a){a.find("textbox").eq(0).each(function(a){a.focus()})},g=function(c,d){var e=b.create(a.extend({type:"form",layout:"flex",direction:"row",padding:5,name:c,spacing:3},d));return e.on("show",function(){f(e)}),e},h=function(a,b){return b?a.show():a.hide()},i=function(a,b){return new c(function(c){a.windowManager.confirm("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(a){var d=a===!0?"http://"+b:b;c(d)})})},j=function(a,b){return!e.isAbsolute(b)&&e.isDomainLike(b)?i(a,b):c.resolve(b)},k=function(a,b){var c={},e=function(){a.focus(),d.unlink(a),b()},f=function(a){var b=a.meta;b&&b.attach&&(c={href:this.value(),attach:b.attach})},i=function(b){if(b.control===this){var c,d="";c=a.dom.getParent(a.selection.getStart(),"a[href]"),c&&(d=a.dom.getAttrib(c,"href")),this.fromJSON({linkurl:d}),h(this.find("#unlink"),c),this.find("#linkurl")[0].focus()}};return g("quicklink",{items:[{type:"button",name:"unlink",icon:"unlink",onclick:e,tooltip:"Remove link"},{type:"filepicker",name:"linkurl",placeholder:"Paste or type a link",filetype:"file",onchange:f},{type:"button",icon:"checkmark",subtype:"primary",tooltip:"Ok",onclick:"submit"}],onshow:i,onsubmit:function(e){j(a,e.data.linkurl).then(function(e){a.undoManager.transact(function(){e===c.href&&(c.attach(),c={}),d.createLink(a,e)}),b()})}})};return{createQuickLinkForm:k}}),g("m",["q","r"],function(a,b){var c=function(a,b){return{rect:a,position:b}},d=function(a,b){return{x:b.x,y:b.y,w:a.w,h:a.h}},e=function(b,e,f,g,h){var i,j,k;return i=a.findBestRelativePosition(h,f,g,b),f=a.clamp(f,g),i?(j=a.relativePosition(h,f,i),k=d(h,j),c(k,i)):(f=a.intersect(g,f),f?(i=a.findBestRelativePosition(h,f,g,e))?(j=a.relativePosition(h,f,i),k=d(h,j),c(k,i)):(k=d(h,f),c(k,i)):null)},f=function(a,b,c){return e(["cr-cl","cl-cr"],["bc-tc","bl-tl","br-tr"],a,b,c)},g=function(a,b,c){return e(["tc-bc","bc-tc","tl-bl","bl-tl","tr-br","br-tr"],["bc-tc","bl-tl","br-tr"],a,b,c)},h=function(a,c,d,e){var f;return"function"==typeof a?(f=a({elementRect:b.toClientRect(c),contentAreaRect:b.toClientRect(d),panelRect:b.toClientRect(e)}),b.fromClientRect(f)):e},i=function(a){return a.panelRect};return{calcInsert:f,calc:g,userConstrain:h,defaultHandler:i}}),g("c",["g","j","i","k","l","f","m","5"],function(a,b,c,d,e,f,g,h){return function(){var i,j,k=["bold","italic","|","quicklink","h2","h3","blockquote"],l=["quickimage","quicktable"],m=function(b,c){return a.map(c,function(a){return d.create(b,a.id,a.items)})},n=function(a){return h.getToolbarItemsOr(a,"selection_toolbar",k)},o=function(a){return h.getToolbarItemsOr(a,"insert_toolbar",l)},p=function(a){return a.items().length>0},q=function(c,f){var g=m(c,f).concat([d.create(c,"text",n(c)),d.create(c,"insert",o(c)),e.createQuickLinkForm(c,B)]);return b.create({type:"floatpanel",role:"dialog",classes:"tinymce tinymce-inline arrow",ariaLabel:"Inline toolbar",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!0,border:1,items:a.grep(g,p),oncancel:function(){c.focus()}})},r=function(a){a&&a.show()},s=function(a,b){a.moveTo(b.x,b.y)},t=function(b,c){c=c?c.substr(0,2):"",a.each({t:"down",b:"up",c:"center"},function(a,d){b.classes.toggle("arrow-"+a,d===c.substr(0,1))}),"cr"===c?(b.classes.toggle("arrow-left",!0),b.classes.toggle("arrow-right",!1)):"cl"===c?(b.classes.toggle("arrow-left",!0),b.classes.toggle("arrow-right",!0)):a.each({l:"left",r:"right"},function(a,d){b.classes.toggle("arrow-"+a,d===c.substr(1,1))})},u=function(a,b){var c=a.items().filter("#"+b);return c.length>0&&(c[0].show(),a.reflow(),!0)},v=function(a,b,d,e){var i,k,l,m;return m=h.getHandlerOr(d,"inline_toolbar_position_handler",g.defaultHandler),i=f.getContentAreaRect(d),k=c.DOM.getRect(a.getEl()),l="insert"===b?g.calcInsert(e,i,k):g.calc(e,i,k),!!l&&(k=l.rect,j=e,s(a,g.userConstrain(m,e,i,k)),t(a,l.position),!0)},w=function(a,b,c,d){return r(a),a.items().hide(),u(a,b)?void(v(a,b,c,d)===!1&&B(a)):void B(a)},x=function(){return i.items().filter("form:visible").length>0},y=function(a,b){if(i){if(i.items().hide(),!u(i,b))return void B(i);var d,e,k,l;r(i),i.items().hide(),u(i,b),l=h.getHandlerOr(a,"inline_toolbar_position_handler",g.defaultHandler),d=f.getContentAreaRect(a),e=c.DOM.getRect(i.getEl()),k=g.calc(j,d,e),k&&(e=k.rect,s(i,g.userConstrain(l,j,d,e)),t(i,k.position))}},z=function(a,b,c,d){i||(i=q(a,d),i.renderTo(document.body).reflow().moveTo(c.x,c.y),a.nodeChanged()),w(i,b,a,c)},A=function(a,b,c){i&&v(i,b,a,c)},B=function(){i&&i.hide()},C=function(){i&&i.find("toolbar:visible").eq(0).each(function(a){a.focus(!0)})},D=function(){i&&(i.remove(),i=null)},E=function(){return i&&i.visible()&&x()};return{show:z,showForm:y,reposition:A,inForm:E,hide:B,focus:C,remove:D}}}),g("n",["s"],function(a){var b=function(b){return new a(function(a){var c=new FileReader;c.onloadend=function(){a(c.result.split(",")[1])},c.readAsDataURL(b)})};return{blobToBase64:b}}),g("o",["s"],function(a){var b=function(){return new a(function(a){var b;b=document.createElement("input"),b.type="file",b.style.position="fixed",b.style.left=0,b.style.top=0,b.style.opacity=.001,document.body.appendChild(b),b.onchange=function(b){a(Array.prototype.slice.call(b.target.files))},b.click(),b.parentNode.removeChild(b)})};return{pickFile:b}}),g("b",["c","n","o","p"],function(a,b,c,d){var e=function(a){for(var b=function(b){return function(){d.formatBlock(a,b)}},c=1;c<6;c++){var e="h"+c;a.addButton(e,{text:e.toUpperCase(),tooltip:"Heading "+c,stateSelector:e,onclick:b(e),onPostRender:function(){var a=this.getEl().firstChild.firstChild;a.style.fontWeight="bold"}})}},f=function(a,f){a.addButton("quicklink",{icon:"link",tooltip:"Insert/Edit link",stateSelector:"a[href]",onclick:function(){f.showForm(a,"quicklink")}}),a.addButton("quickimage",{icon:"image",tooltip:"Insert image",onclick:function(){c.pickFile().then(function(c){var e=c[0];b.blobToBase64(e).then(function(b){d.insertBlob(a,b,e)})})}}),a.addButton("quicktable",{icon:"table",tooltip:"Insert table",onclick:function(){f.hide(),d.insertTable(a,2,2)}}),e(a)};return{addToEditor:f}}),g("0",["1","2","3","4","5","6","7","8","9","a","b","c"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=function(a){var b=a.selection.getNode(),c=a.dom.getParents(b);return c},n=function(a,b,c,d){var e=function(c){return a.dom.is(c,b)};return{predicate:e,id:c,items:d}},o=function(a){var b=a.contextToolbars;return d.flatten([b?b:[],n(a,"img","image","alignleft aligncenter alignright")])},p=function(a,b){var c,d,e;return d=m(a),e=h.fromContextToolbars(b),c=g.match(a,[f.element(d[0],e),i.textSelection("text"),i.emptyTextBlock(d,"insert"),f.parent(d,e)]),c&&c.rect?c:null},q=function(a,b){var c=function(){var c=o(a),d=p(a,c);d?b.show(a,d.id,d.rect,c):b.hide()};return function(){a.removed||c()}},r=function(a,b){return function(){var c=o(a),d=p(a,c);d&&b.reposition(a,d.id,d.rect)}},s=function(a,b,c){return function(){a.removed||b.inForm()||c()}},t=function(a,b){var d=c.throttle(q(a,b),0),e=c.throttle(s(a,b,q(a,b)),0);a.on("blur hide ObjectResizeStart",b.hide),a.on("click",d),a.on("nodeChange mouseup",e),a.on("ResizeEditor keyup",d),a.on("ResizeWindow",r(a,b)),a.on("remove",b.remove),a.shortcuts.add("Alt+F10","",b.focus)},u=function(a,b){a.shortcuts.remove("meta+k"),a.shortcuts.add("meta+k","",function(){var c=o(a),d=d=g.match(a,[i.textSelection("quicklink")]);d&&b.show(a,d.id,d.rect,c)})},v=function(a,b){return j.load(a,function(){t(a,b),u(a,b)}),{}},w=function(a){throw new Error(a)};return a.add("inlite",function(a){var b=new l;k.addToEditor(a,b);var c=function(){return a.inline?v(a,b):w("inlite theme only supports inline mode.")};return{renderUI:c}}),b.appendTo(window.tinymce?window.tinymce:{}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/themes/mobile/theme.min.js b/cps/static/js/libs/tinymce/themes/mobile/theme.min.js deleted file mode 100644 index 07e35bf55..000000000 --- a/cps/static/js/libs/tinymce/themes/mobile/theme.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.7.1 (2021-03-17) - */ -!function(){"use strict";var x=function(){return(x=Object.assign||function(n){for(var e,t=1,r=arguments.length;t "+r.toString()},function(n,e){return"state("+n+")"})}).join("\n")+"}"}}},br=function(t,i){var u=function(n,e){return o=hr(t),function(t,r,n){var e=N(n,function(n,e){return o.extract(t.concat(["["+e+"]"]),r,n)});return fr(e)}(n,v,e);var o};return{extract:function(t,r,o){var n=Qe(o),e=u(t,n);return zt(e,function(n){var e=N(n,function(n){return dr.field(n,n,Qt(),i)});return yr(e).extract(t,r,o)})},toString:function(){return"setOf("+i.toString()+")"}}},xr=y(hr(Nt)),wr=dr.state,Sr=dr.field,Or=function(t,e,r,o,i){return it(o,i).fold(function(){return n=o,e=i,lr(t,function(){return'The chosen schema: "'+e+'" did not exist in branches: '+sr(n)});var n,e},function(n){return n.extract(t.concat(["branch: "+i]),e,r)})},Tr=function(o,i){return{extract:function(e,t,r){return it(r,o).fold(function(){return n=o,lr(e,function(){return'Choice schema did not contain choice key: "'+n+'"'});var n},function(n){return Or(e,t,r,i,n)})},toString:function(){return"chooseOn("+o+"). Possible values: "+Qe(i)}}},kr=hr(Nt),Er=function(e){return hr(function(n){return e(n).fold(Ht,Nt)})},Cr=function(e,n){return br(function(n){return At(e(n))},n)},Mr=function(n,e,t){return jt((r=n,o=v,i=t,u=e.extract([r],o,i),$t(u,function(n){return{input:i,errors:n}})));var r,o,i,u},Dr=function(n){return n.fold(function(n){throw new Error(Ir(n))},v)},_r=function(n,e,t){return Dr(Mr(n,e,t))},Ir=function(n){return"Errors: \n"+(e=n.errors,t=10 ")+")\n"+n.getErrorInfo()}).join("\n"))+"\n\nInput object: "+sr(n.input);var e,t},Fr=function(n,e){return Tr(n,et(e,yr))},Rr=y(kr),Vr=(Mt=I,Dt="function",hr(function(n){var e=typeof n;return Mt(n)?Nt(n):Ht("Expected type: "+Dt+" but got: "+e)})),Br=function(n){return Sr(n,n,Qt(),xr())},Ar=function(n,e){return Sr(n,n,Qt(),e)},jr=function(n,e){return Sr(n,n,Qt(),yr(e))},Nr=function(n){return Sr(n,n,Zt(),xr())},Pr=function(n,e){return Sr(n,n,Zt(),e)},Hr=function(n,e){return Pr(n,yr(e))},zr=function(n,e){return Pr(n,vr(e))},Lr=function(n,e){return Sr(n,n,Jt(e),xr())},Gr=function(n,e,t){return Sr(n,n,Jt(e),t)},$r=function(n,e){return wr(n,e)},Ur=[Br("alpha"),Br("omega")],Wr=function(n){return I(n)?n:l},Xr=function(n,e,t){var r=e(n),o=Wr(t);return r.orThunk(function(){return o(n)?T.none():function(n,e,t){for(var r=n.dom,o=Wr(t);r.parentNode;){r=r.parentNode;var i=de.fromDom(r),u=e(i);if(u.isSome())return u;if(o(i))break}return T.none()}(n,e,o)})},qr=function(n,e){return ve(n.element,e.event.target)},Yr=function(n){if(!ct(n,"can")&&!ct(n,"abort")&&!ct(n,"run"))throw new Error("EventHandler defined by: "+JSON.stringify(n,null,2)+" does not have can, abort, or run!");return _r("Extracting event.handler",vr([Lr("can",w),Lr("abort",l),Lr("run",O)]),n)},Kr=function(t){var e,r,o,i,n=(r=function(n){return n.can},function(){for(var t=[],n=0;n=r.length&&t.substr(o,o+r.length)===r?n.substring(0,n.length-"/*".length):n;var e,t,r,o})},so=function(n,e){var t=n.toString(),r=t.indexOf(")")+1,o=t.indexOf("("),i=t.substring(o+1,r-1).split(/,\s*/);return n.toFunctionAnnotation=function(){return{name:e,parameters:fo(i)}},n},lo=function(n){return{classes:n.classes!==undefined?n.classes:[],attributes:n.attributes!==undefined?n.attributes:{},styles:n.styles!==undefined?n.styles:{}}},mo=function(t,r,o){return co(function(n,e){o(n,t,r)})},go=function(o,i,u){var n,e,t,r,c,a;return n=function(t){for(var n=[],e=1;e"}),Rr()),Xa=$r("schema",function(){return[Nr("preprocess")]}),qa=Lr("defaults",y({})),Ya=Lr("overrides",y({})),Ka=yr([Ga,$a,Ua,Wa,qa,Ya]),Ja=yr([Ga,$a,Ua,qa,Ya]),Qa=yr([Ga,$a,Ua,Wa,qa,Ya]),Za=yr([Ga,Xa,Ua,Br("unit"),Wa,qa,Ya]),nf=function(n){var e=function(n){return n.name};return n.fold(e,e,e,e)},ef=function(t,r){return function(n){var e=_r("Converting part type",r,n);return t(e)}},tf=ef(La.required,Ka),rf=(ef(La.external,Ja),ef(La.optional,Qa)),of=ef(La.group,Za),uf=y("entirety"),cf=function(n,e,t,r){return qt(e.defaults(n,t,r),t,{uid:n.partUids[e.name]},e.overrides(n,t,r))},af=function(o,n){var e={};return P(n,function(n){n.fold(T.some,T.none,T.some,T.some).each(function(t){var r=ff(o,t.pname);e[t.name]=function(n){var e=_r("Part: "+t.name+" in "+o,yr(t.schema),n);return x(x({},r),{config:n,validated:e})}})}),e},ff=function(n,e){return{uiType:Pa(),owner:n,name:e}},sf=function(n,e,t){return r=e,i={},o={},P(t,function(n){n.fold(function(r){i[r.pname]=ja(!0,function(n,e,t){return r.factory.sketch(cf(n,r,e,t))})},function(n){var e=r.parts[n.name];o[n.name]=y(n.factory.sketch(cf(r,n,e[uf()]),e))},function(r){i[r.pname]=ja(!1,function(n,e,t){return r.factory.sketch(cf(n,r,e,t))})},function(o){i[o.pname]=Na(!0,function(e,n,t){var r=e[o.name];return N(r,function(n){return o.factory.sketch(qt(o.defaults(e,n,t),n,o.overrides(e,n)))})})})}),{internals:y(i),externals:y(o)};var r,i,o},lf=function(n,e,t){return Aa(T.some(n),e,e.components,t)},df=function(n,e,t){var r=e.partUids[t];return n.getSystem().getByUid(r).toOptional()},mf=function(n,e,t){return df(n,e,t).getOrDie("Could not find part: "+t)},gf=function(e,n){var t=N(n,nf);return ir(N(t,function(n){return{key:n,value:e+"-"+n}}))},pf=function(e){return Sr("partUids","partUids",er(function(n){return gf(n.uid,e)}),Rr())},hf=za("alloy-premade"),vf=function(n){return or(hf,n)},yf=function(r){return n=function(n){for(var e=[],t=1;t')},function(n){return Af(''+n+"")})},zf=function(n,e,t,r){return Rf.sketch({dom:Hf(n,r),action:e,buttonBehaviours:qt(bo([Vf.config({})]),t)})},Lf=rf({schema:[Br("dom")],name:"label"}),Gf=function(e){return rf({name:e+"-edge",overrides:function(n){return n.model.manager.edgeActions[e].fold(function(){return{}},function(r){return{events:Jr([no(_n(),function(n,e,t){return r(n,t)},[n]),no(Rn(),function(n,e,t){return r(n,t)},[n]),no(Vn(),function(n,e,t){t.mouseIsDown.get()&&r(n,t)},[n])])}})}})},$f=Gf("top-left"),Uf=Gf("top"),Wf=Gf("top-right"),Xf=Gf("right"),qf=Gf("bottom-right"),Yf=Gf("bottom"),Kf=Gf("bottom-left"),Jf=[Lf,Gf("left"),Xf,Uf,Yf,$f,Wf,Kf,qf,tf({name:"thumb",defaults:y({dom:{styles:{position:"absolute"}}}),overrides:function(n){return{events:Jr([ro(_n(),n,"spectrum"),ro(In(),n,"spectrum"),ro(Fn(),n,"spectrum"),ro(Rn(),n,"spectrum"),ro(Vn(),n,"spectrum"),ro(Bn(),n,"spectrum")])}}}),tf({schema:[$r("mouseIsDown",function(){return ko(!1)})],name:"spectrum",overrides:function(t){var r=t.model.manager,o=function(e,n){return r.getValueFromEvent(n).map(function(n){return r.setValueFrom(e,t,n)})};return{behaviours:bo([ka.config({mode:"special",onLeft:function(n){return r.onLeft(n,t)},onRight:function(n){return r.onRight(n,t)},onUp:function(n){return r.onUp(n,t)},onDown:function(n){return r.onDown(n,t)}}),_i.config({})]),events:Jr([Zr(_n(),o),Zr(In(),o),Zr(Rn(),o),Zr(Vn(),function(n,e){t.mouseIsDown.get()&&o(n,e)})])}}})],Qf=function(n,e,t){e.store.manager.onLoad(n,e,t)},Zf=function(n,e,t){e.store.manager.onUnload(n,e,t)},ns=/* */Object.freeze({__proto__:null,onLoad:Qf,onUnload:Zf,setValue:function(n,e,t,r){e.store.manager.setValue(n,e,t,r)},getValue:function(n,e,t){return e.store.manager.getValue(n,e,t)},getState:function(n,e,t){return t}}),es=/* */Object.freeze({__proto__:null,events:function(t,r){var n=t.resetOnDom?[io(function(n,e){Qf(n,t,r)}),uo(function(n,e){Zf(n,t,r)})]:[mo(t,r,Qf)];return Jr(n)}}),ts=function(){var n=ko(null);return yo({set:n.set,get:n.get,isNotSet:function(){return null===n.get()},clear:function(){n.set(null)},readState:function(){return{mode:"memory",value:n.get()}}})},rs=function(){var i=ko({}),u=ko({});return yo({readState:function(){return{mode:"dataset",dataByValue:i.get(),dataByText:u.get()}},lookup:function(n){return it(i.get(),n).orThunk(function(){return it(u.get(),n)})},update:function(n){var e=i.get(),t=u.get(),r={},o={};P(n,function(e){r[e.value]=e,it(e,"meta").each(function(n){it(n,"text").each(function(n){o[n]=e})})}),i.set(x(x({},e),r)),u.set(x(x({},t),o))},clear:function(){i.set({}),u.set({})}})},os=/* */Object.freeze({__proto__:null,memory:ts,dataset:rs,manual:function(){return yo({readState:O})},init:function(n){return n.store.manager.state(n)}}),is=function(n,e,t,r){var o=e.store;t.update([r]),o.setValue(n,r),e.onSetValue(n,r)},us=[Nr("initialValue"),Br("getFallbackEntry"),Br("getDataKey"),Br("setValue"),ri("manager",{setValue:is,getValue:function(n,e,t){var r=e.store,o=r.getDataKey(n);return t.lookup(o).fold(function(){return r.getFallbackEntry(o)},function(n){return n})},onLoad:function(e,t,r){t.store.initialValue.each(function(n){is(e,t,r,n)})},onUnload:function(n,e,t){t.clear()},state:rs})],cs=[Br("getValue"),Lr("setValue",O),Nr("initialValue"),ri("manager",{setValue:function(n,e,t,r){e.store.setValue(n,r),e.onSetValue(n,r)},getValue:function(n,e,t){return e.store.getValue(n)},onLoad:function(e,t,n){t.store.initialValue.each(function(n){t.store.setValue(e,n)})},onUnload:O,state:vo.init})],as=[Nr("initialValue"),ri("manager",{setValue:function(n,e,t,r){t.set(r),e.onSetValue(n,r)},getValue:function(n,e,t){return t.get()},onLoad:function(n,e,t){e.store.initialValue.each(function(n){t.isNotSet()&&t.set(n)})},onUnload:function(n,e,t){t.clear()},state:ts})],fs=[Gr("store",{mode:"memory"},Fr("mode",{memory:as,manual:cs,dataset:us})),Zo("onSetValue"),Lr("resetOnDom",!1)],ss=wo({fields:fs,name:"representing",active:es,apis:ns,extra:{setValueFrom:function(n,e){var t=ss.getValue(e);ss.setValue(n,t)}},state:os}),ls=Hi("width",function(n){return n.dom.offsetWidth}),ds=function(n,e){return ls.set(n,e)},ms=function(n){return ls.get(n)},gs=function(t,r){return{left:t,top:r,translate:function(n,e){return gs(t+n,r+e)}}},ps=gs,hs=y("slider.change.value"),vs=function(n){var e=n.event.raw;return-1===e.type.indexOf("touch")?e.clientX!==undefined?T.some(e).map(function(n){return ps(n.clientX,n.clientY)}):T.none():e.touches!==undefined&&1===e.touches.length?T.some(e.touches[0]).map(function(n){return ps(n.clientX,n.clientY)}):T.none()},ys=function(n){return n.model.minX},bs=function(n){return n.model.minY},xs=function(n){return n.model.minX-1},ws=function(n){return n.model.minY-1},Ss=function(n){return n.model.maxX},Os=function(n){return n.model.maxY},Ts=function(n){return n.model.maxX+1},ks=function(n){return n.model.maxY+1},Es=function(n,e,t){return e(n)-t(n)},Cs=function(n){return Es(n,Ss,ys)},Ms=function(n){return Es(n,Os,bs)},Ds=function(n){return Cs(n)/2},_s=function(n){return Ms(n)/2},Is=function(n){return n.stepSize},Fs=function(n){return n.snapToGrid},Rs=function(n){return n.snapStart},Vs=function(n){return n.rounded},Bs=function(n,e){return n[e+"-edge"]!==undefined},As=function(n){return Bs(n,"left")},js=function(n){return Bs(n,"right")},Ns=function(n){return Bs(n,"top")},Ps=function(n){return Bs(n,"bottom")},Hs=function(n){return n.model.value.get()},zs=function(n){return{x:n}},Ls=function(n){return{y:n}},Gs=function(n,e){return{x:n,y:e}},$s=function(n,e){ce(n,hs(),{value:e})},Us=function(n,e,t,r){return n

'),components:[Ll.parts["left-edge"](jf('
')),Ll.parts.spectrum({dom:Af('
'),components:[jf('
')],behaviours:bo([bi.config({toggleClass:Ti("thumb-active")})])}),Ll.parts["right-edge"](jf('
')),Ll.parts.thumb({dom:Af('
'),behaviours:bo([bi.config({toggleClass:Ti("thumb-active")})])})],onChange:function(n,e,t){var r=i(t.x());Ri(e.element,"background-color",r),o.onChange(n,e,r)},onDragStart:function(n,e){bi.on(e)},onDragEnd:function(n,e){bi.off(e)},onInit:function(n,e,t,r){var o=i(r.x());Ri(e.element,"background-color",o)},stepSize:10,model:{mode:"x",minX:0,maxX:360,getInitialValue:function(){return{x:o.getInitialValue()}}},sliderBehaviours:bo([wi(Ll.refresh)])}))];var o,i},Ul=["9px","10px","11px","12px","14px","16px","18px","20px","24px","32px","36px"],Wl=function(e,n){return(xe(n)?T.some(n):Ee(n).filter(xe)).map(function(n){return Wi(function(n,e){return e(n)},Yi,n,function(n){return ji(n,"font-size").isSome()},e).bind(function(n){return ji(n,"font-size")}).getOrThunk(function(){return Bi(n,"font-size")})}).getOr("")},Xl=function(n){var e=n.selection.getStart(),t=de.fromDom(e),r=de.fromDom(n.getBody()),o=Wl(function(n){return ve(r,n)},t);return G(Ul,function(n){return o===n}).getOr("medium")},ql=function(n){var e,t=Xl(n);return e=t,$(Ul,function(n){return n===e}).getOr(2)},Yl=function(r,n){var e;e=n,T.from(Ul[e]).each(function(n){var e,t;t=n,Xl(e=r)!==t&&e.execCommand("fontSize",!1,t)})},Kl=y(Ul),Jl=vr([Br("getInitialValue"),Br("onChange"),Br("category"),Br("sizes")]),Ql=function(n){var i=_r("SizeSlider",Jl,n);return Ll.sketch({dom:{tag:"div",classes:[Ti("slider-"+i.category+"-size-container"),Ti("slider"),Ti("slider-size-container")]},onChange:function(n,e,t){var r,o=t.x();0<=(r=o)&&r
'),components:[jf('
')]}),Ll.parts.thumb({dom:Af('
'),behaviours:bo([bi.config({toggleClass:Ti("thumb-active")})])})]})},Zl=Kl(),nd=function(n){return[jf(''),Ql({onChange:(e=n).onChange,sizes:Zl,category:"font",getInitialValue:e.getInitialValue}),jf('')];var e},ed=function(n){var e=n.uid!==undefined&&ct(n,"uid")?n.uid:kf("memento");return{get:function(n){return n.getSystem().getByUid(e).getOrDie()},getOpt:function(n){return n.getSystem().getByUid(e).toOptional()},asSpec:function(){return x(x({},n),{uid:e})}}},td=window.Promise?window.Promise:(Uu=function(n){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof n)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],Ku(n,qu(od,this),qu(id,this))},Wu=window,Xu=Uu.immediateFn||"function"==typeof Wu.setImmediate&&Wu.setImmediate||function(n){return setTimeout(n,1)},qu=function(t,r){return function(){for(var n=[],e=0;e'),action:function(n){var e=t.get(n);ss.setValue(e,"")}}));return{name:n,spec:Md.sketch({dom:Af('
'),components:[t.asSpec(),r.asSpec()],containerBehaviours:bo([bi.config({toggleClass:Ti("input-container-empty")}),Cd.config({find:function(n){return T.some(t.get(n))}}),Td("input-clearing",[Zr(Pn(),function(n){var e=t.get(n);(0"},tm=function(o,n){return{uid:o.uid,dom:o.dom,components:n,behaviours:Ma(o.formBehaviours,[ss.config({store:{mode:"manual",getValue:function(n){var e,t,r=(e=o,t=n.getSystem(),et(e.partUids,function(n,e){return y(t.getByUid(n))}));return et(r,function(n,o){return n().bind(function(n){var e,t,r=Cd.getCurrent(n);return e=r,t=new Error("Cannot find a current component to extract the value from for form part '"+o+"': "+Ho(n.element)),e.fold(function(){return Ct.error(t)},Ct.value)}).map(ss.getValue)})},setValue:function(t,n){nt(n,function(e,n){df(t,o,n).each(function(n){Cd.getCurrent(n).each(function(n){ss.setValue(n,e)})})})}}})]),apis:{getField:function(n,e){return df(n,o,e).bind(Cd.getCurrent)}}}},rm=(yf(function(n,e,t){return n.getField(e,t)}),function(n){var i,e=(i=[],{field:function(n,e){return i.push(n),t="form",r=em(n),o=e,{uiType:Pa(),owner:t,name:r,config:o,validated:{}};var t,r,o},record:function(){return i}}),t=n(e),r=e.record(),o=N(r,function(n){return tf({name:n,pname:em(n)})});return Cf("form",nm,o,tm,t)}),om=function(){var e=ko(T.none()),t=function(){return e.get().each(function(n){return n.destroy()})};return{clear:function(){t(),e.set(T.none())},isSet:function(){return e.get().isSome()},set:function(n){t(),e.set(T.some(n))},run:function(n){return e.get().each(n)}}},im=function(){var e=ko(T.none());return{clear:function(){return e.set(T.none())},set:function(n){return e.set(T.some(n))},isSet:function(){return e.get().isSome()},on:function(n){return e.get().each(n)}}},um=function(n){var r="navigateEvent",e=yr([Br("fields"),Lr("maxFieldIndex",n.fields.length-1),Br("onExecute"),Br("getInitialValue"),$r("state",function(){return{dialogSwipeState:im(),currentScreen:ko(0)}})]),u=_r("SerialisedDialog",e,n),o=function(e,n,t){return Rf.sketch({dom:Af(''),action:function(n){ce(n,r,{direction:e})},buttonBehaviours:bo([Zd.config({disableClass:Ti("toolbar-navigation-disabled"),disabled:function(){return!t}})])})},i=function(n,o){var i=Ui(n.element,"."+Ti("serialised-dialog-screen"));Qi(n.element,"."+Ti("serialised-dialog-chain")).each(function(r){0<=u.state.currentScreen.get()+o&&u.state.currentScreen.get()+o
'),components:[Md.sketch({dom:Af('
'),components:N(u.fields,function(n,e){return e<=u.maxFieldIndex?Md.sketch({dom:Af('
'),components:[o(-1,"previous",0
'),behaviours:bo([Fu.config({highlightClass:Ti("dot-active"),itemClass:Ti("dot-item")})]),components:W(u.fields,function(n,e){return e<=u.maxFieldIndex?[jf('
')]:[]})});return{dom:Af('
'),components:[a.asSpec(),f.asSpec()],behaviours:bo([ka.config({mode:"special",focusIn:function(n){var e=a.get(n);ka.focusIn(e)}}),Td("serializer-wrapper-events",[Zr(_n(),function(n,e){var t=e.event;u.state.dialogSwipeState.set({xValue:t.raw.touches[0].clientX,points:[]})}),Zr(In(),function(n,e){var t=e.event;u.state.dialogSwipeState.on(function(n){e.event.prevent(),u.state.dialogSwipeState.set(function(n,e){if(e===n.xValue)return n;var t=0 "):r[0].name;return or(o,{handler:e,purpose:t})})});return ur(e,{})},Sm="alloy.base.behaviour",Om=function(n){var e,t;return Mr("custom.definition",yr([Sr("dom","dom",Qt(),yr([Br("tag"),Lr("styles",{}),Lr("classes",[]),Lr("attributes",{}),Nr("value"),Nr("innerHtml")])),Br("components"),Br("uid"),Lr("events",{}),Lr("apis",{}),Sr("eventOrder","eventOrder",((e={})[Kn()]=["disabling",Sm,"toggling","typeaheadevents"],e[Wn()]=[Sm,"focusing","keying"],e[ne()]=[Sm,"disabling","toggling","representing"],e[Pn()]=[Sm,"representing","streaming","invalidating"],e[te()]=[Sm,"representing","item-events","tooltipping"],e[Rn()]=["focusing",Sm,"item-type-events"],e[_n()]=["focusing",Sm,"item-type-events"],e[An()]=["item-type-events","tooltipping"],e[Yn()]=["receiving","reflecting","tooltipping"],t=e,Kt.mergeWithThunk(y(t))),Rr()),Nr("domModification")]),n)},Tm=function(e,n){P(n,function(n){bt(e,n)})},km=function(e,n){P(n,function(n){wt(e,n)})},Em=function(n,e){return t=n,o=N(r=e,function(n){return Hr(n.name(),[Br("config"),Lr("state",vo)])}),i=Mr("component.behaviours",yr(o),t.behaviours).fold(function(n){throw new Error(Ir(n)+"\nComplete spec:\n"+JSON.stringify(t,null,2))},function(n){return n}),{list:r,data:et(i,function(n){var e=n.map(function(n){return{config:n.config,state:n.state.init(n.config)}});return function(){return e}})};var t,r,o,i},Cm=function(n){var e,t,r=(e=it(n,"behaviours").getOr({}),t=H(Qe(e),function(n){return e[n]!==undefined}),N(t,function(n){return e[n].me}));return Em(n,r)},Mm=function(n,e,t){var r,o,i,u=x(x({},(r=n).dom),{uid:r.uid,domChildren:N(r.components,function(n){return n.element})}),c=n.domModification.fold(function(){return lo({})},lo),a={"alloy.base.modification":c},f=0");r[t[0]]=or(t[1],n),r[t[1]]=or(t[0],n)}),r},createBistate:function(n,e,t){return ir([{key:n,value:or(e,t)},{key:e,value:or(n,t)}])},createTristate:function(n,e,t,r){return ir([{key:n,value:ir([{key:e,value:r},{key:t,value:r}])},{key:e,value:ir([{key:n,value:r},{key:t,value:r}])},{key:t,value:ir([{key:n,value:r},{key:e,value:r}])}])}}}),xg=Ti("scrollable"),wg=function(n){bt(n,xg)},Sg=function(n){wt(n,xg)},Og=xg,Tg=function(n){return it(n,"format").getOr(n.title)},kg=function(n,e,t,r,o){return{data:{value:n,text:e},type:"item",dom:{tag:"div",classes:o?[Ti("styles-item-is-menu")]:[]},toggling:{toggleOnExecute:!1,toggleClass:Ti("format-matches"),selected:t},itemBehaviours:bo(o?[]:[xi(n,function(n,e){(e?bi.on:bi.off)(n)})]),components:[{dom:{tag:"div",attributes:{style:r},innerHtml:e}}]}},Eg=function(n,e,t,r){return{value:n,dom:{tag:"div"},components:[Rf.sketch({dom:{tag:"div",classes:[Ti("styles-collapser")]},components:r?[{dom:{tag:"span",classes:[Ti("styles-collapse-icon")]}},Fm(n)]:[Fm(n)],action:function(n){var e;r&&(e=t().get(n),sg.collapseMenu(e))}}),{dom:{tag:"div",classes:[Ti("styles-menu-items-container")]},components:[Qm.parts.items({})],behaviours:bo([Td("adhoc-scrollable-menu",[io(function(n,e){Ri(n.element,"overflow-y","auto"),Ri(n.element,"-webkit-overflow-scrolling","touch"),wg(n.element)}),uo(function(n){Ni(n.element,"overflow-y"),Ni(n.element,"-webkit-overflow-scrolling"),Sg(n.element)})])])}],items:e,menuBehaviours:bo([bg.config({initialState:"after",routes:bg.createTristate("before","current","after",{transition:{property:"transform",transitionClass:"transitioning"}})})])}},Cg=function(r){var o,i,n,e,t,u=(o=r.formats,i=function(){return c},n=Eg("Styles",[].concat(N(o.items,function(n){return kg(Tg(n),n.title,n.isSelected(),n.getPreview(),ct(o.expansions,Tg(n)))})),i,!1),e=et(o.menus,function(n,e){var t=N(n,function(n){return kg(Tg(n),n.title,n.isSelected!==undefined&&n.isSelected(),n.getPreview!==undefined?n.getPreview():"",ct(o.expansions,Tg(n)))});return Eg(e,t,i,!0)}),t=qt(e,or("styles",n)),{tmenu:sg.tieredData("styles",t,o.expansions)}),c=ed(sg.sketch({dom:{tag:"div",classes:[Ti("styles-menu")]},components:[],fakeFocus:!0,stayInDom:!0,onExecute:function(n,e){var t=ss.getValue(e);return r.handle(e,t.value),T.none()},onEscape:function(){return T.none()},onOpenMenu:function(n,e){var t=ms(n.element);ds(e.element,t),bg.jumpTo(e,"current")},onOpenSubmenu:function(n,e,t){var r=ms(n.element),o=Ji(e.element,'[role="menu"]').getOrDie("hacky"),i=n.getSystem().getByDom(o).getOrDie();ds(t.element,r),bg.progressTo(i,"before"),bg.jumpTo(t,"after"),bg.progressTo(t,"current")},onCollapseMenu:function(n,e,t){var r=Ji(e.element,'[role="menu"]').getOrDie("hacky"),o=n.getSystem().getByDom(r).getOrDie();bg.progressTo(o,"after"),bg.progressTo(t,"current")},navigateOnHover:!1,highlightImmediately:!0,data:u.tmenu,markers:{backgroundMenu:Ti("styles-background-menu"),menu:Ti("styles-menu"),selectedMenu:Ti("styles-selected-menu"),item:Ti("styles-item"),selectedItem:Ti("styles-selected-item")}}));return c.asSpec()},Mg=function(n){return ct(n,"items")?(t=qt(rr(e=n,["items"]),{menu:!0}),r=Dg(e.items),{item:t,menus:qt(r.menus,or(e.title,r.items)),expansions:qt(r.expansions,or(e.title,e.title))}):{item:n,menus:{},expansions:{}};var e,t,r},Dg=function(n){return z(n,function(n,e){var t=Mg(e);return{menus:qt(n.menus,t.menus),items:[t.item].concat(n.items),expansions:qt(n.expansions,t.expansions)}},{menus:{},expansions:{},items:[]})},_g=function(u){var c=function(n){return function(){return u.formatter.match(n)}},a=function(n){return function(){return u.formatter.getCssText(n)}},f=function(n){return N(n,function(n){if(ct(n,"items")){var e=f(n.items);return qt(qt(n,{isSelected:l,getPreview:y("")}),{items:e})}return ct(n,"format")?qt(i=n,{isSelected:c(i.format),getPreview:a(i.format)}):(r=za((t=n).title),o=qt(t,{format:r,isSelected:c(r),getPreview:a(r)}),u.formatter.register(r,o),o);var t,r,o,i})};return f(u.getParam("style_formats",Fo,"array"))},Ig=function(t,n,r){var e,o,i,u=(e=t,i=(o=function(n){return W(n,function(n){return n.items===undefined?!ct(n,"format")||e.formatter.canApply(n.format)?[n]:[]:0e.innerHeight||n.bottom>e.innerHeight?n.bottom-e.innerHeight+50:0;0!=t&&e.scrollTo(e.pageXOffset,e.pageYOffset+t)})})].concat(!0==_p?[]:[Hg(de.fromDom(r.win),"blur",function(){t.getByDom(e).each(bi.off)}),Hg(i,"select",n),Hg(r.doc,"selectionchange",n)]);return{destroy:function(){P(c,function(n){n.unbind()})}}},Fp=function(n,e){var t=parseInt(lt(n,e),10);return isNaN(t)?0:t},Rp=function(n){return x(x({},n),{width:2})},Vp=function(n){return{left:n.left,top:n.top,right:n.right,bottom:n.bottom,width:n.width,height:n.height}},Bp=function(n){var e=n.getSelection();return e!==undefined&&0e.innerHeight||t.bottom>e.innerHeight?Math.min(r,t.bottom-e.innerHeight+50):0);0!==o&&u.scrollTo(u.pageXOffset,u.pageYOffset+o)})}),Np(e,n.innerHeight)});Np(e,n.innerHeight);return{toEditing:function(){Ap(u)},destroy:function(){t.unbind()}}},Lp=function(t,r){var o=null;return{cancel:function(){null!==o&&(clearTimeout(o),o=null)},throttle:function(){for(var n=[],e=0;e
'),containerBehaviours:bo([bi.config({toggleClass:Ti("mask-tap-icon-selected"),toggleOnExecute:!1})])})),u=(t=n,r=200,o=null,{cancel:function(){null!==o&&(clearTimeout(o),o=null)},throttle:function(){for(var n=[],e=0;e
'),components:[Md.sketch({dom:Af('
'),components:[Rf.sketch({dom:Af('
'),components:[i.asSpec()],action:function(n){u.throttle()},buttonBehaviours:bo([bi.config({toggleClass:Ti("mask-tap-icon-selected")})])})]})]})},$p=y({unbind:O}),Up=yr([jr("editor",[Br("getFrame"),Nr("getBody"),Nr("getDoc"),Nr("getWin"),Nr("getSelection"),Nr("setSelection"),Nr("clearSelection"),Nr("cursorSaver"),Nr("onKeyup"),Nr("onNodeChanged"),Nr("getCursorBox"),Br("onDomChanged"),Lr("onTouchContent",O),Lr("onTapContent",O),Lr("onTouchToolstrip",O),Lr("onScrollToCursor",$p),Lr("onScrollToElement",$p),Lr("onToEditing",$p),Lr("onToReading",$p),Lr("onToolbarScrollStart",v)]),Br("socket"),Br("toolstrip"),Br("dropup"),Br("toolbar"),Br("container"),Br("alloy"),$r("win",function(n){return Te(n.socket).dom.defaultView}),$r("body",function(n){return de.fromDom(n.socket.dom.ownerDocument.body)}),Lr("translate",v),Lr("setReadOnly",O),Lr("readOnlyOnInit",w)]),Wp=function(n){var e=_r("Getting AndroidWebapp schema",Up,n);Ri(e.toolstrip,"width","100%");var t=Bm(Gp(function(){e.setReadOnly(e.readOnlyOnInit()),f.enter()},e.translate));e.alloy.add(t);var r={show:function(){e.alloy.add(t)},hide:function(){e.alloy.remove(t)}};Fe(e.container,t.element);var o,i,u,c,a,f=(o=e,i=r,u=xp(),c=om(),a=om(),{enter:function(){i.hide(),bt(o.container,Ti("fullscreen-maximized")),bt(o.container,Ti("android-maximized")),u.maximize(),bt(o.body,Ti("android-scroll-reload")),c.set(zp(o.win,bp(o.editor).getOrDie("no"))),yp(o.editor).each(function(n){kp(o.container,n.body),a.set(Ip(n,o.toolstrip,o.alloy))})},exit:function(){u.restore(),i.show(),wt(o.container,Ti("fullscreen-maximized")),wt(o.container,Ti("android-maximized")),Ep(),wt(o.body,Ti("android-scroll-reload")),a.clear(),c.clear()}});return{setReadOnly:e.setReadOnly,refreshStructure:O,enter:f.enter,exit:f.exit,destroy:O}},Xp=y([Br("dom"),Lr("shell",!0),Ea("toolbarBehaviours",[og])]),qp=y([rf({name:"groups",overrides:function(){return{behaviours:bo([og.config({})])}}})]),Yp=Ff({name:"Toolbar",configFields:Xp(),partFields:qp(),factory:function(e,n,t,r){var o=function(n){return e.shell?T.some(n):df(n,e,"groups")},i=e.shell?{behaviours:[og.config({})],components:[]}:{behaviours:[],components:n};return{uid:e.uid,dom:e.dom,components:i.components,behaviours:Ma(e.toolbarBehaviours,i.behaviours),apis:{setGroups:function(n,e){o(n).fold(function(){throw console.error("Toolbar was defined to not be a shell, but no groups container was specified in components"),new Error("Toolbar was defined to not be a shell, but no groups container was specified in components")},function(n){og.set(n,e)})}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:function(n,e,t){n.setGroups(e,t)}}}),Kp=y([Br("items"),jr("markers",N(["itemSelector"],Br)),Ea("tgroupBehaviours",[ka])]),Jp=y([of({name:"items",unit:"item"})]),Qp=Ff({name:"ToolbarGroup",configFields:Kp(),partFields:Jp(),factory:function(n,e,t,r){return{uid:n.uid,dom:n.dom,components:e,behaviours:Ma(n.tgroupBehaviours,[ka.config({mode:"flow",selector:n.markers.itemSelector})]),domModification:{attributes:{role:"toolbar"}}}}}),Zp="data-"+Ti("horizontal-scroll"),nh=function(n){return"true"===lt(n,Zp)?0<(t=n).dom.scrollLeft||function(n){n.dom.scrollLeft=1;var e=0!==n.dom.scrollLeft;return n.dom.scrollLeft=0,e}(t):0<(e=n).dom.scrollTop||function(n){n.dom.scrollTop=1;var e=0!==n.dom.scrollTop;return n.dom.scrollTop=0,e}(e);var e,t},eh=function(){var e=function(n){var e=!0===n.scrollable?"${prefix}-toolbar-scrollable-group":"";return{dom:Af('
'),tgroupBehaviours:bo([Td("adhoc-scrollable-toolbar",!0===n.scrollable?[co(function(n,e){var t;Ri(n.element,"overflow-x","auto"),t=n.element,ft(t,Zp,"true"),wg(n.element)})]:[])]),components:[Md.sketch({components:[Qp.parts.items({})]})],markers:{itemSelector:"."+Ti("toolbar-group-item")},items:n.items}},t=Bm(Yp.sketch({dom:Af('
'),components:[Yp.parts.groups({})],toolbarBehaviours:bo([bi.config({toggleClass:Ti("context-toolbar"),toggleOnExecute:!1,aria:{mode:"none"}}),ka.config({mode:"cyclic"})]),shell:!0})),n=Bm(Md.sketch({dom:{classes:[Ti("toolstrip")]},components:[Am(t)],containerBehaviours:bo([bi.config({toggleClass:Ti("android-selection-context-toolbar"),toggleOnExecute:!1})])})),r=function(){Yp.setGroups(t,o.get()),bi.off(t)},o=ko([]);return{wrapper:n,toolbar:t,createGroups:function(n){return N(n,i(Qp.sketch,e))},setGroups:function(n){o.set(n),r()},setContextToolbar:function(n){bi.on(t),Yp.setGroups(t,n)},restoreToolbar:function(){bi.isOn(t)&&r()},refresh:function(){},focus:function(){ka.focusIn(t)}}},th=function(n){return Bm(Rf.sketch({dom:Af('
'),action:function(){n.run(function(n){n.setReadOnly(!1)})}}))},rh=function(){return Bm(Md.sketch({dom:Af('
'),components:[],containerBehaviours:bo([og.config({})])}))},oh=function(n,e){og.append(n,Am(e))},ih=function(n,e){og.remove(n,e)},uh=function(n,e,t,r){(!0===t?To.toAlpha:To.toOmega)(r),(t?oh:ih)(n,e)},ch=function(e,n){return n.getAnimationRoot.fold(function(){return e.element},function(n){return n(e)})},ah=function(n){return n.dimension.property},fh=function(n,e){return n.dimension.getDimension(e)},sh=function(n,e){var t=ch(n,e);km(t,[e.shrinkingClass,e.growingClass])},lh=function(n,e){wt(n.element,e.openClass),bt(n.element,e.closedClass),Ri(n.element,ah(e),"0px"),Pi(n.element)},dh=function(n,e){wt(n.element,e.closedClass),bt(n.element,e.openClass),Ni(n.element,ah(e))},mh=function(n,e,t,r){t.setCollapsed(),Ri(n.element,ah(e),fh(e,n.element)),Pi(n.element),sh(n,e),lh(n,e),e.onStartShrink(n),e.onShrunk(n)},gh=function(n,e,t,r){var o=r.getOrThunk(function(){return fh(e,n.element)});t.setCollapsed(),Ri(n.element,ah(e),o),Pi(n.element);var i=ch(n,e);wt(i,e.growingClass),bt(i,e.shrinkingClass),lh(n,e),e.onStartShrink(n)},ph=function(n,e,t){var r=fh(e,n.element);("0px"===r?mh:gh)(n,e,t,T.some(r))},hh=function(n,e,t){var r=ch(n,e),o=St(r,e.shrinkingClass),i=fh(e,n.element);dh(n,e);var u=fh(e,n.element);(o?function(){Ri(n.element,ah(e),i),Pi(n.element)}:function(){lh(n,e)})(),wt(r,e.shrinkingClass),bt(r,e.growingClass),dh(n,e),Ri(n.element,ah(e),u),t.setExpanded(),e.onStartGrow(n)},vh=function(n,e,t){var r=ch(n,e);return!0===St(r,e.growingClass)},yh=function(n,e,t){var r=ch(n,e);return!0===St(r,e.shrinkingClass)},bh=/* */Object.freeze({__proto__:null,refresh:function(n,e,t){var r;t.isExpanded()&&(Ni(n.element,ah(e)),r=fh(e,n.element),Ri(n.element,ah(e),r))},grow:function(n,e,t){t.isExpanded()||hh(n,e,t)},shrink:function(n,e,t){t.isExpanded()&&ph(n,e,t)},immediateShrink:function(n,e,t){t.isExpanded()&&mh(n,e,t,T.none())},hasGrown:function(n,e,t){return t.isExpanded()},hasShrunk:function(n,e,t){return t.isCollapsed()},isGrowing:vh,isShrinking:yh,isTransitioning:function(n,e,t){return vh(n,e)||yh(n,e)},toggleGrow:function(n,e,t){(t.isExpanded()?ph:hh)(n,e,t)},disableTransitions:sh}),xh=/* */Object.freeze({__proto__:null,exhibit:function(n,e,t){var r=e.expanded;return lo(r?{classes:[e.openClass],styles:{}}:{classes:[e.closedClass],styles:or(e.dimension.property,"0px")})},events:function(t,r){return Jr([(n=Ln(),eo(n)(function(n,e){e.event.raw.propertyName===t.dimension.property&&(sh(n,t),r.isExpanded()&&Ni(n.element,t.dimension.property),(r.isExpanded()?t.onGrown:t.onShrunk)(n))}))]);var n}}),wh=[Br("closedClass"),Br("openClass"),Br("shrinkingClass"),Br("growingClass"),Nr("getAnimationRoot"),Zo("onShrunk"),Zo("onStartShrink"),Zo("onGrown"),Zo("onStartGrow"),Lr("expanded",!1),Ar("dimension",Fr("property",{width:[ri("property","width"),ri("getDimension",function(n){return ms(n)+"px"})],height:[ri("property","height"),ri("getDimension",function(n){return Li(n)+"px"})]}))],Sh=wo({fields:wh,name:"sliding",active:xh,apis:bh,state:/* */Object.freeze({__proto__:null,init:function(n){var e=ko(n.expanded);return yo({isExpanded:function(){return!0===e.get()},isCollapsed:function(){return!1===e.get()},setCollapsed:b(e.set,!1),setExpanded:b(e.set,!0),readState:function(){return"expanded: "+e.get()}})}})}),Oh=function(e,t){var r=Bm(Md.sketch({dom:{tag:"div",classes:[Ti("dropup")]},components:[],containerBehaviours:bo([og.config({}),Sh.config({closedClass:Ti("dropup-closed"),openClass:Ti("dropup-open"),shrinkingClass:Ti("dropup-shrinking"),growingClass:Ti("dropup-growing"),dimension:{property:"height"},onShrunk:function(n){e(),t(),og.set(n,[])},onGrown:function(n){e(),t()}}),wi(function(n,e){o(O)})])})),o=function(n){window.requestAnimationFrame(function(){n(),Sh.shrink(r)})};return{appear:function(n,e,t){!0===Sh.hasShrunk(r)&&!1===Sh.isTransitioning(r)&&window.requestAnimationFrame(function(){e(t),og.set(r,[n()]),Sh.grow(r)})},disappear:o,component:r,element:r.element}},Th=function(n){var e,t;return n.raw.which===nu[0]&&!A(["input","textarea"],ye(n.target))&&(e=n.target,!Zi(e,'[contenteditable="true"]',t).isSome())},kh=function(){return Mn().browser.isFirefox()},Eh=vr([Ar("triggerEvent",Vr),Lr("stopBackspace",!0)]),Ch=function(e,n){var t,r,o,i,u=_r("Getting GUI events settings",Eh,n),c=Mp(u),a=N(["touchstart","touchmove","touchend","touchcancel","gesturestart","mousedown","mouseup","mouseover","mousemove","mouseout","click"].concat(["selectstart","input","contextmenu","change","transitionend","drag","dragstart","dragend","dragenter","dragleave","dragover","drop","keyup"]),function(n){return Hg(e,n,function(e){c.fireIfReady(e,n).each(function(n){n&&e.kill()}),u.triggerEvent(n,e)&&e.kill()})}),f=ko(T.none()),s=Hg(e,"paste",function(e){c.fireIfReady(e,"paste").each(function(n){n&&e.kill()}),u.triggerEvent("paste",e)&&e.kill(),f.set(T.some(setTimeout(function(){u.triggerEvent(qn(),e)},0)))}),l=Hg(e,"keydown",function(n){u.triggerEvent("keydown",n)?n.kill():!0===u.stopBackspace&&Th(n)&&n.prevent()}),d=(t=e,r=function(n){u.triggerEvent("focusin",n)&&n.kill()},kh()?zg(t,"focus",r):Hg(t,"focusin",r)),m=ko(T.none()),g=(o=e,i=function(n){u.triggerEvent("focusout",n)&&n.kill(),m.set(T.some(setTimeout(function(){u.triggerEvent(Xn(),n)},0)))},kh()?zg(o,"blur",i):Hg(o,"focusout",i));return{unbind:function(){P(a,function(n){n.unbind()}),l.unbind(),d.unbind(),g.unbind(),s.unbind(),f.get().each(clearTimeout),m.get().each(clearTimeout)}}},Mh=function(n,e){var t=it(n,"target").getOr(e);return ko(t)},Dh=Ut([{stopped:[]},{resume:["element"]},{complete:[]}]),_h=function(n,r,e,t,o,i){var u,c,a,f,s=n(r,t),l=(u=e,c=o,a=ko(!1),f=ko(!1),{stop:function(){a.set(!0)},cut:function(){f.set(!0)},isStopped:a.get,isCut:f.get,event:u,setSource:c.set,getSource:c.get});return s.fold(function(){return i.logEventNoHandlers(r,t),Dh.complete()},function(e){var t=e.descHandler;return hm(t)(l),l.isStopped()?(i.logEventStopped(r,e.element,t.purpose),Dh.stopped()):l.isCut()?(i.logEventCut(r,e.element,t.purpose),Dh.complete()):Ee(e.element).fold(function(){return i.logNoParent(r,e.element,t.purpose),Dh.complete()},function(n){return i.logEventResponse(r,e.element,t.purpose),Dh.resume(n)})})},Ih=function(e,t,r,n,o,i){return _h(e,t,r,n,o,i).fold(w,function(n){return Ih(e,t,r,n,o,i)},l)},Fh=function(n,e,t){var r,o,i=(r=e,o=ko(!1),{stop:function(){o.set(!0)},cut:O,isStopped:o.get,isCut:l,event:r,setSource:f("Cannot set source of a broadcasted event"),getSource:f("Cannot get source of a broadcasted event")});return P(n,function(n){var e=n.descHandler;hm(e)(i)}),i.isStopped()},Rh=function(n,e,t,r,o){var i=Mh(t,r);return Ih(n,e,t,r,i,o)},Vh=function(){var c={};return{registerId:function(i,u,n){nt(n,function(n,e){var t,r,o=c[e]!==undefined?c[e]:{};o[u]=(t=n,r=i,{cHandler:b.apply(undefined,[t.handler].concat(r)),purpose:t.purpose}),c[e]=o})},unregisterId:function(t){nt(c,function(n,e){n.hasOwnProperty(t)&&delete n[t]})},filterByType:function(n){return it(c,n).map(function(n){return ot(n,function(n,e){return{id:e,descHandler:n}})}).getOr([])},find:function(n,e,t){var o=it(c,e);return Xr(t,function(n){return t=o,Tf(r=n).fold(function(){return T.none()},function(e){return t.bind(function(n){return it(n,e)}).map(function(n){return{element:r,descHandler:n}})});var t,r},n)}}},Bh=function(){var r=Vh(),o={},i=function(r){var n=r.element;return Tf(n).fold(function(){return n="uid-",e=r.element,t=za(wf+n),Of(e,t),t;var n,e,t},function(n){return n})},u=function(n){Tf(n.element).each(function(n){delete o[n],r.unregisterId(n)})};return{find:function(n,e,t){return r.find(n,e,t)},filter:function(n){return r.filterByType(n)},register:function(n){var e=i(n);ct(o,e)&&function(n,e){var t=o[e];if(t!==n)throw new Error('The tagId "'+e+'" is already used by: '+Ho(t.element)+"\nCannot use it for: "+Ho(n.element)+"\nThe conflicting element is"+(Le(t.element)?" ":" not ")+"already in the DOM");u(n)}(n,e);var t=[n];r.registerId(t,e,n.events),o[e]=n},unregister:u,getById:function(n){return it(o,n)}}},Ah=function(t){var r=function(e){return Ee(t.element).fold(w,function(n){return ve(e,n)})},o=Bh(),f=function(n,e){return o.find(r,n,e)},n=Ch(t.element,{triggerEvent:function(r,o){return Wo(r,o.target,function(n){return t=n,Rh(f,r,e=o,e.target,t);var e,t})}}),i={debugInfo:y("real"),triggerEvent:function(e,t,r){Wo(e,t,function(n){return Rh(f,e,r,t,n)})},triggerFocus:function(c,a){Tf(c).fold(function(){Eo(c)},function(n){Wo(Wn(),c,function(n){var e,t,r,o,i,u;return e=f,t=Wn(),i=n,u=Mh(r={originator:a,kill:O,prevent:O,target:c},o=c),_h(e,t,r,o,u,i),!1})})},triggerEscape:function(n,e){i.triggerEvent("keydown",n.element,e.event)},getByUid:function(n){return g(n)},getByDom:function(n){return p(n)},build:Bm,addToGui:function(n){c(n)},removeFromGui:function(n){a(n)},addToWorld:function(n){e(n)},removeFromWorld:function(n){u(n)},broadcast:function(n){l(n)},broadcastOn:function(n,e){d(n,e)},broadcastEvent:function(n,e){m(n,e)},isConnected:w},e=function(n){n.connect(i),we(n.element)||(o.register(n),P(n.components(),e),i.triggerEvent(ne(),n.element,{target:n.element}))},u=function(n){we(n.element)||(P(n.components(),u),o.unregister(n)),n.disconnect()},c=function(n){Ye(t,n,Fe)},a=function(n){Ke(n)},s=function(t){var n=o.filter(Yn());P(n,function(n){var e=n.descHandler;hm(e)(t)})},l=function(n){s({universal:!0,data:n})},d=function(n,e){s({universal:!1,channels:n,data:e})},m=function(n,e){var t=o.filter(n);return Fh(t,e)},g=function(n){return o.getById(n).fold(function(){return Ct.error(new Error('Could not find component with uid: "'+n+'" in system.'))},Ct.value)},p=function(n){var e=Tf(n).getOr("not found");return g(e)};return e(t),{root:t,element:t.element,destroy:function(){n.unbind(),Be(t.element)},add:c,remove:a,getByUid:g,getByDom:p,addToWorld:e,removeFromWorld:u,broadcast:l,broadcastOn:d,broadcastEvent:m}},jh=Ti("readonly-mode"),Nh=Ti("edit-mode");function Ph(n){var e=Bm(Md.sketch({dom:{classes:[Ti("outer-container")].concat(n.classes)},containerBehaviours:bo([To.config({alpha:jh,omega:Nh})])}));return Ah(e)}var Hh=function(n,e){var t=de.fromTag("input");Vi(t,{opacity:"0",position:"absolute",top:"-1000px",left:"-1000px"}),Fe(n,t),Eo(t),e(t),Be(t)},zh=function(n){var e,t,r=n.getSelection();0o?0:o},cv=function(n,e){var t=Te(n).dom.defaultView;return Li(n)+Li(e)-uv(t)},av=function(n,e,t){var r=cv(e,t),o=Li(e)+Li(t)-r;Ri(n,"padding-bottom",o+"px")},fv=Ut([{fixed:["element","property","offsetY"]},{scroller:["element","offsetY"]}]),sv="data-"+Ti("position-y-fixed"),lv="data-"+Ti("y-property"),dv="data-"+Ti("scrolling"),mv="data-"+Ti("last-window-height"),gv=function(n){return Fp(n,sv)},pv=function(n,e){var t=lt(n,lv);return fv.fixed(n,t,e)},hv=function(n,e){return fv.scroller(n,e)},vv=function(n){var e=gv(n);return("true"===lt(n,dv)?hv:pv)(n,e)},yv=function(n,e,t){var r=Te(n).dom.defaultView.innerHeight;return ft(n,mv,r+"px"),r-e-t},bv=function(r,o,i,u){var e=Te(r).dom.defaultView,n=function(n){var e=lt(n,"style");Vi(n,{position:"absolute",top:"0px"}),ft(n,sv,"0px"),ft(n,lv,"top");return{restore:function(){ft(n,"style",e||""),gt(n,sv),gt(n,lv)}}}(i),t=Li(i),c=Li(u),a=function(n,e,t){var r=lt(t,"style");wg(t),Vi(t,{position:"absolute",height:e+"px",width:"100%",top:n+"px"}),ft(t,sv,n+"px"),ft(t,dv,"true"),ft(t,lv,"top");return{restore:function(){Sg(t),ft(t,"style",r||""),gt(t,sv),gt(t,dv),gt(t,lv)}}}(t,yv(r,t,c),r),f=function(n){var e=lt(n,"style");Vi(n,{position:"absolute",bottom:"0px"}),ft(n,sv,"0px"),ft(n,lv,"bottom");return{restore:function(){ft(n,"style",e||""),gt(n,sv),gt(n,lv)}}}(u),s=!0,l=function(){var n=e.innerHeight;return Fp(r,mv)Math.abs(r-i))&&(Lg.clearInterval(Jh),f(i))})},n)}}),wv="data-"+Ti("last-scroll-top"),Sv=function(n){var e=ji(n,"top").getOr("0");return parseInt(e,10)},Ov=function(n){return parseInt(n.dom.scrollTop,10)},Tv=function(o,i){return rv(function(n){var e=b(Ov,o);ft(o,wv,e());var t=Math.abs(i-e()),r=Math.ceil(t/10);xv.animate(e,i,r,function(n,e){Fp(o,wv)!==o.dom.scrollTop?e(o.dom.scrollTop):(o.dom.scrollTop=n,ft(o,wv,n))},function(){o.dom.scrollTop=i,ft(o,wv,i),n(i)},10)})},kv=function(n,e){var t=e+gv(n)+"px";Ri(n,"top",t)};var Ev=function(u,n){return n(function(r){var o=[],i=0;0===u.length?r([]):P(u,function(n,e){var t;n.get((t=e,function(n){o[t]=n,++i>=u.length&&r(o)}))})})},Cv=function(n,e,t){var r,o,i,u=e+t,c=ji(n,"top").getOr(t),a=u-parseInt(c,10),f=n.dom.scrollTop+a;return r=n,o=f,i=u,rv(function(n){var e=b(Ov,r);xv.animate(e,o,15,function(n){r.dom.scrollTop=n,Ri(r,"top",Sv(r)+15+"px")},function(){r.dom.scrollTop=o,Ri(r,"top",i+"px"),n(o)},10)})},Mv=function(n,o){return n.fold(function(n,e,t){return Ri(n,e,o+(r=t)+"px"),ov(r);var r},function(n,e){return Cv(n,o,e)})},Dv=function(n,e){var t,r=(t=Ui(n,"["+sv+"]"),N(t,vv)),o=N(r,function(n){return Mv(n,e)});return Ev(o,rv)},_v=function(i,u,n,t,e,r){var o,c,a=(o=function(n){return t=u,r=n,o=Te(e=i).dom.defaultView,rv(function(n){kv(e,r),kv(t,r),o.scrollTo(0,r),n(r)});var e,t,r,o},c=ko(nv.pure({})),{start:function(e){var n=nv.nu(function(n){return o(e).get(n)});c.set(n)},idle:function(n){c.get().get(function(){n()})}}),f=Lp(function(){a.idle(function(){Dv(n,t.pageYOffset).get(function(){var n;(n=Bp(r),T.from(n[0]).bind(function(n){var e=n.top-u.dom.scrollTop;return e>t.innerHeight+5||e<-5?T.some({top:e,bottom:e+n.height}):T.none()})).each(function(n){u.dom.scrollTop=u.dom.scrollTop+n.top}),a.start(0),e.refresh()})})},1e3),s=Hg(de.fromDom(t),"scroll",function(){t.pageYOffset<0||f.throttle()});return Dv(n,t.pageYOffset).get(v),{unbind:s.unbind}},Iv=function(n){var a=n.cWin,e=n.ceBody,f=n.socket,t=n.toolstrip,r=n.contentElement,o=n.keyboardType,i=n.outerWindow,s=n.dropup,u=n.outerBody,c=bv(f,e,t,s),l=o(u,a,Ge(),r),d=$g(i,{onChange:O,onReady:c.refresh});d.onAdjustment(function(){c.refresh()});var m=Hg(de.fromDom(i),"resize",function(){c.isExpanding()&&c.refresh()}),g=_v(t,f,u,i,c,a),p=function(t,e){var n=t.document,r=de.fromTag("div");bt(r,Ti("unfocused-selections")),Fe(de.fromDom(n.documentElement),r);var o=Hg(r,"touchstart",function(n){n.prevent(),Lh(t,e),u()}),i=function(n){var e=de.fromTag("span");return Tm(e,[Ti("layer-editor"),Ti("unfocused-selection")]),Vi(e,{left:n.left+"px",top:n.top+"px",width:n.width+"px",height:n.height+"px"}),e},u=function(){Ve(r)};return{update:function(){u();var n=Bp(t),e=N(n,i);Re(r,e)},isActive:function(){return 0=0;c--)for(d=f.length-1;d>=0;d--)if(f[d].predicate(e[c]))return{toolbar:f[d],element:e[c]};return null};a.on("click keyup setContent ObjectResized",function(b){("setcontent"!==b.type||b.selection)&&c.setEditorTimeout(a,function(){var b;b=u(a.selection.getNode()),b?(t(),s(b)):t()})}),a.on("blur hide contextmenu",t),a.on("ObjectResizeStart",function(){var b=u(a.selection.getNode());b&&b.toolbar.panel&&b.toolbar.panel.hide()}),a.on("ResizeEditor ResizeWindow",q(!0)),a.on("nodeChange",q(!1)),a.on("remove",function(){b.each(n(),function(a){a.panel&&a.panel.remove()}),a.contextToolbars={}}),a.shortcuts.add("ctrl+shift+e > ctrl+shift+p","",function(){var b=u(a.selection.getNode());b&&b.toolbar.panel&&b.toolbar.panel.items()[0].focus()})};return{addContextualToolbars:m}}),g("h",["d"],function(a){var b={file:{title:"File",items:"newdocument"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall"},insert:{title:"Insert",items:"|"},view:{title:"View",items:"visualaid |"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript | formats | removeformat"},table:{title:"Table"},tools:{title:"Tools"}},c=function(a,b){var c;return"|"==b?{text:"|"}:c=a[b]},d=function(d,e,f){var g,h,i,j,k;if(k=a.makeMap((e.removed_menuitems||"").split(/[ ,]/)),e.menu?(h=e.menu[f],j=!0):h=b[f],h){g={text:h.title},i=[],a.each((h.items||"").split(/[ ,]/),function(a){var b=c(d,a);b&&!k[a]&&i.push(c(d,a))}),j||a.each(d,function(a){a.context==f&&("before"==a.separator&&i.push({text:"|"}),a.prependToContext?i.unshift(a):i.push(a),"after"==a.separator&&i.push({text:"|"}))});for(var l=0;l=11},k=function(a){return!(!j()||!a.sidebars)&&a.sidebars.length>0},l=function(b){var c=a.map(b.sidebars,function(a){var c=a.settings;return{type:"button",icon:c.icon,image:c.image,tooltip:c.tooltip,onclick:i(b,a.name,b.sidebars)}});return{type:"panel",name:"sidebar",layout:"stack",classes:"sidebar",items:[{type:"toolbar",layout:"stack",classes:"sidebar-toolbar",items:c}]}};return{hasSidebar:k,createSidebar:l}}),g("j",[],function(){var a=function(a){var b=function(){a._skinLoaded=!0,a.fire("SkinLoaded")};return function(){a.initialized?b():a.on("init",b)}};return{fireSkinLoaded:a}}),g("6",["b","c","d","e","f","g","h","9","i","j","k"],function(a,b,c,d,e,f,g,h,i,j,k){var l=a.DOM,m=function(a){return function(b){a.find("*").disabled("readonly"===b.mode)}},n=function(a){return{type:"panel",name:"iframe",layout:"stack",classes:"edit-area",border:a,html:""}},o=function(a){return{type:"panel",layout:"stack",classes:"edit-aria-container",border:"1 0 0 0",items:[n("0"),i.createSidebar(a)]}},p=function(a,c,p){var q,r,s,t=a.settings;return p.skinUiCss&&l.styleSheetLoader.load(p.skinUiCss,j.fireSkinLoaded(a)),q=c.panel=b.create({type:"panel",role:"application",classes:"tinymce",style:"visibility: hidden",layout:"stack",border:1,items:[t.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:g.createMenuButtons(a)},k.createToolbars(a,t.toolbar_items_size),i.hasSidebar(a)?o(a):n("1 0 0 0")]}),t.resize!==!1&&(r={type:"resizehandle",direction:t.resize,onResizeStart:function(){var b=a.getContentAreaContainer().firstChild;s={width:b.clientWidth,height:b.clientHeight}},onResize:function(b){"both"===t.resize?h.resizeTo(a,s.width+b.deltaX,s.height+b.deltaY):h.resizeTo(a,null,s.height+b.deltaY)}}),t.statusbar!==!1&&q.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath",editor:a},r]}),a.fire("BeforeRenderUI"),a.on("SwitchMode",m(q)),q.renderBefore(p.targetNode).reflow(),t.readonly&&a.setMode("readonly"),p.width&&l.setStyle(q.getEl(),"width",p.width),a.on("remove",function(){q.remove(),q=null}),d.addKeys(a,q),f.addContextualToolbars(a),e.setup(a),{iframeContainer:q.find("#iframe")[0].getEl(),editorContainer:q.getEl()}};return{render:p}}),g("l",["a"],function(a){return a("tinymce.ui.FloatPanel")}),g("7",["d","c","b","l","k","h","g","e","j"],function(a,b,c,d,e,f,g,h,i){var j=function(a,j,k){var l,m,n=a.settings,o=c.DOM;n.fixed_toolbar_container&&(m=o.select(n.fixed_toolbar_container)[0]);var p=function(){if(l&&l.moveRel&&l.visible()&&!l._fixed){var b=a.selection.getScrollContainer(),c=a.getBody(),d=0,e=0;if(b){var f=o.getPos(c),g=o.getPos(b);d=Math.max(0,g.x-f.x),e=Math.max(0,g.y-f.y)}l.fixed(!1).moveRel(c,a.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(d,e)}},q=function(){l&&(l.show(),p(),o.addClass(a.getBody(),"mce-edit-focus"))},r=function(){l&&(l.hide(),d.hideAll(),o.removeClass(a.getBody(),"mce-edit-focus"))},s=function(){return l?void(l.visible()||q()):(l=j.panel=b.create({type:m?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!!m,border:1,items:[n.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:f.createMenuButtons(a)},e.createToolbars(a,n.toolbar_items_size)]}),a.fire("BeforeRenderUI"),l.renderTo(m||document.body).reflow(),h.addKeys(a,l),q(),g.addContextualToolbars(a),a.on("nodeChange",p),a.on("activate",q),a.on("deactivate",r),void a.nodeChanged())};return n.content_editable=!0,a.on("focus",function(){k.skinUiCss?o.styleSheetLoader.load(k.skinUiCss,s,s):s()}),a.on("blur hide",r),a.on("remove",function(){l&&(l.remove(),l=null)}),k.skinUiCss&&o.styleSheetLoader.load(k.skinUiCss,i.fireSkinLoaded(a)),{}};return{render:j}}),g("m",["a"],function(a){return a("tinymce.ui.Throbber")}),g("8",["m"],function(a){var b=function(b,c){var d;b.on("ProgressState",function(b){d=d||new a(c.panel.getEl("body")),b.state?d.show(b.time):d.hide()})};return{setup:b}}),g("0",["1","2","3","4","5","6","7","8","9"],function(a,b,c,d,e,f,g,h,i){var j=b.ThemeManager;e.appendTo(a.tinymce?a.tinymce:{});var k=function(a,b,d){var e=a.settings,i=e.skin!==!1&&(e.skin||"lightgray");if(i){var j=e.skin_url;j=j?a.documentBaseURI.toAbsolute(j):c.baseURL+"/skins/"+i,d.skinUiCss=j+"/skin.min.css",a.contentCSS.push(j+"/content"+(a.inline?".inline":"")+".min.css")}return h.setup(a,b),e.inline?g.render(a,b,d):f.render(a,b,d)};return j.add("modern",function(a){return{renderUI:function(b){return k(a,this,b)},resizeTo:function(b,c){return i.resizeTo(a,b,c)},resizeBy:function(b,c){return i.resizeBy(a,b,c)}}}),function(){}}),d("0")()}(); \ No newline at end of file diff --git a/cps/static/js/libs/tinymce/themes/silver/theme.min.js b/cps/static/js/libs/tinymce/themes/silver/theme.min.js index c1cebd7a8..4579cb758 100644 --- a/cps/static/js/libs/tinymce/themes/silver/theme.min.js +++ b/cps/static/js/libs/tinymce/themes/silver/theme.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.7.1 (2021-03-17) + * Version: 5.10.0 (2021-10-11) */ -!function(){"use strict";var at=function(){},i=function(e,o){return function(){for(var t=[],n=0;n "+o.toString()},function(t,n){return"state("+t+")"})}).join("\n")+"}"}}},dn=function(r){return{extract:function(e,o,t){var n=V(t,function(t,n){return r.extract(e.concat(["["+n+"]"]),o,t)});return nn(n)},toString:function(){return"array("+r.toString()+")"}}},mn=function(a){return{extract:function(t,n,e){for(var o=[],r=0,i=a;r ")+")\n"+t.getErrorInfo()}).join("\n"))+"\n\nInput object: "+en(t.input);var n,e},Bn=xn,An=function(t,n){return xn(t,Tt(n,fn))},Mn=ct(wn),Fn=function(e,o){return sn(function(t){var n=typeof t;return e(t)?vt(t):yt("Expected type: "+o+" but got: "+n)})},In=Fn(dt,"number"),Rn=Fn(C,"string"),Vn=Fn(_,"boolean"),Pn=Fn(T,"function"),Hn=function(n){var t=function(t,n){for(var e=t.next();!e.done;){if(!n(e.value))return!1;e=t.next()}return!0};if(Object(n)!==n)return!0;switch({}.toString.call(n).slice(8,-1)){case"Boolean":case"Number":case"String":case"Date":case"RegExp":case"Blob":case"FileList":case"ImageData":case"ImageBitmap":case"ArrayBuffer":return!0;case"Array":case"Object":return Object.keys(n).every(function(t){return Hn(n[t])});case"Map":return t(n.keys(),Hn)&&t(n.values(),Hn);case"Set":return t(n.keys(),Hn);default:return!1}},zn=sn(function(t){return Hn(t)?vt(t):yt("Expected value to be acceptable for sending via postMessage")}),Nn=function(n){return Cn(function(t){return M(n,t)?pt.value(t):pt.error('Unsupported value: "'+t+'", choose one of "'+n.join(", ")+'".')})},Ln=function(t){return bn(t,t,Wt(),pn())},jn=function(t,n){return bn(t,t,Wt(),n)},Un=function(t){return jn(t,Rn)},Wn=function(t,n){return bn(t,t,Wt(),Nn(n))},Gn=function(t){return jn(t,Pn)},Xn=function(t,n){return bn(t,t,Wt(),fn(n))},Yn=function(t,n){return bn(t,t,Wt(),hn(n))},qn=function(t,n){return bn(t,t,Wt(),dn(n))},Kn=function(t){return bn(t,t,Gt(),pn())},Jn=function(t,n){return bn(t,t,Gt(),n)},$n=function(t){return Jn(t,In)},Qn=function(t){return Jn(t,Rn)},Zn=function(t){return Jn(t,Pn)},te=function(t,n){return Jn(t,fn(n))},ne=function(t,n){return bn(t,t,Ut(n),pn())},ee=function(t,n,e){return bn(t,t,Ut(n),e)},oe=function(t,n){return ee(t,n,In)},re=function(t,n){return ee(t,n,Rn)},ie=function(t,n,e){return ee(t,n,Nn(e))},ue=function(t,n){return ee(t,n,Vn)},ae=function(t,n){return ee(t,n,Pn)},ce=function(t,n,e){return ee(t,n,dn(e))},se=function(t,n,e){return ee(t,n,fn(e))},le=function(t,n){return vn(t,n)},fe=function(t){var n=t;return{get:function(){return n},set:function(t){n=t}}},de=function(t){if(null===t||t===undefined)throw new Error("Node cannot be null or undefined");return{dom:t}},me={fromHtml:function(t,n){var e=(n||document).createElement("div");if(e.innerHTML=t,!e.hasChildNodes()||1=o.length&&e.substr(r,r+o.length)===o;var e,o,r},ke=(nt=/^\s+|\s+$/g,function(t){return t.replace(nt,"")}),Ce=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Oe=function(n){return function(t){return we(t,n)}},_e=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(t){return we(t,"edge/")&&we(t,"chrome")&&we(t,"safari")&&we(t,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Ce],search:function(t){return we(t,"chrome")&&!we(t,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(t){return we(t,"msie")||we(t,"trident")}},{name:"Opera",versionRegexes:[Ce,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Oe("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Oe("firefox")},{name:"Safari",versionRegexes:[Ce,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(t){return(we(t,"safari")||we(t,"mobile/"))&&we(t,"applewebkit")}}],Te=[{name:"Windows",search:Oe("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(t){return we(t,"iphone")||we(t,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Oe("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Oe("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Oe("linux"),versionRegexes:[]},{name:"Solaris",search:Oe("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Oe("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Oe("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],Ee={browsers:ct(_e),oses:ct(Te)},De="Firefox",Be=function(t){var n=t.current,e=t.version,o=function(t){return function(){return n===t}};return{current:n,version:e,isEdge:o("Edge"),isChrome:o("Chrome"),isIE:o("IE"),isOpera:o("Opera"),isFirefox:o(De),isSafari:o("Safari")}},Ae={unknown:function(){return Be({current:undefined,version:ve.unknown()})},nu:Be,edge:ct("Edge"),chrome:ct("Chrome"),ie:ct("IE"),opera:ct("Opera"),firefox:ct(De),safari:ct("Safari")},Me="Windows",Fe="Android",Ie="Solaris",Re="FreeBSD",Ve="ChromeOS",Pe=function(t){var n=t.current,e=t.version,o=function(t){return function(){return n===t}};return{current:n,version:e,isWindows:o(Me),isiOS:o("iOS"),isAndroid:o(Fe),isOSX:o("OSX"),isLinux:o("Linux"),isSolaris:o(Ie),isFreeBSD:o(Re),isChromeOS:o(Ve)}},He={unknown:function(){return Pe({current:undefined,version:ve.unknown()})},nu:Pe,windows:ct(Me),ios:ct("iOS"),android:ct(Fe),linux:ct("Linux"),osx:ct("OSX"),solaris:ct(Ie),freebsd:ct(Re),chromeos:ct(Ve)},ze=function(t,n){var e,o,r,i,u,a,c,s,l,f,d,m,g=Ee.browsers(),p=Ee.oses(),h=ye(g,t).fold(Ae.unknown,Ae.nu),v=xe(p,t).fold(He.unknown,He.nu);return{browser:h,os:v,deviceType:(o=h,r=t,i=n,u=(e=v).isiOS()&&!0===/ipad/i.test(r),a=e.isiOS()&&!u,c=e.isiOS()||e.isAndroid(),s=c||i("(pointer:coarse)"),l=u||!a&&c&&i("(min-device-width:768px)"),f=a||c&&!l,d=o.isSafari()&&e.isiOS()&&!1===/safari/i.test(r),m=!f&&!l&&!d,{isiPad:ct(u),isiPhone:ct(a),isTablet:ct(l),isPhone:ct(f),isTouch:ct(s),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:ct(d),isDesktop:ct(m)})}},Ne=function(t){return window.matchMedia(t).matches},Le=Lt(function(){return ze(navigator.userAgent,Ne)}),je=function(){return Le()},Ue=function(t,n){var e=t.dom;if(1!==e.nodeType)return!1;var o=e;if(o.matches!==undefined)return o.matches(n);if(o.msMatchesSelector!==undefined)return o.msMatchesSelector(n);if(o.webkitMatchesSelector!==undefined)return o.webkitMatchesSelector(n);if(o.mozMatchesSelector!==undefined)return o.mozMatchesSelector(n);throw new Error("Browser lacks native selectors")},We=function(t){return 1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType||0===t.childElementCount},Ge=function(t,n){return t.dom===n.dom},Xe=function(t,n){return e=t.dom,o=n.dom,r=e,i=o,u=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(r.compareDocumentPosition(i)&u);var e,o,r,i,u},Ye=function(t,n){return je().browser.isIE()?Xe(t,n):(e=n,o=t.dom,r=e.dom,o!==r&&o.contains(r));var e,o,r},qe=function(t){return T(t)?t:l},Ke=function(t,n,e){for(var o=t.dom,r=qe(e);o.parentNode;){o=o.parentNode;var i=me.fromDom(o),u=n(i);if(u.isSome())return u;if(r(i))break}return ft.none()},Je=function(t,n,e){var o=n(t),r=qe(e);return o.orThunk(function(){return r(t)?ft.none():Ke(t,n,r)})},$e=function(t,n){return Ge(t.element,n.event.target)},Qe=function(t){if(!Rt(t,"can")&&!Rt(t,"abort")&&!Rt(t,"run"))throw new Error("EventHandler defined by: "+JSON.stringify(t,null,2)+" does not have can, abort, or run!");return En("Extracting event.handler",ln([ne("can",w),ne("abort",l),ne("run",at)]),t)},Ze=function(e){var n,o,r,i,t=(o=function(t){return t.can},function(){for(var e=[],t=0;t "):o[0].name;return Jt(r,{handler:n,purpose:e})})});return Qt(n,{})},Di="alloy.base.behaviour",Bi=function(t){var n,e;return _n("custom.definition",fn([bn("dom","dom",Wt(),fn([Ln("tag"),ne("styles",{}),ne("classes",[]),ne("attributes",{}),Kn("value"),Kn("innerHtml")])),Ln("components"),Ln("uid"),ne("events",{}),ne("apis",{}),bn("eventOrder","eventOrder",((n={})[_o()]=["disabling",Di,"toggling","typeaheadevents"],n[So()]=[Di,"focusing","keying"],n[Mo()]=[Di,"disabling","toggling","representing"],n[po()]=[Di,"representing","streaming","invalidating"],n[Ho()]=[Di,"representing","item-events","tooltipping"],n[io()]=["focusing",Di,"item-type-events"],n[no()]=["focusing",Di,"item-type-events"],n[so()]=["item-type-events","tooltipping"],n[Oo()]=["receiving","reflecting","tooltipping"],e=n,jt.mergeWithThunk(ct(e))),Mn()),Kn("domModification")]),t)},Ai=function(t,n){var e=qr(t,n);return e===undefined||""===e?[]:e.split(" ")},Mi=function(t){return t.dom.classList!==undefined},Fi=function(t,n){return r=n,i=Ai(e=t,o="class").concat([r]),Yr(e,o,i.join(" ")),!0;var e,o,r,i},Ii=function(t,n){return r=n,0<(i=H(Ai(e=t,o="class"),function(t){return t!==r})).length?Yr(e,o,i.join(" ")):$r(e,o),!1;var e,o,r,i},Ri=function(t,n){Mi(t)?t.dom.classList.add(n):Fi(t,n)},Vi=function(t){0===(Mi(t)?t.dom.classList:Ai(t,"class")).length&&$r(t,"class")},Pi=function(t,n){Mi(t)?t.dom.classList.remove(n):Ii(t,n),Vi(t)},Hi=function(t,n){return Mi(t)&&t.dom.classList.contains(n)},zi=function(n,t){mt(t,function(t){Ri(n,t)})},Ni=function(n,t){mt(t,function(t){Pi(n,t)})},Li=function(t){return t.style!==undefined&&T(t.style.getPropertyValue)},ji=function(t){var n=hr(t)?t.dom.parentNode:t.dom;if(n===undefined||null===n||null===n.ownerDocument)return!1;var e,o,r=n.ownerDocument;return Fr(me.fromDom(n)).fold(function(){return r.body.contains(n)},(e=ji,o=Ir,function(t){return e(o(t))}))},Ui=function(){return Wi(me.fromDom(document))},Wi=function(t){var n=t.dom.body;if(null===n||n===undefined)throw new Error("Body is not available yet");return me.fromDom(n)},Gi=function(t,n,e){if(!C(e))throw console.error("Invalid call to CSS.set. Property ",n,":: Value ",e,":: Element ",t),new Error("CSS value must be a string: "+e);Li(t)&&t.style.setProperty(n,e)},Xi=function(t,n){Li(t)&&t.style.removeProperty(n)},Yi=function(t,n,e){var o=t.dom;Gi(o,n,e)},qi=function(t,n){var e=t.dom;_t(n,function(t,n){Gi(e,n,t)})},Ki=function(t,n){var e=t.dom;_t(n,function(t,n){t.fold(function(){Xi(e,n)},function(t){Gi(e,n,t)})})},Ji=function(t,n){var e=t.dom,o=window.getComputedStyle(e).getPropertyValue(n);return""!==o||ji(t)?o:$i(e,n)},$i=function(t,n){return Li(t)?t.style.getPropertyValue(n):""},Qi=function(t,n){var e=t.dom,o=$i(e,n);return ft.from(o).filter(function(t){return 0"}),Mn()),cf=le("schema",function(){return[Kn("preprocess")]}),sf=ne("defaults",ct({})),lf=ne("overrides",ct({})),ff=fn([of,rf,uf,af,sf,lf]),df=fn([of,rf,uf,sf,lf]),mf=fn([of,rf,uf,af,sf,lf]),gf=fn([of,cf,uf,Ln("unit"),af,sf,lf]),pf=function(t){return t.fold(ft.some,ft.none,ft.some,ft.some)},hf=function(t){var n=function(t){return t.name};return t.fold(n,n,n,n)},vf=function(e,o){return function(t){var n=En("Converting part type",o,t);return e(n)}},bf=vf(ef.required,ff),yf=vf(ef.external,df),xf=vf(ef.optional,mf),wf=vf(ef.group,gf),Sf=ct("entirety"),kf=/* */Object.freeze({__proto__:null,required:bf,external:yf,optional:xf,group:wf,asNamedPart:pf,name:hf,asCommon:function(t){return t.fold(st,st,st,st)},original:Sf}),Cf=function(t,n,e,o){return zt(n.defaults(t,e,o),e,{uid:t.partUids[n.name]},n.overrides(t,e,o))},Of=function(r,t){var n={};return mt(t,function(t){pf(t).each(function(e){var o=_f(r,e.pname);n[e.name]=function(t){var n=En("Part: "+e.name+" in "+r,fn(e.schema),t);return lt(lt({},o),{config:t,validated:n})}})}),n},_f=function(t,n){return{uiType:nf(),owner:t,name:n}},Tf=function(t,n,e){return{uiType:nf(),owner:t,name:n,config:e,validated:{}}},Ef=function(t){return U(t,function(t){return t.fold(ft.none,ft.some,ft.none,ft.none).map(function(t){return Xn(t.name,t.schema.concat([ba(Sf())]))}).toArray()})},Df=function(t){return V(t,hf)},Bf=function(t,n,e){return o=n,i={},r={},mt(e,function(t){t.fold(function(o){i[o.pname]=Zl(!0,function(t,n,e){return o.factory.sketch(Cf(t,o,n,e))})},function(t){var n=o.parts[t.name];r[t.name]=ct(t.factory.sketch(Cf(o,t,n[Sf()]),n))},function(o){i[o.pname]=Zl(!1,function(t,n,e){return o.factory.sketch(Cf(t,o,n,e))})},function(r){i[r.pname]=tf(!0,function(n,t,e){var o=n[r.name];return V(o,function(t){return r.factory.sketch(zt(r.defaults(n,t,e),t,r.overrides(n,t)))})})})}),{internals:ct(i),externals:ct(r)};var o,i,r},Af=function(t,n,e){return Ql(ft.some(t),n,n.components,e)},Mf=function(t,n,e){var o=n.partUids[e];return t.getSystem().getByUid(o).toOptional()},Ff=function(t,n,e){return Mf(t,n,e).getOrDie("Could not find part: "+e)},If=function(t,n,e){var o={},r=n.partUids,i=t.getSystem();return mt(e,function(t){o[t]=ct(i.getByUid(r[t]))}),o},Rf=function(t,n){var e=t.getSystem();return Tt(n.partUids,function(t,n){return ct(e.getByUid(t))})},Vf=function(t){return Ct(t.partUids)},Pf=function(t,n,e){var o={},r=n.partUids,i=t.getSystem();return mt(e,function(t){o[t]=ct(i.getByUid(r[t]).getOrDie())}),o},Hf=function(n,t){var e=Df(t);return $t(V(e,function(t){return{key:t,value:n+"-"+t}}))},zf=function(n){return bn("partUids","partUids",Yt(function(t){return Hf(t.uid,n)}),Mn())},Nf=/* */Object.freeze({__proto__:null,generate:Of,generateOne:Tf,schemas:Ef,names:Df,substitutes:Bf,components:Af,defaultUids:Hf,defaultUidsSchema:zf,getAllParts:Rf,getAllPartNames:Vf,getPart:Mf,getPartOrDie:Ff,getParts:If,getPartsOrDie:Pf}),Lf=function(t,n,e,o,r){var i,u,a=(u=r,(0<(i=o).length?[Xn("parts",i)]:[]).concat([Ln("uid"),ne("dom",{}),ne("components",[]),ba("originalSpec"),ne("debug.sketcher",{})]).concat(u));return En(t+" [SpecSchema]",ln(a.concat(n)),e)},jf=function(t,n,e,o,r){var i=Uf(r),u=Ef(e),a=zf(e),c=Lf(t,n,i,u,[a]),s=Bf(0,c,e);return o(c,Af(t,c,s.internals()),i,s.externals())},Uf=function(t){return It(t,"uid")?t:lt(lt({},t),{uid:li("uid")})},Wf=ln([Ln("name"),Ln("factory"),Ln("configFields"),ne("apis",{}),ne("extraApis",{})]),Gf=ln([Ln("name"),Ln("factory"),Ln("configFields"),Ln("partFields"),ne("apis",{}),ne("extraApis",{})]),Xf=function(t){var i=En("Sketcher for "+t.name,Wf,t),n=Tt(i.apis,bi),e=Tt(i.extraApis,pi);return lt(lt({name:i.name,configFields:i.configFields,sketch:function(t){return n=i.name,e=i.configFields,o=i.factory,r=Uf(t),o(Lf(n,e,r,[],[]),r);var n,e,o,r}},n),e)},Yf=function(t){var n=En("Sketcher for "+t.name,Gf,t),e=Of(n.name,n.partFields),o=Tt(n.apis,bi),r=Tt(n.extraApis,pi);return lt(lt({name:n.name,partFields:n.partFields,configFields:n.configFields,sketch:function(t){return jf(n.name,n.configFields,n.partFields,n.factory,t)},parts:e},o),r)},qf=function(t){for(var n=[],e=function(t){n.push(t)},o=0;o',e.getDoc());return zr(t,me.fromDom(n.extractContents())),n.insertNode(t.dom),kr(t).each(function(t){return t.dom.normalize()}),Cs(t,ks).map(function(t){var n;e.selection.setCursorLocation(t.dom,"img"===mr(n=t)?1:ws(n).fold(function(){return _r(n).length},function(t){return t.length}))}),t})},Op=function(t){return Ku(t,"[data-mce-autocompleter]")},_p=function(t){return t.toString().replace(/\u00A0/g," ").replace(/\uFEFF/g,"")},Tp=function(t){return""!==t&&-1!==" \xa0\f\n\r\t\x0B".indexOf(t)},Ep=function(t,n){return t.substring(n.length)},Dp=function(t,o,r,i){if(void 0===i&&(i=0),!(n=o).collapsed||3!==n.startContainer.nodeType)return ft.none();var n,e=t.getParent(o.startContainer,t.isBlock)||t.getRoot();return kp(t,o.startContainer,o.startOffset,function(t,n,e){return function(t,n,e){for(var o=n-1;0<=o;o--){var r=t.charAt(o);if(Tp(r))return ft.none();if(r===e)break}return ft.some(o)}(e,n,r).getOr(n)},e).bind(function(t){var n=o.cloneRange();if(n.setStart(t.container,t.offset),n.setEnd(o.endContainer,o.endOffset),n.collapsed)return ft.none();var e=_p(n);return 0!==e.lastIndexOf(r)||Ep(e,r).length=t.minChars&&t.matches.getOrThunk(function(){return Vp(n.dom)})(e.range,i,e.text)});if(0===u.length)return ft.none();var a=Mp.all(V(u,function(n){return n.fetch(e.text,n.maxResults,o).then(function(t){return{matchText:e.text,items:t,columns:n.columns,onAction:n.onAction,highlightOn:n.highlightOn}})}));return ft.some({lookupData:a,context:e})},zp=fn([Un("type"),Qn("text")]),Np=fn([ne("type","autocompleteitem"),ne("active",!1),ne("disabled",!1),ne("meta",{}),Un("value"),Qn("text"),Qn("icon")]),Lp=fn([Un("type"),Un("ch"),oe("minChars",1),ne("columns",1),oe("maxResults",10),Zn("matches"),Gn("fetch"),Gn("onAction"),ce("highlightOn",[],Rn)]),jp=[ue("disabled",!1),Qn("tooltip"),Qn("icon"),Qn("text"),ae("onSetup",function(){return at})],Up=fn([Un("type"),Gn("onAction")].concat(jp)),Wp=function(t){return _n("toolbarbutton",Up,t)},Gp=[ue("active",!1)].concat(jp),Xp=fn(Gp.concat([Un("type"),Gn("onAction")])),Yp=function(t){return _n("ToggleButton",Xp,t)},qp=[ae("predicate",l),ie("scope","node",["node","editor"]),ie("position","selection",["node","selection","line"])],Kp=jp.concat([ne("type","contextformbutton"),ne("primary",!1),Gn("onAction"),le("original",st)]),Jp=Gp.concat([ne("type","contextformbutton"),ne("primary",!1),Gn("onAction"),le("original",st)]),$p=jp.concat([ne("type","contextformbutton")]),Qp=Gp.concat([ne("type","contextformtogglebutton")]),Zp=An("type",{contextformbutton:Kp,contextformtogglebutton:Jp}),th=fn([ne("type","contextform"),ae("initValue",function(){return""}),Qn("label"),qn("commands",Zp),Jn("launch",An("type",{contextformbutton:$p,contextformtogglebutton:Qp}))].concat(qp)),nh=fn([ne("type","contexttoolbar"),Un("items")].concat(qp)),eh=function(t){var n,e,o=t.ui.registry.getAll().popups,r=Tt(o,function(t){return _n("Autocompleter",Lp,t).fold(function(t){throw new Error(Dn(t))},function(t){return t})}),i=(n=Bt(r,function(t){return t.ch}),e={},mt(n,function(t){e[t]={}}),Ct(e)),u=Mt(r);return{dataset:r,triggerChars:i,lookupByChar:function(n){return H(u,function(t){return t.ch===n})}}};(xp=yp=yp||{})[xp.CLOSE_ON_EXECUTE=0]="CLOSE_ON_EXECUTE",xp[xp.BUBBLE_TO_SANDBOX=1]="BUBBLE_TO_SANDBOX";var oh,rh,ih=yp,uh="tox-menu-nav__js",ah="tox-collection__item",ch="tox-swatch",sh={normal:uh,color:ch},lh="tox-collection__item--enabled",fh="tox-collection__item-label",dh="tox-collection__item-caret",mh="tox-collection__item--active",gh="tox-collection__item-container",ph="tox-collection__item-container--row",hh=function(t){return Ft(sh,t).getOr(uh)},vh=function(t){return{backgroundMenu:"tox-background-menu",selectedMenu:"tox-selected-menu",selectedItem:"tox-collection__item--active",hasIcons:"tox-menu--has-icons",menu:"color"===t?"tox-swatches":"tox-menu",tieredMenu:"tox-tiered-menu"}},bh=function(t){var n=vh(t);return{backgroundMenu:n.backgroundMenu,selectedMenu:n.selectedMenu,menu:n.menu,selectedItem:n.selectedItem,item:hh(t)}},yh=[Xg.parts.items({})],xh=function(t,n,e){var o=vh(e);return{dom:{tag:"div",classes:gt([[o.tieredMenu]])},markers:bh(e)}},wh=function(e,o){return function(t){var n=R(t,o);return V(n,function(t){return{dom:e,components:t}})}},Sh=function(t,e){var o=[],r=[];return mt(t,function(t,n){e(t,n)?(0o}).getOr(r.length);return ft.some({numColumns:e,numRows:Math.ceil(r.length/e)})}return ft.none()},jh=function(t,n){return rc([fg(t,n)])},Uh=function(t){return jh(oi("unnamed-events"),t)},Wh=oi("tooltip.exclusive"),Gh=oi("tooltip.show"),Xh=oi("tooltip.hide"),Yh=function(t,n,e){t.getSystem().broadcastOn([Wh],{})},qh=/* */Object.freeze({__proto__:null,hideAllExclusive:Yh,setComponents:function(t,n,e,o){e.getTooltip().each(function(t){t.getSystem().isConnected()&&lg.set(t,o)})}}),Kh=/* */Object.freeze({__proto__:null,events:function(r,i){var e=function(n){i.getTooltip().each(function(t){al(t),r.onHide(n,t),i.clearTooltip()}),i.clearTimer()};return Zo(gt([[er(Gh,function(o){i.resetTimer(function(){var n,t,e;n=o,i.isShowing()||(Yh(n),t=r.lazySink(n).getOrDie(),e=n.getSystem().build({dom:r.tooltipDom,components:r.tooltipComponents,events:Zo("normal"===r.mode?[er(so(),function(t){Yo(n,Gh)}),er(ao(),function(t){Yo(n,Xh)})]:[]),behaviours:rc([lg.config({})])}),i.setTooltip(e),rl(t,e),r.onShow(n,e),Zs.position(t,r.anchor(n),e))},r.delay)}),er(Xh,function(t){i.resetTimer(function(){e(t)},r.delay)}),er(Oo(),function(t,n){n.universal||M(n.channels,Wh)&&e(t)}),lr(function(t){e(t)})],"normal"===r.mode?[er(lo(),function(t){Yo(t,Gh)}),er(ko(),function(t){Yo(t,Xh)}),er(so(),function(t){Yo(t,Gh)}),er(ao(),function(t){Yo(t,Xh)})]:[er(Go(),function(t,n){Yo(t,Gh)}),er(Xo(),function(t){Yo(t,Xh)})]]))}}),Jh=[Ln("lazySink"),Ln("tooltipDom"),ne("exclusive",!0),ne("tooltipComponents",[]),ne("delay",300),ie("mode","normal",["normal","follow-highlight"]),ne("anchor",function(t){return{anchor:"hotspot",hotspot:t,layouts:{onLtr:ct([ja,La,Pa,za,Ha,Na]),onRtl:ct([ja,La,Pa,za,Ha,Na])}}}),ma("onHide"),ma("onShow")],$h=uc({fields:Jh,name:"tooltipping",active:Kh,state:/* */Object.freeze({__proto__:null,init:function(){var e=fe(ft.none()),n=fe(ft.none()),o=function(){e.get().each(function(t){clearTimeout(t)})},t=ct("not-implemented");return xi({getTooltip:function(){return n.get()},isShowing:function(){return n.get().isSome()},setTooltip:function(t){n.set(ft.some(t))},clearTooltip:function(){n.set(ft.none())},clearTimer:o,resetTimer:function(t,n){o(),e.set(ft.some(setTimeout(function(){t()},n)))},readState:t})}}),apis:qh}),Qh=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Zh=tinymce.util.Tools.resolve("tinymce.util.I18n"),tv=["input","button","textarea","select"],nv=function(t,n,e){(n.disabled()?av:cv)(t,n)},ev=function(t,n){return!0===n.useNative&&M(tv,mr(t.element))},ov=function(t){Yr(t.element,"disabled","disabled")},rv=function(t){$r(t.element,"disabled")},iv=function(t){Yr(t.element,"aria-disabled","true")},uv=function(t){Yr(t.element,"aria-disabled","false")},av=function(n,t,e){t.disableClass.each(function(t){Ri(n.element,t)}),(ev(n,t)?ov:iv)(n),t.onDisabled(n)},cv=function(n,t,e){t.disableClass.each(function(t){Pi(n.element,t)}),(ev(n,t)?rv:uv)(n),t.onEnabled(n)},sv=function(t,n){return ev(t,n)?Jr(t.element,"disabled"):"true"===qr(t.element,"aria-disabled")},lv=/* */Object.freeze({__proto__:null,enable:cv,disable:av,isDisabled:sv,onLoad:nv,set:function(t,n,e,o){(o?av:cv)(t,n)}}),fv=/* */Object.freeze({__proto__:null,exhibit:function(t,n){return Si({classes:n.disabled()?n.disableClass.toArray():[]})},events:function(e,t){return Zo([tr(_o(),function(t,n){return sv(t,e)}),Za(e,t,nv)])}}),dv=[ae("disabled",l),ne("useNative",!0),Kn("disableClass"),ma("onDisabled"),ma("onEnabled")],mv=uc({fields:dv,name:"disabling",active:fv,apis:lv}),gv=tinymce.util.Tools.resolve("tinymce.EditorManager"),pv=function(t){return t.getParam("height",Math.max(t.getElement().offsetHeight,200))},hv=function(t){return t.getParam("width",Qh.DOM.getStyle(t.getElement(),"width"))},vv=function(t){return ft.from(t.getParam("min_width")).filter(dt)},bv=function(t){return ft.from(t.getParam("min_height")).filter(dt)},yv=function(t){return ft.from(t.getParam("max_width")).filter(dt)},xv=function(t){return ft.from(t.getParam("max_height")).filter(dt)},wv=function(t){return!1!==t.getParam("menubar",!0,"boolean")},Sv=function(t){var n=t.getParam("toolbar",!0),e=!0===n,o=C(n),r=p(n)&&0'+t+""})}return r},fb=function(t,s){return V(t,function(t){switch(t.type){case"cardcontainer":return u=fb((i=t).items,s),a="vertical"===i.direction?"tox-collection__item-container--column":ph,c="left"===i.align?"tox-collection__item-container--align-left":"tox-collection__item-container--align-right",{dom:{tag:"div",classes:[gh,a,c,function(){switch(i.valign){case"top":return"tox-collection__item-container--valign-top";case"middle":return"tox-collection__item-container--valign-middle";case"bottom":return"tox-collection__item-container--valign-bottom"}}()]},components:u};case"cardimage":return e=t.src,o=t.classes,r=t.alt,{dom:{tag:"img",classes:o,attributes:{src:e,alt:r.getOr("")}}};case"cardtext":var n=t.name.exists(function(t){return M(s.cardText.highlightOn,t)})?ft.from(s.cardText.matchText).getOr(""):"";return nb(lb(t.text,n),t.classes)}var e,o,r,i,u,a,c})},db=Of(zg(),Ng()),mb=function(t){return{value:t}},gb=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,pb=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,hb=function(t){return gb.test(t)||pb.test(t)},vb=function(t){var n={value:t.value.replace(gb,function(t,n,e,o){return n+n+e+e+o+o})},e=pb.exec(n.value);return null===e?["FFFFFF","FF","FF","FF"]:e},bb=function(t){var n=t.toString(16);return 1===n.length?"0"+n:n},yb=function(t){var n=bb(t.red)+bb(t.green)+bb(t.blue);return mb(n)},xb=Math.min,wb=Math.max,Sb=Math.round,kb=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/,Cb=/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/,Ob=function(t,n,e,o){return{red:t,green:n,blue:e,alpha:o}},_b=function(t){var n=parseInt(t,10);return n.toString()===t&&0<=n&&n<=255},Tb=function(t){var n,e,o,r=(t.hue||0)%360,i=t.saturation/100,u=t.value/100,i=wb(0,xb(i,1)),u=wb(0,xb(u,1));if(0===i)return n=e=o=Sb(255*u),Ob(n,e,o,1);var a=r/60,c=u*i,s=c*(1-Math.abs(a%2-1)),l=u-c;switch(Math.floor(a)){case 0:n=c,e=s,o=0;break;case 1:n=s,e=c,o=0;break;case 2:n=0,e=c,o=s;break;case 3:n=0,e=s,o=c;break;case 4:n=s,e=0,o=c;break;case 5:n=c,e=0,o=s;break;default:n=e=o=0}return n=Sb(255*(n+l)),e=Sb(255*(e+l)),o=Sb(255*(o+l)),Ob(n,e,o,1)},Eb=function(t){var n=vb(t),e=parseInt(n[1],16),o=parseInt(n[2],16),r=parseInt(n[3],16);return Ob(e,o,r,1)},Db=function(t,n,e,o){var r=parseInt(t,10),i=parseInt(n,10),u=parseInt(e,10),a=parseFloat(o);return Ob(r,i,u,a)},Bb=function(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"},Ab=Ob(255,0,0,1),Mb=function(t,n){return t.fire("ResizeContent",n)},Fb=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),Ib="tinymce-custom-colors";var Rb,Vb,Pb="choiceitem",Hb=[{type:Pb,text:"Light Green",value:"#BFEDD2"},{type:Pb,text:"Light Yellow",value:"#FBEEB8"},{type:Pb,text:"Light Red",value:"#F8CAC6"},{type:Pb,text:"Light Purple",value:"#ECCAFA"},{type:Pb,text:"Light Blue",value:"#C2E0F4"},{type:Pb,text:"Green",value:"#2DC26B"},{type:Pb,text:"Yellow",value:"#F1C40F"},{type:Pb,text:"Red",value:"#E03E2D"},{type:Pb,text:"Purple",value:"#B96AD9"},{type:Pb,text:"Blue",value:"#3598DB"},{type:Pb,text:"Dark Turquoise",value:"#169179"},{type:Pb,text:"Orange",value:"#E67E23"},{type:Pb,text:"Dark Red",value:"#BA372A"},{type:Pb,text:"Dark Purple",value:"#843FA1"},{type:Pb,text:"Dark Blue",value:"#236FA1"},{type:Pb,text:"Light Gray",value:"#ECF0F1"},{type:Pb,text:"Medium Gray",value:"#CED4D9"},{type:Pb,text:"Gray",value:"#95A5A6"},{type:Pb,text:"Dark Gray",value:"#7E8C8D"},{type:Pb,text:"Navy Blue",value:"#34495E"},{type:Pb,text:"Black",value:"#000000"},{type:Pb,text:"White",value:"#ffffff"}],zb=function(e){void 0===e&&(e=10);var t,n=Fb.getItem(Ib),o=C(n)?JSON.parse(n):[],r=e-(t=o).length<0?t.slice(0,e):t,i=function(t){r.splice(t,1)};return{add:function(t){var n;(-1===(n=A(r,t))?ft.none():ft.some(n)).each(i),r.unshift(t),r.length>e&&r.pop(),Fb.setItem(Ib,JSON.stringify(r))},state:function(){return r.slice(0)}}}(10),Nb=function(t){return!1!==t.getParam("custom_colors")},Lb=function(t){var n=t.getParam("color_map");return n!==undefined?function(t){var n=[],u=document.createElement("canvas");u.height=1,u.width=1;for(var a=u.getContext("2d"),c=function(t,n){var e=n/255;return("0"+Math.round(t*e+255*(1-e)).toString(16)).slice(-2).toUpperCase()},e=0;e'+n+"
":"",o='
'+t.icon+"
",r={_:" "," - ":" ","-":" "},i=n.replace(/\_| \- |\-/g,function(t){return r[t]});return'
'+o+e+"
"}),r="auto"!==u.columns&&1'+t.join("")+"
"}),Gr(n.element,i.join("")),"auto"===u.columns&&Lh(o,5,"tox-collection__item").each(function(t){var n=t.numRows,e=t.numColumns;ig.setGridSize(o,n,e)}),Yo(o,ax)}}),Yy.config({}),ig.config((n=u.columns,e="normal",1===n?{mode:"menu",moveOnTab:!1,selector:".tox-collection__item"}:"auto"===n?{mode:"flatgrid",selector:".tox-collection__item",initSize:{numColumns:1,numRows:1}}:{mode:"matrix",selectors:{row:"color"===e?".tox-swatches__row":".tox-collection__group",cell:"color"===e?"."+ch:"."+ah}})),fg("collection-events",c)]),eventOrder:((t={})[_o()]=["disabling","alloy.base.behaviour","collection-events"],t)});return Ky(o,l,["tox-form__group--collection"],[])},sx=ct([Kn("data"),ne("inputAttributes",{}),ne("inputStyles",{}),ne("tag","input"),ne("inputClasses",[]),ma("onSetValue"),ne("styles",{}),ne("eventOrder",{}),jl("inputBehaviours",[Ll,hg]),ne("selectOnFocus",!0)]),lx=function(t){return rc([hg.config({onFocus:t.selectOnFocus?function(t){var n=t.element,e=eu(n);n.dom.setSelectionRange(0,e.length)}:at})])},fx=function(t){return{tag:t.tag,attributes:lt({type:"text"},t.inputAttributes),styles:t.inputStyles,classes:t.inputClasses}},dx=Xf({name:"Input",configFields:sx(),factory:function(t,n){return{uid:t.uid,dom:fx(t),components:[],behaviours:lt(lt({},lx(e=t)),Wl(e.inputBehaviours,[Ll.config({store:lt(lt({mode:"manual"},e.data.map(function(t){return{initialValue:t}}).getOr({})),{getValue:function(t){return eu(t.element)},setValue:function(t,n){eu(t.element)!==n&&ou(t.element,n)}}),onSetValue:e.onSetValue})])),eventOrder:t.eventOrder};var e}}),mx={},gx={exports:mx};dy=undefined,my=mx,gy=gx,py=undefined,function(t){"object"==typeof my&&void 0!==gy?gy.exports=t():"function"==typeof dy&&dy.amd?dy([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).EphoxContactWrapper=t()}(function(){return function l(i,u,a){function c(n,t){if(!u[n]){if(!i[n]){var e="function"==typeof py&&py;if(!t&&e)return e(n,!0);if(s)return s(n,!0);var o=new Error("Cannot find module '"+n+"'");throw o.code="MODULE_NOT_FOUND",o}var r=u[n]={exports:{}};i[n][0].call(r.exports,function(t){return c(i[n][1][t]||t)},r,r.exports,l,i,u,a)}return u[n].exports}for(var s="function"==typeof py&&py,t=0;t"},JS=function(o,t){return{uid:o.uid,dom:o.dom,components:t,behaviours:Wl(o.formBehaviours,[Ll.config({store:{mode:"manual",getValue:function(t){var n=Rf(t,o);return Tt(n,function(t,r){return t().bind(function(t){var n,e,o=Zf.getCurrent(t);return n=o,e=new Error("Cannot find a current component to extract the value from for form part '"+r+"': "+Zr(t.element)),n.fold(function(){return pt.error(e)},pt.value)}).map(Ll.getValue)})},setValue:function(e,t){_t(t,function(n,t){Mf(e,o,t).each(function(t){Zf.getCurrent(t).each(function(t){Ll.setValue(t,n)})})})}}})]),apis:{getField:function(t,n){return Mf(t,o,n).bind(Zf.getCurrent)}}}},$S={getField:bi(function(t,n,e){return t.getField(n,e)}),sketch:function(t){var e,n=(e=[],{field:function(t,n){return e.push(t),Tf("form",KS(t),n)},record:function(){return e}}),o=t(n),r=n.record(),i=V(r,function(t){return bf({name:t,pname:KS(t)})});return jf("form",qS,i,JS,o)}},QS=oi("valid-input"),ZS=oi("invalid-input"),tk=oi("validating-input"),nk="colorcustom.rgb.",ek=function(d,m,g,p){var h=function(t,n,e,o,r){var i,u,a=d(nk+"range"),c=[Wy.parts.label({dom:{tag:"label",innerHtml:e,attributes:{"aria-label":o}}}),Wy.parts.field({data:r,factory:dx,inputAttributes:lt({type:"text"},"hex"===n?{"aria-live":"polite"}:{}),inputClasses:[m("textfield")],inputBehaviours:rc([(i=n,u=t,Fx.config({invalidClass:m("invalid"),notify:{onValidate:function(t){qo(t,tk,{type:i})},onValid:function(t){qo(t,QS,{type:i,value:Ll.getValue(t)})},onInvalid:function(t){qo(t,ZS,{type:i,value:Ll.getValue(t)})}},validator:{validate:function(t){var n=Ll.getValue(t),e=u(n)?pt.value(!0):pt.error(d("aria.input.invalid"));return kx(e)},validateOnLoad:!1}})),Yy.config({})]),onSetValue:function(t){Fx.isInvalid(t)&&Fx.run(t).get(at)}})],s="hex"!==n?[Wy.parts["aria-descriptor"]({text:a})]:[];return{dom:{tag:"div",attributes:{role:"presentation"}},components:c.concat(s)}},v=function(t,n){var e=n.red,o=n.green,r=n.blue;Ll.setValue(t,{red:e,green:o,blue:r})},b=mp({dom:{tag:"div",classes:[m("rgba-preview")],styles:{"background-color":"white"},attributes:{role:"presentation"}}}),y=function(t,n){b.getOpt(t).each(function(t){Yi(t.element,"background-color","#"+n.value)})};return Xf({factory:function(){var e={red:fe(ft.some(255)),green:fe(ft.some(255)),blue:fe(ft.some(255)),hex:fe(ft.some("ffffff"))},o=function(t){return e[t].get()},i=function(t,n){e[t].set(n)},r=function(t){var n=t.red,e=t.green,o=t.blue;i("red",ft.some(n)),i("green",ft.some(e)),i("blue",ft.some(o))},n=function(t,n){var e=n.event;"hex"!==e.type?i(e.type,ft.none()):p(t)},u=function(r,t,n){var e=parseInt(n,10);i(t,ft.some(e)),o("red").bind(function(e){return o("green").bind(function(n){return o("blue").map(function(t){return Ob(e,n,t,1)})})}).each(function(t){var n,e,o=(n=r,e=yb(t),$S.getField(n,"hex").each(function(t){hg.isFocused(t)||Ll.setValue(n,{hex:e.value})}),e);y(r,o)})},a=function(t,n){var e=n.event;"hex"===e.type?function(t,n){g(t);var e=mb(n);i("hex",ft.some(n));var o=Eb(e);v(t,o),r(o),qo(t,lw,{hex:e}),y(t,e)}(t,e.value):u(t,e.type,e.value)},t=function(t){return{label:d(nk+t+".label"),description:d(nk+t+".description")}},c=t("red"),s=t("green"),l=t("blue"),f=t("hex");return zt($S.sketch(function(t){return{dom:{tag:"form",classes:[m("rgb-form")],attributes:{"aria-label":d("aria.color.picker")}},components:[t.field("red",Wy.sketch(h(_b,"red",c.label,c.description,255))),t.field("green",Wy.sketch(h(_b,"green",s.label,s.description,255))),t.field("blue",Wy.sketch(h(_b,"blue",l.label,l.description,255))),t.field("hex",Wy.sketch(h(hb,"hex",f.label,f.description,"ffffff"))),b.asSpec()],formBehaviours:rc([Fx.config({invalidClass:m("form-invalid")}),fg("rgb-form-events",[er(QS,a),er(ZS,n),er(tk,n)])])}}),{apis:{updateHex:function(t,n){var e,o;Ll.setValue(t,{hex:n.value}),e=t,o=Eb(n),v(e,o),r(o),y(t,n)}}})},name:"RgbForm",configFields:[],apis:{updateHex:function(t,n,e){t.updateHex(n,e)}},extraApis:{}})},ok=function(t,o){var r=YS.parts.spectrum({dom:{tag:"canvas",attributes:{role:"presentation"},classes:[o("sv-palette-spectrum")]}}),i=YS.parts.thumb({dom:{tag:"div",attributes:{role:"presentation"},classes:[o("sv-palette-thumb")],innerHtml:"'}}),u=function(t,n){var e,o,r=t.width,i=t.height,u=t.getContext("2d");null!==u&&(u.fillStyle=n,u.fillRect(0,0,r,i),(e=u.createLinearGradient(0,0,r,0)).addColorStop(0,"rgba(255,255,255,1)"),e.addColorStop(1,"rgba(255,255,255,0)"),u.fillStyle=e,u.fillRect(0,0,r,i),(o=u.createLinearGradient(0,0,0,i)).addColorStop(0,"rgba(0,0,0,0)"),o.addColorStop(1,"rgba(0,0,0,1)"),u.fillStyle=o,u.fillRect(0,0,r,i))};return Xf({factory:function(t){var n=ct({x:0,y:0}),e=rc([Zf.config({find:ft.some}),hg.config({})]);return YS.sketch({dom:{tag:"div",attributes:{role:"presentation"},classes:[o("sv-palette")]},model:{mode:"xy",getInitialValue:n},rounded:!1,components:[r,i],onChange:function(t,n,e){qo(t,dw,{value:e})},onInit:function(t,n,e,o){u(e.element.dom,Bb(Ab))},sliderBehaviours:e})},name:"SaturationBrightnessPalette",configFields:[],apis:{setRgba:function(t,n,e){var o,r;o=e,r=n.components()[0].element.dom,u(r,Bb(o))}},extraApis:{}})},rk=function(f,d){return Xf({name:"ColourPicker",configFields:[Ln("dom"),ne("onValidHex",at),ne("onInvalidHex",at)],factory:function(t){var a,v,n,e,o,r=ek(f,d,t.onValidHex,t.onInvalidHex),i=ok(0,d),b={paletteRgba:fe(Ab)},u=mp(i.sketch({})),c=mp(r.sketch({})),s=function(t,e){u.getOpt(t).each(function(t){var n=Eb(e);b.paletteRgba.set(n),i.setRgba(t,n)})},l=function(t,n){c.getOpt(t).each(function(t){r.updateHex(t,n)})},y=function(n,e,t){mt(t,function(t){t(n,e)})};return{uid:t.uid,dom:t.dom,components:[u.asSpec(),(n=d,e=YS.parts.spectrum({dom:{tag:"div",classes:[n("hue-slider-spectrum")],attributes:{role:"presentation"}}}),o=YS.parts.thumb({dom:{tag:"div",classes:[n("hue-slider-thumb")],attributes:{role:"presentation"}}}),YS.sketch({dom:{tag:"div",classes:[n("hue-slider")],attributes:{role:"presentation"}},rounded:!1,model:{mode:"y",getInitialValue:ct({y:0})},components:[e,o],sliderBehaviours:rc([hg.config({})]),onChange:function(t,n,e){qo(t,fw,{value:e})}})),c.asSpec()],behaviours:rc([fg("colour-picker-events",[er(dw,(v=[l],function(t,n){var e,o,r,i,u,a,c,s,l,f=n.event.value,d=b.paletteRgba.get(),m=(i=r=0,u=(e=d).red/255,a=e.green/255,c=e.blue/255,s=Math.min(u,Math.min(a,c)),l=Math.max(u,Math.max(a,c)),s===l?sw(0,0,100*(i=s)):(r=60*((r=u===s?3:c===s?1:5)-(u===s?a-c:c===s?u-a:c-u)/(l-s)),o=(l-s)/l,i=l,sw(Math.round(r),Math.round(100*o),Math.round(100*i)))),g=sw(m.hue,f.x,100-f.y),p=Tb(g),h=yb(p);y(t,h,v)})),er(fw,(a=[s,l],function(t,n){var e,o,r,i=n.event.value,u=(e=i.y,o=sw((100-e)/100*360,100,100),r=Tb(o),yb(r));y(t,u,a)}))]),Zf.config({find:function(t){return c.getOpt(t)}}),ig.config({mode:"acyclic"})])}}})},ik=function(){return Zf.config({find:ft.some})},uk=function(t){return Zf.config({find:t.getOpt})},ak=function(t){return Zf.config({find:function(n){return Tr(n.element,t).bind(function(t){return n.getSystem().getByDom(t).toOptional()})}})},ck={"colorcustom.rgb.red.label":"R","colorcustom.rgb.red.description":"Red component","colorcustom.rgb.green.label":"G","colorcustom.rgb.green.description":"Green component","colorcustom.rgb.blue.label":"B","colorcustom.rgb.blue.description":"Blue component","colorcustom.rgb.hex.label":"#","colorcustom.rgb.hex.description":"Hex color code","colorcustom.rgb.range":"Range 0 to 255","colorcustom.sb.saturation":"Saturation","colorcustom.sb.brightness":"Brightness","colorcustom.sb.picker":"Saturation and Brightness Picker","colorcustom.sb.palette":"Saturation and Brightness Palette","colorcustom.sb.instructions":"Use arrow keys to select saturation and brightness, on x and y axes","colorcustom.hue.hue":"Hue","colorcustom.hue.slider":"Hue Slider","colorcustom.hue.palette":"Hue Palette","colorcustom.hue.instructions":"Use arrow keys to select a hue","aria.color.picker":"Color Picker","aria.input.invalid":"Invalid input"},sk=function(t){return ck[t]},lk=tinymce.util.Tools.resolve("tinymce.Resource"),fk=tinymce.util.Tools.resolve("tinymce.util.Tools"),dk=fn([ne("preprocess",st),ne("postprocess",st)]),mk=function(t,n,e){return Ll.config(zt({store:{mode:"manual",getValue:n,setValue:e}},t.map(function(t){return{store:{initialValue:t}}}).getOr({})))},gk=function(t,n,e){return mk(t,function(t){return n(t.element)},function(t,n){return e(t.element,n)})},pk=function(r,t){var i=En("RepresentingConfigs.memento processors",dk,t);return Ll.config({store:{mode:"manual",getValue:function(t){var n=r.get(t),e=Ll.getValue(n);return i.postprocess(e)},setValue:function(t,n){var e=i.preprocess(n),o=r.get(t);Ll.setValue(o,e)}}})},hk=mk,vk=function(t){return gk(t,Wr,Gr)},bk=function(t){return Ll.config({store:{mode:"memory",initialValue:t}})},yk=function(i,u){var n=function(t,n){n.stop()},e=function(t){return function(n,e){mt(t,function(t){t(n,e)})}},o=function(t,n){var e;mv.isDisabled(t)||(e=n.event.raw,a(t,e.dataTransfer.files))},r=function(t,n){var e=n.event.raw.target;a(t,e.files)},a=function(t,n){var e,o,r;Ll.setValue(t,(e=n,o=u,r=fk.explode(o.getSetting("images_file_types","jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp","string")),H($(e),function(n){return F(r,function(t){return Se(n.name.toLowerCase(),"."+t.toLowerCase())})}))),qo(t,Zy,{name:i.name})},c=mp({dom:{tag:"input",attributes:{type:"file",accept:"image/*"},styles:{display:"none"}},behaviours:rc([fg("input-file-events",[ar(vo()),ar(Eo())])])}),t=i.label.map(function(t){return Qy(t,u)}),s=Wy.parts.field({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"div",classes:["tox-dropzone-container"]},behaviours:rc([bk([]),ik(),mv.config({}),Eg.config({toggleClass:"dragenter",toggleOnExecute:!1}),fg("dropzone-events",[er("dragenter",e([n,Eg.toggle])),er("dragleave",e([n,Eg.toggle])),er("dragover",n),er("drop",e([n,o])),er(ho(),r)])]),components:[{dom:{tag:"div",classes:["tox-dropzone"],styles:{}},components:[{dom:{tag:"p",innerHtml:u.translate("Drop an image here")}},dp.sketch({dom:{tag:"button",innerHtml:u.translate("Browse for an image"),styles:{position:"relative"},classes:["tox-button","tox-button--secondary"]},components:[c.asSpec()],action:function(t){c.get(t).element.dom.click()},buttonBehaviours:rc([Yy.config({}),jv(u.isDisabled),Nv()])})]}]}}}});return Ky(t,s,["tox-form__group--stretched"],[])},xk=oi("alloy-fake-before-tabstop"),wk=oi("alloy-fake-after-tabstop"),Sk=function(t){return{dom:{tag:"div",styles:{width:"1px",height:"1px",outline:"none"},attributes:{tabindex:"0"},classes:t},behaviours:rc([hg.config({ignore:!0}),Yy.config({})])}},kk=function(t){return{dom:{tag:"div",classes:["tox-navobj"]},components:[Sk([xk]),t,Sk([wk])],behaviours:rc([ak(1)])}},Ck=function(t,n){qo(t,mo(),{raw:{which:9,shiftKey:n}})},Ok=function(t,n){var e=n.element;Hi(e,xk)?Ck(t,!0):Hi(e,wk)&&Ck(t,!1)},_k=function(t){return Oy(t,["."+xk,"."+wk].join(","),l)},Tk=!(je().browser.isIE()||je().browser.isEdge()),Ek=function(t,n){var o,r,e=Tk&&t.sandboxed,i=lt(lt({},t.label.map(function(t){return{title:t}}).getOr({})),e?{sandbox:"allow-scripts allow-same-origin"}:{}),u=(o=e,r=fe(""),{getValue:function(t){return r.get()},setValue:function(t,n){var e;o?Yr(t.element,"srcdoc",n):(Yr(t.element,"src","javascript:''"),(e=t.element.dom.contentWindow.document).open(),e.write(n),e.close()),r.set(n)}}),a=t.label.map(function(t){return Qy(t,n)}),c=Wy.parts.field({factory:{sketch:function(t){return kk({uid:t.uid,dom:{tag:"iframe",attributes:i},behaviours:rc([Yy.config({}),hg.config({}),hk(ft.none(),u.getValue,u.setValue)])})}}});return Ky(a,c,["tox-form__group--stretched"],[])},Dk=function(t,n){return Mk(document.createElement("canvas"),t,n)},Bk=function(t){var n=Dk(t.width,t.height);return Ak(n).drawImage(t,0,0),n},Ak=function(t){return t.getContext("2d")},Mk=function(t,n,e){return t.width=n,t.height=e,t},Fk=function(t){return t.naturalWidth||t.width},Ik=function(t){return t.naturalHeight||t.height},Rk=window.Promise?window.Promise:(zx=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],Wx(t,jx(Pk,this),jx(Hk,this))},Nx=window,Lx=zx.immediateFn||"function"==typeof Nx.setImmediate&&Nx.setImmediate||function(t){return setTimeout(t,1)},jx=function(e,o){return function(){for(var t=[],n=0;n
").css({position:"absolute",top:0,left:0,width:f.width,height:f.height,zIndex:2147483647,opacity:1e-4,cursor:l}).appendTo(b.body),gO(b).on("mousemove touchmove",x).on("mouseup touchend",w),m.start(t)}),{destroy:function(){gO(y).off()}}}var yO=0,xO=function(s,e,l,o,r){var t,n="tox-",u="tox-crid-"+yO++,a=[{name:"move",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:0,deltaH:0,label:"Crop Mask"},{name:"nw",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:-1,deltaH:-1,label:"Top Left Crop Handle"},{name:"ne",xMul:1,yMul:0,deltaX:0,deltaY:1,deltaW:1,deltaH:-1,label:"Top Right Crop Handle"},{name:"sw",xMul:0,yMul:1,deltaX:1,deltaY:0,deltaW:-1,deltaH:1,label:"Bottom Left Crop Handle"},{name:"se",xMul:1,yMul:1,deltaX:0,deltaY:0,deltaW:1,deltaH:1,label:"Bottom Right Crop Handle"}],i=["top","right","bottom","left"],f=function(t,n){return{x:n.x-t.x,y:n.y-t.y,w:n.w,h:n.h}},c=function(t,n,e,o){var r,i=n.x,u=n.y,a=n.w,c=n.h;i+=e*t.deltaX,u+=o*t.deltaY,(a+=e*t.deltaW)<20&&(a=20),(c+=o*t.deltaH)<20&&(c=20),r=s=mO.clamp({x:i,y:u,w:a,h:c},l,"move"===t.name),r=f(l,r),p.fire("updateRect",{rect:r}),g(r)},d=function(n){var t=function(t,n){n.h<0&&(n.h=0),n.w<0&&(n.w=0),gO("#"+u+"-"+t,o).css({left:n.x,top:n.y,width:n.w,height:n.h})};fk.each(a,function(t){gO("#"+u+"-"+t.name,o).css({left:n.w*t.xMul+n.x,top:n.h*t.yMul+n.y})}),t("top",{x:e.x,y:e.y,w:e.w,h:n.y-e.y}),t("right",{x:n.x+n.w,y:n.y,w:e.w-n.x-n.w+e.x,h:n.h}),t("bottom",{x:e.x,y:n.y+n.h,w:e.w,h:e.h-n.y-n.h+e.y}),t("left",{x:e.x,y:n.y,w:n.x-e.x,h:n.h}),t("move",n)},m=function(t){d(s=t)},g=function(t){var n,e;m((n=l,{x:(e=t).x+n.x,y:e.y+n.y,w:e.w,h:e.h}))};gO('
').appendTo(o),fk.each(i,function(t){gO("#"+u,o).append('').css(_e({},r)).appendTo(i)[0];return f.set({caret:o,element:t,before:e}),e&&Wa(o).addClass("mce-visual-caret-before"),c=_r.setInterval(function(){u()?Wa("div.mce-visual-caret",i).toggleClass("mce-visual-caret-hidden"):Wa("div.mce-visual-caret",i).addClass("mce-visual-caret-hidden")},500),(n=t.ownerDocument.createRange()).setStart(l,0),n.setEnd(l,0),n},hide:s,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){f.on(function(e){var t=js(i,e.element,e.before);Wa(e.caret).css(_e({},t))})},destroy:function(){return _r.clearInterval(c)}}}function qs(){return bc.isIE()||bc.isEdge()||bc.isFirefox()}function $s(e){return wc(e)||cn(e)&&qs()}function Ws(e,t){for(var n;n=e(t);)if(!_c(n))return n;return null}function Ks(e,t,n,r,o){var i=new Rr(e,r),a=Sc(e)||_c(e);if(t<0){if(a&&n(e=Ws(i.prev.bind(i),!0)))return e;for(;e=Ws(i.prev.bind(i),o);)if(n(e))return e}if(0=a.data.length-1)return 1===e&&(r=i(a))?Dc(r):n;if(No(a)&&u<=1)return-1===e&&(r=o(a))?Tc(r):n;if(u===a.data.length)return(r=i(a))?Dc(r):n;if(0===u)return(r=o(a))?Tc(r):n}return n}function ec(e,t){return ve.from(Gs(e?0:-1,t)).filter(Sc)}function tc(e,t,n){var r=Zs(e,t,n);return-1===e?as.fromRangeStart(r):as.fromRangeEnd(r)}function nc(e){return ve.from(e.getNode()).map(Nt.fromDom)}function rc(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function oc(e,t){var n=Ys(e,t);return!(n||!Wn(e.getNode()))||n}as.fromRangeStart=function(e){return as(e.startContainer,e.startOffset)},as.fromRangeEnd=function(e){return as(e.endContainer,e.endOffset)},as.after=function(e){return as(e.parentNode,rs(e)+1)},as.before=function(e){return as(e.parentNode,rs(e))},as.isAbove=function(e,t){return dn(Q(t.getClientRects()),Z(e.getClientRects()),Ru).getOr(!1)},as.isBelow=function(e,t){return dn(Z(t.getClientRects()),Q(e.getClientRects()),Du).getOr(!1)},as.isAtStart=function(e){return!!e&&e.isAtStart()},as.isAtEnd=function(e){return!!e&&e.isAtEnd()},as.isTextPosition=function(e){return!!e&&jn(e.container())},as.isElementPosition=function(e){return!1===as.isTextPosition(e)};var ic,ac,uc=jn,sc=sn,cc=Ja.nodeIndex,lc=function(e){var t=e.parentNode;return sc(t)?lc(t):t},fc=function(e){return e?me(e.childNodes,function(e,t){return sc(t)&&"BR"!==t.nodeName?e=e.concat(fc(t)):e.push(t),e},[]):[]},dc=Yn,mc=A(bs,u,!0),gc=Ja.DOM,pc=zn,hc=jn,vc=function(e){pc(e)&&Ir(e)&&(Mr(e)?e.removeAttribute("data-mce-caret"):Is(e)),hc(e)&&(Fs(e),0===e.data.length&&Is(e))},bc=dt().browser,yc=Yn,Cc=Jn,xc=Gn,wc=function(e){return yc(e)||Cc(e)},Sc=Yn,Ec=Jn,Nc=an("display","block table table-cell table-caption list-item"),kc=Ir,_c=Pr,Ac=zn,Rc=jr,Dc=A(Js,!0),Tc=A(Js,!1);function Oc(e,t){return e.hasChildNodes()&&tu.length-1)return qc(c,i,r)||function(t){return tf(i).fold(R,function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})}(r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return 1}function Wc(e){return jn(e)&&0=t.data.length&&e.splice(0,1);var n=e[e.length-1];return 0===a&&0L(s)?(_=I(k*E),k=I(_/E)):(k=I(_/E),_=I(k*E))),m(h,k,_),t=b.startPos.x+u,n=b.startPos.y+s,T.setStyles(v,{left:t=0u.childNodes.length-1&&(f=!1),qn(u)&&(u=i,s=0),u===i){if(f&&(d=u.childNodes[0d.bottom&&Zt(n.element,!0===r)}function Yf(e,t,n){return jf(e,Kf,t,n)}function Gf(e,t,n){return qf(e,t,Kf,n)}function Jf(e,t,n){return jf(e,Xf,t,n)}function Qf(e,t,n){return qf(e,t,Xf,n)}function Zf(e,t,n){(e.inline?Yf:Jf)(e,t,n)}function ed(e){var t=Bn(e).dom;return e.dom===t.activeElement}function td(e){return void 0===e&&(e=Nt.fromDom(document)),ve.from(e.dom.activeElement).map(Nt.fromDom)}function nd(e,t){var n=_n(t)?Pl(t).length:Dn(t).length+1;return n\ufeff'),qt(s.element,c),Hf(c,function(){return Ln(c)}));Vf(e,i,t,l,r),l.cleanup()},Rd=function(e,t,n){var r=n.startContainer,o=n.startOffset,i=n.endContainer,a=n.endOffset;t(Nt.fromDom(r),Nt.fromDom(i));var u=e.dom.createRng();u.setStart(r,o),u.setEnd(i,a),e.selection.setRng(n)},Dd=or([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Td=(Dd.before,Dd.on,Dd.after,function(e){return e.fold(u,u,u)}),Od=or([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Bd={domRange:Od.domRange,relative:Od.relative,exact:Od.exact,exactFromRange:function(e){return Od.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){return Tt(e.match({domRange:function(e){return Nt.fromDom(e.startContainer)},relative:function(e,t){return Td(e)},exact:function(e,t,n,r){return e}}))},range:function(e,t,n,r){return{start:e,soffset:t,finish:n,foffset:r}}},Pd=dt().browser,Ld={isEditorUIElement:function(e){var t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Id=Ja.DOM,Md=function(e){return e.editorManager.setActive(e)},Fd={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},Ud=(zd.create=function(e,t){var n=new zd(e,Fd[e]||1);return t&&ne(t,function(e,t){n.attr(t,e)}),n},zd.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},zd.prototype.attr=function(e,t){var n,r=this;if("string"!=typeof e)return null!=e&&ne(e,function(e,t){r.attr(t,e)}),r;if(n=r.attributes){if(void 0===t)return n.map[e];if(null===t){if(e in n.map){delete n.map[e];for(var o=n.length;o--;)if(n[o].name===e)return n.splice(o,1),r}return r}if(e in n.map){for(o=n.length;o--;)if(n[o].name===e){n[o].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,r}},zd.prototype.clone=function(){var e,t=new zd(this.name,this.type);if(e=this.attributes){var n=[];n.map={};for(var r=0,o=e.length;r=u.length)for(n=0,r=a.length;n=u.length||a[n]!==u[n]){o=n+1;break}if(a.length=a.length||a[n]!==u[n]){o=n+1;break}if(1===o)return t;for(n=0,r=a.length-(o-1);n]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,i=e.getShortEndedElements(),a=1,u=n;0!==a;)for(r.lastIndex=u;;){var s=r.exec(t);if(null===s)return u;if("!"===s[1]){u=Ge(s[2],"--")?Qd(t,!1,s.index+"!--".length):Qd(t,!0,s.index+1);break}o.lastIndex=r.lastIndex;var c=o.exec(t);if(!l(c)&&c.index===r.lastIndex){"/"===s[1]?--a:Ne(i,s[2])||(a+=1),u=r.lastIndex+c[0].length;break}}return u}function Gd(q,$){var e;void 0===$&&($=to());var W=null!==(e=(q=q||{}).document)&&void 0!==e?e:document,K=W.createElement("form");function n(s,e){void 0===e&&(e="html");for(var t,i,n,c,r,o,a,l,u,f,d,m,g,p,h,v,b,y,C,x=s.html,w=0,S=[],E=0,N=Go.decode,k=Et.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),_="html"===e?0:1,A=function(e){for(var t,n=S.length;n--&&S[n].name!==e;);if(0<=n){for(t=S.length-1;n<=t;t--)(e=S[t]).valid&&Q(e.name);S.length=n}},R=function(e,t){return G(Hd(e,s),t)},D=function(e){""!==e&&(">"===e.charAt(0)&&(e=" "+e),q.allow_conditional_comments||"[if"!==e.substr(0,3).toLowerCase()||(e=" "+e),X(Hd(e,s)))},T=function(e,t){var n=e||"",r=!Ge(n,"--"),o=Qd(x,r,t);return e=x.substr(t,o-t),D(r?n+e:e),o+1},O=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|(?:!(--)?)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>))","g"),B=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,P=$.getShortEndedElements(),L=q.self_closing_elements||$.getSelfClosingElements(),I=$.getBoolAttrs(),M=q.validate,F=q.remove_internals,U=q.fix_self_closing,z=$.getSpecialElements(),H=x+">";t=O.exec(H);){var j=t[0];if(wx.length){R(N(x.substr(t.index))),w=t.index+j.length;continue}u=(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i)in P,U&&L[i]&&0.*/.test(r.substr(u)))){var o=r.indexOf("[endif]",n);return r.indexOf(">",o)}if(t){var i=r.indexOf(">",n);return-1!==i?i:r.length}var a=/--!?>/g;a.lastIndex=n;var u,s=a.exec(e);return s?s.index+s[0].length:r.length};function Zd(e,t){for(var n,r,o,i,a=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,u=e.schema,s=(n=e.getTempAttrs(),r=t,o=new RegExp(["\\s?("+n.join("|")+')="[^"]+"'].join("|"),"gi"),r.replace(o,"")),c=u.getShortEndedElements();i=a.exec(s);){var l=a.lastIndex,f=i[0].length,d=c[i[1]]?l:Gd.findEndTag(u,s,l),s=s.substring(0,l-f)+s.substring(d);a.lastIndex=l-f}return wo(s)}function em(o){return{compare:function(e,t){return e.nodeName===t.nodeName&&!(!r(n(e),n(t))||!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))||Yc(e)||Yc(t));function n(n){var r={};return om(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r}function r(e,t){var n,r;for(r in e)if(Ne(e,r)){if(void 0===(n=t[r]))return;if(e[r]!==n)return;delete t[r]}for(r in t)if(Ne(t,r))return;return 1}}}}function tm(e){var u=[],s=(e=e||{}).indent,c=im(e.indent_before||""),l=im(e.indent_after||""),f=Go.getEncodeFunc(e.entity_encoding||"raw",e.entities),d="html"===e.element_format;return{start:function(e,t,n){var r,o,i,a;if(s&&c[e]&&0":" />",n&&s&&l[e]&&0"),s&&l[e]&&0")},comment:function(e){u.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?u.push(""):u.push(""),s&&u.push("\n")},doctype:function(e){u.push("",s?"\n":"")},reset:function(){u.length=0},getContent:function(){return u.join("").replace(/\n$/,"")}}}function nm(t,g){void 0===g&&(g=to());var p=tm(t);return(t=t||{}).validate=!("validate"in t)||t.validate,{serialize:function(e){var f=t.validate,d={3:function(e){p.text(e.value,e.raw)},8:function(e){p.comment(e.value)},7:function(e){p.pi(e.name,e.value)},10:function(e){p.doctype(e.value)},4:function(e){p.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}};p.reset();var m=function(e){var t=d[e.type];if(t)t(e);else{var n=e.name,r=e.shortEnded,o=e.attributes;if(f&&o&&1'))}function gm(n){Ut(n).each(function(t){Bt(t).each(function(e){lo(n)&&Br(t)&&lo(e)&&Ln(t)})})}function pm(e,t){return o=R,Ve(r=t,n=e)?function(e,t){for(var n=y(t)?t:R,r=e.dom,o=[];null!==r.parentNode&&void 0!==r.parentNode;){var i=r.parentNode,a=Nt.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o}(n,function(e){return o(e)||je(e,r)}).slice(0,-1):[];var n,r,o}function hm(e,t){return[e].concat(pm(e,t))}function vm(e,t,n){return Jl(e,t,n,cm)}function bm(e,t){return M(hm(Nt.fromDom(t.container()),e),lo)}function ym(e,n,r){return vm(e,n.dom,r).forall(function(t){return bm(n,r).fold(function(){return!1===Ys(t,r,n.dom)},function(e){return!1===Ys(t,r,n.dom)&&Ve(e,Nt.fromDom(t.container()))})})}function Cm(t,n,r){return bm(n,r).fold(function(){return vm(t,n.dom,r).forall(function(e){return!1===Ys(e,r,n.dom)})},function(e){return vm(t,e.dom,r).isNone()})}function xm(e){return nc(e).exists(Br)}function wm(e,t,n){var r=Q(U(hm(Nt.fromDom(n.container()),t),lo)).getOr(t);return Gl(e,r.dom,n).filter(xm)}function Sm(e,t){return nc(t).exists(Br)||wm(!0,e,t).isSome()}function Em(e,t){return ve.from(t.getNode(!0)).map(Nt.fromDom).exists(Br)||wm(!1,e,t).isSome()}function Nm(e){return as.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd()}function km(e,t){return Q(U(hm(Nt.fromDom(t.container()),e),lo)).getOr(e)}function _m(e,t){return Nm(t)?Kg(t):Kg(t)||Zl(km(e,t).dom,t).exists(Kg)}function Am(e,t){return Nm(t)?Wg(t):Wg(t)||Ql(km(e,t).dom,t).exists(Wg)}function Rm(e){return nc(e).bind(function(e){return pr(e,kn)}).exists(function(e){return D(["pre","pre-wrap"],xn(e,"white-space"))})}function Dm(e,t){return!Rm(t)&&(np(e,t)||op(e,t)||Em(e,t)||_m(e,t))}function Tm(e,t){return!Rm(t)&&(rp(e,t)||ip(e,t)||Sm(e,t)||Am(e,t))}function Om(e,t){return Dm(e,t)||Tm(e,(r=(n=t).container(),o=n.offset(),jn(r)&&o=e.data.length&&Tm(o,as(e,e.data.length)),u=0===t&&Dm(o,as(e,0)),e.replaceData(t,n,(c=u,l=a,L(s=i,function(e,t){return Gc(t)||of(t)?e.previousCharIsSpace||""===e.str&&c||e.str.length===s.length-1&&l?{previousCharIsSpace:!1,str:e.str+yo}:{previousCharIsSpace:!0,str:e.str+" "}:{previousCharIsSpace:!1,str:e.str+t}},{previousCharIsSpace:!1,str:""}).str)))}function Fm(e,t){var n=e.data.slice(t);Mm(e,t,n.length-Qe(n).length)}function Um(e,t){var n=e.data.slice(0,t),r=n.length-Ze(n).length;Mm(e,t-r,r)}function zm(e,t,n,r){void 0===r&&(r=!0);var o=Ze(e.data).length,i=r?e:t,a=r?t:e;return r?i.appendData(a.data):i.insertData(0,a.data),Ln(Nt.fromDom(a)),n&&Fm(i,o),i}function Hm(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===as.isTextPosition(n)&&o===r.parentNode&&i>as.before(r).offset()?as(t.container(),t.offset()-1):t;var n,r,o,i}function jm(e){return jr(e.previousSibling)?ve.some((t=e.previousSibling,jn(t)?as(t,t.data.length):as.after(t))):e.previousSibling?tf(e.previousSibling):ve.none();var t}function Vm(e){return jr(e.nextSibling)?ve.some((t=e.nextSibling,jn(t)?as(t,0):as.before(t))):e.nextSibling?ef(e.nextSibling):ve.none();var t}function qm(r,o){return jm(o).orThunk(function(){return Vm(o)}).orThunk(function(){return e=r,n=as.before((t=o).previousSibling||t.parentNode),Zl(e,n).fold(function(){return Ql(e,as.after(t))},ve.some);var e,t,n})}function $m(n,r){return Vm(r).orThunk(function(){return jm(r)}).orThunk(function(){return Ql(e=n,as.after(t=r)).fold(function(){return Zl(e,as.before(t))},ve.some);var e,t})}function Wm(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})}function Km(e,t){return t&&Ne(e.schema.getBlockElements(),kt(t))}function Xm(e){if(Wr(e)){var t=Nt.fromHtml('
');return Xt(e),Pn(e,t),ve.some(as.before(t.dom))}return ve.none()}function Ym(t,n,e,r){void 0===r&&(r=!0);var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(p=n,h=t.getBody(),v=e.dom,(p?$m:qm)(h,v).map(A(Hm,v))),y=gr(e,A(Km,t),(o=t.getBody(),function(e){return e.dom===o})),C=(u=b,i=a=e,s=Ne(t.schema.getTextInlineElements(),kt(i)),m=Bt(a).filter(_n),g=Pt(a).filter(_n),Ln(a),l=g,f=u,d=function(e,t,n){var r=e.dom,o=t.dom,i=r.data.length;return zm(r,o,s),n.container()===o?as(r,i):n},((c=m).isSome()&&l.isSome()&&f.isSome()?ve.some(d(c.getOrDie(),l.getOrDie(),f.getOrDie())):ve.none()).orThunk(function(){return s&&(m.each(function(e){return Um(e.dom,e.dom.length)}),g.each(function(e){return Fm(e.dom,0)})),u}));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):y.bind(Xm).fold(function(){r&&Wm(t,n,C)},function(e){r&&Wm(t,n,ve.some(e))})}function Gm(e){return hu(e,"td,th")}function Jm(e,t){return{start:e,end:t}}function Qm(e,t){return br(Nt.fromDom(e),"td,th",t)}function Zm(e){return!je(e.start,e.end)}function eg(e,n){return Al(e.start,n).bind(function(t){return Al(e.end,n).bind(function(e){return je(t,e)?ve.some(t):ve.none()})})}function tg(e){return function(t){return eg(t,e).map(function(e){return{rng:t,table:e,cells:Gm(e)}})}}function ng(e,t,n,r){if(n.collapsed||!e.forall(Zm))return ve.none();if(t.isSameTable){var o=e.bind(tg(r));return ve.some({start:o,end:o})}var i,a,u=Qm(n.startContainer,r),s=Qm(n.endContainer,r),c=u.bind((a=r,function(t){return Al(t,a).bind(function(e){return Z(Gm(e)).map(function(e){return Jm(t,e)})})})).bind(tg(r)),l=s.bind((i=r,function(t){return Al(t,i).bind(function(e){return Q(Gm(e)).map(function(e){return Jm(e,t)})})})).bind(tg(r));return ve.some({start:c,end:l})}function rg(e,t){return z(e,function(e){return je(e,t)})}function og(n){return dn(rg(n.cells,n.rng.start),rg(n.cells,n.rng.end),function(e,t){return n.cells.slice(e,t+1)})}function ig(e,t){var n=t.startTable,r=t.endTable,o=e.cloneRange();return n.each(function(e){return o.setStartAfter(e.dom)}),r.each(function(e){return o.setEndBefore(e.dom)}),o}function ag(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(n=e,function(e){return je(n,e)}),y=dn(Qm((r=t).startContainer,o=b),Qm(r.endContainer,o),Jm),C=(l=b,f=x((c=t).startContainer),d=x(c.endContainer),m=f.isSome(),g=d.isSome(),p=dn(f,d,je).getOr(!1),{startTable:f,endTable:d,isStartInTable:m,isEndInTable:g,isSameTable:p,isMultiTable:!p&&m&&g});function x(e){return Al(Nt.fromDom(e),l)}return h=t,v=b,y.exists(function(e){return!Zm(t=e)&&eg(t,v).exists(function(e){var t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})&&Rl(e.start,h);var t})?y.map(function(e){return sp.singleCellTable(t,e.start)}):C.isMultiTable?ng(y,u=C,s=t,b).bind(function(e){var t=e.start,n=e.end,r=t.bind(og).getOr([]),o=n.bind(og).getOr([]);if(0)?$/," "):i.replace(/ ()?$/," "));var c=e.parser,l=n.merge,f=nm({validate:e.getParam("validate")},e.schema),d='',m=e.fire("BeforeSetContent",{content:t,format:"html",selection:!0,paste:n.paste});if(m.isDefaultPrevented())e.fire("SetContent",{content:m.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=m.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,d);var g,p,h=(g=u.getRng()).startContainer||(g.parentElement?g.parentElement():null),v=e.getBody();h===v&&u.isCollapsed()&&s.isBlock(v.firstChild)&&((p=v.firstChild)&&!e.schema.getShortEndedElements()[p.nodeName])&&s.isEmpty(v.firstChild)&&((g=s.createRng()).setStart(v.firstChild,0),g.setEnd(v.firstChild,0),u.setRng(g)),u.isCollapsed()||function(e){var t=e.dom,n=vg(e.selection.getRng());e.selection.setRng(n);var r,o=t.getParent(n.startContainer,mp),i=n;null!==(r=o)&&r===t.getParent(i.endContainer,mp)&&Rl(Nt.fromDom(r),i)?lp(e,n,Nt.fromDom(o)):e.getDoc().execCommand("Delete",!1,null)}(e);var b,y,C,x,w,S,E,N,k,_,A,R,D,T,O={context:(I=u.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0},B=c.parse(t,O);if(!0===n.paste&&bg(e.schema,B)&&Cg(s,I))return g=wg(f,s,u.getRng(),B),u.setRng(g),void e.fire("SetContent",m);if(function(){for(var e=B;e=e.walk();)1===e.type&&e.attr("data-mce-fragment","1")}(),"mce_marker"===(L=B.lastChild).attr("id"))for(var P=L,L=L.prev;L;L=L.walk(!0))if(3===L.type||!s.isBlock(L.name)){e.schema.isValidChild(L.parent.name,"span")&&L.parent.insert(P,L,"br"===L.name);break}if(e._selectionOverrides.showBlockCaretContainer(I),O.invalid){e.selection.setContent(d);var I=u.getNode(),M=e.getBody();for(9===I.nodeType?I=L=M:L=I;L!==M;)L=(I=L).parentNode;t=I===M?M.innerHTML:s.getOuterHTML(I),t=f.serialize(c.parse(t.replace(//i,function(){return f.serialize(B)}))),I===M?s.setHTML(M,t):s.setOuterHTML(I,t)}else b=e,y=t=f.serialize(B),"all"===(C=I).getAttribute("data-mce-bogus")?C.parentNode.insertBefore(b.dom.createFragment(y),C):(x=C.firstChild,w=C.lastChild,!x||x===w&&"BR"===x.nodeName?b.dom.setHTML(C,y):b.selection.setContent(y));E=l,_=(S=e).schema.getTextInlineElements(),A=S.dom,E&&(N=S.getBody(),k=em(A),Et.each(A.select("*[data-mce-fragment]"),function(e){if(V(_[e.nodeName.toLowerCase()])&&j(um(A,e),function(e){return!am.has(e)}))for(var t=e.parentNode;V(t)&&t!==N&&!function(r,o,i){function a(e){var t=r.getStyle(o,e),n=r.getStyle(i,e);return Be(t)&&Be(n)&&t!==n}var e=um(r,o),u=um(r,i);return F(e,function(t){function e(e){return F(e,function(e){return e===t})}if(e(u)||!e($g))return a(t);var n=U(u,function(t){return F($g,function(e){return Ge(t,e)})});return F(n,a)})}(A,e,t);t=t.parentNode)if(k.compare(t,e)){A.remove(e,!0);break}})),function(n,e){var t,r=n.dom,o=n.selection;if(e){o.scrollIntoView(e);var i=pf(n.getBody(),e);if("false"===r.getContentEditable(i))return r.remove(e),o.select(i);var a,u=r.createRng(),s=e.previousSibling;jn(s)?(u.setStart(s,s.nodeValue.length),xt.ie||(a=e.nextSibling,jn(a)&&(s.appendData(a.data),a.parentNode.removeChild(a)))):(u.setStartBefore(e),u.setEndBefore(e));var c=r.getParent(e,r.isBlock);r.remove(e),c&&r.isEmpty(c)&&(n.$(c).empty(),u.setStart(c,0),u.setEnd(c,0),mp(c)||c.getAttribute("data-mce-fragment")||!(t=function(e){var t=as.fromRangeStart(e);if(t=Pc(n.getBody()).next(t))return t.toRange()}(u))?r.add(c,r.create("br",{"data-mce-bogus":"1"})):(u=t,r.remove(c))),o.setRng(u)}}(e,s.get("mce_marker")),R=e.getBody(),Et.each(R.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),D=s,T=u.getStart(),ve.from(D.getParent(T,"td,th")).map(Nt.fromDom).each(gm),e.fire("SetContent",m),e.addVisual()}}function Eg(e){return e instanceof Ud}function Ng(e,t,n){var r;e.dom.setHTML(e.getBody(),t),!0!==n&&vd(r=e)&&ef(r.getBody()).each(function(e){var t=e.getNode(),n=cn(t)?ef(t).getOr(e):e;r.selection.setRng(n.toRange())})}function kg(u,s,e){var t,n=(t=s,_e(_e({format:"html"},e),{set:!0,content:Eg(t)?"":t})),c=e.no_events?n:u.fire("BeforeSetContent",n);return Eg(s)||(s=c.content),ve.from(u.getBody()).fold(J(s),function(e){return Eg(s)?function(e,t,n,r){var o,i,u,a;o=e.parser.getNodeFilters(),i=e.parser.getAttributeFilters(),u=n,a=function(e,n){var t,r,o={},i={},a=[];for(t in u.firstChild&&gp(u.firstChild,function(t){Y(e,function(e){e.name===t.name&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})}),Y(n,function(e){"string"==typeof t.attr(e.name)&&(i[e.name]?i[e.name].nodes.push(t):i[e.name]={filter:e,nodes:[t]})})}),o)Ne(o,t)&&a.push(o[t]);for(r in i)Ne(i,r)&&a.push(i[r]);return a}(o,i),Y(a,function(t){Y(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})});var s=nm({validate:e.validate},e.schema).serialize(n);return r.content=vo(Nt.fromDom(t))?s:Et.trim(s),Ng(e,r.content,r.no_selection),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(i='
',"TABLE"===n.nodeName?r=""+i+"":/^(UL|OL)$/.test(n.nodeName)&&(r="
  • "+i+"
  • "),r=(a=Ss(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),a.toLowerCase())?(r=i,t.dom.createHTML(a,Es(t),r)):r||'
    ',Ng(t,r,o.no_selection),t.fire("SetContent",o)):("raw"!==o.format&&(r=nm({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=vo(Nt.fromDom(n))?r:Et.trim(r),Ng(t,o.content,o.no_selection),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})}function _g(e){return y(e)?e:R}function Ag(i,e,t){var n=e(i),a=_g(t);return n.orThunk(function(){return a(i)?ve.none():function(e){for(var t=i.dom,n=_g(a);t.parentNode;){var t=t.parentNode,r=Nt.fromDom(t),o=e(r);if(o.isSome())return o;if(n(r))break}return ve.none()}(e)})}function Rg(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o=o.nodeValue.length&&(o=new Rr(o,e.getBody()).next()||o),jn(o)&&!n&&0===i&&new Rr(o,e.getBody()).prev()||o}function Dp(e,t){var n=t?"firstChild":"lastChild";if(/^(TR|TH|TD)$/.test(e.nodeName)&&e[n]){var r=e[n];return"TR"===e.nodeName&&r[n]||r}return e}function Tp(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o}function Op(e,t,n,r,o){var i=Nt.fromDom(t),a=Nt.fromDom(e.create(r,o));return Kt(a,(n?It:Lt)(i)),n?(qt(i,a),Wt(a,i)):($t(i,a),Pn(a,i)),a.dom}function Bp(e,t,n,r){var o=el(t,n,r);return K(o)||"BR"===o.nodeName||e.isBlock(o)}function Pp(e,r,o,t,i){var n,a,u=e.dom,s=u,c=t;if(!(dl(a=r)&&kh(c,a.inline)||ll(a)&&kh(c,a.block)||fl(a)&&(zn(c)&&s.is(c,a.selector))||r.links&&"A"===t.nodeName))return Sh.keep();var l,f,d,m,g,p,h,v,b=t;if(dl(r)&&"all"===r.remove&&S(r.preserve_attributes)){var y=U(u.getAttribs(b),function(e){return D(r.preserve_attributes,e.name.toLowerCase())});if(u.removeAllAttribs(b),Y(y,function(e){return u.setAttrib(b,e.name,e.value)}),0e?t.cells.length:e},0)}function Kp(e,t){for(var n=e.rows,r=0;r")?{type:"fragmented",fragments:t,content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:r,bookmark:null,beforeBookmark:null}}function ih(e,t,n){var r,o,i,g,p,a,h,v,c,l,u,s=n?t.beforeBookmark:t.bookmark;function b(e,t,n,r){for(var o=e;o-tc){for(var l=0;l]*>( | |\\s|\xa0|
    |)<\\/"+u+">[\r\n]*|
    [\r\n]*)$"),a.replace(s,"")),D(["text","tree"],l.format)||vo(Nt.fromDom(r))?l.content=f:l.content=Et.trim(f),(l.no_events?l:t.fire("GetContent",l)).content;var t,n,r,o,i,a,u,s,c,l,f});var d,m,g},setContent:function(e,t){return kg(c,e,t)},insertContent:function(e,t){return Sg(c,e,t)},addVisual:function(e){var i,t=e,a=(i=c).dom,n=V(t)?t:i.getBody();b(i.hasVisual)&&(i.hasVisual=i.getParam("visual",!0,"boolean")),Y(a.select("table,a",n),function(e){switch(e.nodeName){case"TABLE":var t=i.getParam("visual_table_class","mce-item-table","string"),n=a.getAttrib(e,"border");n&&"0"!==n||!i.hasVisual?a.removeClass(e,t):a.addClass(e,t);break;case"A":var r,o;a.getAttrib(e,"href")||(r=a.getAttrib(e,"name")||e.id,o=i.getParam("visual_anchor_class","mce-item-anchor","string"),r&&i.hasVisual?a.addClass(e,o):a.removeClass(e,o))}}),i.fire("VisualAid",{element:t,hasVisual:i.hasVisual})}},selection:{getContent:function(e,t){return function(e,t,n){var r,o=(r=t,_e(_e({},n=void 0===n?{}:n),{format:r,get:!0,selection:!0})),i=e.fire("BeforeGetContent",o);if(i.isDefaultPrevented())return e.fire("GetContent",i),i.content;if("text"===i.format)return m=e,ve.from(m.selection.getRng()).map(function(e){var t=ve.from(m.dom.getParent(e.commonAncestorContainer,m.dom.isBlock)),n=m.getBody(),r=t.map(function(e){return e.nodeName}).getOr("div").toLowerCase(),o=xt.browser.isIE()&&"pre"!==r,i=m.dom.add(n,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},e.cloneContents()),a=th(i,o),u=wo(i.textContent);if(m.dom.remove(i),eh(u,0)||eh(u,u.length-1)){var s=th(t.getOr(n),o),c=s.indexOf(a);return-1===c?a:(eh(s,c-1)?" ":"")+a+(eh(s,c+a.length)?" ":"")}return a}).getOr("");i.getInner=!0;var a,u,s,c,l,f,d,m,g=(u=i,s=(a=e).selection.getRng(),c=a.dom.create("body"),l=a.selection.getSel(),f=wd(a,Nl(l)),(d=u.contextual?Zp(Nt.fromDom(a.getBody()),f).dom:s.cloneContents())&&c.appendChild(d),a.selection.serializer.serialize(c,u));return"tree"===i.format?g:(i.content=e.selection.isCollapsed()?"":g,e.fire("GetContent",i),i.content)}(c,e,t)}},raw:{getModel:function(){return ve.none()}}}}function mh(e){return Ne(e.plugins,"rtc")}function gh(e){var u=e;return ue(e.plugins,"rtc").bind(function(e){return ve.from(e.setup)}).fold(function(){return u.rtcInstance=dh(e),ve.none()},function(e){var t,n;return u.rtcInstance=(t=J(null),n=J(""),{undoManager:{beforeChange:te,add:t,undo:t,redo:t,clear:te,reset:te,hasUndo:R,hasRedo:R,transact:t,ignore:te,extra:te},formatter:{match:R,matchAll:J([]),matchNode:J(void 0),canApply:R,closest:n,apply:te,remove:te,toggle:te,formatChanged:J({unbind:te})},editor:{getContent:n,setContent:n,insertContent:te,addVisual:te},selection:{getContent:n},raw:{getModel:J(ve.none())}}),ve.some(function(){return e().then(function(e){return u.rtcInstance=(i=e.undoManager,a=e.formatter,n=e.editor,r=e.selection,t=e.raw,{undoManager:{beforeChange:i.beforeChange,add:i.add,undo:i.undo,redo:i.redo,clear:i.clear,reset:i.reset,hasUndo:i.hasUndo,hasRedo:i.hasRedo,transact:function(e,t,n){return i.transact(n)},ignore:function(e,t){return i.ignore(t)},extra:function(e,t,n,r){return i.extra(n,r)}},formatter:{match:function(e,t,n,r){return a.match(e,o(t),r)},matchAll:a.matchAll,matchNode:a.matchNode,canApply:function(e){return a.canApply(e)},closest:function(e){return a.closest(e)},apply:function(e,t,n){return a.apply(e,o(t))},remove:function(e,t,n,r){return a.remove(e,o(t))},toggle:function(e,t,n){return a.toggle(e,o(t))},formatChanged:function(e,t,n,r,o){return a.formatChanged(t,n,r,o)}},editor:{getContent:function(e,t){return n.getContent(e)},setContent:function(e,t){return n.setContent(e,t)},insertContent:function(e,t){return n.insertContent(e)},addVisual:n.addVisual},selection:{getContent:function(e,t){return r.getContent(t)}},raw:{getModel:function(){return ve.some(t.getRawModel())}}}),e.rtc.isRemote;function o(e){return h(e)?e:{}}var i,a,n,r,t})})})}function ph(e){return e.rtcInstance||dh(e)}function hh(e){var t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")}function vh(e){return 0===e.dom.length?(Ln(e),ve.none()):ve.some(e)}function bh(e,t,u,s){e.bind(function(a){return(s?Um:Fm)(a.dom,s?a.dom.length:0),t.filter(_n).map(function(e){var t=u,n=s,r=a.dom,o=e.dom,i=(n?r:o).length;n?(zm(r,o,!1,!n),t.setStart(o,i)):(zm(o,r,!1,!n),t.setEnd(o,i))})}).orThunk(function(){var e=s;return t.filter(function(e){return Fl.isBookmarkNode(e.dom)}).bind(e?Pt:Bt).or(t).filter(_n).map(function(e){var n,r=s;Ot(n=e).each(function(e){var t=n.dom;r&&Dm(e,as(t,0))?Fm(t,0):!r&&Tm(e,as(t,t.length))&&Um(t,t.length)})})})}function yh(e,t,n){var r,o=(r=t,_e(_e({format:"html"},n=void 0===n?{}:n),{set:!0,selection:!0,content:r})),i=o;if(!o.no_events){var a=e.fire("BeforeSetContent",o);if(a.isDefaultPrevented())return void e.fire("SetContent",a);i=a}i.content=function(e,t){if("raw"===t.format)return t.content;var n=e.selection.getRng(),r=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),o=r?{context:r.nodeName.toLowerCase()}:{},i=e.parser.parse(t.content,_e(_e({isRootContent:!0,forced_root_block:!1},o),t));return nm({validate:e.validate},e.schema).serialize(i)}(e,i);var u=e.selection.getRng();!function(e,t){var n=ve.from(t.firstChild).map(Nt.fromDom),r=ve.from(t.lastChild).map(Nt.fromDom);e.deleteContents(),e.insertNode(t);var o=n.bind(Bt).filter(_n).bind(vh),i=r.bind(Pt).filter(_n).bind(vh);bh(o,n,e,!0),bh(i,r,e,!1),e.collapse(!1)}(u,u.createContextualFragment(i.content)),e.selection.setRng(u),Zf(e,u),i.no_events||e.fire("SetContent",i)}function Ch(e,t,n){var r;e&&Ne(e,t)&&(0===(r=U(e[t],function(e){return e!==n})).length?delete e[t]:e[t]=r)}qg=function(e){var t,n=e.selection.getRng(),r=on(["pre"]);n.collapsed||(t=e.selection.getSelectedBlocks(),xp(Cp(Cp(t,r),function(e){return r(e.previousSibling)&&-1!==de(t,e.previousSibling)}),function(e){var t,n=e.previousSibling;Wa(t=e).remove(),Wa(n).append("

    ").append(t.childNodes)}))},yp["pre"]||(yp.pre=[]),yp.pre.push(qg);var xh=Et.each,wh=function(e,t,n){xh(e.childNodes,function(e){wp(e)&&(t(e)&&n(e),e.hasChildNodes()&&wh(e,t,n))})},Sh=or([{keep:[]},{rename:["name"]},{removed:[]}]),Eh=/^(src|href|style)$/,Nh=Et.each,kh=ol,_h=Et.each,Ah=Et.each,Rh=function(S,E,N,r){function k(n,e){var t;y((e=void 0===e?A:e).onformat)&&e.onformat(n,e,N,r),Ah(e.styles,function(e,t){u.setStyle(n,t,rl(e,N))}),!e.styles||(t=u.getAttrib(n,"style"))&&u.setAttrib(n,"data-mce-style",t),Ah(e.attributes,function(e,t){u.setAttrib(n,t,rl(e,N))}),Ah(e.classes,function(e){e=rl(e,N),u.hasClass(n,e)||u.addClass(n,e)})}function g(e,t){var n=!1;return Ah(e,function(e){return!!fl(e)&&(V(e.collapsed)&&e.collapsed!==a||!u.is(t,e.selector)||zc(t)?void 0:(k(t,e),!(n=!0)))}),n}function o(x,e,l){var w=[],f=!0,d=A.inline||A.block,m=function(e){if(X(e)){var t=u.create(e);return k(t),t}return null}(d);El(x,e,function(e){var s,c=function(e){var t=!1,n=f,r=e.nodeName.toLowerCase(),o=e.parentNode,i=o.nodeName.toLowerCase();if(zn(e)&&x.getContentEditable(e)&&(n=f,f="true"===x.getContentEditable(e),t=!0),Wn(e)&&!function(e,t,n,r){if(e.getParam("format_empty_lines",!1,"boolean")&&dl(t)){var o=_e(_e({},e.schema.getTextBlockElements()),{td:{},th:{},li:{},dt:{},dd:{},figcaption:{},caption:{},details:{},summary:{}}),i=(a=Nt.fromDom(n),s=function(e){return zc(e.dom)},((c=(u=a).dom).parentNode?Nr(Nt.fromDom(c.parentNode),function(e){return!je(u,e)&&s(e)}):ve.none()).isSome());return se(o,r)&&Wr(Nt.fromDom(n.parentNode),!1)&&!i}var a,u,s,c}(S,A,e,i))return s=null,void(ll(A)&&x.remove(e));if(ll(A)&&A.wrapper&&hp(S,e,E,N))s=null;else{if(f&&!t&&ll(A)&&!A.wrapper&&tl(S,r)&&nl(S,i,d)){var a=x.rename(e,d);return k(a),w.push(a),void(s=null)}if(fl(A)){var u=g(_,e);if(!u&&V(o)&&ml(A)&&(u=g(_,o)),!dl(A)||u)return void(s=null)}!f||t||!nl(S,d,r)||!nl(S,i,d)||!l&&jn(e)&&xo(e.data)||zc(e)||dl(A)&&x.isBlock(e)?(s=null,Y(xe(e.childNodes),c),t&&(f=n),s=null):(s||(s=x.clone(m,!1),e.parentNode.insertBefore(s,e),w.push(s)),s.appendChild(e))}};Y(e,c)}),!0===A.links&&Y(w,function(e){var t=function(e){"A"===e.nodeName&&k(e,A),Y(xe(e.childNodes),t)};t(e)}),Y(w,function(e){var n,t,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=(n=0,Y(e.childNodes,function(e){var t;V(t=e)&&jn(t)&&0===t.length||Yc(e)||n++}),n);function C(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=ul(m,e.parentNode),m.getStyle(e,"color")&&t?m.setStyle(e,"text-decoration",t):m.getStyle(e,"text-decoration")===t&&m.setStyle(e,"text-decoration",null))}!(1t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){V(e)?(s.inline?Gf:Qf)(s,e,t):Zf(s,p(),t)},placeCaretAt:function(e,t){return h(wf(e,t,s.getDoc()))},getBoundingClientRect:function(){var e=p();return e.collapsed?as.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){u=l=f=null,y.destroy()}},b=Fl(v),y=Cf(v,s);function C(t,e){return M(e,function(e){return o.is(e,t)})}function x(e){return o.getParents(e,null,o.getRoot())}return v.bookmarkManager=b,v.controlSelection=y,v}function Ih(e,t){var n,r,a,u,o=ro();t.convert_fonts_to_spans&&(r=e,a=o,u=Et.explode(t.font_size_legacy_values),r.addNodeFilter("font",function(e){Y(e,function(e){var t,n=a.parse(e.attr("style")),r=e.attr("color"),o=e.attr("face"),i=e.attr("size");r&&(n.color=r),o&&(n["font-family"]=o),i&&(n["font-size"]=u[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",a.serialize(n)),t=e,Y(["color","face","size"],function(e){t.attr(e,null)})})})),n=o,e.addNodeFilter("strike",function(e){Y(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})}function Mh(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}}function Fh(e,t){var n;try{n=atob(t)}catch(e){return ve.none()}for(var r=new Uint8Array(n.length),o=0;o)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")},r=e.length;r--;){var o,i=e[r],a=i.firstChild?i.firstChild.value:"";"script"===t?((o=i.attr("type"))&&i.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0")):"xhtml"===s.element_format&&0)\s*/g,"$1"),Et.map(s.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Et.map(e.split(/(?:~\+|~|\+)/),Yv),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[],f=l.length?(l[0].name||(l[0].name=c),c=e.selector,Xv(l,n)):Xv([c],n),d=dy.select(c,f)[0]||f.firstChild;return fy(e.styles,function(e,t){var n=a(e);n&&dy.setStyle(d,t,n)}),fy(e.attributes,function(e,t){var n=a(e);n&&dy.setAttrib(d,t,n)}),fy(e.classes,function(e){var t=a(e);dy.hasClass(d,t)||dy.addClass(d,t)}),n.fire("PreviewFormats"),dy.setStyles(f,{position:"absolute",left:-65535}),n.getBody().appendChild(f),r=dy.getStyle(n.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,fy(i.split(" "),function(e){var t=dy.getStyle(d,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=dy.getStyle(n.getBody(),e,!0),"#ffffff"===dy.toHex(t).toLowerCase())||"color"===e&&"#000000"===dy.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===r)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*r+"px"}"border"===e&&t&&(o+="padding:0 2px;"),o+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),dy.remove(f),o}function Jv(c){var e,r,t,n,o,i,a=(n={},(o=function(e,t){e&&(X(e)?(Y(t=!S(t)?[t]:t,function(e){b(e.deep)&&(e.deep=!fl(e)),b(e.split)&&(e.split=!fl(e)||dl(e)),b(e.remove)&&fl(e)&&!dl(e)&&(e.remove="none"),fl(e)&&dl(e)&&(e.mixed=!0,e.block_expand=!0),X(e.classes)&&(e.classes=e.classes.split(/\s+/))}),n[e]=t):ne(e,function(e,t){o(t,e)}))})((r=(e=c).dom,t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"s",remove:"all",preserve_attributes:["class","style"]}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",defaultBlock:"p",styles:{lineHeight:"%value"}},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(e,t,n){return zn(e)&&e.hasAttribute("href")},onformat:function(n,e,t){Et.each(t,function(e,t){r.setAttrib(n,t,e)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":function(e){var t;return null!==(t=null==e?void 0:e.customValue)&&void 0!==t?t:null}}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]},Et.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t)),o(e.getParam("formats")),{get:function(e){return V(e)?n[e]:n},has:function(e){return Ne(n,e)},register:o,unregister:function(e){return e&&n[e]&&delete n[e],n}}),l=ru(null);return function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])}(c),(i=c).on("mouseup keydown",function(e){var t=i,n=e.keyCode,r=t.selection,o=t.getBody();Fg(t,null,!1),8!==n&&46!==n||!r.isCollapsed()||r.getStart().innerHTML!==vp||Fg(t,Hc(o,r.getStart())),37!==n&&39!==n||Fg(t,Hc(o,r.getStart()))}),{get:a.get,has:a.has,register:a.register,unregister:a.unregister,apply:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.apply(r,o,i)},remove:function(e,t,n,r){var o=e,i=t,a=n,u=r;hh(c).formatter.remove(o,i,a,u)},toggle:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.toggle(r,o,i)},match:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.match(o,i,a,u);var o,i,a,u},closest:function(e){return t=e,hh(c).formatter.closest(t);var t},matchAll:function(e,t){return n=e,r=t,hh(c).formatter.matchAll(n,r);var n,r},matchNode:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.matchNode(o,i,a,u);var o,i,a,u},canApply:function(e){return t=e,hh(c).formatter.canApply(t);var t},formatChanged:function(e,t,n,r){return o=l,i=e,a=t,u=n,s=r,hh(c).formatter.formatChanged(o,i,a,u,s);var o,i,a,u,s},getCssText:A(Gv,c)}}function Qv(e){switch(e.toLowerCase()){case"undo":case"redo":case"mcerepaint":case"mcefocus":return 1;default:return}}function Zv(s){var e,n,r,o,i,c=cu(),l=ru(0),f=ru(0),d={data:[],typing:!1,beforeChange:function(){var e=l,t=c;hh(s).undoManager.beforeChange(e,t)},add:function(e,t){return n=d,r=f,o=l,i=c,a=e,u=t,hh(s).undoManager.add(n,r,o,i,a,u);var n,r,o,i,a,u},undo:function(){return e=d,t=l,n=f,hh(s).undoManager.undo(e,t,n);var e,t,n},redo:function(){return e=f,t=d.data,hh(s).undoManager.redo(e,t);var e,t},clear:function(){var e=d,t=f;hh(s).undoManager.clear(e,t)},reset:function(){var e=d;hh(s).undoManager.reset(e)},hasUndo:function(){return e=d,t=f,hh(s).undoManager.hasUndo(e,t);var e,t},hasRedo:function(){return e=d,t=f,hh(s).undoManager.hasRedo(e,t);var e,t},transact:function(e){return t=d,n=l,r=e,hh(s).undoManager.transact(t,n,r);var t,n,r},ignore:function(e){var t=l,n=e;hh(s).undoManager.ignore(t,n)},extra:function(e,t){var n=d,r=f,o=e,i=t;hh(s).undoManager.extra(n,r,o,i)}};return mh(s)||(r=d,o=l,i=ru(!1),(n=s).on("init",function(){r.add()}),n.on("BeforeExecCommand",function(e){Qv(e.command)||(fh(r,o),r.beforeChange())}),n.on("ExecCommand",function(e){Qv(e.command)||a(e)}),n.on("ObjectResizeStart cut",function(){r.beforeChange()}),n.on("SaveContent ObjectResized blur",a),n.on("dragend",a),n.on("keyup",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),n.nodeChanged()),46!==t&&8!==t||n.nodeChanged(),i.get()&&r.typing&&!1===sh(oh(n),r.data[0])&&(!1===n.isDirty()&&(n.setDirty(!0),n.fire("change",{level:r.data[0],lastLevel:null})),n.fire("TypingUndo"),i.set(!1),n.nodeChanged()))}),n.on("keydown",function(e){var t,n=e.keyCode;e.isDefaultPrevented()||(33<=n&&n<=36||37<=n&&n<=40||45===n?r.typing&&a(e):(t=e.ctrlKey&&!e.altKey||e.metaKey,!(n<16||20t}}function jy(t){return function(e){return e.line===t}}function Vy(e,t){return Math.abs(e.left-t)}function qy(e,t){return Math.abs(e.right-t)}function $y(e,t){return e>=t.left&&e<=t.right}function Wy(e,t){return e>=t.top&&e<=t.bottom}function Ky(e,o,i){return void 0===i&&(i=w),me(e,function(e,t){if($y(o,t))return i(t)?t:e;if($y(o,e))return i(e)?e:t;var n=Math.min(Vy(e,o),qy(e,o)),r=Math.min(Vy(t,o),qy(t,o));return r===n&&se(t,"node")&&MC(t.node)||r'),o=i,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse()))}function R0(t,e){return n=t,r=e?ic.Forwards:ic.Backwards,o=n.selection.getRng(),Qy(n,r,o,ep,tp,VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function D0(t,e){return r=e?1:-1,o=(n=t).selection.getRng(),Zy(n,r,o,function(e){return ep(e)||Qg(e)},function(e){return tp(e)||Zg(e)},VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function T0(e,t){return e0(e,t,t?tp:ep)}function O0(e){return D(["figcaption"],kt(e))}function B0(e){var t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t}function P0(e,t,n){(n?Pn:Wt)(e,t)}function L0(h,v){var b=Nt.fromDom(h.getBody()),y=as.fromRangeStart(h.selection.getRng()),C=Ss(h),x=Es(h),e=y,t=A(je,b);return pr(Nt.fromDom(e.container()),lo,t).filter(O0).exists(function(){if(d=b,m=y,v?(p=d.dom,My(p,m).breakAt.isNone()):(g=d.dom,Iy(g,m).breakAt.isNone())){var e=(t=b,r=x,o=v,""===(n=C)?(l=o,P0(t,f=Nt.fromTag("br"),l),B0(f)):(i=t,a=o,u=r,s=Nt.fromTag(n),c=Nt.fromTag("br"),hn(s,u),Pn(s,c),P0(i,s,a),B0(c)));return h.selection.setRng(e),!0}var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p;return!1})}function I0(e,t){return!!e.selection.isCollapsed()&&L0(e,t)}function M0(e){for(var t=[],n=1;nm.childNodes.length-1,m=m.childNodes[Math.min(g,m.childNodes.length-1)]||m,g=s&&jn(m)?m.nodeValue.length:0);var b,y,C,x,w,S,p,E,N,k,_,A,R,D,T,O,B,P,L,I,M,F=aC(c,m);F&&((p&&!h||!p&&h)&&(m=function(e,t,n,r){var o,i,a,u,s,c,l=p||"P",f=e.dom,d=aC(f,n),m=f.getParent(n,f.isBlock);if(!m||!oC(f,m)){if(s=((m=m||d)===e.getBody()||(c=m)&&/^(TD|TH|CAPTION)$/.test(c.nodeName)?m:m.parentNode).nodeName.toLowerCase(),!m.hasChildNodes())return uC(e,o=f.create(l)),m.appendChild(o),t.setStart(o,0),t.setEnd(o,0),o;for(a=n;a.parentNode!==m;)a=a.parentNode;for(;a&&!f.isBlock(a);)a=(i=a).previousSibling;if(i&&e.schema.isValidChild(s,l.toLowerCase())){for(uC(e,o=f.create(l)),i.parentNode.insertBefore(o,i),a=i;a&&!f.isBlock(a);)u=a.nextSibling,o.appendChild(a),a=u;t.setStart(n,r),t.setEnd(n,r)}}return n}(a,d,m,g)),y=(b=c.getParent(m,c.isBlock))?c.getParent(b.parentNode,c.isBlock):null,C=b?b.nodeName.toUpperCase():"","LI"!==(x=y?y.nodeName.toUpperCase():"")||v||(y=(b=y).parentNode,C=x),/^(LI|DT|DD)$/.test(C)&&c.isEmpty(b)?(N=t,k=y,_=b,A=p,I=(E=a).dom,M=E.selection.getRng(),k!==E.getBody()&&(D=(A=Z0(R=k)&&Z0(R.parentNode)?"LI":A)?N(A):I.create("BR"),tC(k,_,!0)&&tC(k,_,!1)?Q0(k,"LI")?(T=eC(k),I.insertAfter(D,T),(null===(L=(P=k).parentNode)||void 0===L?void 0:L.firstChild)===P?I.remove(T):I.remove(k)):I.replace(D,k):(tC(k,_,!0)?Q0(k,"LI")?(I.insertAfter(D,eC(k)),D.appendChild(I.doc.createTextNode(" ")),D.appendChild(k)):k.parentNode.insertBefore(D,k):tC(k,_,!1)?I.insertAfter(D,eC(k)):(k=eC(k),(O=M.cloneRange()).setStartAfter(_),O.setEndAfter(k),B=O.extractContents(),"LI"===A&&(B.firstChild&&"LI"===B.firstChild.nodeName)?(D=B.firstChild,I.insertAfter(B,k)):(I.insertAfter(B,k),I.insertAfter(D,k))),I.remove(_)),G0(E,D))):p&&b===a.getBody()||(p=p||"P",Pr(b)?(u=zr(b),c.isEmpty(b)&&nC(b),uC(a,u),G0(a,u)):n()?r():n(!0)?(u=b.parentNode.insertBefore(t(),b),G0(a,rC(b,"HR")?u:b)):((S=(w=d).cloneRange()).setStart(w.startContainer,iC(!0,w.startContainer,w.startOffset)),S.setEnd(w.endContainer,iC(!1,w.endContainer,w.endOffset)),(o=S.cloneRange()).setEndAfter(b),i=o.extractContents(),Y(Hu(Nt.fromDom(i),_n),function(e){var t=e.dom;t.nodeValue=wo(t.nodeValue)}),function(e){for(;jn(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(i),u=i.firstChild,c.insertAfter(i,b),function(e,t){var n,r,o=u,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;zn(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(n=i.length;n--;)!(o=i[n]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(r=o)&&"A"===r.nodeName&&e.isEmpty(r)&&e.remove(o)}}(c,f),function(e,t){t.normalize();var n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(c,b),c.isEmpty(b)&&nC(b),u.normalize(),c.isEmpty(u)?(c.remove(u),r()):(uC(a,u),G0(a,u))),c.setAttrib(u,"id",""),a.fire("NewBlock",{newBlock:u})))}function cC(e,t,n){var r=e.dom.createRng();n?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)),e.selection.setRng(r),Zf(e,r)}function lC(e,t){var n=Nt.fromTag("br");qt(Nt.fromDom(t),n),e.undoManager.add()}function fC(e,t){XC(e.getBody(),t)||$t(Nt.fromDom(t),Nt.fromTag("br"));var n=Nt.fromTag("br");$t(Nt.fromDom(t),n),cC(e,n.dom,!1),e.undoManager.add()}function dC(e){return e&&"A"===e.nodeName&&"href"in e}function mC(e){return e.fold(R,dC,dC,R)}function gC(e,t){t.fold(te,A(lC,e),A(fC,e),te)}function pC(e,t){var n,r,o,i=(r=A(nb,n=e),o=as.fromRangeStart(n.selection.getRng()),Qb(r,n.getBody(),o).filter(mC));i.isSome()?i.each(A(gC,e)):function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();Rf(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u,s=a.startOffset,c=a.startContainer;1===c.nodeType&&c.hasChildNodes()&&(u=s>c.childNodes.length-1,c=c.childNodes[Math.min(s,c.childNodes.length-1)]||c,s=u&&3===c.nodeType?c.nodeValue.length:0);var l=i.getParent(c,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==d||m||(l=f),c&&3===c.nodeType&&s>=c.nodeValue.length&&!function(e){for(var t,n=new Rr(c,l),r=e.getNonEmptyElements();t=n.next();)if(r[t.nodeName.toLowerCase()]||0t}),WC=A(V0,Iy),KC=A(V0,My),XC=function(e,t){return n=as.after(t),!!Wn(n.getNode())||Ql(e,as.after(t)).map(function(e){return Wn(e.getNode())}).getOr(!1);var n},YC=or([{br:[]},{block:[]},{none:[]}]),GC=dt().browser,JC=dt(),QC=A(TC,yo),ZC=A(TC," "),e1=(t1.prototype.nodeChanged=function(e){var t,n,r,o=this.editor.selection;this.editor.initialized&&o&&!this.editor.getParam("disable_nodechange")&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),(t=o.getStart(!0)||r).ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(t,r)||(t=r),n=[],this.editor.dom.getParent(t,function(e){return e===r||void n.push(e)}),(e=e||{}).element=t,e.parents=n,this.editor.fire("NodeChange",e))},t1.prototype.isSameElementPath=function(e){var t,n=this.editor.$(e).parentsUntil(this.editor.getBody()).add(e);if(n.length===this.lastPath.length){for(t=n.length;0<=t&&n[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=n,!0}return this.lastPath=n,!1},t1);function t1(r){var o;this.lastPath=[],this.editor=r;var t=this;"onselectionchange"in r.getDoc()||r.on("NodeChange click mouseup keyup focus",function(e){var t=r.selection.getRng(),n={startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset};"nodechange"!==e.type&&Sf(n,o)||r.fire("SelectionChange"),o=n}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!e||!xt.range&&r.selection.isCollapsed()||Tl(r)&&!t.isSameElementPath(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("mouseup",function(e){!e.isDefaultPrevented()&&Tl(r)&&("IMG"===r.selection.getNode().nodeName?_r.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())})}function n1(e){return zn(e)&&fo(Nt.fromDom(e))}function r1(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.documentElement,o=n.defaultView;return{top:t.top+o.pageYOffset-r.clientTop,left:t.left+o.pageXOffset-r.clientLeft}}function o1(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function i1(e,S){var E=_r.throttle(function(e,t){S._selectionOverrides.hideFakeCaret(),S.selection.placeCaretAt(e,t)},0);return S.on("remove",E.stop),function(w){return e.on(function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=Math.max(Math.abs(w.screenX-e.screenX),Math.abs(w.screenY-e.screenY));if(!e.dragging&&10
    ').attr("id",w)).appendTo(l.getBody());var i=y.createRng();t===n&&xt.ie?(o.empty().append('

    \xa0

    ').append(t),i.setStartAfter(o[0].firstChild.firstChild),i.setEndAfter(t)):(o.empty().append(yo).append(t).append(yo),i.setStart(o[0].firstChild,1),i.setEnd(o[0].lastChild,0)),o.css({top:y.getPos(e,l.getBody()).y}),o[0].focus();var a=b.getSel();return a.removeAllRanges(),a.addRange(i),i}(e,n.targetClone,t),o=Nt.fromDom(e);return Y(hu(Nt.fromDom(l.getBody()),"*[data-mce-selected]"),function(e){je(o,e)||yn(e,S)}),y.getAttrib(e,S)||e.setAttribute(S,"1"),v=e,E(),r}(c)}return null}function h(){v&&v.removeAttribute(S),vr(Nt.fromDom(l.getBody()),"#"+w).each(Ln),v=null}var v,n,e,o,b=l.selection,y=l.dom,C=y.isBlock,x=l.getBody(),i=Vs(l,x,C,function(){return vd(l)}),w="sel-"+y.uniqueId(),S="data-mce-selected",r=b.getRng,E=function(){i.hide()};return xt.ceFalse&&!mh(l)&&(l.on("mouseup",function(e){var t=r();t.collapsed&&av(l,e.clientX,e.clientY)&&Sb(l,t,!1).each(d)}),l.on("click",function(e){var t=s1(l,e.target);t&&(P1(t)&&(e.preventDefault(),l.focus()),B1(t)&&y.isChildOf(t,b.getNode())&&h())}),l.on("blur NewBlock",h),l.on("ResizeWindow FullscreenStateChanged",i.reposition),l.on("tap",function(e){var t=e.target,n=s1(l,t);P1(n)?(e.preventDefault(),wb(l,n).each(p)):f(t)&&wb(l,t).each(p)},!0),l.on("mousedown",function(e){var t,n,r,o,i,a,u,s=e.target;s!==x&&"HTML"!==s.nodeName&&!y.isChildOf(s,x)||!1===av(l,e.clientX,e.clientY)||((t=s1(l,s))?P1(t)?(e.preventDefault(),wb(l,t).each(p)):(h(),B1(t)&&e.shiftKey||hf(e.clientX,e.clientY,b.getRng())||(E(),b.placeCaretAt(e.clientX,e.clientY))):f(s)?wb(l,s).each(p):!1===$s(s)&&(h(),E(),(n=Yy(x,e.clientX,e.clientY))&&(r=s,o=n.node,a=y.getParent(r,C),u=y.getParent(o,C),!K(a)&&(r!==u&&y.isChildOf(a,u)&&!1===P1(s1(l,a))||!y.isChildOf(u,a)&&(i=u,y.getParent(a,C)!==y.getParent(i,C))&&function(e){var t=e.firstChild;if(!K(t)){var n=as.before(t);if(Wn(n.getNode())&&1===e.childNodes.length)return!c(n);var r=Pc(e).next(n);return r&&!c(r)}}(a))||(e.preventDefault(),d(m(1,n.node,n.before,!1)),l.getBody().focus()))))}),l.on("keypress",function(e){Bf.modifierPressed(e)||P1(b.getNode())&&e.preventDefault()}),l.on("GetSelectionRange",function(e){var t=e.range;v&&(v.parentNode?((t=t.cloneRange()).selectNode(v),e.range=t):v=null)}),l.on("SetSelectionRange",function(e){var t,n,r,o,i,a,u;e.range=(t=e.range,n=l.schema.getShortEndedElements(),r=y.createRng(),o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,Ne(n,o.nodeName.toLowerCase())?0===i?r.setStartBefore(o):r.setStartAfter(o):r.setStart(o,i),Ne(n,a.nodeName.toLowerCase())?0===u?r.setEndBefore(a):r.setEndAfter(a):r.setEnd(a,u),r);var s=p(e.range,e.forward);s&&(e.range=s)}),l.on("AfterSetSelectionRange",function(e){var t=e.range,n=t.startContainer.parentNode;g(t)||"mcepastebin"===n.id||E(),y.hasClass(n,"mce-offscreen-selection")||h()}),l.on("copy",function(e){var t,n,r=e.clipboardData;e.isDefaultPrevented()||!e.clipboardData||xt.ie||(t=(n=y.get(w))&&n.getElementsByTagName("*")[0])&&(e.preventDefault(),r.clearData(),r.setData("text/html",t.outerHTML),r.setData("text/plain",t.outerText||t.innerText))}),u1(l),e=lu(function(){var e,t;n.removed||!n.getBody().contains(document.activeElement)||(e=n.selection.getRng()).collapsed&&(t=Eb(n,e,!1),n.selection.setRng(t))},0),(n=l).on("focus",function(){e.throttle()}),n.on("blur",function(){e.cancel()}),(o=l).on("init",function(){o.on("focusin",function(e){var t,n,r=e.target;Jn(r)&&(t=pf(o.getBody(),r),n=Yn(t)?t:r,o.selection.getNode()!==n&&wb(o,n).each(function(e){return o.selection.setRng(e)}))})})),{showCaret:m,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(zr(e),d(r()),b.scrollIntoView(e))},hideFakeCaret:E,destroy:function(){i.destroy(),v=null}}}function l1(a){function e(e,t){try{a.getDoc().execCommand(e,!1,t)}catch(e){}}function u(e){return e.isDefaultPrevented()}function t(){a.shortcuts.add("meta+a",null,"SelectAll")}function n(){a.inline||b.bind(a.getDoc(),"mousedown mouseup",function(e){var t;e.target===a.getDoc().documentElement&&(t=y.getRng(),a.getBody().focus(),"mousedown"===e.type?Ir(t.startContainer)||y.placeCaretAt(e.clientX,e.clientY):y.setRng(t))})}function r(){Range.prototype.getClientRects||a.on("mousedown",function(e){var t;u(e)||"HTML"!==e.target.nodeName||((t=a.getBody()).blur(),_r.setEditorTimeout(a,function(){t.focus()}))})}function o(){a.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==b.getContentEditableParent(t)&&(e.preventDefault(),a.selection.select(t),a.nodeChanged()),"A"===t.nodeName&&b.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),y.select(t))})}function i(){a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function s(){a.getParam("readonly")||a.on("BeforeExecCommand mousedown",function(){e("StyleWithCSS",!1),e("enableInlineTableEditing",!1),Ts(a)||e("enableObjectResizing",!1)})}function c(){a.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function l(){a.inline||a.on("keydown",function(){document.activeElement===document.body&&a.getWin().focus()})}function f(){a.inline||(a.contentStyles.push("body {min-height: 150px}"),a.on("click",function(e){var t;"HTML"===e.target.nodeName&&(11")+"";e.getParam("document_base_url","")!==e.documentBaseUrl&&(t+=''),t+='';var n=xs(e,"body_id","tinymce"),r=xs(e,"body_class","");return ws(e)&&(t+=''),t+('
    '}(e),I1.add(t.iframeContainer,u),s}function y1(e){return e.replace(/^\-/,"")}function C1(e){return{editorContainer:e,iframeContainer:e,api:{}}}function x1(e){var t,n,r,o,i,a,u,s=e.getElement();return e.orgDisplay=s.style.display,X(Bs(e))?e.theme.renderUI():y(Bs(e))?(n=(t=e).getElement(),(r=Bs(t)(t,n)).editorContainer.nodeType&&(r.editorContainer.id=r.editorContainer.id||t.id+"_parent"),r.iframeContainer&&r.iframeContainer.nodeType&&(r.iframeContainer.id=r.iframeContainer.id||t.id+"_iframecontainer"),r.height=r.iframeHeight||n.offsetHeight,r):(u=(o=e).getElement(),o.inline?C1(null):(i=u,a=M1.create("div"),M1.insertAfter(a,i),C1(a)))}function w1(e){var n,t,r,o,i,a,u,s;e.fire("ScriptsLoaded"),n=e,t=Et.trim(ks(n)),r=n.ui.registry.getAll().icons,ne(_e(_e({},_v.get("default").icons),_v.get(t).icons),function(e,t){Ne(r,t)||n.ui.registry.addIcon(t,e)}),a=Bs(o=e),X(a)?(o.settings.theme=y1(a),i=Bv.get(a),o.theme=new i(o,Bv.urls[a]),o.theme.init&&o.theme.init(o,Bv.urls[a]||o.documentBaseUrl.replace(/\/$/,""),o.$)):o.theme={},s=[],Et.each(Ls(u=e).split(/[ ,]/),function(e){F1(u,s,y1(e))});var c=x1(e),l=e,f=ve.from(c.api).getOr({}),d={show:ve.from(f.show).getOr(te),hide:ve.from(f.hide).getOr(te),disable:ve.from(f.disable).getOr(te),isDisabled:ve.from(f.isDisabled).getOr(R),enable:function(){l.mode.isReadOnly()||ve.from(f.enable).map(x)}};l.ui=_e(_e({},l.ui),d);var m,g,p,h={editorContainer:c.editorContainer,iframeContainer:c.iframeContainer};return e.editorContainer=h.editorContainer||null,zv(e),e.inline?v1(e):(p=b1(m=e,g=h),g.editorContainer&&(I1.get(g.editorContainer).style.display=m.orgDisplay,m.hidden=I1.isHidden(g.editorContainer)),m.getElement().style.display="none",I1.setAttrib(m.id,"aria-hidden","true"),void(p||v1(m)))}function S1(e){return"-"===e.charAt(0)}function E1(t,e,n){return ve.from(e).filter(function(e){return 0")},mceToggleVisualAid:function(){u.hasVisual=!u.hasVisual,u.addVisual()},mceReplaceContent:function(e,t,n){u.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,u.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){"string"==typeof n&&(n={href:n});var r=u.dom.getParent(u.selection.getNode(),"a");n.href=n.href.replace(/ /g,"%20"),r&&n.href||u.formatter.remove("link"),n.href&&u.formatter.apply("link",n,r)},selectAll:function(){var e,t=u.dom.getParent(u.selection.getStart(),Xn);t&&((e=u.dom.createRng()).selectNodeContents(t),u.selection.setRng(e))},mceNewDocument:function(){u.setContent("")},InsertLineBreak:function(e,t,n){return pC(u,n),!0}}),o.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return o.isFormatMatch(e)},mceBlockQuote:function(){return o.isFormatMatch("blockquote")},Outdent:function(){return b0(u)},"InsertUnorderedList,InsertOrderedList":function(e){var t=u.dom.getParent(u.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),o.addCommands({Undo:function(){u.undoManager.undo()},Redo:function(){u.undoManager.redo()}}),o.addQueryValueHandler("FontName",function(){return A1(t=u,function(e){return j1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("FontSize",function(){return A1(t=u,function(e){return H1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("LineHeight",function(){return A1(t=u,function(n){var e=Nt.fromDom(t.getBody());return Ag(n,function(e){return wn(e,"line-height")},A(je,e)).getOrThunk(function(){var e=parseFloat(xn(n,"line-height")),t=parseFloat(xn(n,"font-size"));return String(e/t)})}).getOr("");var t},this)},K1);function K1(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}function X1(e,t,n){var r,o,i,a,u,s;pu(e,t)&&!1===n?(o=t,mu(r=e)?r.dom.classList.remove(o):(u=o,0<(s=U(du(a=r,"class"),function(e){return e!==u})).length?pn(a,"class",s.join(" ")):yn(a,"class")),0===(mu(i=r)?i.dom.classList:du(i,"class")).length&&yn(i,"class")):n&&gu(e,t)}function Y1(e,t,n){try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}}function G1(e,t){e.dom.contentEditable=t?"true":"false"}function J1(e,t){var n,r,o=Nt.fromDom(e.getBody());X1(o,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),ve.from(e.selection.getNode()).each(function(e){e.removeAttribute("data-mce-selected")}),G1(o,!(e.readonly=!0)),Y(hu(o,'*[contenteditable="true"]'),function(e){pn(e,ex,"true"),G1(e,!1)})):(G1(o,!(e.readonly=!1)),Y(hu(o,"*["+ex+'="true"]'),function(e){yn(e,ex),G1(e,!0)}),Y1(e,"StyleWithCSS",!1),Y1(e,"enableInlineTableEditing",!1),Y1(e,"enableObjectResizing",!1),(vd(n=e)||(r=n,td(Bn(Nt.fromDom(r.getElement()))).filter(function(e){return!(void 0!==(t=e.dom.classList)&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body")))&&dd(r,e.dom);var t}).isSome()))&&e.focus(),e.selection.setRng(e.selection.getRng()),e.nodeChanged())}function Q1(e){return e.readonly}function Z1(t){t.parser.addAttributeFilter("contenteditable",function(e){Q1(t)&&Y(e,function(e){e.attr(ex,e.attr("contenteditable")),e.attr("contenteditable","false")})}),t.serializer.addAttributeFilter(ex,function(e){Q1(t)&&Y(e,function(e){e.attr("contenteditable",e.attr(ex))})}),t.serializer.addTempAttr(ex)}var ex="data-mce-contenteditable",tx=Et.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),nx=(rx.isNative=function(e){return!!tx[e.toLowerCase()]},rx.prototype.fire=function(e,t){var n=e.toLowerCase(),r=io(n,t||{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(r);var o=this.bindings[n];if(o)for(var i=0,a=o.length;i"),cx);return o[o.length-1]=Et.extend(o[o.length-1],{func:n,scope:r||this.editor}),Et.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},Cx.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},Cx.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},Cx.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},Cx.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},Cx);function Cx(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(px(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}var xx=Ja.DOM,wx=Et.extend,Sx=Et.each,Ex=Et.resolve,Nx=xt.ie,kx=(_x.prototype.render=function(){!function(t){var e=t.id;uu.setCode(As(t));var n,r,o,i,a=function(){U1.unbind(window,"ready",a),t.render()};ai.Event.domLoaded?t.getElement()&&xt.contentEditable&&(n=Nt.fromDom(t.getElement()),r=L(n.dom.attributes,function(e,t){return e[t.name]=t.value,e},{}),t.on("remove",function(){O(n.dom.attributes,function(e){return yn(n,e.name),0}),hn(n,r)}),t.ui.styleSheetLoader=Ar.forElement(n,{contentCssCors:(o=t).getParam("content_css_cors"),referrerPolicy:_s(o)}),t.getParam("inline")?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden"),(i=t.getElement().form||U1.getParent(e,"form"))&&(t.formElement=i,t.getParam("hidden_input")&&!Hn(t.getElement())&&(U1.insertAfter(U1.create("input",{type:"hidden",name:e}),e),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},U1.bind(i,"submit reset",t.formEventDelegate),t.on("reset",function(){t.resetContent()}),!t.getParam("submit_patch")||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),i._mceOldSubmit(i)})),t.windowManager=Pv(t),t.notificationManager=uv(t),"xml"===t.getParam("encoding")&&t.on("GetContent",function(e){e.save&&(e.content=U1.encode(e.content))}),t.getParam("add_form_submit_trigger")&&t.on("submit",function(){t.initialized&&t.save()}),t.getParam("add_unload_trigger")&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),N1(t,t.suffix)):U1.bind(window,"ready",a)}(this)},_x.prototype.focus=function(e){this.execCommand("mceFocus",!1,e)},_x.prototype.hasFocus=function(){return vd(this)},_x.prototype.execCallback=function(e){for(var t=[],n=1;n",visual:!0,font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,inline_styles:!0,convert_fonts_to_spans:!0,indent:!0,indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:v.convertURL,url_converter_scope:v},y=_e(_e({},b),h?kv:{}),!1!==(C=nv(Sv||Ev,Sv,y,m,g)).deprecation_warnings&&Jh(g,C),C),this.settings.suffix&&(n.suffix=this.settings.suffix),this.suffix=n.suffix,this.settings.base_url&&n._setBaseUrl(this.settings.base_url),this.baseUri=n.baseURI,this.settings.referrer_policy&&(tu.ScriptLoader._setReferrerPolicy(this.settings.referrer_policy),Ja.DOM.styleSheetLoader._setReferrerPolicy(this.settings.referrer_policy)),su.languageLoad=this.settings.language_load,su.baseURL=n.baseURL,this.id=e,this.setDirty(!1),this.documentBaseURI=new Kd(this.settings.document_base_url,{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=!!this.settings.inline,this.shortcuts=new yx(this),this.editorCommands=new W1(this),this.settings.cache_suffix&&(xt.cacheSuffix=this.settings.cache_suffix.replace(/^[\?\&]+/,"")),this.ui={registry:{addAutocompleter:(u={},(r={addButton:w(o={},"button"),addGroupToolbarButton:w(o,"grouptoolbarbutton"),addToggleButton:w(o,"togglebutton"),addMenuButton:w(o,"menubutton"),addSplitButton:w(o,"splitbutton"),addMenuItem:w(i={},"menuitem"),addNestedMenuItem:w(i,"nestedmenuitem"),addToggleMenuItem:w(i,"togglemenuitem"),addAutocompleter:w(a={},"autocompleter"),addContextMenu:w(s={},"contextmenu"),addContextToolbar:w(c={},"contexttoolbar"),addContextForm:w(c,"contextform"),addSidebar:w(l={},"sidebar"),addIcon:function(e,t){return u[e.toLowerCase()]=t},getAll:function(){return{buttons:o,menuItems:i,icons:u,popups:a,contextMenus:s,contextToolbars:c,sidebars:l}}}).addAutocompleter),addButton:r.addButton,addContextForm:r.addContextForm,addContextMenu:r.addContextMenu,addContextToolbar:r.addContextToolbar,addIcon:r.addIcon,addMenuButton:r.addMenuButton,addMenuItem:r.addMenuItem,addNestedMenuItem:r.addNestedMenuItem,addSidebar:r.addSidebar,addSplitButton:r.addSplitButton,addToggleButton:r.addToggleButton,addGroupToolbarButton:r.addGroupToolbarButton,addToggleMenuItem:r.addToggleMenuItem,getAll:r.getAll},styleSheetLoader:void 0,show:te,hide:te,enable:te,disable:te,isDisabled:R};var S,E,N,k,_,A=(k=ru("design"),_=ru({design:{activate:te,deactivate:te,editorReadOnly:!1},readonly:{activate:te,deactivate:te,editorReadOnly:!0}}),(E=S=this).serializer?Z1(E):E.on("PreInit",function(){Z1(E)}),(N=S).on("ShowCaret",function(e){Q1(N)&&e.preventDefault()}),N.on("ObjectSelected",function(e){Q1(N)&&e.preventDefault()}),{isReadOnly:function(){return Q1(S)},set:function(e){return function(e,t,n,r){if(r!==n.get()){if(!Ne(t,r))throw new Error("Editor mode '"+r+"' is invalid");e.initialized?sx(e,n,t,r):e.on("init",function(){return sx(e,n,t,r)})}}(S,_.get(),k,e)},get:function(){return k.get()},register:function(e,t){_.set(function(e,t,n){var r;if(D(gx,t))throw new Error("Cannot override default mode "+t);return _e(_e({},e),((r={})[t]=_e(_e({},n),{deactivate:function(){try{n.deactivate()}catch(e){console.error("problem while deactivating editor mode "+t+":",e)}}}),r))}(_.get(),e,t))}});this.mode=A,this.setMode=A.set,n.fire("SetupEditor",{editor:this}),this.execCallback("setup",this),this.$=Wa.overrideDefaults(function(){return{context:x.inline?x.getBody():x.getDoc(),element:x.getBody()}})}function Ax(t){var n=t.type;Px(Hx.get(),function(e){switch(n){case"scroll":e.fire("ScrollWindow",t);break;case"resize":e.fire("ResizeWindow",t)}})}function Rx(e){e!==Mx&&(e?Wa(window).on("resize scroll",Ax):Wa(window).off("resize scroll",Ax),Mx=e)}function Dx(t){var e=Ux;delete Fx[t.id];for(var n=0;n=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n=Gx(e.x,t.x),r=Gx(e.y,t.y),o=Yx(e.x+e.w,t.x+t.w),i=Yx(e.y+e.h,t.y+t.h);return o-n<0||i-r<0?null:qx(n,r,o-n,i-r)},clamp:function(e,t,n){var r=e.x,o=e.y,i=e.x+e.w,a=e.y+e.h,u=t.x+t.w,s=t.y+t.h,c=Gx(0,t.x-r),l=Gx(0,t.y-o),f=Gx(0,i-u),d=Gx(0,a-s);return r+=c,o+=l,n&&(i+=c,a+=l,r-=f,o-=d),qx(r,o,(i-=f)-r,(a-=d)-o)},create:qx,fromClientRect:function(e){return qx(e.left,e.top,e.width,e.height)}},Zx=($x={},Wx={},{load:function(r,o){var i='Script at URL "'+o+'" failed to load',a='Script at URL "'+o+"\" did not call `tinymce.Resource.add('"+r+"', data)` within 1 second";if(void 0!==$x[r])return $x[r];var e=new kr(function(e,t){var n=function(e,t,n){function r(n){return function(){for(var e=[],t=0;t Date: Sun, 24 Oct 2021 21:22:08 +0200 Subject: [PATCH 025/412] Read and archive bit visible in book table --- cps/db.py | 63 +++++++++++++++++++++++------------ cps/editbooks.py | 11 +++++- cps/shelf.py | 1 + cps/static/js/table.js | 26 +++++++++++++-- cps/templates/book_table.html | 11 +++--- cps/templates/detail.html | 2 +- cps/web.py | 54 +++++++++++++++++++++++------- 7 files changed, 124 insertions(+), 44 deletions(-) diff --git a/cps/db.py b/cps/db.py index 64abbe1b3..cf4ab50cc 100644 --- a/cps/db.py +++ b/cps/db.py @@ -605,13 +605,6 @@ class CalibreDB(): filter(self.common_filters(allow_show_archived)).first() def get_book_read_archived(self, book_id, read_column, allow_show_archived=False): - # Add missing relationships for inter database joins - #setattr(Books, "is_archived", - # relationship(ub.ArchivedBook, - # uselist=False, - # foreign_keys=ub.ArchivedBook.book_id, - # primaryjoin=and_(Books.id == ub.ArchivedBook.book_id, - # int(current_user.id) == ub.ArchivedBook.user_id))) if not read_column: bd = (self.session.query(Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived).select_from(Books) .join(ub.ReadBook, and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id), @@ -704,11 +697,13 @@ class CalibreDB(): return outcome[offset:offset + limit] # Fill indexpage with all requested data from database - def fill_indexpage(self, page, pagesize, database, db_filter, order, *join): - return self.fill_indexpage_with_archived_books(page, pagesize, db_filter, order, False, database, join) + def fill_indexpage(self, page, pagesize, database, db_filter, order, + join_archive_read=False, config_read_column=0, *join): + return self.fill_indexpage_with_archived_books(page, database, pagesize, db_filter, order, False, + join_archive_read, config_read_column, *join) - def fill_indexpage_with_archived_books(self, page, pagesize, db_filter, order, allow_show_archived, - *args): + def fill_indexpage_with_archived_books(self, page, database, pagesize, db_filter, order, allow_show_archived, + join_archive_read, config_read_column, *join): pagesize = pagesize or self.config.config_books_per_page if current_user.show_detail_random(): randm = self.session.query(Books) \ @@ -717,15 +712,26 @@ class CalibreDB(): .limit(self.config.config_random_books).all() else: randm = false() - if len(args) > 1: - if isinstance(args[0], DeclarativeMeta): - query = self.session.query(args[0]) + if join_archive_read: + if not config_read_column: + query = (self.session.query(database, ub.ReadBook.read_status, ub.ArchivedBook.is_archived) + .select_from(Books) + .outerjoin(ub.ReadBook, + and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == Books.id))) else: - query = self.session.query(*args[0]) - join = args[1] + try: + read_column = cc_classes[config_read_column] + query = (self.session.query(database, read_column.value, ub.ArchivedBook.is_archived) + .select_from(Books) + .outerjoin(read_column, read_column.book == Books.id)) + except (KeyError, AttributeError): + log.error("Custom Column No.%d is not existing in calibre database", read_column) + # Skip linking read column and return None instead of read status + query =self.session.query(database, None, ub.ArchivedBook.is_archived) + query = query.outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id)) else: - join = tuple() - query = self.session.query(args) + query = self.session.query(database) off = int(int(pagesize) * (page - 1)) indx = len(join) @@ -793,16 +799,29 @@ class CalibreDB(): return self.session.query(Books) \ .filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first() - def search_query(self, term, *join): + def search_query(self, term, config_read_column, *join): term.strip().lower() self.session.connection().connection.connection.create_function("lower", 1, lcase) q = list() authorterms = re.split("[, ]+", term) for authorterm in authorterms: q.append(Books.authors.any(func.lower(Authors.name).ilike("%" + authorterm + "%"))) - query = (self.session.query(Books, ub.ArchivedBook.is_archived) - .outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, - int(current_user.id) == ub.ArchivedBook.user_id))) + if not config_read_column: + query = (self.session.query(Books, ub.ArchivedBook.is_archived, ub.ReadBook).select_from(Books) + .outerjoin(ub.ReadBook, and_(Books.id == ub.ReadBook.book_id, + int(current_user.id) == ub.ReadBook.user_id))) + else: + try: + read_column = cc_classes[config_read_column] + query = (self.session.query(Books, ub.ArchivedBook.is_archived, read_column.value).select_from(Books) + .outerjoin(read_column, read_column.book == Books.id)) + except (KeyError, AttributeError): + log.error("Custom Column No.%d is not existing in calibre database", config_read_column) + # Skip linking read column + query = self.session.query(Books, ub.ArchivedBook.is_archived, None) + query = query.outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id)) + if len(join) == 6: query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]).outerjoin(join[5]) if len(join) == 3: diff --git a/cps/editbooks.py b/cps/editbooks.py index e466e22c9..383422b17 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -1161,13 +1161,22 @@ def edit_list_book(param): ret = Response(json.dumps({'success': True, 'newValue': ' & '.join([author.replace('|',',') for author in input_authors])}), mimetype='application/json') + elif param =='is_archive': + # ToDo save + ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), + mimetype='application/json') + elif param =='read_status': + # ToDo save + ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), + mimetype='application/json') elif param.startswith("custom_column_"): new_val = dict() new_val[param] = vals['value'] edit_single_cc_data(book.id, book, param[14:], new_val) ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), mimetype='application/json') - + else: + return _("Parameter not found"), 400 book.last_modified = datetime.utcnow() try: calibre_db.session.commit() diff --git a/cps/shelf.py b/cps/shelf.py index 09fe8dd4e..2f9269a41 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -425,6 +425,7 @@ def render_show_shelf(shelf_type, shelf_id, page_no, sort_param): db.Books, ub.BookShelf.shelf == shelf_id, [ub.BookShelf.order.asc()], + False, 0, ub.BookShelf, ub.BookShelf.book_id == db.Books.id) # delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web wrong_entries = calibre_db.session.query(ub.BookShelf) \ diff --git a/cps/static/js/table.js b/cps/static/js/table.js index d1a328622..ba664d64f 100644 --- a/cps/static/js/table.js +++ b/cps/static/js/table.js @@ -631,14 +631,21 @@ function singleUserFormatter(value, row) { } function checkboxFormatter(value, row){ - if(value & this.column) + if (value & this.column) return ''; else return ''; } +function bookCheckboxFormatter(value, row){ + if (value) + return ''; + else + return ''; +} + function singlecheckboxFormatter(value, row){ - if(value) + if (value) return ''; else return ''; @@ -790,7 +797,7 @@ function handleListServerResponse (data) { function checkboxChange(checkbox, userId, field, field_index) { $.ajax({ method: "post", - url: window.location.pathname + "/../../ajax/editlistusers/" + field, + url: getPath() + "/ajax/editlistusers/" + field, data: {"pk": userId, "field_index": field_index, "value": checkbox.checked}, error: function(data) { handleListServerResponse([{type:"danger", message:data.responseText}]) @@ -799,6 +806,19 @@ function checkboxChange(checkbox, userId, field, field_index) { }); } +function BookCheckboxChange(checkbox, userId, field) { + $.ajax({ + method: "post", + url: getPath() + "/ajax/editbooks/" + field, + data: {"pk": userId, "value": checkbox.checked}, + error: function(data) { + handleListServerResponse([{type:"danger", message:data.responseText}]) + }, + success: handleListServerResponse + }); +} + + function selectHeader(element, field) { if (element.value !== "None") { confirmDialog(element.id, "GeneralChangeModal", 0, function () { diff --git a/cps/templates/book_table.html b/cps/templates/book_table.html index 6f8e87471..bbdbe50de 100644 --- a/cps/templates/book_table.html +++ b/cps/templates/book_table.html @@ -14,13 +14,13 @@ >{{ show_text }} {%- endmacro %} -{% macro book_checkbox_row(parameter, array_field, show_text, element, value, sort) -%} - + {%- endmacro %} @@ -71,7 +71,8 @@ {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }} {{_('Comments')}} - + {{ book_checkbox_row('is_archived', _('Enter Archiv Status'), false)}} + {{ book_checkbox_row('read_status', _('Enter Read Status'), false)}} {% for c in cc %} {% if c.datatype == "int" %} {{c.name}} diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 00c6ca962..919afaffd 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -228,7 +228,7 @@
    diff --git a/cps/web.py b/cps/web.py index 0fcb43f45..6892ec9e3 100644 --- a/cps/web.py +++ b/cps/web.py @@ -406,6 +406,7 @@ def render_books_list(data, sort, book_id, page): else: website = data or "newest" entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, order, + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) @@ -419,6 +420,7 @@ def render_rated_books(page, book_id, order): db.Books, db.Books.ratings.any(db.Ratings.rating > 9), order, + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) @@ -482,6 +484,7 @@ def render_downloaded_books(page, order, user_id): db.Books, ub.Downloads.user_id == user_id, order, + False, 0, ub.Downloads, db.Books.id == ub.Downloads.book_id) for book in entries: if not calibre_db.session.query(db.Books).filter(calibre_db.common_filters()) \ @@ -504,6 +507,7 @@ def render_author_books(page, author_id, order): db.Books, db.Books.authors.any(db.Authors.id == author_id), [order[0], db.Series.name, db.Books.series_index], + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) @@ -535,6 +539,7 @@ def render_publisher_books(page, book_id, order): db.Books, db.Books.publishers.any(db.Publishers.id == book_id), [db.Series.name, order[0], db.Books.series_index], + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) @@ -590,6 +595,7 @@ def render_category_books(page, book_id, order): db.Books, db.Books.tags.any(db.Tags.id == book_id), [order[0], db.Series.name, db.Books.series_index], + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series) @@ -625,6 +631,7 @@ def render_read_books(page, are_read, as_xml=False, order=None): db.Books, db_filter, order, + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series, @@ -639,6 +646,7 @@ def render_read_books(page, are_read, as_xml=False, order=None): db.Books, db_filter, order, + False, 0, db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series, @@ -676,11 +684,12 @@ def render_archived_books(page, order): archived_filter = db.Books.id.in_(archived_book_ids) - entries, random, pagination = calibre_db.fill_indexpage_with_archived_books(page, 0, + entries, random, pagination = calibre_db.fill_indexpage_with_archived_books(page, db.Books, + 0, archived_filter, order, True, - db.Books) + False, 0) name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' pagename = "archived" @@ -770,7 +779,7 @@ def list_books(): sort = request.args.get("sort", "id") order = request.args.get("order", "").lower() state = None - join = list() + join = tuple() if sort == "state": state = json.loads(request.args.get("state", "[]")) @@ -802,27 +811,48 @@ def list_books(): books = calibre_db.search_query(search).all() filtered_count = len(books) else: - books = (calibre_db.session.query(db.Books,ub.ArchivedBook.is_archived) - .outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id, - int(current_user.id) == ub.ArchivedBook.user_id)) + if not config.config_read_column: + books = (calibre_db.session.query(db.Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived) + .select_from(db.Books) + .outerjoin(ub.ReadBook, + and_(ub.ReadBook.user_id == int(current_user.id), + ub.ReadBook.book_id == db.Books.id))) + else: + try: + read_column = db.cc_classes[config.config_read_column] + books = (calibre_db.session.query(db.Books, read_column.value, ub.ArchivedBook.is_archived) + .select_from(db.Books) + .outerjoin(read_column, read_column.book == db.Books.id)) + except (KeyError, AttributeError): + log.error("Custom Column No.%d is not existing in calibre database", read_column) + # Skip linking read column and return None instead of read status + books =calibre_db.session.query(db.Books, None, ub.ArchivedBook.is_archived) + books = (books.outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id, + int(current_user.id) == ub.ArchivedBook.user_id)) .filter(calibre_db.common_filters()).all()) entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order, True) elif search: - entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *tuple(join)) + entries, filtered_count, __ = calibre_db.get_search_results(search, + off, + order, + limit, + config.config_read_column, + *join) else: - join.append(ub.ArchivedBook) - join.append(and_(db.Books.id == ub.ArchivedBook.book_id,int(current_user.id) == ub.ArchivedBook.user_id)) entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, - (db.Books, ub.ArchivedBook), + db.Books, True, order, - *tuple(join)) + True, + config.config_read_column, + *join) result = list() for entry in entries: val = entry[0] - val.is_archived = entry[1] == True + val.read_status = entry[1] == ub.ReadBook.STATUS_FINISHED + val.is_archived = entry[2] is True for index in range(0, len(val.languages)): val.languages[index].language_name = isoLanguages.get_language_name(get_locale(), val.languages[ index].lang_code) From 3a1a32f053d2ab94d0768ab2aca6b7aeaea2bb3b Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 25 Oct 2021 19:16:52 +0200 Subject: [PATCH 026/412] Update infinite scrolling javascript --- cps/static/js/libs/context.min.js | 11 +++++------ cps/static/js/libs/intention.min.js | 19 +++++++++---------- cps/static/js/libs/plugins.js | 14 +++++++++----- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/cps/static/js/libs/context.min.js b/cps/static/js/libs/context.min.js index 21bbcc5f3..6d0ed1994 100644 --- a/cps/static/js/libs/context.min.js +++ b/cps/static/js/libs/context.min.js @@ -1,10 +1,9 @@ -/*! intention.js v0.9.7.3 +/*! intention.js v0.9.9 * http://intentionjs.com/ * * context.js * -* Copyright 2011, 2013 Dowjones and other contributors -* Released under the MIT license -* -*/ -!function(){"use strict";var a=function(a,b){function c(a,b){var c=new Date,d=null;return function(e){var f=new Date;if(b>f-c){d&&window.clearTimeout(d);var g=function(b){return function(){a(b)}};return d=window.setTimeout(g(e),b),!1}a(e),c=f}}var d,e,f=new b;return f.responsive([{name:"base"}]).respond("base"),d=f.responsive({ID:"width",contexts:[{name:"standard",min:840},{name:"tablet",min:510},{name:"mobile",min:0}],matcher:function(a,b){return"string"==typeof a?a===b.name:a>=b.min},measure:function(b){return"string"==typeof b?b:a(window).width()}}),e=f.responsive({ID:"orientation",contexts:[{name:"portrait",rotation:0},{name:"landscape",rotation:90}],matcher:function(a,b){return a===b.rotation},measure:function(){var a=Math.abs(window.orientation);return a>0&&(a=180-a),a}}),f.responsive({ID:"touch",contexts:[{name:"touch"}],matcher:function(){return"ontouchstart"in window}}).respond(),f.responsive({ID:"highres",contexts:[{name:"highres"}],matcher:function(){return window.devicePixelRatio>1}}).respond(),a(window).on("resize",c(d.respond,100)).on("orientationchange",d.respond).on("orientationchange",e.respond),d.respond(),e.respond(),a(function(){f.elements(document)}),f};!function(a,b){"function"==typeof define&&define.amd?define("context",["jquery","intention"],b):a.intent=b(a.jQuery,a.Intention)}(this,function(b,c){return a(b,c)})}.call(this); \ No newline at end of file +* Copyright 2008, 2013 +* Dowjones and other contributors. +* Released under the MIT license. +**/ !function(){"use strict";var a=function(a,b){function c(a,b){var c=new Date,d=null;return function(e){var f=new Date;if(b>f-c){d&&window.clearTimeout(d);var g=function(b){return function(){a(b)}};return d=window.setTimeout(g(e),b),!1}a(e),c=f}}var d,e,f=new b;return f.responsive([{name:"base"}]).respond("base"),d=f.responsive({ID:"width",contexts:[{name:"standard",min:840},{name:"tablet",min:510},{name:"mobile",min:0}],matcher:function(a,b){return"string"==typeof a?a===b.name:a>=b.min},measure:function(b){return"string"==typeof b?b:a(window).width()}}),e=f.responsive({ID:"orientation",contexts:[{name:"portrait",rotation:0},{name:"landscape",rotation:90}],matcher:function(a,b){return a===b.rotation},measure:function(){var a=Math.abs(window.orientation);return a>0&&(a=180-a),a}}),f.responsive({ID:"touch",contexts:[{name:"touch"}],matcher:function(){return"ontouchstart"in window}}).respond(),f.responsive({ID:"highres",contexts:[{name:"highres"}],matcher:function(){return window.devicePixelRatio>1}}).respond(),a(window).on("resize",c(d.respond,100)).on("orientationchange",d.respond).on("orientationchange",e.respond),d.respond(),e.respond(),a(function(){f.elements(document)}),f};!function(a,b){"function"==typeof define&&define.amd?define("context",["jquery","intention"],b):a.intent=b(a.jQuery,a.Intention)}(this,function(b,c){return a(b,c)})}.call(this); diff --git a/cps/static/js/libs/intention.min.js b/cps/static/js/libs/intention.min.js index ad3f1d53d..1efea0cfc 100644 --- a/cps/static/js/libs/intention.min.js +++ b/cps/static/js/libs/intention.min.js @@ -1,10 +1,9 @@ -/*! intention.js v0.9.7.3 -* http://intentionjs.com/ -* -* intention.js -* -* Copyright 2011, 2013 Dowjones and other contributors -* Released under the MIT license -* -*/ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define("intention",["jquery","underscore"],b):a.Intention=b(a.jQuery,a._)}(this,function(a,b){"use strict";var c=function(c){var d=b.extend(this,c,{_listeners:{},contexts:[],elms:a(),axes:{},priority:[]});return d};return c.prototype={responsive:function d(a,c){var e,f="abcdefghijklmnopqrstuvwxyz0123456789",g="";for(e=0;5>e;e++)g+=f[Math.floor(Math.random()*f.length)];var h={matcher:function(a,b){return a===b.name},measure:b.identity,ID:g};if(b.isObject(c)===!1&&(c={}),b.isArray(a)&&b.isArray(a[0].contexts))return b.each(a,function(a){d.apply(this,a)},this),void 0;b.isArray(a)===!1&&b.isObject(a)?c=a:c.contexts=a,c=b.extend({},h,c),this.on("_"+c.ID+":",b.bind(function(a){this.axes=this._contextualize(c.ID,a.context,this.axes),this._respond(this.axes,this.elms)},this));var i={ID:c.ID,current:null,contexts:c.contexts,respond:b.bind(this._responder(c.ID,c.contexts,c.matcher,c.measure),this)};return this.axes[c.ID]=i,this.axes.__keys__=this.priority,this.priority.unshift(c.ID),i},elements:function(c){return c||(c=document),a("[data-intent],[intent],[data-in],[in]",c).each(b.bind(function(b,c){this.add(a(c))},this)),this},add:function(c,d){var e;return d||(d={}),c.each(b.bind(function(c,f){var g=!1;this.elms.each(function(a,b){return f===b?(g=!0,!1):!0}),g===!1&&(e=this._fillSpec(b.extend(d,this._attrsToSpec(f.attributes,this.axes))),this._makeChanges(a(f),e,this.axes),this.elms.push({elm:f,spec:e}))},this)),this},remove:function(a){var b=this.elms;return a.each(function(a,c){b.each(function(a,d){return c===d.elm?(b.splice(a,1),!1):!0})}),this},is:function(a){var c=this.axes;return b.some(c.__keys__,function(b){return a===c[b].current})},current:function(a){return this.axes.hasOwnProperty(a)?this.axes[a].current:!1},on:function(a,b){var c=a.split(" "),d=0;for(d;de;e++)h+=f[Math.floor(Math.random()*g)];var i={matcher:function(a,b){return a===b.name},measure:b.identity,ID:h};if(b.isObject(c)===!1&&(c={}),b.isArray(a)&&b.isArray(a[0].contexts))return b.each(a,function(a){d.apply(this,a)},this),void 0;b.isArray(a)===!1&&b.isObject(a)?c=a:c.contexts=a,c=b.extend({},i,c),this.on("_"+c.ID+":",b.bind(function(a){this.axes=this._contextualize(c.ID,a.context,this.axes),this._respond(this.axes,this.elms)},this));var j={ID:c.ID,current:null,contexts:c.contexts,respond:b.bind(this._responder(c.ID,c.contexts,c.matcher,c.measure),this)};return this.axes[c.ID]=j,this.axes.__keys__=this.priority,this.priority.unshift(c.ID),j},elements:function(c){return c||(c=document),a("[data-intent],[intent],[data-in],[in]",c).each(b.bind(function(b,c){this.add(a(c))},this)),this},add:function(c,d){var e;return d||(d={}),c.each(b.bind(function(c,f){var g=!1;this.elms.each(function(a,b){return f===b.elm?(g=!0,!1):!0}),g===!1&&(e=this._fillSpec(b.extend(d,this._attrsToSpec(f.attributes,this.axes))),this._makeChanges(a(f),e,this.axes),this.elms.push({elm:f,spec:e}))},this)),this},remove:function(a){var b=this.elms;return a.each(function(a,c){b.each(function(a,d){return c===d.elm?(b.splice(a,1),!1):!0})}),this},is:function(a){var c=this.axes;return b.some(c.__keys__,function(b){return a===c[b].current})},current:function(a){return this.axes.hasOwnProperty(a)?this.axes[a].current:!1},on:function(a,b){var c=a.split(" "),d=0;for(d;d=0,this.isPrefilling?(this.log("prefill"),this.loadNextPage()):this.stopPrefill()},s.getPrefillDistance=function(){return this.options.elementScroll?this.scroller.clientHeight-this.scroller.scrollHeight:this.windowHeight-this.element.clientHeight},s.stopPrefill=function(){this.log("stopPrefill"),this.off("append",this.prefill)},e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/scroll-watch",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){var n=e.prototype;return e.defaults.scrollThreshold=400,e.create.scrollWatch=function(){this.pageScrollHandler=this.onPageScroll.bind(this),this.resizeHandler=this.onResize.bind(this);var t=this.options.scrollThreshold,e=t||0===t;e&&this.enableScrollWatch()},e.destroy.scrollWatch=function(){this.disableScrollWatch()},n.enableScrollWatch=function(){this.isScrollWatching||(this.isScrollWatching=!0,this.updateMeasurements(),this.updateScroller(),this.on("last",this.disableScrollWatch),this.bindScrollWatchEvents(!0))},n.disableScrollWatch=function(){this.isScrollWatching&&(this.bindScrollWatchEvents(!1),delete this.isScrollWatching)},n.bindScrollWatchEvents=function(e){var i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.pageScrollHandler),t[i]("resize",this.resizeHandler)},n.onPageScroll=e.throttle(function(){var t=this.getBottomDistance();t<=this.options.scrollThreshold&&this.dispatchEvent("scrollThreshold")}),n.getBottomDistance=function(){return this.options.elementScroll?this.getElementBottomDistance():this.getWindowBottomDistance()},n.getWindowBottomDistance=function(){var e=this.top+this.element.clientHeight,i=t.pageYOffset+this.windowHeight;return e-i},n.getElementBottomDistance=function(){var t=this.scroller.scrollHeight,e=this.scroller.scrollTop+this.scroller.clientHeight;return t-e},n.onResize=function(){this.updateMeasurements()},i.debounceMethod(e,"onResize",150),e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/history",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){var n=e.prototype;e.defaults.history="replace";var o=document.createElement("a");return e.create.history=function(){if(this.options.history){o.href=this.getAbsolutePath();var t=o.origin||o.protocol+"//"+o.host,e=t==location.origin;return e?void(this.options.append?this.createHistoryAppend():this.createHistoryPageLoad()):void console.error("[InfiniteScroll] cannot set history with different origin: "+o.origin+" on "+location.origin+" . History behavior disabled.")}},n.createHistoryAppend=function(){this.updateMeasurements(),this.updateScroller(),this.scrollPages=[{top:0,path:location.href,title:document.title}],this.scrollPageIndex=0,this.scrollHistoryHandler=this.onScrollHistory.bind(this),this.unloadHandler=this.onUnload.bind(this),this.scroller.addEventListener("scroll",this.scrollHistoryHandler),this.on("append",this.onAppendHistory),this.bindHistoryAppendEvents(!0)},n.bindHistoryAppendEvents=function(e){var i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.scrollHistoryHandler),t[i]("unload",this.unloadHandler)},n.createHistoryPageLoad=function(){this.on("load",this.onPageLoadHistory)},e.destroy.history=n.destroyHistory=function(){var t=this.options.history&&this.options.append;t&&this.bindHistoryAppendEvents(!1)},n.onAppendHistory=function(t,e,i){if(i&&i.length){var n=i[0],r=this.getElementScrollY(n);o.href=e,this.scrollPages.push({top:r,path:o.href,title:t.title})}},n.getElementScrollY=function(t){return this.options.elementScroll?this.getElementElementScrollY(t):this.getElementWindowScrollY(t)},n.getElementWindowScrollY=function(e){var i=e.getBoundingClientRect();return i.top+t.pageYOffset},n.getElementElementScrollY=function(t){return t.offsetTop-this.top},n.onScrollHistory=function(){for(var t,e,i=this.getScrollViewY(),n=0;n=i)break;t=n,e=o}t!=this.scrollPageIndex&&(this.scrollPageIndex=t,this.setHistory(e.title,e.path))},i.debounceMethod(e,"onScrollHistory",150),n.getScrollViewY=function(){return this.options.elementScroll?this.scroller.scrollTop+this.scroller.clientHeight/2:t.pageYOffset+this.windowHeight/2},n.setHistory=function(t,e){var i=this.options.history,n=i&&history[i+"State"];n&&(history[i+"State"](null,t,e),this.options.historyTitle&&(document.title=t),this.dispatchEvent("history",null,[t,e]))},n.onUnload=function(){var e=this.scrollPageIndex;if(0!==e){var i=this.scrollPages[e],n=t.pageYOffset-i.top+this.top;this.destroyHistory(),scrollTo(0,n)}},n.onPageLoadHistory=function(t,e){this.setHistory(t.title,e)},e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/button",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){function n(t,e){this.element=t,this.infScroll=e,this.clickHandler=this.onClick.bind(this),this.element.addEventListener("click",this.clickHandler),e.on("request",this.disable.bind(this)),e.on("load",this.enable.bind(this)),e.on("error",this.hide.bind(this)),e.on("last",this.hide.bind(this))}return e.create.button=function(){var t=i.getQueryElement(this.options.button);if(t)return void(this.button=new n(t,this))},e.destroy.button=function(){this.button&&this.button.destroy()},n.prototype.onClick=function(t){t.preventDefault(),this.infScroll.loadNextPage()},n.prototype.enable=function(){this.element.removeAttribute("disabled")},n.prototype.disable=function(){this.element.disabled="disabled"},n.prototype.hide=function(){this.element.style.display="none"},n.prototype.destroy=function(){this.element.removeEventListener("click",this.clickHandler)},e.Button=n,e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/status",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){function n(t){r(t,"none")}function o(t){r(t,"block")}function r(t,e){t&&(t.style.display=e)}var s=e.prototype;return e.create.status=function(){var t=i.getQueryElement(this.options.status);t&&(this.statusElement=t,this.statusEventElements={request:t.querySelector(".infinite-scroll-request"),error:t.querySelector(".infinite-scroll-error"),last:t.querySelector(".infinite-scroll-last")},this.on("request",this.showRequestStatus),this.on("error",this.showErrorStatus),this.on("last",this.showLastStatus),this.bindHideStatus("on"))},s.bindHideStatus=function(t){var e=this.options.append?"append":"load";this[t](e,this.hideAllStatus)},s.showRequestStatus=function(){this.showStatus("request")},s.showErrorStatus=function(){this.showStatus("error")},s.showLastStatus=function(){this.showStatus("last"),this.bindHideStatus("off")},s.showStatus=function(t){o(this.statusElement),this.hideStatusEventElements();var e=this.statusEventElements[t];o(e)},s.hideAllStatus=function(){n(this.statusElement),this.hideStatusEventElements()},s.hideStatusEventElements=function(){for(var t in this.statusEventElements){var e=this.statusEventElements[t];n(e)}},e}),function(t,e){"function"==typeof define&&define.amd?define(["infinite-scroll/js/core","infinite-scroll/js/page-load","infinite-scroll/js/scroll-watch","infinite-scroll/js/history","infinite-scroll/js/button","infinite-scroll/js/status"],e):"object"==typeof module&&module.exports&&(module.exports=e(require("./core"),require("./page-load"),require("./scroll-watch"),require("./history"),require("./button"),require("./status")))}(window,function(t){return t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("imagesloaded/imagesloaded",["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,function(t,e){function i(t,e){for(var i in e)t[i]=e[i];return t}function n(t){if(Array.isArray(t))return t;var e="object"==typeof t&&"number"==typeof t.length;return e?h.call(t):[t]}function o(t,e,r){if(!(this instanceof o))return new o(t,e,r);var s=t;return"string"==typeof t&&(s=document.querySelectorAll(t)),s?(this.elements=n(s),this.options=i({},this.options),"function"==typeof e?r=e:i(this.options,e),r&&this.on("always",r),this.getImages(),l&&(this.jqDeferred=new l.Deferred),void setTimeout(this.check.bind(this))):void a.error("Bad element for imagesLoaded "+(s||t))}function r(t){this.img=t}function s(t,e){this.url=t,this.element=e,this.img=new Image}var l=t.jQuery,a=t.console,h=Array.prototype.slice;o.prototype=Object.create(e.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),this.options.background===!0&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&c[e]){for(var i=t.querySelectorAll("img"),n=0;nt instanceof HTMLElement)).reduce(((t,e)=>{if(!i)return t.push(e),t;e.matches(i)&&t.push(e);let n=e.querySelectorAll(i);return t=t.concat(...n)}),[])},debounceMethod:function(t,e,i){i=i||100;let n=t.prototype[e],o=e+"Timeout";t.prototype[e]=function(){clearTimeout(this[o]);let t=arguments;this[o]=setTimeout((()=>{n.apply(this,t),delete this[o]}),i)}},docReady:function(t){let e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},toDashed:function(t){return t.replace(/(.)([A-Z])/g,(function(t,e,i){return e+"-"+i})).toLowerCase()}},i=t.console;return e.htmlInit=function(n,o){e.docReady((function(){let s="data-"+e.toDashed(o),r=document.querySelectorAll(`[${s}]`),l=t.jQuery;[...r].forEach((t=>{let e,r=t.getAttribute(s);try{e=r&&JSON.parse(r)}catch(e){return void(i&&i.error(`Error parsing ${s} on ${t.className}: ${e}`))}let h=new n(t,e);l&&l.data(t,o,h)}))}))},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter"),require("fizzy-ui-utils")):t.InfiniteScroll=e(t,t.EvEmitter,t.fizzyUIUtils)}(window,(function(t,e,i){let n=t.jQuery,o={};function s(t,e){let r=i.getQueryElement(t);if(r){if((t=r).infiniteScrollGUID){let i=o[t.infiniteScrollGUID];return i.option(e),i}this.element=t,this.options={...s.defaults},this.option(e),n&&(this.$element=n(this.element)),this.create()}else console.error("Bad element for InfiniteScroll: "+(r||t))}s.defaults={},s.create={},s.destroy={};let r=s.prototype;Object.assign(r,e.prototype);let l=0;r.create=function(){let t=this.guid=++l;if(this.element.infiniteScrollGUID=t,o[t]=this,this.pageIndex=1,this.loadCount=0,this.updateGetPath(),this.getPath&&this.getPath()){this.updateGetAbsolutePath(),this.log("initialized",[this.element.className]),this.callOnInit();for(let t in s.create)s.create[t].call(this)}else console.error("Disabling InfiniteScroll")},r.option=function(t){Object.assign(this.options,t)},r.callOnInit=function(){let t=this.options.onInit;t&&t.call(this,this)},r.dispatchEvent=function(t,e,i){this.log(t,i);let o=e?[e].concat(i):i;if(this.emitEvent(t,o),!n||!this.$element)return;let s=t+=".infiniteScroll";if(e){let i=n.Event(e);i.type=t,s=i}this.$element.trigger(s,i)};let h={initialized:t=>`on ${t}`,request:t=>`URL: ${t}`,load:(t,e)=>`${t.title||""}. URL: ${e}`,error:(t,e)=>`${t}. URL: ${e}`,append:(t,e,i)=>`${i.length} items. URL: ${e}`,last:(t,e)=>`URL: ${e}`,history:(t,e)=>`URL: ${e}`,pageIndex:function(t,e){return`current page determined to be: ${t} from ${e}`}};r.log=function(t,e){if(!this.options.debug)return;let i=`[InfiniteScroll] ${t}`,n=h[t];n&&(i+=". "+n.apply(this,e)),console.log(i)},r.updateMeasurements=function(){this.windowHeight=t.innerHeight;let e=this.element.getBoundingClientRect();this.top=e.top+t.scrollY},r.updateScroller=function(){let e=this.options.elementScroll;if(e){if(this.scroller=!0===e?this.element:i.getQueryElement(e),!this.scroller)throw new Error(`Unable to find elementScroll: ${e}`)}else this.scroller=t},r.updateGetPath=function(){let t=this.options.path;if(!t)return void console.error(`InfiniteScroll path option required. Set as: ${t}`);let e=typeof t;"function"!=e?"string"==e&&t.match("{{#}}")?this.updateGetPathTemplate(t):this.updateGetPathSelector(t):this.getPath=t},r.updateGetPathTemplate=function(t){this.getPath=()=>{let e=this.pageIndex+1;return t.replace("{{#}}",e)};let e=t.replace(/(\\\?|\?)/,"\\?").replace("{{#}}","(\\d\\d?\\d?)"),i=new RegExp(e),n=location.href.match(i);n&&(this.pageIndex=parseInt(n[1],10),this.log("pageIndex",[this.pageIndex,"template string"]))};let a=[/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/],c=s.getPathParts=function(t){if(t)for(let e of a){let i=t.match(e);if(i){let[,t,e,n]=i;return{begin:t,index:e,end:n}}}};r.updateGetPathSelector=function(t){let e=document.querySelector(t);if(!e)return void console.error(`Bad InfiniteScroll path option. Next link not found: ${t}`);let i=e.getAttribute("href"),n=c(i);if(!n)return void console.error(`InfiniteScroll unable to parse next link href: ${i}`);let{begin:o,index:s,end:r}=n;this.isPathSelector=!0,this.getPath=()=>o+(this.pageIndex+1)+r,this.pageIndex=parseInt(s,10)-1,this.log("pageIndex",[this.pageIndex,"next link"])},r.updateGetAbsolutePath=function(){let t=this.getPath();if(t.match(/^http/)||t.match(/^\//))return void(this.getAbsolutePath=this.getPath);let{pathname:e}=location,i=t.match(/^\?/),n=e.substring(0,e.lastIndexOf("/")),o=i?e:n+"/";this.getAbsolutePath=()=>o+this.getPath()},s.create.hideNav=function(){let t=i.getQueryElement(this.options.hideNav);t&&(t.style.display="none",this.nav=t)},s.destroy.hideNav=function(){this.nav&&(this.nav.style.display="")},r.destroy=function(){this.allOff();for(let t in s.destroy)s.destroy[t].call(this);delete this.element.infiniteScrollGUID,delete o[this.guid],n&&this.$element&&n.removeData(this.element,"infiniteScroll")},s.throttle=function(t,e){let i,n;return e=e||200,function(){let o=+new Date,s=arguments,r=()=>{i=o,t.apply(this,s)};i&&o{if(!i.ok){let t=new Error(i.statusText);return this.onPageError(t,o,i),{response:i}}return i[t]().then((s=>("text"==t&&e&&(s=n.parseFromString(s,"text/html")),204==i.status?(this.lastPageReached(s,o),{body:s,response:i}):this.onPageLoad(s,o,i))))})).catch((t=>{this.onPageError(t,o)}));return this.dispatchEvent("request",null,[o,s]),s},i.onPageLoad=function(t,e,i){return this.options.append||(this.isLoading=!1),this.pageIndex++,this.loadCount++,this.dispatchEvent("load",null,[t,e,i]),this.appendNextPage(t,e,i)},i.appendNextPage=function(t,e,i){let{append:n,responseBody:s,domParseResponse:r}=this.options;if(!("text"==s&&r)||!n)return{body:t,response:i};let l=t.querySelectorAll(n),h={body:t,response:i,items:l};if(!l||!l.length)return this.lastPageReached(t,e),h;let a=o(l),c=()=>(this.appendItems(l,a),this.isLoading=!1,this.dispatchEvent("append",null,[t,e,l,i]),h);return this.options.outlayer?this.appendOutlayerItems(a,c):c()},i.appendItems=function(t,e){t&&t.length&&(function(t){let e=t.querySelectorAll("script");for(let t of e){let e=document.createElement("script"),i=t.attributes;for(let t of i)e.setAttribute(t.name,t.value);e.innerHTML=t.innerHTML,t.parentNode.replaceChild(e,t)}}(e=e||o(t)),this.element.appendChild(e))},i.appendOutlayerItems=function(i,n){let o=e.imagesLoaded||t.imagesLoaded;return o?new Promise((function(t){o(i,(function(){let e=n();t(e)}))})):(console.error("[InfiniteScroll] imagesLoaded required for outlayer option"),void(this.isLoading=!1))},i.onAppendOutlayer=function(t,e,i){this.options.outlayer.appended(i)},i.checkLastPage=function(t,e){let i,{checkLastPage:n,path:o}=this.options;if(n){if("function"==typeof o){if(!this.getPath())return void this.lastPageReached(t,e)}"string"==typeof n?i=n:this.isPathSelector&&(i=o),i&&t.querySelector&&(t.querySelector(i)||this.lastPageReached(t,e))}},i.lastPageReached=function(t,e){this.canLoad=!1,this.dispatchEvent("last",null,[t,e])},i.onPageError=function(t,e,i){return this.isLoading=!1,this.canLoad=!1,this.dispatchEvent("error",null,[t,e,i]),t},e.create.prefill=function(){if(!this.options.prefill)return;let t=this.options.append;t?(this.updateMeasurements(),this.updateScroller(),this.isPrefilling=!0,this.on("append",this.prefill),this.once("error",this.stopPrefill),this.once("last",this.stopPrefill),this.prefill()):console.error(`append option required for prefill. Set as :${t}`)},i.prefill=function(){let t=this.getPrefillDistance();this.isPrefilling=t>=0,this.isPrefilling?(this.log("prefill"),this.loadNextPage()):this.stopPrefill()},i.getPrefillDistance=function(){return this.options.elementScroll?this.scroller.clientHeight-this.scroller.scrollHeight:this.windowHeight-this.element.clientHeight},i.stopPrefill=function(){this.log("stopPrefill"),this.off("append",this.prefill)},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;return Object.assign(e.defaults,{scrollThreshold:400}),e.create.scrollWatch=function(){this.pageScrollHandler=this.onPageScroll.bind(this),this.resizeHandler=this.onResize.bind(this);let t=this.options.scrollThreshold;(t||0===t)&&this.enableScrollWatch()},e.destroy.scrollWatch=function(){this.disableScrollWatch()},n.enableScrollWatch=function(){this.isScrollWatching||(this.isScrollWatching=!0,this.updateMeasurements(),this.updateScroller(),this.on("last",this.disableScrollWatch),this.bindScrollWatchEvents(!0))},n.disableScrollWatch=function(){this.isScrollWatching&&(this.bindScrollWatchEvents(!1),delete this.isScrollWatching)},n.bindScrollWatchEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.pageScrollHandler),t[i]("resize",this.resizeHandler)},n.onPageScroll=e.throttle((function(){this.getBottomDistance()<=this.options.scrollThreshold&&this.dispatchEvent("scrollThreshold")})),n.getBottomDistance=function(){let e,i;return this.options.elementScroll?(e=this.scroller.scrollHeight,i=this.scroller.scrollTop+this.scroller.clientHeight):(e=this.top+this.element.clientHeight,i=t.scrollY+this.windowHeight),e-i},n.onResize=function(){this.updateMeasurements()},i.debounceMethod(e,"onResize",150),e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;Object.assign(e.defaults,{history:"replace"});let o=document.createElement("a");return e.create.history=function(){if(!this.options.history)return;o.href=this.getAbsolutePath(),(o.origin||o.protocol+"//"+o.host)==location.origin?this.options.append?this.createHistoryAppend():this.createHistoryPageLoad():console.error(`[InfiniteScroll] cannot set history with different origin: ${o.origin} on ${location.origin} . History behavior disabled.`)},n.createHistoryAppend=function(){this.updateMeasurements(),this.updateScroller(),this.scrollPages=[{top:0,path:location.href,title:document.title}],this.scrollPage=this.scrollPages[0],this.scrollHistoryHandler=this.onScrollHistory.bind(this),this.unloadHandler=this.onUnload.bind(this),this.scroller.addEventListener("scroll",this.scrollHistoryHandler),this.on("append",this.onAppendHistory),this.bindHistoryAppendEvents(!0)},n.bindHistoryAppendEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.scrollHistoryHandler),t[i]("unload",this.unloadHandler)},n.createHistoryPageLoad=function(){this.on("load",this.onPageLoadHistory)},e.destroy.history=n.destroyHistory=function(){this.options.history&&this.options.append&&this.bindHistoryAppendEvents(!1)},n.onAppendHistory=function(t,e,i){if(!i||!i.length)return;let n=i[0],s=this.getElementScrollY(n);o.href=e,this.scrollPages.push({top:s,path:o.href,title:t.title})},n.getElementScrollY=function(e){if(this.options.elementScroll)return e.offsetTop-this.top;return e.getBoundingClientRect().top+t.scrollY},n.onScrollHistory=function(){let t=this.getClosestScrollPage();t!=this.scrollPage&&(this.scrollPage=t,this.setHistory(t.title,t.path))},i.debounceMethod(e,"onScrollHistory",150),n.getClosestScrollPage=function(){let e,i;e=this.options.elementScroll?this.scroller.scrollTop+this.scroller.clientHeight/2:t.scrollY+this.windowHeight/2;for(let t of this.scrollPages){if(t.top>=e)break;i=t}return i},n.setHistory=function(t,e){let i=this.options.history;i&&history[i+"State"]&&(history[i+"State"](null,t,e),this.options.historyTitle&&(document.title=t),this.dispatchEvent("history",null,[t,e]))},n.onUnload=function(){if(0===this.scrollPage.top)return;let e=t.scrollY-this.scrollPage.top+this.top;this.destroyHistory(),scrollTo(0,e)},n.onPageLoadHistory=function(t,e){this.setHistory(t.title,e)},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){class n{constructor(t,e){this.element=t,this.infScroll=e,this.clickHandler=this.onClick.bind(this),this.element.addEventListener("click",this.clickHandler),e.on("request",this.disable.bind(this)),e.on("load",this.enable.bind(this)),e.on("error",this.hide.bind(this)),e.on("last",this.hide.bind(this))}onClick(t){t.preventDefault(),this.infScroll.loadNextPage()}enable(){this.element.removeAttribute("disabled")}disable(){this.element.disabled="disabled"}hide(){this.element.style.display="none"}destroy(){this.element.removeEventListener("click",this.clickHandler)}}return e.create.button=function(){let t=i.getQueryElement(this.options.button);t&&(this.button=new n(t,this))},e.destroy.button=function(){this.button&&this.button.destroy()},e.Button=n,e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;function o(t){r(t,"none")}function s(t){r(t,"block")}function r(t,e){t&&(t.style.display=e)}return e.create.status=function(){let t=i.getQueryElement(this.options.status);t&&(this.statusElement=t,this.statusEventElements={request:t.querySelector(".infinite-scroll-request"),error:t.querySelector(".infinite-scroll-error"),last:t.querySelector(".infinite-scroll-last")},this.on("request",this.showRequestStatus),this.on("error",this.showErrorStatus),this.on("last",this.showLastStatus),this.bindHideStatus("on"))},n.bindHideStatus=function(t){let e=this.options.append?"append":"load";this[t](e,this.hideAllStatus)},n.showRequestStatus=function(){this.showStatus("request")},n.showErrorStatus=function(){this.showStatus("error")},n.showLastStatus=function(){this.showStatus("last"),this.bindHideStatus("off")},n.showStatus=function(t){s(this.statusElement),this.hideStatusEventElements(),s(this.statusEventElements[t])},n.hideAllStatus=function(){o(this.statusElement),this.hideStatusEventElements()},n.hideStatusEventElements=function(){for(let t in this.statusEventElements){o(this.statusEventElements[t])}},e})), +/*! + * imagesLoaded v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ +function(t,e){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],(function(i){return e(t,i)})):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,(function(t,e){"use strict";var i=t.jQuery,n=t.console;function o(t,e){for(var i in e)t[i]=e[i];return t}var s=Array.prototype.slice;function r(t,e,l){if(!(this instanceof r))return new r(t,e,l);var h,a=t;("string"==typeof t&&(a=document.querySelectorAll(t)),a)?(this.elements=(h=a,Array.isArray(h)?h:"object"==typeof h&&"number"==typeof h.length?s.call(h):[h]),this.options=o({},this.options),"function"==typeof e?l=e:o(this.options,e),l&&this.on("always",l),this.getImages(),i&&(this.jqDeferred=new i.Deferred),setTimeout(this.check.bind(this))):n.error("Bad element for imagesLoaded "+(a||t))}r.prototype=Object.create(e.prototype),r.prototype.options={},r.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},r.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),!0===this.options.background&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&l[e]){for(var i=t.querySelectorAll("img"),n=0;n Date: Mon, 25 Oct 2021 20:06:22 +0200 Subject: [PATCH 027/412] Fix for iOS covers are not displayed during infinite scroll on standard theme --- cps/static/css/style.css | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cps/static/css/style.css b/cps/static/css/style.css index 2bbdf3702..32c6f2257 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -155,11 +155,6 @@ table .bg-dark-danger a { color: #fff; } height: 100%; } -.container-fluid .book .cover span.img { - bottom: 0; - height: 100%; - position: absolute; -} .author-bio img { margin: 0 1em 1em 0; } .container-fluid .single .cover img { @@ -175,11 +170,11 @@ table .bg-dark-danger a { color: #fff; } } .container-fluid .book .cover span img { - position: relative; - top: 0; - left: 0; - height: 100%; border: 1px solid #fff; + bottom: 0; + position: relative; + height: 100%; + box-sizing: border-box; -webkit-box-shadow: 0 5px 8px -6px #777; -moz-box-shadow: 0 5px 8px -6px #777; From baba205bcedcf87c5317db04d263b4570ed10f27 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Thu, 11 Nov 2021 18:46:32 +0400 Subject: [PATCH 028/412] Rename everything on rename authors --- cps/editbooks.py | 35 ++++++++++++++++++------- cps/helper.py | 68 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 80 insertions(+), 23 deletions(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index 3403f46f7..caec3dce3 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -114,7 +114,7 @@ def search_objects_add(db_book_object, db_type, input_elements): type_elements = c_elements.value else: type_elements = c_elements.name - if inp_element.lower() == type_elements.lower(): # Lowercase check + if inp_element == type_elements: found = True break if not found: @@ -709,6 +709,7 @@ def handle_title_on_edit(book, book_title): def handle_author_on_edit(book, author_name, update_stored=True): # handle author(s) + # renamed = False input_authors = author_name.split('&') input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors)) # Remove duplicates in authors list @@ -717,6 +718,20 @@ def handle_author_on_edit(book, author_name, update_stored=True): if input_authors == ['']: input_authors = [_(u'Unknown')] # prevent empty Author + # ToDo: Falsch es kann auch sein das der 2. Author in der Liste umbenannt wurde, + # man müsste für alle Authoren schauen + renamed = list() + for in_aut in input_authors: + renamed_author = calibre_db.session.query(db.Authors).filter(db.Authors.name == in_aut).first() + if renamed_author and in_aut != renamed_author.name: + renamed.append(renamed_author.name) + all_books = calibre_db.session.query(db.Books) \ + .filter(db.Books.authors.any(db.Authors.name == renamed_author.name)).all() + sorted_renamed_author = helper.get_sorted_author(renamed_author.name) + sorted_old_author = helper.get_sorted_author(in_aut) + for one_book in all_books: + one_book.author_sort = one_book.author_sort.replace(sorted_renamed_author, sorted_old_author) + change = modify_database_object(input_authors, book.authors, db.Authors, calibre_db.session, 'author') # Search for each author if author is in database, if not, author name and sorted author name is generated new @@ -733,7 +748,7 @@ def handle_author_on_edit(book, author_name, update_stored=True): if book.author_sort != sort_authors and update_stored: book.author_sort = sort_authors change = True - return input_authors, change + return input_authors, change, renamed @editbook.route("/admin/book/", methods=['GET', 'POST']) @@ -773,7 +788,7 @@ def edit_book(book_id): # handle book title title_change = handle_title_on_edit(book, to_save["book_title"]) - input_authors, authorchange = handle_author_on_edit(book, to_save["author_name"]) + input_authors, authorchange, renamed = handle_author_on_edit(book, to_save["author_name"]) if authorchange or title_change: edited_books_id = book.id modif_date = True @@ -783,7 +798,8 @@ def edit_book(book_id): error = False if edited_books_id: - error = helper.update_dir_stucture(edited_books_id, config.config_calibre_dir, input_authors[0]) + error = helper.update_dir_structure(edited_books_id, config.config_calibre_dir, input_authors[0], + renamed_author=renamed) if not error: if "cover_url" in to_save: @@ -1145,7 +1161,7 @@ def edit_list_book(param): elif param == 'title': sort = book.sort handle_title_on_edit(book, vals.get('value', "")) - helper.update_dir_stucture(book.id, config.config_calibre_dir) + helper.update_dir_structure(book.id, config.config_calibre_dir) ret = Response(json.dumps({'success': True, 'newValue': book.title}), mimetype='application/json') elif param =='sort': @@ -1157,8 +1173,8 @@ def edit_list_book(param): ret = Response(json.dumps({'success': True, 'newValue': book.comments[0].text}), mimetype='application/json') elif param =='authors': - input_authors, __ = handle_author_on_edit(book, vals['value'], vals.get('checkA', None) == "true") - helper.update_dir_stucture(book.id, config.config_calibre_dir, input_authors[0]) + input_authors, __, renamed = handle_author_on_edit(book, vals['value'], vals.get('checkA', None) == "true") + helper.update_dir_structure(book.id, config.config_calibre_dir, input_authors[0], renamed_author=renamed) ret = Response(json.dumps({'success': True, 'newValue': ' & '.join([author.replace('|',',') for author in input_authors])}), mimetype='application/json') @@ -1267,7 +1283,7 @@ def table_xchange_author_title(): author_names.append(authr.name.replace('|', ',')) title_change = handle_title_on_edit(book, " ".join(author_names)) - input_authors, authorchange = handle_author_on_edit(book, authors) + input_authors, authorchange, renamed = handle_author_on_edit(book, authors) if authorchange or title_change: edited_books_id = book.id modif_date = True @@ -1276,7 +1292,8 @@ def table_xchange_author_title(): gdriveutils.updateGdriveCalibreFromLocal() if edited_books_id: - helper.update_dir_stucture(edited_books_id, config.config_calibre_dir, input_authors[0]) + helper.update_dir_structure(edited_books_id, config.config_calibre_dir, input_authors[0], + renamed_author=renamed) if modif_date: book.last_modified = datetime.utcnow() try: diff --git a/cps/helper.py b/cps/helper.py index df7019e64..2cc7591b1 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -334,9 +334,22 @@ def delete_book_file(book, calibrepath, book_format=None): id=book.id, path=book.path) +# was muss gemacht werden: +# Die Autorennamen müssen separiert werden und von dupletten bereinigt werden. +# Es muss geprüft werden: +# - ob es die alten Autoren mit dem letzten Buch verknüpft waren, dann müssen sie gelöscht werden +# - ob es neue Autoren sind, dann müssen sie angelegt werden -> macht modify_database_object +# - ob es bestehende Autoren sind welche umbenannt wurden -> Groß Kleinschreibung, dann muss: +# für jedes Buch und jeder Autor welcher umbenannt wurde: +# - Autorensortierung angepasst werden +# - Pfad im Buch angepasst werden +# - Dateiname in Datatabelle angepasst werden, sowie die Dateien umbenannt werden +# - Dateipfade Autor umbenannt werden +# die letzten Punkte treffen auch zu wenn es sich um einen normalen Autoränderungsvorgang handelt kann man also generell +# behandeln # Moves files in file storage during author/title rename, or from temp dir to file storage -def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepath, db_filename): +def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepath, db_filename, renamed_author): # get book database entry from id, if original path overwrite source with original_filepath localbook = calibre_db.get_book(book_id) if orignal_filepath: @@ -352,21 +365,32 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa # Create new titledir from database and add id if first_author: new_authordir = get_valid_filename(first_author) + for r in renamed_author: + if first_author.lower() == r.lower(): + try: + new_author_path = os.path.join(calibrepath, new_authordir) + old_author_path = os.path.join(calibrepath, r) + shutil.move(os.path.normcase(old_author_path), os.path.normcase(new_author_path)) + except (OSError) as ex: + log.error("Rename author from: %s to %s: %s", r, new_authordir, ex) + log.debug(ex, exc_info=True) + return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", + src=old_author_path, dest=new_author_path, error=str(ex)) else: new_authordir = get_valid_filename(localbook.authors[0].name) new_titledir = get_valid_filename(localbook.title) + " (" + str(book_id) + ")" if titledir != new_titledir or authordir != new_authordir or orignal_filepath: new_path = os.path.join(calibrepath, new_authordir, new_titledir) - new_name = get_valid_filename(localbook.title) + ' - ' + get_valid_filename(new_authordir) + new_name = get_valid_filename(localbook.title) + ' - ' + new_authordir try: if orignal_filepath: if not os.path.isdir(new_path): os.makedirs(new_path) shutil.move(os.path.normcase(path), os.path.normcase(os.path.join(new_path, db_filename))) log.debug("Moving title: %s to %s/%s", path, new_path, new_name) - # Check new path is not valid path else: + # Check new path is not valid path if not os.path.exists(new_path): # move original path to new path log.debug("Moving title: %s to %s", path, new_path) @@ -379,8 +403,6 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa shutil.move(os.path.normcase(os.path.join(dir_name, file)), os.path.normcase(os.path.join(new_path + dir_name[len(path):], file))) # os.unlink(os.path.normcase(os.path.join(dir_name, file))) - # change location in database to new author/title path - localbook.path = os.path.join(new_authordir, new_titledir).replace('\\','/') except (OSError) as ex: log.error("Rename title from: %s to %s: %s", path, new_path, ex) log.debug(ex, exc_info=True) @@ -389,15 +411,23 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa # Rename all files from old names to new names try: - for file_format in localbook.data: - shutil.move(os.path.normcase( - os.path.join(new_path, file_format.name + '.' + file_format.format.lower())), - os.path.normcase(os.path.join(new_path, new_name + '.' + file_format.format.lower()))) - file_format.name = new_name - if not orignal_filepath and len(os.listdir(os.path.dirname(path))) == 0: + all_books = calibre_db.session.query(db.Books)\ + .filter(db.Books.authors.any(db.Authors.name == renamed_author)).all() + for book in all_books: + all_titledir = book.path.split('/')[1] + all_new_path = os.path.join(calibrepath, new_authordir, all_titledir) + all_new_name = get_valid_filename(book.title) + ' - ' + new_authordir + # change location in database to new author/title path + book.path = os.path.join(new_authordir, all_titledir).replace('\\', '/') + for file_format in book.data: + shutil.move(os.path.normcase( + os.path.join(all_new_path, file_format.name + '.' + file_format.format.lower())), + os.path.normcase(os.path.join(all_new_path, all_new_name + '.' + file_format.format.lower()))) + file_format.name = all_new_name + if not renamed_author and not orignal_filepath and len(os.listdir(os.path.dirname(path))) == 0: shutil.rmtree(os.path.dirname(path)) except (OSError) as ex: - log.error("Rename file in path %s to %s: %s", new_path, new_name, ex) + log.error("Rename file in path %s to %s: %s", all_new_path, all_new_name, ex) log.debug(ex, exc_info=True) return _("Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s", src=new_path, dest=new_name, error=str(ex)) @@ -528,11 +558,21 @@ def valid_email(email): # ################################# External interface ################################# -def update_dir_stucture(book_id, calibrepath, first_author=None, orignal_filepath=None, db_filename=None): +def update_dir_structure(book_id, + calibrepath, + first_author=None, + orignal_filepath=None, + db_filename=None, + renamed_author=False): if config.config_use_google_drive: + # ToDo: rename author on gdrive return update_dir_structure_gdrive(book_id, first_author) else: - return update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepath, db_filename) + return update_dir_structure_file(book_id, + calibrepath, + first_author, + orignal_filepath, + db_filename, renamed_author) def delete_book(book, calibrepath, book_format): From 8e5bb02a284adcdc3d7bab791c8526566e847b9c Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sat, 13 Nov 2021 17:57:01 +0400 Subject: [PATCH 029/412] Merge author rename --- cps/db.py | 48 +++++++++++++++++++++++---------------- cps/editbooks.py | 8 +++---- cps/helper.py | 59 ++++++++++++++++++++++++++++++++---------------- cps/opds.py | 14 ++++++------ cps/ub.py | 2 ++ cps/web.py | 15 ++++++++---- 6 files changed, 90 insertions(+), 56 deletions(-) diff --git a/cps/db.py b/cps/db.py index f2acb7a1f..06019e178 100644 --- a/cps/db.py +++ b/cps/db.py @@ -39,7 +39,6 @@ except ImportError: from sqlalchemy.pool import StaticPool from sqlalchemy.sql.expression import and_, true, false, text, func, or_ from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.orm import joinedload from flask_login import current_user from flask_babel import gettext as _ from flask import flash @@ -759,26 +758,32 @@ class CalibreDB(): entries = query.order_by(*order).offset(off).limit(pagesize).all() except Exception as ex: log.debug_or_exception(ex) + # display authors in right order + entries = self.order_authors(entries, True) return entries, randm, pagination # Orders all Authors in the list according to authors sort - def order_authors(self, entry): - sort_authors = entry.author_sort.split('&') - authors_ordered = list() - error = False - ids = [a.id for a in entry.authors] - for auth in sort_authors: - results = self.session.query(Authors).filter(Authors.sort == auth.lstrip().strip()).all() - # ToDo: How to handle not found authorname - if not len(results): - error = True - break - for r in results: - if r.id in ids: - authors_ordered.append(r) - if not error: - entry.authors = authors_ordered - return authors_ordered + def order_authors(self, entries, list_return=False): + for entry in entries: + sort_authors = entry.author_sort.split('&') + authors_ordered = list() + error = False + ids = [a.id for a in entry.authors] + for auth in sort_authors: + results = self.session.query(Authors).filter(Authors.sort == auth.lstrip().strip()).all() + # ToDo: How to handle not found authorname + if not len(results): + error = True + break + for r in results: + if r.id in ids: + authors_ordered.append(r) + if not error: + entry.authors = authors_ordered + if list_return: + return entries + else: + return authors_ordered def get_typeahead(self, database, query, replace=('', ''), tag_filter=true()): query = query or '' @@ -839,10 +844,10 @@ class CalibreDB(): )) # read search results from calibre-database and return it (function is used for feed and simple search - def get_search_results(self, term, offset=None, order=None, limit=None, *join): + def get_search_results(self, term, offset=None, order=None, limit=None, config_read_column=False, *join): order = order[0] if order else [Books.sort] pagination = None - result = self.search_query(term, *join).order_by(*order).all() + result = self.search_query(term, config_read_column, *join).order_by(*order).all() result_count = len(result) if offset != None and limit != None: offset = int(offset) @@ -853,6 +858,9 @@ class CalibreDB(): limit_all = result_count ub.store_combo_ids(result) + # ToDo: doesn't work as more than one table returned + # entries = self.order_authors(result[offset:limit_all], True) + return result[offset:limit_all], result_count, pagination # Creates for all stored languages a translated speaking name in the array for the UI diff --git a/cps/editbooks.py b/cps/editbooks.py index 9e5dd70d1..bf971b158 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -171,7 +171,7 @@ def add_objects(db_book_object, db_object, db_session, db_type, add_elements): def create_objects_for_addition(db_element, add_element, db_type): if db_type == 'custom': if db_element.value != add_element: - db_element.value = add_element # ToDo: Before new_element, but this is not plausible + db_element.value = add_element elif db_type == 'languages': if db_element.lang_code != add_element: db_element.lang_code = add_element @@ -182,7 +182,7 @@ def create_objects_for_addition(db_element, add_element, db_type): elif db_type == 'author': if db_element.name != add_element: db_element.name = add_element - db_element.sort = add_element.replace('|', ',') + db_element.sort = helper.get_sorted_author(add_element.replace('|', ',')) elif db_type == 'publisher': if db_element.name != add_element: db_element.name = add_element @@ -376,7 +376,7 @@ def render_edit_book(book_id): for lang in book.languages: lang.language_name = isoLanguages.get_language_name(get_locale(), lang.lang_code) - book.authors = calibre_db.order_authors(book) + book.authors = calibre_db.order_authors([book]) author_names = [] for authr in book.authors: @@ -1286,7 +1286,7 @@ def table_xchange_author_title(): modif_date = False book = calibre_db.get_book(val) authors = book.title - book.authors = calibre_db.order_authors(book) + book.authors = calibre_db.order_authors([book]) author_names = [] for authr in book.authors: author_names.append(authr.name.replace('|', ',')) diff --git a/cps/helper.py b/cps/helper.py index 2cc7591b1..9f7061c27 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -334,6 +334,32 @@ def delete_book_file(book, calibrepath, book_format=None): id=book.id, path=book.path) + +def clean_author_database(renamed_author, calibrepath, local_book=None): + valid_filename_authors = [get_valid_filename(r) for r in renamed_author] + for r in renamed_author: + if local_book: + all_books = [local_book] + else: + all_books = calibre_db.session.query(db.Books) \ + .filter(db.Books.authors.any(db.Authors.name == r)).all() + for book in all_books: + book_author_path = book.path.split('/')[0] + if book_author_path in valid_filename_authors or local_book: + new_author = calibre_db.session.query(db.Authors).filter(db.Authors.name == r).first() + all_new_authordir = get_valid_filename(new_author.name) + all_titledir = book.path.split('/')[1] + all_new_path = os.path.join(calibrepath, all_new_authordir, all_titledir) + all_new_name = get_valid_filename(book.title) + ' - ' + all_new_authordir + # change location in database to new author/title path + book.path = os.path.join(all_new_authordir, all_titledir).replace('\\', '/') + for file_format in book.data: + shutil.move(os.path.normcase( + os.path.join(all_new_path, file_format.name + '.' + file_format.format.lower())), + os.path.normcase(os.path.join(all_new_path, all_new_name + '.' + file_format.format.lower()))) + file_format.name = all_new_name + + # was muss gemacht werden: # Die Autorennamen müssen separiert werden und von dupletten bereinigt werden. # Es muss geprüft werden: @@ -366,13 +392,16 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa if first_author: new_authordir = get_valid_filename(first_author) for r in renamed_author: - if first_author.lower() == r.lower(): + new_author = calibre_db.session.query(db.Authors).filter(db.Authors.name == r).first() + old_author_dir = get_valid_filename(r) + new_author_rename_dir = get_valid_filename(new_author.name) + if os.path.isdir(os.path.join(calibrepath, old_author_dir)): try: - new_author_path = os.path.join(calibrepath, new_authordir) - old_author_path = os.path.join(calibrepath, r) + old_author_path = os.path.join(calibrepath, old_author_dir) + new_author_path = os.path.join(calibrepath, new_author_rename_dir) shutil.move(os.path.normcase(old_author_path), os.path.normcase(new_author_path)) except (OSError) as ex: - log.error("Rename author from: %s to %s: %s", r, new_authordir, ex) + log.error("Rename author from: %s to %s: %s", old_author_path, new_author_path, ex) log.debug(ex, exc_info=True) return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", src=old_author_path, dest=new_author_path, error=str(ex)) @@ -411,26 +440,16 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa # Rename all files from old names to new names try: - all_books = calibre_db.session.query(db.Books)\ - .filter(db.Books.authors.any(db.Authors.name == renamed_author)).all() - for book in all_books: - all_titledir = book.path.split('/')[1] - all_new_path = os.path.join(calibrepath, new_authordir, all_titledir) - all_new_name = get_valid_filename(book.title) + ' - ' + new_authordir - # change location in database to new author/title path - book.path = os.path.join(new_authordir, all_titledir).replace('\\', '/') - for file_format in book.data: - shutil.move(os.path.normcase( - os.path.join(all_new_path, file_format.name + '.' + file_format.format.lower())), - os.path.normcase(os.path.join(all_new_path, all_new_name + '.' + file_format.format.lower()))) - file_format.name = all_new_name + clean_author_database(renamed_author, calibrepath) + + if first_author not in renamed_author: + clean_author_database([first_author], calibrepath, localbook) if not renamed_author and not orignal_filepath and len(os.listdir(os.path.dirname(path))) == 0: shutil.rmtree(os.path.dirname(path)) except (OSError) as ex: - log.error("Rename file in path %s to %s: %s", all_new_path, all_new_name, ex) + log.error("Error in rename file in path %s", ex) log.debug(ex, exc_info=True) - return _("Rename file in path '%(src)s' to '%(dest)s' failed with error: %(error)s", - src=new_path, dest=new_name, error=str(ex)) + return _("Error in rename file in path: %(error)s", error=str(ex)) return False def update_dir_structure_gdrive(book_id, first_author): diff --git a/cps/opds.py b/cps/opds.py index 92c51d1ba..f249218c6 100644 --- a/cps/opds.py +++ b/cps/opds.py @@ -20,23 +20,21 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import sys import datetime +from urllib.parse import unquote_plus from functools import wraps from flask import Blueprint, request, render_template, Response, g, make_response, abort from flask_login import current_user from sqlalchemy.sql.expression import func, text, or_, and_, true from werkzeug.security import check_password_hash - +from tornado.httputil import HTTPServerRequest from . import constants, logger, config, db, calibre_db, ub, services, get_locale, isoLanguages from .helper import get_download_link, get_book_cover from .pagination import Pagination from .web import render_read_books from .usermanagement import load_user_from_request from flask_babel import gettext as _ -from babel import Locale as LC -from babel.core import UnknownLocaleError opds = Blueprint('opds', __name__) @@ -84,10 +82,12 @@ def feed_osd(): @opds.route("/opds/search", defaults={'query': ""}) -@opds.route("/opds/search/") +@opds.route("/opds/search/") @requires_basic_auth_if_no_ano def feed_cc_search(query): - return feed_search(query.strip()) + # Handle strange query from Libera Reader with + instead of spaces + plus_query = unquote_plus(request.base_url.split('/opds/search/')[1]).strip() + return feed_search(plus_query) @opds.route("/opds/search", methods=["GET"]) @@ -527,7 +527,7 @@ def get_metadata_calibre_companion(uuid, library): def feed_search(term): if term: - entries, __, ___ = calibre_db.get_search_results(term) + entries, __, ___ = calibre_db.get_search_results(term, config_read_column=config.config_read_column) entriescount = len(entries) if len(entries) > 0 else 1 pagination = Pagination(1, entriescount, entriescount) return render_xml_template('feed.xml', searchterm=term, entries=entries, pagination=pagination) diff --git a/cps/ub.py b/cps/ub.py index e9ad264fa..6530a5957 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -83,6 +83,8 @@ def signal_store_user_session(object, user): store_user_session() def store_user_session(): + if flask_session.get('user_id', ""): + flask_session['_user_id'] = flask_session.get('user_id', "") if flask_session.get('_user_id', ""): try: if not check_user_session(flask_session.get('_user_id', ""), flask_session.get('_id', "")): diff --git a/cps/web.py b/cps/web.py index 9809c4e0f..6d1b9866e 100644 --- a/cps/web.py +++ b/cps/web.py @@ -543,7 +543,6 @@ def render_author_books(page, author_id, order): if services.goodreads_support and config.config_use_goodreads: author_info = services.goodreads_support.get_author_info(author_name) other_books = services.goodreads_support.get_other_books(author_info, entries) - return render_title_template('author.html', entries=entries, pagination=pagination, id=author_id, title=_(u"Author: %(name)s", name=author_name), author=author_info, other_books=other_books, page="author", order=order[1]) @@ -753,7 +752,12 @@ def render_prepare_search_form(cc): def render_search_results(term, offset=None, order=None, limit=None): join = db.books_series_link, db.Books.id == db.books_series_link.c.book, db.Series - entries, result_count, pagination = calibre_db.get_search_results(term, offset, order, limit, *join) + entries, result_count, pagination = calibre_db.get_search_results(term, + offset, + order, + limit, + config.config_read_column, + *join) return render_title_template('search.html', searchterm=term, pagination=pagination, @@ -832,7 +836,7 @@ def list_books(): total_count = filtered_count = calibre_db.session.query(db.Books).filter(calibre_db.common_filters(False)).count() if state is not None: if search: - books = calibre_db.search_query(search).all() + books = calibre_db.search_query(search, config.config_read_column).all() filtered_count = len(books) else: if not config.config_read_column: @@ -1424,10 +1428,11 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): else: offset = 0 limit_all = result_count + entries = calibre_db.order_authors(q[offset:limit_all], True) return render_title_template('search.html', adv_searchterm=searchterm, pagination=pagination, - entries=q[offset:limit_all], + entries=entries, result_count=result_count, title=_(u"Advanced Search"), page="advsearch", order=order[1]) @@ -1830,7 +1835,7 @@ def show_book(book_id): entry.tags = sort(entry.tags, key=lambda tag: tag.name) - entry.authors = calibre_db.order_authors(entry) + entry.authors = calibre_db.order_authors([entry]) entry.kindle_list = check_send_to_kindle(entry) entry.reader_list = check_read_formats(entry) From 927384306223e1be94b1fc205bee2b69a67b32cf Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sun, 21 Nov 2021 09:13:26 +0100 Subject: [PATCH 030/412] Removed double declared functions --- cps/ub.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/cps/ub.py b/cps/ub.py index 69ea55f6c..405b0865a 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -62,27 +62,13 @@ searched_ids = {} logged_in = dict() -def store_user_session(): - if flask_session.get('_user_id', ""): - if logged_in.get(flask_session.get('_user_id', "")): - logged_in[flask_session.get('_user_id', "")].append(flask_session.get('_id', "")) - else: - logged_in[flask_session.get('_user_id', "")] = [flask_session.get('_id', "")] - log.info(flask_session.get('_id', "")) - -def delete_user_session(user_id, session_key): - try: - logged_in.get(str(user_id), []).remove(session_key) - except ValueError: - pass - -def check_user_session(user_id, session_key): - return session_key in logged_in.get(str(user_id), []) def signal_store_user_session(object, user): store_user_session() def store_user_session(): + if flask_session.get('user_id', ""): + flask_session['_user_id'] = flask_session.get('user_id', "") if flask_session.get('_user_id', ""): try: if not check_user_session(flask_session.get('_user_id', ""), flask_session.get('_id', "")): From 642af2f973a3fb5800f8760d02d84a7847d8f3d3 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sun, 21 Nov 2021 09:28:03 +0100 Subject: [PATCH 031/412] Added support for missing locale Enu --- cps/iso_language_names.py | 20 + cps/translations/cs/LC_MESSAGES/messages.mo | Bin 39918 -> 39635 bytes cps/translations/cs/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/de/LC_MESSAGES/messages.mo | Bin 54015 -> 53698 bytes cps/translations/de/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/el/LC_MESSAGES/messages.mo | Bin 58278 -> 57858 bytes cps/translations/el/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/es/LC_MESSAGES/messages.mo | Bin 51719 -> 51420 bytes cps/translations/es/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/fi/LC_MESSAGES/messages.mo | Bin 27816 -> 27521 bytes cps/translations/fi/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/fr/LC_MESSAGES/messages.mo | Bin 54095 -> 53763 bytes cps/translations/fr/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/hu/LC_MESSAGES/messages.mo | Bin 25588 -> 25272 bytes cps/translations/hu/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/it/LC_MESSAGES/messages.mo | Bin 56691 -> 56390 bytes cps/translations/it/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/ja/LC_MESSAGES/messages.mo | Bin 20280 -> 19949 bytes cps/translations/ja/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/km/LC_MESSAGES/messages.mo | Bin 24788 -> 24546 bytes cps/translations/km/LC_MESSAGES/messages.po | 452 ++++++++--------- cps/translations/nl/LC_MESSAGES/messages.mo | Bin 50897 -> 50584 bytes cps/translations/nl/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/pl/LC_MESSAGES/messages.mo | Bin 52799 -> 52511 bytes cps/translations/pl/LC_MESSAGES/messages.po | 454 +++++++++--------- .../pt_BR/LC_MESSAGES/messages.mo | Bin 47339 -> 47022 bytes .../pt_BR/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/ru/LC_MESSAGES/messages.mo | Bin 48412 -> 48070 bytes cps/translations/ru/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/sv/LC_MESSAGES/messages.mo | Bin 49146 -> 48854 bytes cps/translations/sv/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/tr/LC_MESSAGES/messages.mo | Bin 23171 -> 22880 bytes cps/translations/tr/LC_MESSAGES/messages.po | 454 +++++++++--------- cps/translations/uk/LC_MESSAGES/messages.mo | Bin 18235 -> 18028 bytes cps/translations/uk/LC_MESSAGES/messages.po | 452 ++++++++--------- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 48933 -> 48654 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 454 +++++++++--------- .../zh_Hant_TW/LC_MESSAGES/messages.mo | Bin 49256 -> 48977 bytes .../zh_Hant_TW/LC_MESSAGES/messages.po | 454 +++++++++--------- messages.pot | 450 ++++++++--------- 40 files changed, 4696 insertions(+), 4396 deletions(-) diff --git a/cps/iso_language_names.py b/cps/iso_language_names.py index 07848b9cd..11e5e67bf 100644 --- a/cps/iso_language_names.py +++ b/cps/iso_language_names.py @@ -112,6 +112,7 @@ LANGUAGE_NAMES = { "elx": "elamština", "eng": "Angličtina", "enm": "Angličtina; středověká (1100-1500)", + "enu": "Enu", "epo": "esperanto", "est": "estonština", "eus": "baskičtina", @@ -533,6 +534,7 @@ LANGUAGE_NAMES = { "elx": "Elamisch", "eng": "Englisch", "enm": "Mittelenglisch", + "enu": "Enu", "epo": "Esperanto", "est": "Estnisch", "eus": "Baskisch", @@ -945,6 +947,7 @@ LANGUAGE_NAMES = { "eka": "Ekajuk", "elx": "Elamite", "eng": "Αγγλικά", + "enu": "Enu", "myv": "Erzya", "epo": "Εσπεράντο", "est": "Εσθονικά", @@ -1330,6 +1333,7 @@ LANGUAGE_NAMES = { "elx": "Elamita", "eng": "Inglés", "enm": "Inglés medio (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estonio", "eus": "Vasco", @@ -1751,6 +1755,7 @@ LANGUAGE_NAMES = { "elx": "elami", "eng": "englanti", "enm": "keskienglanti", + "enu": "Enu", "epo": "esperanto", "est": "viro", "eus": "baski", @@ -2172,6 +2177,7 @@ LANGUAGE_NAMES = { "elx": "élamite", "eng": "anglais", "enm": "anglais moyen (1100-1500)", + "enu": "enu", "epo": "espéranto", "est": "estonien", "eus": "basque", @@ -2593,6 +2599,7 @@ LANGUAGE_NAMES = { "elx": "elamita", "eng": "angol", "enm": "angol; középkori (1100-1500)", + "enu": "Enu", "epo": "eszperantó", "est": "észt", "eus": "Baszk", @@ -3014,6 +3021,7 @@ LANGUAGE_NAMES = { "elx": "Elamitico", "eng": "Inglese", "enm": "Inglese medio (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estone", "eus": "Basco", @@ -3435,6 +3443,7 @@ LANGUAGE_NAMES = { "elx": "エラム語", "eng": "英語", "enm": "英語; 中世 (1100-1500)", + "enu": "Enu", "epo": "エスペラント", "est": "エストニア語", "eus": "バスク語", @@ -3856,6 +3865,7 @@ LANGUAGE_NAMES = { "elx": "Elamite", "eng": "English", "enm": "English; Middle (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estonian", "eus": "Basque", @@ -4277,6 +4287,7 @@ LANGUAGE_NAMES = { "elx": "Elamitisch", "eng": "Engels", "enm": "Engels; middel (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estlands", "eus": "Baskisch", @@ -4698,6 +4709,7 @@ LANGUAGE_NAMES = { "elx": "elamicki", "eng": "Angielski", "enm": "angielski średniowieczny (1100-1500)", + "enu": "Enu", "epo": "esperanto", "est": "estoński", "eus": "baskijski", @@ -5110,6 +5122,7 @@ LANGUAGE_NAMES = { "eka": "Ekajuk", "elx": "Elamite", "eng": "Inglês", + "enu": "Enu", "myv": "Erzya", "epo": "Esperanto", "est": "Estónio", @@ -5493,6 +5506,7 @@ LANGUAGE_NAMES = { "elx": "Эламский", "eng": "Английский", "enm": "Среднеанглийский (1100-1500)", + "enu": "Enu", "epo": "Эсперанто", "est": "Эстонский", "eus": "Баскский", @@ -5914,6 +5928,7 @@ LANGUAGE_NAMES = { "elx": "Elamitiska", "eng": "Engelska", "enm": "Medelengelska (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estniska", "eus": "Baskiska", @@ -6326,6 +6341,7 @@ LANGUAGE_NAMES = { "eka": "Ekajuk (Afrika)", "elx": "Elamca", "eng": "İngilizce", + "enu": "Enu", "myv": "Erzya dili", "epo": "Esperanto", "est": "Estonca", @@ -6709,6 +6725,7 @@ LANGUAGE_NAMES = { "elx": "еламська", "eng": "англійська", "enm": "середньоанглійська (1100-1500)", + "enu": "ену", "epo": "есперанто", "est": "естонська", "eus": "баскська", @@ -7130,6 +7147,7 @@ LANGUAGE_NAMES = { "elx": "埃兰语", "eng": "英语", "enm": "英语(中古,1100-1500)", + "enu": "Enu", "epo": "世界语", "est": "爱沙尼亚语", "eus": "巴斯克语", @@ -7542,6 +7560,7 @@ LANGUAGE_NAMES = { "eka": "Ekajuk", "elx": "Elamite", "eng": "英文", + "enu": "Enu", "myv": "Erzya", "epo": "世界語", "est": "愛沙尼亞文", @@ -7925,6 +7944,7 @@ LANGUAGE_NAMES = { "elx": "Elamite", "eng": "English", "enm": "English; Middle (1100-1500)", + "enu": "Enu", "epo": "Esperanto", "est": "Estonian", "eus": "Basque", diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo index 2168e8beed52c7e3b86d6f0a8383b40e93d27496..d03dc08c93d654e22a38d2bcb5f0de3efa426db5 100644 GIT binary patch delta 9015 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 IO|x4352GAli~s-t delta 9256 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
    4>PD&xfGN% zFQd-(HCsQ4e$+q0Z2TBIVf){iY|q5L)JstxpzU}Mo=4rD=p|-hQ&AHyMMb&>HSQKv z?$o;!22pqqM`OTa<^wVj$5UU93i&0>$MB{6YY9$Ao#iRiJwJ5dF{s?=hq|USushbFHuNSoC$F4S6ei%uI0_SgZ&o@Vb*8IP$+r(R(HT^TKS2$2 z!?xeSF4Tione0!(KDQ zmG?#U%f=3vkD6#6CSwii{Xe57I*pp(9ERWx)O)v4N!Vts$*G<$g;W}HP%B-48h8_G z=Lb+Peqg<3+x^#>e$lAp>}%`eP&rd-+t*olp(Z|x%89?CHtJrXpinkoGfZ1=LYavQ z)huj+flGu>j{f&SF@+vl&NHgp1$@EcU_w5v5a5{-=KI`I?~vLw_*=@^N_ z@E)9mnz$ara66{s0UV6iFa;Cq%u!529o^%o_Wh{-S5WgrJ!Ot68XN!rUoQ$8co6E$ z#$Y_oM1^P#_QOr6h@8hzyo?ce0~JzdgGu5b)Xux32XiqJXQPhB#g_OSM(O_VrO+DR z#nJc)4#32x&4ga`P%lF*bS-9LJr?6d+kW>mX5i82q5T2W0;{nNuEBQr0%`+?(2b?= zJ_YUU2I|xJBWee&H<}$~qIPf}Dk8J2^HE3h7%H?YQOWxxYT}o$EgnMc_yTsvFHsQ- z-o*LqgAuvO{5+3FCCPBS3rC{P@=;90-KYUCpmxxJ+SxCtTxh-7BNE-$b0RFzeF3d_Boxn(|2;hZ^T3%tc1Uzw-e zTUs{X>nZdUm6gr*OfN4h_4sC%RCp?8dgn~0JS1_S&m+<9elN*?z9^Gb5p ebqLD%|F6$`XJbk6|GZxO&u`i-6m5K@$$tTWZN9_+ diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po index 3c8875ed8..6a6705473 100644 --- a/cps/translations/cs/LC_MESSAGES/messages.po +++ b/cps/translations/cs/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2020-06-09 21:11+0100\n" "Last-Translator: Lukas Heroudek \n" "Language: cs_CZ\n" @@ -15,17 +15,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "není nainstalováno" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "nainstalováno" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistika" @@ -64,17 +64,17 @@ msgstr "Základní konfigurace" msgid "UI Configuration" msgstr "Konfigurace uživatelského rozhraní" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Uživatel admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Vše" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Uživatel nenalezen" @@ -82,7 +82,7 @@ msgstr "Uživatel nenalezen" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zobrazit vše" @@ -91,7 +91,7 @@ msgstr "Zobrazit vše" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -99,7 +99,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Nezbývá žádný správce, nelze odebrat roli správce" @@ -271,9 +271,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -303,7 +303,7 @@ msgstr "Nastavení e-mailového serveru aktualizováno" msgid "Database Configuration" msgstr "Konfigurace funkcí" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Vyplňte všechna pole!" @@ -311,167 +311,167 @@ msgstr "Vyplňte všechna pole!" msgid "E-mail is not from valid domain" msgstr "E-mail není z platné domény" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Přidat nového uživatele" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Uživatel '%(user)s' vytvořen" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu nebo přezdívku." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Uživatel '%(nick)s' smazán" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Nezbývá žádný správce, nemůžete jej odstranit" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Upravit uživatele %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Uživatel '%(nick)s' aktualizován" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Změnit SMTP nastavení" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Při odesílání zkušebního e-mailu došlo k chybě: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Prvně nastavte svou e-mailovou adresu..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Nastavení e-mailového serveru aktualizováno" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Heslo pro uživatele %(user)s resetováno" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Prohlížeč log souborů" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Požadování balíčku aktualizace" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Stahování balíčku aktualizace" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Rozbalování balíčku aktualizace" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Nahrazování souborů" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Databázová připojení jsou uzavřena" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Zastavuji server" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Aktualizace dokončena, klepněte na tlačítko OK a znovu načtěte stránku" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Aktualizace selhala:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Chyba připojení" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Vypršel časový limit při navazování spojení" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Všeobecná chyba" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Aktualizační soubor nemohl být uložen do Temp Dir" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Chyba: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Chyba: Žádná reakce od uživatele LDAP serveru" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Nejméně jeden uživatel LDAP nenalezen v databázi" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -483,7 +483,7 @@ msgstr "není nakonfigurováno" msgid "Execution permissions missing" msgstr "Chybí povolení k exekuci" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Vlastní sloupec %(column)d neexistuje v databázi" @@ -496,8 +496,8 @@ msgstr "Formát knihy úspěšně smazán" msgid "Book Successfully Deleted" msgstr "Kniha úspěšně smazána" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Jejda! Vybraná kniha není k dispozici. Soubor neexistuje nebo není přístupný" @@ -534,7 +534,7 @@ msgstr "Nepodařilo se vytvořit cestu %(path)s (oprávnění odepřeno)." msgid "Failed to store file %(file)s." msgstr "Uložení souboru %(file)s se nezdařilo." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Chyba databáze: %(error)s." @@ -692,7 +692,7 @@ msgstr "Soubor %(file)s nenalezen na Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." @@ -726,34 +726,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Pouze jpg/jpeg jsou podporované soubory pro obal" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Unrar binární soubor nenalezen" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Chyba provádění UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Čekám" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Selhalo" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Spuštěno" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Dokončeno" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Neznámý stav" @@ -770,7 +774,7 @@ msgstr "Kobo nastavení" msgid "Register with %(provider)s" msgstr "Registrovat s %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "nyní jste přihlášen jako: '%(nickname)s'" @@ -836,7 +840,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Přihlásit" @@ -852,7 +856,7 @@ msgstr "Token vypršel" msgid "Success! Please return to your device" msgstr "Úspěch! Vraťte se prosím do zařízení" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Knihy" @@ -877,7 +881,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Nejlépe hodnocené knihy" @@ -886,7 +890,7 @@ msgid "Show Top Rated Books" msgstr "Zobrazit nejlépe hodnocené knihy" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Přečtené knihy" @@ -895,7 +899,7 @@ msgid "Show read and unread" msgstr "Zobrazit prečtené a nepřečtené" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Nepřečtené knihy" @@ -913,7 +917,7 @@ msgid "Show Random Books" msgstr "Zobrazit náhodné knihy" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategorie" @@ -923,7 +927,7 @@ msgstr "Zobrazit výběr kategorie" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Série" @@ -941,7 +945,7 @@ msgid "Show author selection" msgstr "Zobrazit výběr autora" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Vydavatelé" @@ -951,7 +955,7 @@ msgstr "Zobrazit výběr vydavatele" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Jazyky" @@ -975,7 +979,7 @@ msgstr "Formáty souborů" msgid "Show file formats selection" msgstr "Zobrazit výběr formátů" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Archivované knihy" @@ -983,7 +987,7 @@ msgstr "Archivované knihy" msgid "Show archived books" msgstr "Zobrazit archivované knihy" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1011,9 +1015,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Kniha byla přidána do police: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Nejste oprávněni přidat knihu do police: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1036,58 +1039,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Kniha byla odebrána z police: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Lituji, nejste oprávněni odebrat knihu z této police: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Vytvořit polici" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Lituji, nejste oprávněni odebrat knihu z této police: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Upravit polici" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Police %(title)s vytvořena" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Police %(title)s změněna" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Došlo k chybě" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Veřejná police s názvem '%(title)s' již existuje." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Osobní police s názvem ‘%(title)s’ již existuje." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Změnit pořadí Police: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Police: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Chyba otevírání police. Police neexistuje nebo není přístupná" @@ -1120,177 +1126,177 @@ msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizu msgid "No release information available" msgstr "Nejsou k dispozici žádné informace o verzi" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Objevte (Náhodné knihy)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Žhavé knihy (Nejstahovanější)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Autoři: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavatel: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnocení: %(rating)s stars" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Soubor formátů: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Jazyky: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Rozšířené hledání" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Hledat" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Stáhnutí" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Seznam hodnocení" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Seznam formátů" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Úlohy" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Vydáno po " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Vydáno před " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Hodnocení <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Hodnocení >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registrovat" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Váš e-mail nemá povolení k registraci" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Potvrzovací e-mail byl odeslán na váš účet." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Nelze aktivovat ověření LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Záložní přihlášení jako: ‘%(nickname)s’, server LDAP není dosažitelný nebo neznámý uživatel" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Nelze se přihlásit: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Špatné uživatelské jméno nebo heslo" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Nové heslo bylo zasláno na vaši emailovou adresu" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Nyní jste přihlášeni jako: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profil" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profil aktualizován" @@ -1303,31 +1309,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre převaděč %(tool)s nenalezen" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-převaděč selhal: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Převedený soubor nebyl nalezen nebo více než jeden soubor ve složce %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Převaděč eknih selhal: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1361,212 +1367,212 @@ msgstr "Správce" msgid "Password" msgstr "Heslo" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Nahrávat" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Stahovat" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Prohlížení knih" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Upravovat" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Smazat" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Veřejná police" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Přidat nového uživatele" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importovat LDAP uživatele" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Nastavení e-mailového serveru SMTP" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP hostitel" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP port" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Šifrování" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP přihlášení" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Z e-mailu" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Konfigurace" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre DB adresář" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Úroveň logu" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Knihy na stránku" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Nahrávání" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Anonymní prohlížení" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Veřejná registrace" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Magic Link vzdálené přihlášení" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Reverzní proxy přihlášení" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Název záhlaví reverzního proxy" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Upravit základní konfiguraci" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Upravit základní konfiguraci" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Upravit konfiguraci uživatelského rozhraní" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Správa" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Zobrazit log" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Znovupřipojení ke Calibre databázi" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Restartovat" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Vypnout" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Aktualizovat" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Verze" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Detaily" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Současná verze" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Zkontrolovat aktualizace" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Provést aktualizaci" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Opravdu chcete restartovat?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Zrušit" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Opravdu chcete vypnout?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Probíhá aktualizace, prosím nenačítejte stránku znovu" @@ -1578,39 +1584,39 @@ msgstr "přes" msgid "In Library" msgstr "V knihovně" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "redukovat" @@ -1740,9 +1746,9 @@ msgid "Fetch Metadata" msgstr "Získat metadata" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Uložit" @@ -1765,7 +1771,7 @@ msgstr "Načítání..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Zavřít" @@ -2246,50 +2252,50 @@ msgstr "Povolit stahování" msgid "Allow eBook Viewer" msgstr "Povolit prohlížeč knih" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Povolit nahrávání" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Povolit úpravy" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Povolit mazání knih" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Povolit změnu hesla" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Povolit úpravy veřejných polic" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Vynechat jazyky" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Zobrazit knihy s jazykem" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Výchozí zobrazení pro nové uživatele" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Zobrazit náhodné knihy v podrobném zobrazení" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Přidat povolené/zakázané štítky" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Přidat povolené/zakázané hodnoty vlastních sloupců" @@ -2443,21 +2449,29 @@ msgstr "Zpět domů" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3066,15 +3080,15 @@ msgstr "Vytvořit/Prohlížet" msgid "Add allowed/Denied Custom Column Values" msgstr "Přidat povolené/zakázané hodnoty vlastních sloupců" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Odstranit tohoto uživatele" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Vygenerovat URL pro Kobo Auth" diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index 4ad26e6b201e9adae0fa7e01569f612b5d1bb952..88ec0827506a04563a01db93551d73241ad1cf99 100644 GIT binary patch delta 11707 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 delta 11885 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 diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po index 823c2aa7c..a1b69d0cd 100644 --- a/cps/translations/de/LC_MESSAGES/messages.po +++ b/cps/translations/de/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2021-08-01 17:24+0200\n" "Last-Translator: Ozzie Isaacs\n" "Language: de\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "Nicht installiert" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "Installiert" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistiken" @@ -65,16 +65,16 @@ msgstr "Basiskonfiguration" msgid "UI Configuration" msgstr "Benutzeroberflächenkonfiguration" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "Benutzer bearbeiten" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Alle" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Benutzer nicht gefunden" @@ -82,7 +82,7 @@ msgstr "Benutzer nicht gefunden" msgid "{} users deleted successfully" msgstr "{} Benutzer erfolgreich gelöscht" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zeige alle" @@ -91,7 +91,7 @@ msgstr "Zeige alle" msgid "Malformed request" msgstr "Ungültige Anfrage" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Guest Name kann nicht geändert werden" @@ -99,7 +99,7 @@ msgstr "Guest Name kann nicht geändert werden" msgid "Guest can't have this role" msgstr "Guest Benutzer kann diese Rolle nicht haben" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Kein Admin Benutzer verblieben Admin Berechtigung kann nicht entfernt werden" @@ -266,9 +266,9 @@ msgstr "LDAP Member User Filter hat eine ungleiche Anzahl von geöffneten und ge msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-Zertifikat, Zertifikat oder Key Datei ist kein gültiger Pfad" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "Einstellungsdatenbank ist nicht schreibbar" @@ -297,7 +297,7 @@ msgstr "Einstellungen des E-Mail-Servers aktualisiert" msgid "Database Configuration" msgstr "Datenbank-Konfiguration" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Bitte alle Felder ausfüllen!" @@ -305,166 +305,166 @@ msgstr "Bitte alle Felder ausfüllen!" msgid "E-mail is not from valid domain" msgstr "E-Mail bezieht sich nicht auf eine gültige Domain" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Neuen Benutzer hinzufügen" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Benutzer '%(user)s' angelegt" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "Es existiert bereits ein Account für diese E-Mailadresse oder diesen Benutzernamen." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Benutzer '%(nick)s' gelöscht" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "Guest Benutzer kann nicht gelöscht werden" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Benutzer %(nick)s bearbeiten" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Benutzer '%(nick)s' aktualisiert" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "SMTP-Einstellungen ändern" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "Gmail Account Verifikation erfolgreich" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail an %(email)s wurde zum Senden in die Warteschlange eingereiht, für das Ergebnis bitte Aufgaben überprüfen" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Es trat ein Fehler beim Versenden der Test-E-Mail auf: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Bitte zuerst E-Mail Adresse konfigurieren..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Einstellungen des E-Mail-Servers aktualisiert" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Logdatei Anzeige" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Frage Update an" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Lade Update herunter" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Entpacke Update" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Ersetze Dateien" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Schließe Datenbankverbindungen" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Stoppe Server" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Update fehlgeschlagen:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP Fehler" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Verbindungsfehler" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Timeout beim Verbindungsaufbau" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Allgemeiner Fehler" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Updatedatei konnte nicht in Temporärem Ordner gespeichert werden" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht erzeugt werden" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht erzeugt werden" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fehler: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Fehler: Keine Benutzerinformationen von LDAP Server empfangen" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Mindestens ein LDAP Benutzer wurde nicht in der Datenbank gefudnen" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} Benutzer erfolgreich importiert" @@ -476,7 +476,7 @@ msgstr "Nicht konfiguriert" msgid "Execution permissions missing" msgstr "Ausführeberechtigung fehlt" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Benutzerdefinierte Spalte Nr. %(column)d ist nicht in Calibre Datenbank vorhanden" @@ -489,8 +489,8 @@ msgstr "Buch Format erfolgreich gelöscht" msgid "Book Successfully Deleted" msgstr "Buch erfolgreich gelöscht" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich" @@ -527,7 +527,7 @@ msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)" msgid "Failed to store file %(file)s." msgstr "Fehler beim Speichern der Datei %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Datenbankfehler: %(error)s." @@ -685,7 +685,7 @@ msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden" msgid "Book path %(path)s not found on Google Drive" msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse" @@ -718,34 +718,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Nur jpg/jpeg/png/webp/bmp Dateien werden als Coverdatei unterstützt" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Es werden nur jpg/jpeg Dateien als Cover untertützt" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "UnRar Programm nicht gefunden" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Fehler beim ausführen von UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Wartend" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Fehlgeschlagen" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Gestartet" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Beendet" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Unbekannter Status" @@ -762,7 +766,7 @@ msgstr "Kobo Setup" msgid "Register with %(provider)s" msgstr "Anmelden mit %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'" @@ -828,7 +832,7 @@ msgid "{} Stars" msgstr "{} Sterne" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Login" @@ -844,7 +848,7 @@ msgstr "Token ist abgelaufen" msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Bücher" @@ -869,7 +873,7 @@ msgstr "Heruntergeladene Bücher" msgid "Show Downloaded Books" msgstr "Zeige heruntergeladene Bücher" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Best bewertete Bücher" @@ -878,7 +882,7 @@ msgid "Show Top Rated Books" msgstr "Bestbewertete Bücher anzeigen" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Gelesene Bücher" @@ -887,7 +891,7 @@ msgid "Show read and unread" msgstr "Zeige gelesene/ungelesene Bücher" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Ungelesene Bücher" @@ -905,7 +909,7 @@ msgid "Show Random Books" msgstr "Zeige zufällige Bücher" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategorien" @@ -915,7 +919,7 @@ msgstr "Zeige Kategorienauswahl" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Serien" @@ -933,7 +937,7 @@ msgid "Show author selection" msgstr "Zeige Autorenauswahl" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Verleger" @@ -943,7 +947,7 @@ msgstr "Zeige Verlegerauswahl" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Sprachen" @@ -967,7 +971,7 @@ msgstr "Dateiformate" msgid "Show file formats selection" msgstr "Zeige Dateiformatauswahl" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Archivierte Bücher" @@ -975,7 +979,7 @@ msgstr "Archivierte Bücher" msgid "Show archived books" msgstr "Zeige archivierte Bücher" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Bücherliste" @@ -1002,9 +1006,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Das Buch wurde dem Bücherregal %(sname)s hinzugefügt" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Dir ist es nicht erlaubt, ein Buch zum Bücherregal %(name)s hinzuzufügen" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1027,57 +1030,60 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Dir ist es nicht erlaubt, Bücher aus dem Bücherregal %(sname)s zu entfernen" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Bücherregal erzeugen" -#: cps/shelf.py:236 +#: cps/shelf.py:241 msgid "Sorry you are not allowed to edit this shelf" msgstr "Dir ist es nicht erlaubt, dieses Bücherregal zu editieren" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Bücherregal editieren" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Bücherregal %(title)s erzeugt" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Bücherregal %(title)s verändert" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Es trat ein Fehler auf" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Es existiert bereit ein öffentliches Bücherregal mit dem Name '%(title)s'." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Es existiert bereit ein privates Bücherregal mit dem Name '%(title)s'." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Reihenfolge in Bücherregal '%(name)s' verändern" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Bücherregal: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fehler beim Öffnen des Bücherregals. Bücherregal exisitert nicht oder ist nicht zugänglich" @@ -1110,177 +1116,177 @@ msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Ver msgid "No release information available" msgstr "Keine Releaseinformationen verfügbar" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Entdecke (Zufällige Bücher)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Beliebte Bücher (am meisten Downloads)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Von %(user)s heruntergeladene Bücher" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Verleger: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Bewertung: %(rating)s Sterne" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Dateiformat: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Sprache: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Erweiterte Suche" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Suche" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Bewertungsliste" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Liste der Dateiformate" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Aufgaben" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Herausgegeben nach dem " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Herausgegeben vor dem " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Bewertung <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Bewertung >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Lesestatus = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fehler bei der Suche nach eigenen Spalten, bitte Calibre-Web neustarten" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registrieren" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Rückfall Login als: '%(nickname)s', LDAP Server ist nicht erreichbar, oder der Nutzer ist unbekannt" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Login nicht erfolgreich: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Eingeloggt als: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's Profil" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profil aktualisiert" @@ -1293,31 +1299,31 @@ msgstr "Keine gültige gmail.json Datei mit Oauth informationen gefunden" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre E-Book Konverter %(tool)s nicht gefunden" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s Format nicht gefunden" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "EBook Converter mit unbekanntem Fehler fehlgeschlagen" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify Konverter Aufruf fehlgeschlagen: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konvertierte Datei nicht gefunden, oder mehr als eine Datei im Pfad %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Fehler des EBook-Converters: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre fehlgeschlagen mit Fehler: %(error)s" @@ -1351,211 +1357,211 @@ msgstr "Admin" msgid "Password" msgstr "Passwort" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Upload" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Download" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Bücher ansehen" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Editieren" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Löschen" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Öffentliches Bücherregal" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Neuen Benutzer hinzufügen" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "LDAP Benutzer importieren" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Einstellungen des SMTP-Servers" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP-Hostname" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP Port" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Verschlüsselung" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP-Login" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Absenderadresse" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "E-Mail Service" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail via Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Konfiguration" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Ordner der Calibre-DB" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Loglevel" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Externer Port" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Bücher pro Seite" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Hochladen" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Anonymes Durchsuchen" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Öffentliche Registrierung" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Remotelogin ('Magischer Link')" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Reverse Proxy Login" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Reverse Proxy Header Name" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "Calibre Datenbank Konfiguration editieren" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Basiskonfiguration" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Benutzeroberflächenkonfiguration" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Debug Daten herunterladen" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Logdateien ansehen" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Calibre-DB neu verbinden" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Neustart" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Calibre-Web beenden" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Update" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Aktuelle Version" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Nach Update suchen" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Update durchführen" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Calibre-Web wirklich neustarten?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Abbruch" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Calibre-Web wirklich anhalten?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Updatevorgang, Seite bitte nicht neu laden" @@ -1567,39 +1573,39 @@ msgstr "via" msgid "In Library" msgstr "In Bibliothek" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Sortiere nach Buchdatum, Neuestes zuerst" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Sortiere nach Buchdatum, Aältestes zuerst" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Sortiere Titel in alphabetischer Reihenfolge" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Sortiere Titel in umgekehrt alphabetischer Reihenfolge" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Sortiere nach Herausgabedatum, Neueste zuerst" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Sortiere nach Herausgabedatum, Älteste zuerst" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "Reduzieren" @@ -1729,9 +1735,9 @@ msgid "Fetch Metadata" msgstr "Metadaten laden" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Speichern" @@ -1754,7 +1760,7 @@ msgstr "Lade..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Schließen" @@ -2234,50 +2240,50 @@ msgstr "Downloads erlauben" msgid "Allow eBook Viewer" msgstr "Anzeige von Büchern erlauben" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Hochladen erlauben" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Bearbeiten erlauben" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Löschen von Büchern erlauben" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Ändern des Passworts erlauben" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Editieren öffentlicher Bücherregale erlauben" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Sprachen ausschließen" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Zeige nur Bücher mit dieser Sprache" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Standard-Sichtbarkeiten für neue Benutzer" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Zeige zufällige Bücher in der Detailansicht" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Erlaubte/Verbotene Tags hinzufügen" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Erlaubte/Verbotene Calibre Spalten hinzufügen" @@ -2430,21 +2436,29 @@ msgstr "Zurück zur Hauptseite" msgid "Logout User" msgstr "Benutzer ausloggem" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Sortiere Autoren in alphabetischer Reihenfolge" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Sortiere Autoren in umgekehrt alphabetischer Reihenfolge" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Sortiere Serienindex aufsteigend" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Sortiere Serienindex absteigend" @@ -3046,15 +3060,15 @@ msgstr "Erzeugen/Ansehen" msgid "Add allowed/Denied Custom Column Values" msgstr "Erlaubte/Verbotene Calibre Spalten hinzufügen" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Nur Bücher aus ausgewählten Bücherregalen mit Kobo synchronisieren" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Benutzer löschen" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Kobo Auth URL erzeugen" diff --git a/cps/translations/el/LC_MESSAGES/messages.mo b/cps/translations/el/LC_MESSAGES/messages.mo index fe3cf95661e79caf882ba50d2a788ecf8a852cb1..47ef49892936030cc3503c49ae16fb00590c85fb 100644 GIT binary patch delta 9570 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 F{{wZ7Nw@$2 delta 9897 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 diff --git a/cps/translations/el/LC_MESSAGES/messages.po b/cps/translations/el/LC_MESSAGES/messages.po index fad7c698c..3e5b003de 100644 --- a/cps/translations/el/LC_MESSAGES/messages.po +++ b/cps/translations/el/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Depountis Georgios\n" "Language: el\n" @@ -15,17 +15,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "δεν εγκαταστάθηκε" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "εγκαταστάθηκε" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Στατιστικά" @@ -64,17 +64,17 @@ msgstr "Βασική Διαμόρφωση" msgid "UI Configuration" msgstr "UI Διαμόρφωση" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Χρήστης Διαχειριστής" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Όλα" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Δεν βρέθηκε χρήστης" @@ -82,7 +82,7 @@ msgstr "Δεν βρέθηκε χρήστης" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Προβολή Όλων" @@ -91,7 +91,7 @@ msgstr "Προβολή Όλων" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -99,7 +99,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να αφαιρεθεί ο ρόλος διαχειριστή" @@ -271,9 +271,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "Οι ρυθμίσεις DB δεν μπορούν να Γραφτούν" @@ -303,7 +303,7 @@ msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομισ msgid "Database Configuration" msgstr "Διαμόρφωση Λειτουργίας" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Παρακαλούμε συμπλήρωσε όλα τα πεδία!" @@ -311,167 +311,167 @@ msgstr "Παρακαλούμε συμπλήρωσε όλα τα πεδία!" msgid "E-mail is not from valid domain" msgstr "Το E-mail δεν είναι από έγκυρο domain" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Προσθήκη νέου χρήστη" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Χρήστης/ες '%(user)s' δημιουργήθηκαν" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Βρέθηκε ένας ήδη υπάρχον λογαριασμός για αυτή τη διεύθυνση e-mail ή όνομα χρήστη." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Χρήστης/ες '%(nick)s' διαγράφηκαν" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να διαγραφεί ο χρήστης" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Επεξεργασία χρήστη %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Χρήστης/ες '%(nick)s' ενημερώθηκαν" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Προέκυψε ένα άγνωστο σφάλμα. Παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Επεξεργασία Ρυθμίσεων E-mail Διακομιστή" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Παρουσιάστηκε σφάλμα κατά την αποστολή του δοκιμαστικού e-mail:% (res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Παρακαλούμε ρύθμισε πρώτα τη διεύθυνση e-mail σου..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομιστή" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Κωδικός για επαναφορά %(user) χρήστη/ών" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Παρακαλούμε διαμόρφωσε πρώτα τις ρυθμίσεις ταχυδρομείου SMTP..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Προβολέας αρχείου φύλλου καταγραφής" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Αίτημα πακέτου ενημέρωσης" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Κατεβάζει πακέτο ενημέρωσης" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Ανοίγει πακέτο ενημέρωσης" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Αντικατάσταση αρχείων" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Οι συνδέσεις βάσης δεδομένων είναι κλειστές" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Σταματάει το διακομιστή" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Η ενημέρωση τελειώσε, παρακαλούμε πιέστε το εντάξει και φορτώστε ξανά τη σελίδα" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Η ενημέρωση απέτυχε:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP Σφάλμα" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Σφάλμα σύνδεσης" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Τελείωσε ο χρόνος κατά την προσπάθεια δημιουργίας σύνδεσης" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Γενικό σφάλμα" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Το Αρχείο Ενημέρωσης Δεν Μπόρεσε Να Αποθηκευτεί σε" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Αποτυχία Δημιουργίας Τουλάχιστον Ενός Χρήστη LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Αποτυχία Δημιουργίας Τουλάχιστον Ενός Χρήστη LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Σφάλμα: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Σφάλμα: Δεν επιστράφηκε χρήστης σε απάντηση του διακομιστή LDAP" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Τουλάχιστον Ένας Χρήστης LDAP Δεν Βρέθηκε Στη Βάση Δεδομένων" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -483,7 +483,7 @@ msgstr "δεν διαμορφώθηκε" msgid "Execution permissions missing" msgstr "Λείπουν άδειες εκτέλεσης" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Η ειδικά προσαρμοσμένη στήλη No.%(column)d δεν υπάρχει στο επίπεδο βάσης δεδομένων" @@ -496,8 +496,8 @@ msgstr "Η μορφή βιβλίου Διαγράφηκε Επιτυχώς" msgid "Book Successfully Deleted" msgstr "Το Βιβλίο Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oυπς! Ο επιλεγμένος τίτλος βιβλίου δεν είναι διαθέσιμος. Το αρχείο δεν υπάρχει ή δεν είναι προσβάσιμο" @@ -534,7 +534,7 @@ msgstr "Αποτυχεία δημιουργίας πορείας %(path)s (Η ά msgid "Failed to store file %(file)s." msgstr "Αποτυχία αποθήκευσης αρχείου %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Σφάλμα βάσης δεδομένων: %(error)s." @@ -692,7 +692,7 @@ msgstr "Το αρχείο %(file)s δεν βρέθηκε στο Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Η πορεία βιβλίου %(path)s δεν βρέθηκε στο Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Βρέθηκε ένας ήδη υπάρχον λογαριασμός για αυτή τη διεύθυνση e-mail." @@ -726,34 +726,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Μόνο jpg/jpeg αρχεία υποστηρίζονται ως αρχεία φόντου" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Δεν βρέθηκε δυαδικό αρχείο Unrar" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Σφάλμα εκτέλεσης UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Αναμονή" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Απέτυχε" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Ξεκίνησε" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Τελείωσε" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "ʼΑγνωστη κατάσταση" @@ -770,7 +774,7 @@ msgstr "Καθορισμός Kobo" msgid "Register with %(provider)s" msgstr "Εγγραφή με %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" @@ -836,7 +840,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Σύνδεση" @@ -852,7 +856,7 @@ msgstr "Η μάρκα έχει λήξει" msgid "Success! Please return to your device" msgstr "Επιτυχία! Παρακαλούμε επέστρεψε στη συσκευή σου" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Βιβλία" @@ -877,7 +881,7 @@ msgstr "Κατεβασμένα Βιβλία" msgid "Show Downloaded Books" msgstr "Προβολή Κατεβασμένων Βιβλίων" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Βιβλία με Κορυφαία Αξιολόγηση" @@ -886,7 +890,7 @@ msgid "Show Top Rated Books" msgstr "Προβολή Βιβλίων με Κορυφαία Αξιολόγηση" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Βιβλία που Διαβάστηκαν" @@ -895,7 +899,7 @@ msgid "Show read and unread" msgstr "Προβολή διαβασμένων και αδιάβαστων" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Βιβλία που δεν Διαβάστηκαν" @@ -913,7 +917,7 @@ msgid "Show Random Books" msgstr "Προβολή Τυχαίων Βιβλίων" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Κατηγορίες" @@ -923,7 +927,7 @@ msgstr "Προβολή επιλογών κατηγορίας" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Σειρές" @@ -941,7 +945,7 @@ msgid "Show author selection" msgstr "Προβολή επιλογών συγγραφέα" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Εκδότες" @@ -951,7 +955,7 @@ msgstr "Προβολή επιλογών εκδότη" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Γλώσσες" @@ -975,7 +979,7 @@ msgstr "Μορφές αρχείου" msgid "Show file formats selection" msgstr "Προβολή επιλογών μορφής αρχείου" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Αρχειοθετημένα Βιβλία" @@ -983,7 +987,7 @@ msgstr "Αρχειοθετημένα Βιβλία" msgid "Show archived books" msgstr "Προβολή αρχειοθετημένων βιβλίων" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Λίστα Βιβλίων" @@ -1011,9 +1015,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Το βιβλίο έχει προστεθεί στο ράφι: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Δεν σου επιτρέπεται να προσθέσεις ένα βιβλίο στο ράφι: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1036,58 +1039,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Το βιβλίο έχει αφαιρεθεί από το ράφι: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Συγγνώμη αλλά δεν σου επιτρέπεται η αφαίρεση ενός βιβλίου από αυτό το ράφι: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Δημιούργησε ένα Ράφι" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Συγγνώμη αλλά δεν σου επιτρέπεται η αφαίρεση ενός βιβλίου από αυτό το ράφι: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Επεξεργασία ενός ραφιού" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Το ράφι %(title)s δημιουργήθηκε" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Το ράφι %(title)s άλλαξε" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Υπήρξε ένα σφάλμα" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Ένα δημόσιο ράφι με το όνομα '%(title)s' υπάρχει ήδη." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ένα ιδιωτικό ράφι με το όνομα '%(title)s' υπάρχει ήδη." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Αλλαγή σειράς του Ραφιού: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Ράφι: '%(name)s" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Σφάλμα κατά το άνοιγμα του ραφιού. Το ράφι δεν υπάρχει ή δεν είναι προσβάσιμο" @@ -1120,177 +1126,177 @@ msgstr "Μια νέα ενημέρωση είναι διαθέσιμη. Κάνε msgid "No release information available" msgstr "Δεν υπάρχουν διαθέσιμες πληροφορίες αποδέσμευσης" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Ανακάλυψε (Τυχαία Βιβλία)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Βιβλία στη Μόδα (Με τα περισσότερα κατεβάσματα)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Κατεβασμένα βιβλία από %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Συγγραφέας: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Εκδότης: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Σειρές: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Αξιολόγηση: %(rating)s stars" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Μορφή αρχείου: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Κατηγορία: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Γλώσσα: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Προχωρημένη Αναζήτηση" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Αναζήτηση" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Κατεβασμένα" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Λίστα αξιολογήσεων" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Λίστα μορφών αρχείου" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Εργασίες" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Εκδόθηκε μετά" -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Εκδόθηκε πριν" -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Αξιολόγηση <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Αξιολόγηση >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Το βιβλίο έχει επιτυχώς μπει σε σειρά για αποστολή στο %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Oυπς! Υπήρξε ένα σφάλμα κατά την αποστολή αυτού του βιβλίου: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Παρακαλούμε ενημέρωσε το προφίλ σου με μια έγκυρη Διεύθυνση E-mail Αποστολής στο Kindle." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Εγγραφή" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Η διεύθυνση e-mail σου δεν επιτρέπεται να εγγραφεί" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Το e-mail επιβεβαίωσης έχει σταλεί στον e-mail λογαριασμό σου." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Δεν μπόρεσε να ενεργοποιηθεί η επαλήθευση LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Εναλλακτική Σύνδεση ως: '%(nickname)s', Ο Διακομιστής LDAP δεν είναι προσβάσιμος, ή ο χρήστης δεν είναι γνωστός" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Δεν μπόρεσε να συνδεθεί: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Λανθασμένο Όνομα Χρήστη ή Κωδικός" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Ο Νέος Κωδικός έχει σταλεί στη διεύθυνση email σου" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Παρακαλούμε συμπλήρωσε ένα έγκυρο όνομα χρήστη για επαναφορά του κωδικού" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Έχεις συνδεθεί ως: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's προφίλ" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Το προφίλ ενημερώθηκε" @@ -1303,31 +1309,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Το εργαλείο μετατροπής Calibre ebook %(tool)s δεν βρέθηκε" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s μορφή δεν βρέθηκε σε δίσκο" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "Ο μετατροπέας Ebook απέτυχε με άγνωστο σφάλμα" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Ο μετατροπέας Kepubify απέτυχε: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Το τροποποιημένο αρχείο δεν βρέθηκε ή υπάρχουν περισσότερα από ένα αρχεία στο φάκελο %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ο μετατροπέας Ebook απέτυχε: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Το Calibre απέτυχε με σφάλμα: %(error)s" @@ -1361,212 +1367,212 @@ msgstr "Διαχειριστής" msgid "Password" msgstr "Κωδικός" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Ανέβασμα" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Κατέβασμα" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Προβολή Βιβλίων" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Επεξεργασία" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Διαγραφή" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Δημόσιο Ράφι" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Προσθήκη Νέου Χρήστη" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Εισαγωγή Χρηστών LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Ρυθμίσεις E-mail Διακομιστή" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "Όνομα Εξυπηρετητή SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP Θύρα" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Κρυπτογράφηση" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Σύνδεση SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Από E-mail" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Διαμόρφωση" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Ευρετήριο Βάσης Δεδομένων Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Επίπεδο Φύλλου Καταγραφής" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Θύρα" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Εξωτερική Θύρα" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Βιβλία ανά Σελίδα" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Ανεβάσμένα" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Ανώνυμη Περιήγηση" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Δημόσια Εγγραφή" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Μαγικός Σύνδεσμος Απομακρυσμένης Σύνδεσης" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Αναστροφή Σύνδεσης Διακομιστή Μεσολάβησης" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Αναστροφή Proxy Όνομα Επικεφαλίδας" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Επεξεργασία Βασικής Διαμόρφωσης" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Επεξεργασία Βασικής Διαμόρφωσης" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Επεξεργασία Διαμόρφωσης UI" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Διοίκηση" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Προβολή Φύλλων Καταγραφής" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Επανασύνδεση Βάσης Δεδομένων Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Επανεκκίνηση" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Κλείσιμο" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Ενημέρωση" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Έκδοση" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Λεπτομέρειες" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Τρέχουσα έκδοση" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Έλεγχος για Ενημέρωση" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Πραγματοποίηση Ενημέρωσης" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Είσαι σίγουρος/η πως θέλεις να κάνεις επανεκκίνηση" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Ακύρωση" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Είσαι σίγουρος/η πως θέλεις να κάνεις κλείσιμο;" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Γίνεται ενημέρωση, παρακαλούμε μη φορτώσεις ξανά αυτή τη σελίδα" @@ -1578,39 +1584,39 @@ msgstr "μέσω" msgid "In Library" msgstr "Στη Βιβλιοθήκη" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "μείωση" @@ -1740,9 +1746,9 @@ msgid "Fetch Metadata" msgstr "Συγκέντρωση Μεταδεδομένων" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Αποθήκευση" @@ -1765,7 +1771,7 @@ msgstr "Φόρτωση..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Κλείσιμο" @@ -2246,50 +2252,50 @@ msgstr "Να Επιτρέπεται το Κατέβασμα" msgid "Allow eBook Viewer" msgstr "Να Επιτρέπεται η Προβολή eBook Viewer" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Να Επιτρέπεται το Ανέβασμα" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Να Επιτρέπεται η Επεξεργασία" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Να Επιτρέπεται η Διαγραφή Βιβλίων" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Να Επιτρέπεται η Αλλαγή Κωδικού" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Να Επιτρέπεται η Επεξεργασία Δημόσιων Ραφιών" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Εξαίρεση Γλωσσών" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Γλώσσα Βιβλίων" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Προκαθορισμένες Ορατότηες για Νέους Χρήστες" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Προβολή Τυχαίων Βιβλίων σε Προβολή Λεπτομερειών" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Προσθήκη ετικετών Επιτρέπεται/Απορρίπτεται" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Προσθήκη τιμών ειδικά κατασκευασμένων στηλών Επιτρέπεται/Απορρίπτεται" @@ -2443,21 +2449,29 @@ msgstr "Επιστροφή στην Κεντρική" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3066,15 +3080,15 @@ msgstr "Δημιουγία/Προβολή" msgid "Add allowed/Denied Custom Column Values" msgstr "Προσθήκη Τιμών Ειδικά Προσαρμοσμένης Στήλης επιτρέπεται/Απορρίπτεται" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Διαγραφή Χρήστη" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Δημιουργία Kobo Auth URL" diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index 99318bb3349c4f051e35a547b01ecdb816c3043a..82ed25531ba509e2edfc2e09850d3af6c598f121 100644 GIT binary patch delta 11106 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 delta 11371 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 diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index a44d25736..d57c31cc4 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2020-05-25 17:22+0200\n" "Last-Translator: minakmostoles \n" "Language: es\n" @@ -18,18 +18,18 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "no instalado" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "instalado" # "Last-Translator: victorhck \n" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Estadísticas" @@ -68,17 +68,17 @@ msgstr "Configuración básica" msgid "UI Configuration" msgstr "Configuración de la interfaz de usuario" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Editar usuarios" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Todo" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Usuario no encontrado" @@ -86,7 +86,7 @@ msgstr "Usuario no encontrado" msgid "{} users deleted successfully" msgstr "{} usuarios eliminados con éxito" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar todo" @@ -95,7 +95,7 @@ msgstr "Mostrar todo" msgid "Malformed request" msgstr "Petición mal formulada" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "El nombre de invitado no se puede cambiar" @@ -103,7 +103,7 @@ msgstr "El nombre de invitado no se puede cambiar" msgid "Guest can't have this role" msgstr "El invitado no puede tener ese rol" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "No queda ningún usuario administrador, no se puede eliminar al usuario" @@ -275,9 +275,9 @@ msgstr "El filtro de LDAP \"Member User\" tiene paréntesis no coincidentes" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Ubicaciones del certificado de la CA del LDAP, del certificado o de la clave no válidos. Por favor introduce la ruta correcta" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "La base de datos de configuración no es modificable" @@ -307,7 +307,7 @@ msgstr "Actualizados los ajustes del servidor de correo electrónico" msgid "Database Configuration" msgstr "Configuración de la base de datos" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "¡Por favor, rellena todos los campos!" @@ -315,167 +315,167 @@ msgstr "¡Por favor, rellena todos los campos!" msgid "E-mail is not from valid domain" msgstr "El correo electrónico no tiene un dominio válido" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Añadir un nuevo usuario" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Encontrada una cuenta existente para este correo electrónico o nombre de usuario." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' eliminado" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "No puedes borrar al Usuario Invitado" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "No queda ningún usuario administrador, no se puede borrar al usuario" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Cambiar parámetros de correo" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "Verificación de cuenta de Gmail exitosa" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Puesto en cola un correo electrónico de prueba enviado a %(email)s, por favor, comprueba el resultado en Tareas" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocurrió un error enviando el correo electrónico de prueba: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure su correo electrónico primero..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Actualizados los ajustes del servidor de correo electrónico" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Contraseña para el usuario %(user)s reinicializada" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Configura primero los parámetros del servidor SMTP..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Visor del fichero de log" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Remplazando archivos" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Los conexiones con la base datos están cerradas" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Parando el servidor" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Falló la actualización:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "Error HTTP" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Error de conexión" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Tiempo agotado mientras se trataba de establecer la conexión" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Error general" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "La actualización del archivo no pudo guardarse en el directorio temporal (Temp Dir)" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Error al crear al menos un usuario LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Error al crear al menos un usuario LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Error: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Error: el servidor LDAP no ha devuelto ningún usuario" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Al menos, un usuario LDAP no se ha encontrado en la base de datos" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} Usuario importado con éxito" @@ -487,7 +487,7 @@ msgstr "no configurado" msgid "Execution permissions missing" msgstr "Faltan permisos de ejecución" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Columna personalizada No.%(column)d no existe en la base de datos calibre" @@ -500,8 +500,8 @@ msgstr "Formato de libro eliminado con éxito" msgid "Book Successfully Deleted" msgstr "Libro eliminado con éxito" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "oh, oh, el libro seleccionado no está disponible. El archivo no existe o no es accesible" @@ -538,7 +538,7 @@ msgstr "Fallo al crear la ruta %(path)s (permiso denegado)" msgid "Failed to store file %(file)s." msgstr "Fallo al guardar el archivo %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Error en la base de datos: %(error)s." @@ -696,7 +696,7 @@ msgstr "Fichero %(file)s no encontrado en Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico" @@ -730,34 +730,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Sólo se admiten como portada los archivos jpg/jpeg/png/webp/bmp" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Sólo se admiten como portada los archivos jpg/jpeg" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "No se encuentra el archivo binario UnRar" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Error ejecutando UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Esperando" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Fallido" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Comenzado" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Finalizado" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Estado desconocido" @@ -774,7 +778,7 @@ msgstr "Configuración de Kobo" msgid "Register with %(provider)s" msgstr "Registrado con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "has iniciado sesión como : '%(nickname)s'" @@ -840,7 +844,7 @@ msgid "{} Stars" msgstr "{} Estrellas" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Inicio de sesión" @@ -856,7 +860,7 @@ msgstr "El token ha expirado" msgid "Success! Please return to your device" msgstr "¡Correcto! Por favor regrese a su dispositivo" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Libros" @@ -881,7 +885,7 @@ msgstr "Libros Descargados" msgid "Show Downloaded Books" msgstr "Mostrar Libros Descargados" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Libros mejor valorados" @@ -890,7 +894,7 @@ msgid "Show Top Rated Books" msgstr "Mostrar libros mejor valorados" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Libros leídos" @@ -899,7 +903,7 @@ msgid "Show read and unread" msgstr "Mostrar leídos y no leídos" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Libros no leídos" @@ -917,7 +921,7 @@ msgid "Show Random Books" msgstr "Mostrar libros al azar" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Categorías" @@ -927,7 +931,7 @@ msgstr "Mostrar selección de categorías" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Series" @@ -945,7 +949,7 @@ msgid "Show author selection" msgstr "Mostrar selección de autores" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Editores" @@ -955,7 +959,7 @@ msgstr "Mostrar selección de editores" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Idiomas" @@ -979,7 +983,7 @@ msgstr "Formatos de archivo" msgid "Show file formats selection" msgstr "Mostrar selección de formatos de archivo" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Libros archivados" @@ -987,7 +991,7 @@ msgstr "Libros archivados" msgid "Show archived books" msgstr "Mostrar libros archivados" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Lista de Libros" @@ -1015,9 +1019,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "El libro fue agregado a el estante: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "No tiene permiso para añadir un libro a el estante: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1040,58 +1043,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "El libro fue eliminado del estante: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crear un estante" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Ya existe un estante público con el nombre '%(title)s'." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ya existe un estante privado con el nombre '%(title)s'." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Error al abrir un estante. El estante no existe o no es accesible" @@ -1124,177 +1130,177 @@ msgstr "Hay una nueva actualización disponible. Haz clic en el botón de abajo msgid "No release information available" msgstr "No hay información del lanzamiento disponible" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Descubrir (Libros al azar)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Libros populares (los más descargados)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libros descargados por %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Autor/es: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Editor/es: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Series: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Calificación: %(rating)s estrellas" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Formato del archivo: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Búsqueda avanzada" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Buscar" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Descargas" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Lista de calificaciones" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Lista de formatos" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Tareas" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Publicado después de " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Publicado antes de " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Calificación <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Calificación >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Estado de lectura = $(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Error en la búsqueda de columnas personalizadas, por favor reinicia Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro puesto en la cola de envío a %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Ha sucedido un error en el envío del libro: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Por favor actualiza tu perfil con la dirección de correo de su kindle..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "El servidor de correo no está configurado, por favor, ¡avisa a tu administrador!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registro" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Su correo electrónico no está permitido para registrarse" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "No se puede activar la autenticación LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login como: '%(nickname)s', no se puede acceder al servidor LDAP o usuario desconocido" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "No se pudo entrar: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Usuario o contraseña inválido" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Una nueva contraseña se ha enviado a su cuenta de correo electrónico" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Por favor, introduce un usuario válido para restablecer la contraseña" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ahora estás conectado como: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Perfil actualizado" @@ -1307,31 +1313,31 @@ msgstr "No se ha encontrado ningún archivo gmail.json válido con información msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s no encontrado" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format no encontrado en disco" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "El conversor de Ebook falló con un error desconocido" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter falló: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Archivo convertido no encontrado, o más de un archivo en el directorio %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Falló Ebook-converter: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falló con el error: %(error)s" @@ -1365,212 +1371,212 @@ msgstr "Admin" msgid "Password" msgstr "Contraseña" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Subir archivo" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Descargar" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Ver libros" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Editar" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Borrar" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Estantería pública" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Añadir nuevo usuario" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importar usuarios LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Ajustes del servidor de correo electrónico" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "Servidor SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "Puerto SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Encriptado" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Login SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Desde el correo" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "Servicio de Correo" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail por Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Configuración" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Directorio de la base de datos de Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Nivel de registro" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Puerto" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Puerto externo" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Libros por página" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Subidas" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Navegación anónima" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Registro público" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Acceso remoto mediante enlace mágico" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Acceso mediante Proxy inverso" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Nombre de cabecera de Proxy inverso" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Editar la configuración de la base de datos de Calibre" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Editar la configuración básica" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Editar la configuración de la interfaz de usuario" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Administración" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Descargar paquete de debug" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Ver archivos de registro" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Reconectar a la BD Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Reiniciar" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Apagar" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Actualizar" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Versión" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Detalles" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Versión actual" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Comprobar actualizaciones" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Realizar actualización" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "¿Realmente quieres reiniciar?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Cancelar" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "¿Realmente quiere detener?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Actualizando. Por favor, no recargue la página" @@ -1582,39 +1588,39 @@ msgstr "via" msgid "In Library" msgstr "En la Librería" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Ordenar en base a fecha del libro, más reciente primero" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Ordenar en base a fecha del libro, menos reciente primero" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Ordenar en base al título en orden alfabético" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Ordenar en base al título en orden alfabético invertido" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Ordenar en base a fecha de publicación, más reciente primero" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Ordenar en base a fecha de publicación, menos reciente primero" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "reducir" @@ -1744,9 +1750,9 @@ msgid "Fetch Metadata" msgstr "Obtener metadatos" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Guardar" @@ -1769,7 +1775,7 @@ msgstr "Cargando..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Cerrar" @@ -2250,50 +2256,50 @@ msgstr "Permitir descargas" msgid "Allow eBook Viewer" msgstr "Permitir visor de libros" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Permitir subidas de archivos" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Permitir editar" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Permitir borrar libros" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Permitir cambiar la contraseña" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Permitir editar estantes públicos" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Excluir idiomas" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Mostrar libros con idioma" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Visibilidad predeterminada para nuevos usuarios" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Mostrar libros aleatorios en la vista detallada" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Añadir etiquetas Permitidas/Denegados" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Añadir valores personalizados Permitidos/Denegados" @@ -2447,21 +2453,29 @@ msgstr "Volver al inicio" msgid "Logout User" msgstr "Cerrar sesión" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Ordenar autores en orden alfabético" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Ordenar autores en orden alfabético inverso" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Ordenar ascendientemente en base al índice de serie" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Ordenar descendientemente en base al índice de serie" @@ -3070,15 +3084,15 @@ msgstr "Crear/Ver" msgid "Add allowed/Denied Custom Column Values" msgstr "Añadir columnas de valores propios de Permitidos/Denegados" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Sincronizar con Kobo solo los libros de las estanterías seleccionadas" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Borrar usuario" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Generar Auth URL de Kobo" diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo index 1754e51a94d44f57457a6b1a14bd34fcd815478b..cf1a75d3ad6928ed40cd57e099dbfbfa9a8f302b 100644 GIT binary patch delta 6781 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 delta 7052 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 diff --git a/cps/translations/fi/LC_MESSAGES/messages.po b/cps/translations/fi/LC_MESSAGES/messages.po index 58d169241..0a4f2fb99 100644 --- a/cps/translations/fi/LC_MESSAGES/messages.po +++ b/cps/translations/fi/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2020-01-12 13:56+0100\n" "Last-Translator: Samuli Valavuo \n" "Language: fi\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "ei asennettu" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "asennettu" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Tilastot" @@ -65,17 +65,17 @@ msgstr "Perusasetukset" msgid "UI Configuration" msgstr "Käyttöliittymän asetukset" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Pääkäyttäjä" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Kaikki" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -83,7 +83,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Näytä kaikki" @@ -92,7 +92,7 @@ msgstr "Näytä kaikki" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -100,7 +100,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -271,9 +271,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -303,7 +303,7 @@ msgstr "Sähköpostipalvelimen tiedot päivitetty" msgid "Database Configuration" msgstr "Ominaisuuksien asetukset" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Ole hyvä ja täytä kaikki kentät!" @@ -311,165 +311,165 @@ msgstr "Ole hyvä ja täytä kaikki kentät!" msgid "E-mail is not from valid domain" msgstr "Sähköpostiosoite ei ole toimivasta domainista" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Lisää uusi käyttäjä" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Käyttäjä '%(user)s' lisätty" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Tälle sähköpostiosoitteelle tai tunnukselle löytyi jo tili." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Käyttäjä '%(nick)s' poistettu" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Pääkäyttäjiä ei jää jäljelle, käyttäjää ei voi poistaa" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Muokkaa käyttäjää %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Käyttäjä '%(nick)s' päivitetty" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Muuta SMTP asetuksia" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Testisähköpostin lähetyksessä tapahtui virhe: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Sähköpostipalvelimen tiedot päivitetty" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Käyttäjän %(user)s salasana palautettu" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Lokitiedoston katselin" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Haetaan päivitystiedostoa" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Ladataan päivitystiedostoa" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Puretaan päivitystiedostoa" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Korvataan tiedostoja" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Tietokantayhteydet on katkaistu" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Sammutetaan palvelin" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Päivitys valmistui, ole hyvä ja paina OK ja lataa sivu uudelleen" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Päivitys epäonnistui:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP virhe" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Yhteysvirhe" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Aikakatkaisu yhteyttä luotaessa" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Yleinen virhe" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -481,7 +481,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -494,8 +494,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:" @@ -532,7 +532,7 @@ msgstr "Polun %(path)s luonti epäonnistui (Ei oikeutta)." msgid "Failed to store file %(file)s." msgstr "Tiedoston %(file)s tallennus epäonnistui." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -690,7 +690,7 @@ msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta" msgid "Book path %(path)s not found on Google Drive" msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus." @@ -724,34 +724,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Odottaa" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Epäonnistui" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Aloitettu" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Valmistui" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Tuntematon tila" @@ -768,7 +772,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "Rekisteröi tuottajalle %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" @@ -834,7 +838,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Kirjaudu sisään" @@ -850,7 +854,7 @@ msgstr "Valtuutus vanhentunut" msgid "Success! Please return to your device" msgstr "Onnistui! Ole hyvä ja palaa laitteellesi" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Kirjat" @@ -875,7 +879,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Parhaiten arvioidut kirjat" @@ -884,7 +888,7 @@ msgid "Show Top Rated Books" msgstr "Näytä parhaiten arvioidut kirjat" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Luetut kirjat" @@ -893,7 +897,7 @@ msgid "Show read and unread" msgstr "Näytä luetut ja lukemattomat" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Lukemattomat kirjat" @@ -911,7 +915,7 @@ msgid "Show Random Books" msgstr "Näytä satunnausia kirjoja" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategoriat" @@ -921,7 +925,7 @@ msgstr "Näytä kategoriavalinta" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Sarjat" @@ -939,7 +943,7 @@ msgid "Show author selection" msgstr "Näytä kirjailijavalinta" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Julkaisijat" @@ -949,7 +953,7 @@ msgstr "Näytä julkaisijavalinta" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Kielet" @@ -973,7 +977,7 @@ msgstr "Tiedotomuodot" msgid "Show file formats selection" msgstr "Näytä tiedostomuotovalinta" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -981,7 +985,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1009,9 +1013,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Kirja on lisätty hyllyyn: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Sinulla ei ole oikeutta lisätä kirjaa hyllyyn: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1034,58 +1037,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Kirja on poistettu hyllystä: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Valitettavsti sinulla ei ole oikeutta poistaa kirjaa hyllystä: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "luo hylly" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Valitettavsti sinulla ei ole oikeutta poistaa kirjaa hyllystä: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Muokkaa hyllyä" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Hylly %(title)s luotu" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Hylly %(title)s muutettu" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Tapahtui virhe" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Muuta hyllyn: '%(name)s' järjestystä" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylly: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Virhe hyllyn avauksessa. Hyllyä ei ole tai se ei ole saatavilla" @@ -1118,177 +1124,177 @@ msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi ve msgid "No release information available" msgstr "Ei päivitystietoa saatavilla" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Löydä (satunnaiset kirjat)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Kuumat kirjat (ladatuimmat)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Kirjailija: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Julkaisija: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Sarja: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Arvostelu: %(rating)s tähteä" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Tiedostomuoto: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Kieli: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Edistynyt haku" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Hae" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "DLS" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Arvostelulistaus" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Tiedostomuotolistaus" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Tehtävät" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Julkaistu alkaen " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Julkaisut ennen " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Arvostelu <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Arvostelu >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Ole hyvä ja aseta Kindle sähköpostiosoite ensin..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Rekisteröi" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "LDAP autnetikoinnin aktivointi ei onnistu" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Väärä käyttäjätunnus tai salasana" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "olet kirjautunut tunnuksella: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)sn profiili" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profiili päivitetty" @@ -1301,31 +1307,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-kirjan muunnos epäonnistui: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1359,212 +1365,212 @@ msgstr "Ylläpito" msgid "Password" msgstr "Salasana" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Lähetä" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Lataa" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Näytä ekirjat" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Muokkaa" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Poista" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "SMTP sähköpostipalvelimen asetukset" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP palvein" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP portti" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP tunnus" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Lähettäjän sähköposti" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Asetukset" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre DB hakemisto" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Lokitaso" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Portti" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Kirjaa sivulla" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Lähetetään" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Nimetön selaus" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Julkinen rekisteröinti" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Etäkirjautuminen" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Calibre DB hakemisto" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Ylläpito" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Katsele lokitiedostoja" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Uudelleenyhdistä Calibre DB" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Uudellenkäynnistä Calibre-Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Sammuta Calibre-Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Päivitä" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Versio" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Yksityiskohdat" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Nykyinen versio" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Tarkista päivitykset" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Päivitä" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Haluatko varmasti uudelleenkäynnistää Calibre-Webin?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Haluatko varmasti pysäyttää Calibre-Webin?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Päivitetään, älä päivitä sivua" @@ -1576,39 +1582,39 @@ msgstr "" msgid "In Library" msgstr "Kirjastossa" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "vähennä" @@ -1738,9 +1744,9 @@ msgid "Fetch Metadata" msgstr "Hae metadata" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1763,7 +1769,7 @@ msgstr "Ladataan..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Sulje" @@ -2243,50 +2249,50 @@ msgstr "Salli kirjojen lataukset" msgid "Allow eBook Viewer" msgstr "Salli kirjojen luku" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Salli lisäykset" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Salli muutokset" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Salli sananan vaihto" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Salli julkisten hyllyjen editointi" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Poissulje kieli" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Näytä kirjat kielellä" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Oletusnäkymä uusille käyttäjille" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Näytä satunnaisia kirjoja näkymässä" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2439,21 +2445,29 @@ msgstr "Palaa kotiin" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3062,15 +3076,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Poista tämä käyttäjä" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index df93858a2e854a108a571de62748f19403193512..02501df2de235322a46bda7d407673c4b99f4c99 100644 GIT binary patch delta 11090 zcmYM)3w+OI|Htv~%uaSlUvv)N|munpU2M~OLaF>|a;LOB~ke1%4#bUTcgLvl!o zjGT!HbC$c}UUBDkN_YJKM0cX@*W2}dJnkMndS2JH@AtYs*XMIx->FAu*SpXB$lbmi zRCTe%Uz@5}Ru~Sisowwo+Sk~!66x;8D7=eJFgV^kpM?$S55ORt;fyav7yWJ6950|Z zy7O{A`e852vaLcItr^&jsdyhfut`(P%ETn}!m;R%ld%>~!&qE`)$jlYUg<~fPV z=(iY&_t76iNr#?qi1k?CN}-{MdthCB$$4N3CeeQveejSoeiD_+%NT$+Q9FHzozXYJ zvR=Rf?1En)*|*%OV*_lC3MdclP#Q%v$htKbRsLOA2hX4<-a=ozi`DTDR7w1ZP8kS6 z?YIe6#S{$2G^d}7+F(Aqun;x>%p~%!7fTsXjW(hpJ%P`i%}&w zg?j&Mq`cM-7>B+s%|=>b0sYRXK-Z!&yw~Y}+mie%k~<89qjxLwKn&`IY^UD`mFgm_ zhchu6SD`ZW6>8#Bs1)DCM(9Jdx*bVa0}D_;ABI|Yu1!M=t;2!1-|0uBn2A$R*DeFK z(?ZljBQOZ(U~62Cn)n-3iGITn^yW(Gxo}hf37Cy-QJJ-8(NHQsN1e`{NHVOiP!l~u z%5C|wifWjSnz$3{`4>@VV+1~nlTfAHk2+-6QMbUG`YDiTOv6-UKHC~kL#dsCitv5Z zgljPnx1hcQ2T=?Dg_POyf5sfLY}BF4#|Z3;b#XG*$Hk~Xwxde*9cuo|Po@61X=tH` zr~o_(PqnL!9Wfg<;at><>ro4CbNV|`nJGuzigT#zdJ&bWtElVx8`eTA-K4%Y#<9Nj z91W#x6zahe493-18@FR9o<^1A8iwHmRA50FX2GVY1yWEM?T#wR3r_z-)I6V~GIbp7 z`ZR9Q(6#Z(G>0e=wZk5$0D5CR9D^#se5{Gf9Y06a_82M?|3GE(Cf323R zt(%%f{k4Mv1{CpF)G2=xHNia8f-6xw{}ffK{Z9WhYQf8>l>dw>(F4@;ZX9(PggWF= zs0_uS4taLAZBjCU0g_Tq_)s@NN~!vUxXhoVxw z1o`+`8&IYA0X^_1^vAoXK%O9n*tSACmBqp3+cD&lsi9p*abqjuUCeQ+>p;!&u> zI2RS*a@6~uqR!GTRKUL>e_KAC%sf3%<1b)M*0)B}P_2ql*JLs3uzifGc{!>iKcY%> z$LV`^HoshgQHL@W`C40@(FtP3 zX=ullSOf2)A9_4*CJaJN*Z_6vV^L=#4Rtnpp=w=(THp|Z$SmV9rfG+tb#{T z0ooNbs?+!#wc~2sCG9L08)G^q;81koGUS_O?ZGzq1fPD(dzu9cP#fxx%19Av!I{_) zi&3@z1ewRS&eCYcKv2F(eKrz{H5FUnIqZm4dp-RZ2CEwe(_e=Qd^dXI33TBF$6rw? zu32CLNx>xg?J*lCVU+IwUK-lr6>N&tdz&3)p!x$)hh{GF(Xuw6c76v_Fs_f;`9M@4 zub>X&C=A4@j`N+Lm!dMU9)orNPts7$ub^u6Z&d0Y>H+lV>zr29j^mwv8tVCOsONg4 z4%=|l!V^*R&PJV$MHqt19k-&b2fm^qzsA~l1$9{dl;+ca9!7=~?dEh@sxsEKZ%?(tnzV85ci z2LUgd1wv3ej&w{yZKN$~p*++E`Z?o;s6fY{0<@<&56nZ|_l2lyasXAD|Hnx5d&x}L z92H1w)IvQl91BqkO-C&}8@15;7>X-VCES5Z{V{Bz`~N)+)wudVQ}Zy?&a*KLJ2~S+ zP$ij%wQ#lLF4W;Vhg#rQR0cf@P38hnZ&88#8|z`!L8k9Q-HKGyJb9=L3_{H_*%^NipZ@+|Lqi$ZiHfismC92X zhZh{5U~~GhFB=Q65&hX1iCa-6ynuS|Pjq3U!REP+sCmaCskbJft%1!nwDaxgf#s-E zTY*aD-<|&VsON8@Qg{a&;GYd<|HRdM$#g40vEU zDiamh3BN&o@mxd9AE^>i&yB_)oPhdtzm3|_9#pFDpl+4NP;;0wQJEQw^|2Haao*FEqc6E46AT;=o+qOR>3Y=myFnfDr_Zc!pC_1!QQ z`(sbEXVK7tmrxPkz^5rhz2Gt2WFQ!I+N042(^03sgX17nDQ(nqvm94AZbt=v3caxs z$+&G@qoEAkMg`zK!aPtNHDMi83F>1tOhDEC8B`$MFb;d80-u4JXBn!bYf!1)fGX)> zRECaXjPCzk8k#V4q}g#C>Yk>c4pA3pyco6MB2-{2F#y-1KW;;n>Pys_IEH%eqT>&! z0Is3}xPjiRZv~Dr8K~`;jN{#?52o|;6Qj+a>Ac67KX9}})qXf?qIswd>_FA}IJ)pU zwnERbCZlP{UajYlsjV`!(`ZDEGYh?h+Tltpz>TOKSw$wLUf7gwAZp@t48n1!)EA>l zS&9m5FFuFYobkrv&6hI=_52It$$tQi@eI_!S*RK>L5;6LEwB}p%5qeI$5E&FYt)zT z5h^3$6HMvSF^T^3*cjhJ1+*0#;3bU0KPHfWoz{qn=98L&HR%t*ES!ouOb1Yb97S)u zgsSmX)NjN4I1v3`=lhPMkeg`TMtu+RCz;F@qXOEF3gn7SqcaUR-qMb`qEa{>mHLGk zh##Obv-Ef~`o(n_0*ANpi8MV$(REF&ZG*W4-!WMWDTcO_@ z=06^_#s2h*u@C+WwNUz0lYw@q_wum~zK!+p2+qKNVqF|G%{UEJs%6Nh*tT}lP(&9o z40R>-LO8lG6_tTLsMHO^mbeI2iVA1^YivgUiPLW~-Si7El<{KJccK*a+%b&MVh?F- zV<7ZRa|S9I!JJ`*G855OFpie2z1 zda}M1Jj;AQ>S8+mMi`8*peCM-I($2jlv&4}{!P>&e1tkfzHgb|k_DJde+eqHr%~@c zzq?GOg0)6jy8QHSMY)WmyHFPuU>7dhMf(nvv_k$LEehf!y!0+r$_b4-bv zU>5y>sB8NnY9pUwEj&1f{HyUD13JZbQIY$+O`0$ZmAV6{lwU?K{1sJ_$EZ)Q_dDh+ zgrX1q2#m%!tcKlDrR$3->FXGeAHPHXHSi4sn#gmmc`*cI=(lnD15p9YM%A_yqwq^q z#;#!_e2B_i#5|L^1XN~=QO|#X*?0g|YRjH)YMg<(pOa8K`~>wv87jc1I^sPGST68I@`O_sq_tQ5&)IXvESeLSI~gy1yGyH9vy-pj>kL z_fVPeT3~)2j_N0&GLeJ2zI{>ejYpl4cQFAMV*wsTuCZ;^f8TsqdN^)I?ZoSE{HHjq zk1ia98lQzq>2k*{sGXIgN>GW_ul73l%g>A!{5G4KO3p$m03+MupiFC33=pys)UnkQztsdXl5p3$g^U`_h{ zP#GJ8y0#_G_+gvI5C$${A!e;M{k0fI-*=5EK_hh0Z;e{8FV@2mn1*j-2Rw=+G2laU zXs2R(`fIQk-a?f)bFImoJ&cB~%`}X}4frgcz-}1uktxXlY(W2IR4R*6C0dHXxEdSc zcJ#nYs8U|REWCl*dF(n9`19zm`#+LK9zS>k+u<41gTd>~;mJT9s==s?OhXqgN2Pop z)<^#h=G)%{GwCOz0-b;=*&NjSi%}WahA!Rz?`bHdPf(}5`bLwQ2IxaS8KW=@>)^}S z45y(NZg$*(?dk7#`c*$RA0R)}b9K=jBk>uG!CI_u71D^t$(VqvF$d3M2dulv-0MQr zj@MvkyoU-T;}ete5vap94t1#C#wxfB<8cMH#^b0=SNW9uYk>|l^ksSv3-B81KBsLq zfA$-Vqv@YUeP}X1Ga1WAKl($lEsn=#xC`~ky@|?Ltu5w5mWcWEhhZEZ+(P~p(N7Gd zV$@cX>i*cB{&ZAk&S5S-#BSK(bMr42ORy^a@6i{3#2WYus-%CR&Q8!a^BsxDMEc37 z@5az=uM6mb4^XN8169MI?PdoxQ31G6r#=a5VIFFy!!QodJpFQ1 zK%qO#hc4F9evXDxKM3_9S>g0Ap>`bfg^4s8wZkmbf}LdUwR zYhgJmW0e?!zo4#RmEHPXLH#{x=uizroq?^W1$LoocL>w*v@`Cz$D}X>^<79p7xr@c z6HyB-N6oVp707N>M$esT9{ZyL zpM!i-tp%tZuf#gI74`fHtc{nk1OA3~T^gDDO^y1Zc03O|<5Fyi*RUSeIbiN>D^&kQ zOu;FrT9=_pb^;a9-!THeM|~$Aqu%p5Xi6P@ko@b^=P(eCuVNU^!PdAAmEtST&)vT? zscwM!F0{pFI22u2f;vOHQ1et`EdB=-pzDwsPeHBQ^N?*)JAnb!Y&Pl;t-x$ti&=Ob zm9m(_<{Li})9CL&1#l0Ou|c`{<V%jj!i>{qB|;eg;))T zd^E%YRnbFdG3;fJXCHlg0zjXro1Rg!No zOZVUBggFeIP%jL3`cqJ+wG0h(yU_2BdTs@(WM{AyR$_guamxJC zO28@fC*afn|L-0R?I7T^xn2>dGtm*X)BYHVMW_HvFb3CSLp+VXcn@9pCq`k!8FQ z7d>$h>MXsAdT$ga<2Y2tHl62bW#9`2VzCkz2E>P#{oeRVYFXOLk9^9;jlAyWmFP-n p-6koy?8VVOZf>b%!^ZrOyYTAa=4EFOHwjpHsM|A)ytdrf5wKLL-ro!OTz7qNq|+OIuWw znoEkRsv$L%mbTPXt)VWhw%iWrso{LS*1q??&Oi6Odd_>TmA%*SJkQ#p=cP4nC)c{U zzOPemOG|md+ddtxDefNIo7}x*Z_B8CHx+J@h7Z| z_t78So0#WcIFYC~hu6-Z+-jcDA6O8+^mg}VQRPV=-#}k~s3O7xyxtTpmU3^bWFVD>&Y4tUD&spM))N z2Py@>px*x-Nw@V7BQdI(IY?hjr=N}5Xc;QP7oGmyX2f4R@ojEdA=nW0Knm)G45vR4 z73#%U8%r<(_n{(m9rfNXs1SRy%Z3<Bm=n!V$C8yuMrI|P# zb?pYDPFjpwXdYI__b~zYpeFtcm7*G4C4X#)daf;M18LX+hoVyMT0=vj{0dc_XOZYw z*HIG%F*{{oMWJ#y2sQC2)blP>ZOp??xD1ubOQ<4qPc*lnA!;MZ*arI}^SP`gG!)v^ zs2y%YO<0Ci@FeOx@B?bWI<5KmU}N;d3{=q-VI7==LAV@4aR+K6r%|c8hnoM<6Ul!i zwxfjtQ5&d_%3Ujb3Nug>ZbZF!7`5QnPX8<_GS^VI;tuM%-bY2Md|Pu}YhVrfHY)V3 zFp~AHOd1N=eAK<(g*w@Otcj;F5PwCbq(VCr(g4)P;!q2AM=g+!ifA4xCDWY#LDW27 zp(1q?U7<88wl~+N0jh|eL7lJwwSfs(8(&AIU^52b9>=dxxxImk#J^CH^h`2UUJG@g zc+>&9pw{i5ME-Sx@eF9k3sF`6E^2~Js0BYoy?6qZs!LA)SJZ-!P!aH^w3VU&)bnAE zai}8igo@Bps3Onk;4&du$^g-@Haq@;%3V}P^9fGETJ#H0C!L4d;40L{x1%<407LLg z)Iokh9pE17d3W-mBCLT*d8mso2@@AAJ9G;W|msCNEwI`7`DdsayX^Q6a`ml1?sg^Cw|dd=U|t<5qi|W_MdKix?%Kpe#+sZ~yT!WQx6KbQoP#Ztucnw`z@G%YkvHViaugf9G z=B-^wj;wN2lqLv8eGi&A{Vq;F9pe}ugIpY|1Su!$I;y6kdYIoKoiK@h5r*T=9>iav zyTE`ZzJ+?B0wo=b!I*?Sup-V!h3-w%i8r7Z?nNIw;*6g`72Qo#Du2UB`~ww%kTf$- zLK^W`h`KSr*VXEWDvrgdlb=Fu>{rx69?zKKs*1X94NxI(i@rDxweSp#!MUjU_n>O* zFnZ$`7>4IvG<4#Bup0XHa;_h0!Z_4~9Z*%@1yvgZQMEA+mFvZ*1>VLeEJ2<8Bx>WQ zQO|vk2Jof+eV8U5m>7abzBsb(=;L2IBgf&}SffvfjaXyn|0+y?#&r!eHg1AN@n9jh{!= z#?NTuACCU%CdAEA8%f7F9Dyp*Wf-pef02ex_!t{w)Bff}gHipdsG`}3DR=~Ra^Ghy zt0g{#I{AyJjm$(9<9w`w?>KIDe!dqKiNolp`+tju?(<_*t|~ugb{vR0X#}b^5>O}Z z=JW@mp3g-+Hvv^_uc8)y12ykDRBe2S{ZkU z4pqf%QO`exT5u?8fqV?YSx$d7D(AaU5xVG%|2Tm7>%qSnsE_^w%{RO?Dn!Fj3%!Dh zz+%)%);j&o*p>c1?1B{snT@1jE&9)+4mJrDp;@Sdy@lFn$sppd2R>pzMRExB;%U?i zzo8Z^KiKrWP`M33jYpw27>Amt9qNSLP|x*2MQo_kAB{@cWOTzBE*c3mW@93jp?3HP zHIc^<6Z$HsjrpU#2Tf25G(&~Hqhl}BL589h8jITKWM{k>wb9p6@4Hqw4{So+_fpg~ z`5u*;YR{WLK1ZV_?1|dQv#5m%Fa(QH3#~#uw+^+?HVnj1Q7Jrw3jGa?*ZqG$Lm_OM zVRGIEb@B`h#!=4rEL2K1VGZ2xcn(!ucTfxX4>b|2k1E(4Fx}RQ1N7iZapZcSH~R-BF?JgJC!vBXA}*#!YDB1ym&dK{xan zX^OAfNaA0CfjSJxdiZ2vR77I%X>5)9^3B9{_y+2^Z?QUlhx&xyMjgn0!GydI>UL$L ziuyfNk)Oj*bju?Du{7#tnVt7RO*{#8^697@&qbYJzT>;7lb1S{p*Hx9)Bh2*p+C_R zBSx9XHb%YI20bvA93P^hx7J}yK}yc>P+1nS;iKo!$%XFM{`EZh>c z!4Bw)DX91QqC!6mRU4yF&rNomj&7`P&7h$T%tk_DZAV37kK=hPD#u?Uu`T1H$C^Lm zZN!%J&!TFeO1_yV26ce`sGMh`jjv#HT#s7k2UJw8n>3i)>Q`X?-OORsLT-iTgdH%Q zemB&KN>HKQfQ@lGYU0aS9RrI@3L;SlNkScPFec+HXZ(vI;vc}kEe4dca^p-0Yoc=9 z0F~^ztV(f-%P$#;B3SrI3CiE?^3jMaI2z5toXb9@Lk*E#KK&5IW*2J}_=k}rAJA$$3 zI!{9jc~3E+kH=Q@JEA_Nld(B&#ZGt~2V&$@{tSRKQ43v0Mc@YNz5AGm(bLTLVI&sQ ze+h%ogUF-H3ZtQ1wLyK82ckAK8H2F|^}>F%@ggb$4^WY-Jl*`eoR+9mG7{Na`LEt^IvW}!m46ZHYvi*4~Z`k~hhGjRy2`1+$FmhJTC zpi=M-s)n{;JNy^6z=WA5vSU#1y@{^AGk^JyuobFUQc)8RMm?X0x>kp< z4_?6L81srbKqjh&a!{Y-_plkB#3ZaR+g#h^*~DKb>B)eu-B8C#s48BF+W97=o~&!A z&}Gaq8-5Wz>A!(W$x2k@HeyBGjb3;VBk%-P!rxJ;csPgnE2p*Rnonvfsy_iW(R$R2 zyRbf9a{3isH5+Jz%54&c<1kdjW?@5IhKk%lROG%vMK*GtdA_ZSMh6BmP`NHaU7ITy zi@~p%6ZSwY&=0l2NvH^I#7I1Zjqo-qw?Xqwl_#K1nudy8E{5T2sEE5hpbkgl zDNB5V+r#?Sa2kVfH|pBdc+=!C4Rt&6P#=6vT)qU3SGU~aXFa;lAAa+`24)Ppo z1Iy3@OR*Y$j4tK+1Pv9(pBRt+%T2DjqIQ~rs{XlH6}Mw8EJM}CCDbkX8;h{cTV|dm zSd;!SB-hqe)I5G~n;J`eoA~E2Fq8prJc+u`7qK#4L+$vEGky=1%g3k_RC>o0Z!jtX zUC|#0pxz&Y&*4f%?rkFK2bnk$C*x4O=JZqEH8rpWm4f4F z<9Db9A7X8+y4w5^E*iVg&%#{XhWdWkC8kC?V?X+?xipmHtEkXbUSqCJ7}ll#G6V}6YbjK;E_lhwIXCoghm-RUf?ffs){j9du{2Hx; zo#~H79<+91eY}Dys*3AOM8eRf-wqY>AsC7upckIR_IMt((OU1Dltp2%?td#9ia=kq z(S-`>DpaUTQIYu!HQ{*-$7`rt;JM!X`5_EF>8CmN#}xX{JN+QTt8Owi6^JV8Xe^IyFbdnF z{_k5Wn}$OD9%_M~u@A;=HlOBMsPDoLI1v4|aJ6s@>O*q{6|wtR8NIife@9#so6sMC zF*pYmv5!$7veR3MzwTq@4@?S%qBis@w!*`xP(Q|=7{1L!rU29EFT)=AGbUrgcJucF z7kblw8LQy}td6TuwX*{&;g{Qqe=Lpj3@FFmrRG5!mCJba!`2v#J<-M-)P(a;3#`J5 zxE*zk_n;Skg?@MutKx0c#;gxbBr3a{MtuxoJjrnYhS48~%H^A=P_IDca0luHAE7o- zhN}8As2chcb<)Z^%!exi)$fkIa0F^YuH7{BrTg6RCMxtEJI#lrJ*qzib>bbUjUGjv z@EU5tUojWmcbQLYAu89OqkjG)2I2!$#Qi>cGVZdHY1j-5LY-t92H*nJ2WTy7f@7!! zub?(?3l&y9eK^y;e`aye4ZM8$q(;KysfmmJlzmSHCYZmGQu?CZH zJ8C0;U_5sG#Qa%t94dDop=#t9DiXI)_xdrac%$~3`QlM0?trzhH|qJ(=&DKMMH;&I z%P|PAqH^>Qb>f&$%?GA6HlsfaYvU&viRYYt`F-YIhoW-b50$dfs11$BI_N@uCsytw z{+ehL1IqPL)QN6k2>R?dk%__t`dv{WE=K))E!y}QM&Na9g5C$rcp_@v0T_(aumQe> z+F;oMm-)d32ErJ)hYD@2gC=K$jK&gF zs!m}Vx*s+R_CwvSIp~J2RWuZeHK<(gK@U8F%GsBwhGV*a+``t^v9q(ZbM((g%$8HYQx7-x8*A8 zjt02sw?-kQ=Nmn2)iHmfJu$Dy&dATSbMp%AjGUaj@tMQz z!aO@ab9COgOgqCKnwOVtkI2s(Z5O_fRbUsqkeM?g(T-?Xkee|&GqPaOgJGeicZOZ| ziv5q*GlmcUpLdz8@P*7L|NY;WpS)Z8+35c+=h@VbjZKVeR{BYvSGjTtrH98{O6%OY zY<)pqPTBfsdt6>oft`DG`m(YOg_#BRn2Z8Dqo^=1KdYc@yrgy@JxGHW?^Bby=eN3z(u(SLl?OnthQ*t!Pru_ga7z6{ePy)7?oF4_#abc\n" "Language: fr\n" @@ -31,17 +31,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "non installé" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "installé" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistiques" @@ -80,17 +80,17 @@ msgstr "Configuration principale" msgid "UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Utilisateur admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Tout" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "L'utilisateur n'a pas été trouvé" @@ -98,7 +98,7 @@ msgstr "L'utilisateur n'a pas été trouvé" msgid "{} users deleted successfully" msgstr "{} utilisateurs supprimés avec succès" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Montrer tout" @@ -107,7 +107,7 @@ msgstr "Montrer tout" msgid "Malformed request" msgstr "Demande malformée" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Le nom de l’invité ne peut pas être modifié" @@ -115,7 +115,7 @@ msgstr "Le nom de l’invité ne peut pas être modifié" msgid "Guest can't have this role" msgstr "L’invité ne peut pas avoir ce rôle" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Aucun utilisateur admin restant, impossible de supprimer le rôle admin" @@ -287,9 +287,9 @@ msgstr "Le filtre utilisateur de membre LDAP a des parenthèses non appariées" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertificat, certificat ou emplacement de clé non valide, veuillez entrer le chemin correct" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "Les paramètres de la base de données ne sont pas accessibles en écriture" @@ -319,7 +319,7 @@ msgstr "Les paramètres du serveur de courriels ont été mis à jour" msgid "Database Configuration" msgstr "Configuration des options" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Veuillez compléter tous les champs !" @@ -327,167 +327,167 @@ msgstr "Veuillez compléter tous les champs !" msgid "E-mail is not from valid domain" msgstr "Cette adresse de courriel n’appartient pas à un domaine valide" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Un compte existant a été trouvé pour cette adresse de courriel ou pour ce surnom." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "Impossible de supprimer l’utilisateur Invité" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Aucun utilisateur admin restant, impossible de supprimer l’utilisateur" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Modifier les paramètres du serveur de courriels" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "La vérification du compte Gmail réussie" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Teste les courriels en file d’attente pour l’envoi à %(email)s, veuillez vérifier le résultat des tâches" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Il y a eu une erreur pendant l’envoi du courriel de test : %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Veuillez d'abord configurer votre adresse de courriel..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Les paramètres du serveur de courriels ont été mis à jour" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez configurer les paramètres SMTP au préalable..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Visualiseur de fichier journal" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Demande de mise à jour" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Téléchargement de la mise à jour" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Remplacement des fichiers" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Les connexions à la base de données ont été fermées" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Arrêt du serveur" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "La mise à jour a échoué :" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "Erreur HTTP" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Erreur de connexion" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Délai d'attente dépassé lors de l'établissement de connexion" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Erreur générale" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Le fichier de mise à jour ne peut pas être sauvegardé dans le répertoire temporaire" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Impossible de créer au moins un utilisateur LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Impossible de créer au moins un utilisateur LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erreur : %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Erreur : Aucun utilisateur renvoyé dans la réponse LDAP du serveur" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Au moins un utilisateur LDAP n'a pas été trouvé dans la base de données" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} utilisateur importé avec succès" @@ -499,7 +499,7 @@ msgstr "non configuré" msgid "Execution permissions missing" msgstr "Les permissions d'exécutions manquantes" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "La colonne personnalisée No.%(column)d n'existe pas dans la base de données calibre" @@ -512,8 +512,8 @@ msgstr "Le format du livre a été supprimé avec succès" msgid "Book Successfully Deleted" msgstr "Le livre a été supprimé avec succès" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible" @@ -550,7 +550,7 @@ msgstr "Impossible de créer le chemin %(path)s (Permission refusée)." msgid "Failed to store file %(file)s." msgstr "Échec de la sauvegarde du fichier %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Erreur de la base de données: %(error)s." @@ -708,7 +708,7 @@ msgstr "Le fichier %(file)s n'a pas été trouvé dans Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Le chemin du livre %(path)s n'a pas été trouvé dans Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Un compte existant a été trouvé pour cette adresse de courriel." @@ -742,34 +742,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Seuls les fichiers jpg/jpeg/png/webp/bmp sont supportés comme fichier de couverture" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Seuls les fichiers jpg/jpeg sont supportés comme fichier de couverture" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Fichier binaire Unrar non trouvé" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Une erreur est survenue lors de l'exécution d'UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "En attente" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Echoué" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Débuté" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Terminé" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Statut inconnu" @@ -786,7 +790,7 @@ msgstr "Configuration Kobo" msgid "Register with %(provider)s" msgstr "Enregistrer avec %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté comme : '%(nickname)s'" @@ -852,7 +856,7 @@ msgid "{} Stars" msgstr "{} Étoiles" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Connexion" @@ -868,7 +872,7 @@ msgstr "Jeton expiré" msgid "Success! Please return to your device" msgstr "Réussite! Merci de vous tourner vers votre appareil" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Livres" @@ -893,7 +897,7 @@ msgstr "Livres téléchargés" msgid "Show Downloaded Books" msgstr "Montrer les livres téléchargés" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Livres les mieux notés" @@ -902,7 +906,7 @@ msgid "Show Top Rated Books" msgstr "Montrer les livres les mieux notés" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Livres lus" @@ -911,7 +915,7 @@ msgid "Show read and unread" msgstr "Montrer lus et non-lus" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Livres non-lus" @@ -929,7 +933,7 @@ msgid "Show Random Books" msgstr "Montrer des livres au hasard" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Catégories" @@ -939,7 +943,7 @@ msgstr "Montrer la sélection par catégories" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Séries" @@ -957,7 +961,7 @@ msgid "Show author selection" msgstr "Montrer la sélection par auteur" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Éditeurs" @@ -967,7 +971,7 @@ msgstr "Montrer la sélection par éditeur" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Langues" @@ -991,7 +995,7 @@ msgstr "Formats de fichier" msgid "Show file formats selection" msgstr "Afficher la sélection des formats de fichiers" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Livres archivés" @@ -999,7 +1003,7 @@ msgstr "Livres archivés" msgid "Show archived books" msgstr "Afficher les livres archivés" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Liste des livres" @@ -1027,9 +1031,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Vous n’êtes pas autorisé à ajouter un livre dans l’étagère : %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1052,58 +1055,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Le livre a été supprimé de l'étagère %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Créer une étagère" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "L’étagère %(title)s a été modifiée" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Une étagère publique avec le nom '%(title)s' existe déjà." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Une étagère privée avec le nom '%(title)s' existe déjà." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible" @@ -1136,177 +1142,177 @@ msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-desso msgid "No release information available" msgstr "Aucune information concernant cette version n’est disponible" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Découvrir (Livres au hasard)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livres téléchargés par %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Auteur : %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Éditeur : '%(name)s'" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Évaluation : %(rating)s étoiles" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Format de fichier : %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Recherche avancée" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Chercher" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Téléchargements" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Liste des évaluations" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Liste de formats de fichiers" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Tâches" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Publié après le " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Publié avant le " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Évaluation <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Évaluation >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Status de lecture = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erreur lors de la recherche de colonnes personnalisées, veuillez redémarrer Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Le livre a été mis en file de traitement avec succès pour un envoi vers %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Veuillez mettre à jour votre profil avec une adresse de courriel Kindle valide." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Créer un compte" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Impossible d’activer l’authentification LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Connexion de secours comme: '%(nickname)s', le serveur LDAP est indisponible, ou l'utilisateur est inconnu" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Impossible de se connecter: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Le nouveau mot de passe a été envoyé vers votre adresse de courriel" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Veuillez entrer un nom d'utilisateur valide pour réinitialiser le mot de passe" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Vous êtes maintenant connecté en tant que : ‘%(nickname)s’" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profil mis à jour" @@ -1319,31 +1325,31 @@ msgstr "Aucun fichier gmail.json avec information OAuth valide trouvé" msgid "Calibre ebook-convert %(tool)s not found" msgstr "ebook-convert calibre %(tool)s non trouvé" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "Format %(format)s non trouvé sur le disque" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "Le convertisseur Ebook a échoué avec une erreur inconnue" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "La commande Kepubify-converter a échouée : %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Fichier converti non trouvé ou plus d'un fichier dans le chemin %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "La commande ebook-convert a échouée : %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre a échoué avec l’erreur : %(error)s" @@ -1377,212 +1383,212 @@ msgstr "Administration" msgid "Password" msgstr "Mot de passe" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Téléverser" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Télécharger" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Afficher les livres" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Éditer" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Supprimer" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Étagère publique" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Ajouter un nouvel utilisateur" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importer des utilisateurs LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Paramètres du serveur de courriels" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "Nom d'hôte du serveur SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "Port du serveur SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Chiffrement" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Compte utilisateur SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Expéditeur des courriels" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "Service courriel" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail via Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Configuration" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Répertoire de la base de données Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Niveau de journalisation" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Port exeterne" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Livres par page" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Téléversements" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Navigation anonyme" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Inscription publique" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Connexion à distance Magic Link" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Compte du Reverse Proxy" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Nom de l'en-tête du Reverse Proxy" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Éditer la configuration principale" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Éditer la configuration principale" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Télécharger le package de débogage" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Afficher les fichiers journaux" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Reconnecter la base de données Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Redémarrer Calibre-Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Arrêter Calibre-Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Mise à jour de Calibre-Web" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Détails" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Version actuelle" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Rechercher les mises à jour" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Effectuer la mise à jour" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Voulez-vous vraiment redémarrer Calibre-Web?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Annuler" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Voulez-vous vraiment arrêter Calibre-Web?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Mise à jour en cours, ne pas rafraîchir la page" @@ -1594,39 +1600,39 @@ msgstr "via" msgid "In Library" msgstr "Dans la librairie" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Trier en fonction de la date du livre, le plus récent en premier" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Trier en fonction de la date du livre, le plus ancien en premier" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Trier les titres dans l’ordre alphabétique" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Trier le titre dans l’ordre alphabétique inverse" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Trier en fonction de la date de publication, le plus récent en premier" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Trier en fonction de la date de publication, le plus ancien en premier" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "réduire" @@ -1756,9 +1762,9 @@ msgid "Fetch Metadata" msgstr "Obtenir les métadonnées" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Sauvegarder" @@ -1781,7 +1787,7 @@ msgstr "Chargement..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Fermer" @@ -2262,50 +2268,50 @@ msgstr "Permettre les téléchargements" msgid "Allow eBook Viewer" msgstr "Autoriser le visionneur de livres" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Permettre le téléversement de fichiers" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Permettre l'édition" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Permettre la suppression de livres" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Permettre le changement de mot de passe" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Autoriser la modification d’étagères publiques" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Exclure les langues" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Montrer les livres dans la langue" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Mode de visualisation par défaut pour les nouveaux utilisateurs" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Montrer aléatoirement des livres dans la vue détaillée" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Ajouter les étiquettes autorisées/refusées" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Ajouter les valeurs de colonnes autorisées/refusées" @@ -2459,21 +2465,29 @@ msgstr "Retour à l’accueil" msgid "Logout User" msgstr "Déconnecter l’utilisateur" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Trier les auteurs dans l’ordre alphabétique" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Trier les auteurs dans l’ordre alphabétique inverse" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Trier par ordre croissant en fonction de l’index de série" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Trier par ordre décroissant en fonction de l’index de série" @@ -3082,15 +3096,15 @@ msgstr "Créer/visualiser" msgid "Add allowed/Denied Custom Column Values" msgstr "Ajouter les valeurs de colonnes personnalisées autorisées/refusées" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Synchroniser uniquement les livres dans les étagères sélectionnées avec Kobo" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Supprimer l'utilisateur" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Générer l'URL d'authentification Kobo" diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo index cd2790bb24ea546765b285bd6d8675ad8ffb6b4a..bd42e50e5d6c9bffb314495577357be7bf9c5ab5 100644 GIT binary patch delta 5881 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 Mmu58nxZuS906#)_W&i*H delta 6158 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 J>tFSK|8Ivg>rnsz diff --git a/cps/translations/hu/LC_MESSAGES/messages.po b/cps/translations/hu/LC_MESSAGES/messages.po index a91824ee0..06d891e2a 100644 --- a/cps/translations/hu/LC_MESSAGES/messages.po +++ b/cps/translations/hu/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2019-04-06 23:36+0200\n" "Last-Translator: \n" "Language: hu\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "nincs telepítve" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statisztika" @@ -65,17 +65,17 @@ msgstr "Alapvető beállítások" msgid "UI Configuration" msgstr "Felhasználói felület beállításai" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Rendszergazda felhasználó" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -83,7 +83,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mindent mutass" @@ -92,7 +92,7 @@ msgstr "Mindent mutass" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -100,7 +100,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -271,9 +271,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -303,7 +303,7 @@ msgstr "Az e-mail kiszolgáló beállításai frissítve." msgid "Database Configuration" msgstr "Funkciók beállítása" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Az összes mezőt ki kell tölteni!" @@ -311,165 +311,165 @@ msgstr "Az összes mezőt ki kell tölteni!" msgid "E-mail is not from valid domain" msgstr "Az e-mail tartománya nem érvényes." -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Új felhasználó hozzáadása" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "A következő felhasználó létrehozva: %(user)s" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Már létezik felhasználó ehhez az e-mail címhez vagy felhasználói névhez." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "A felhasználó törölve: %(nick)s" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr " A felhasználó szerkesztése: %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "A felhasználó frissítve: %(nick)s" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Ismeretlen hiba történt. Próbáld újra később!" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "SMTP beállítások változtatása" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Hiba történt a teszt levél küldése során: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Az e-mail kiszolgáló beállításai frissítve." -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "A(z) %(user)s felhasználó jelszavának alaphelyzetbe állítása" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Először be kell állítani az SMTP levelező beállításokat..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Frissítési csomag kérése" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Frissítési csomag letöltése" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Frissítési csomag kitömörítése" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Fájlok cserélése" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Adatbázis kapcsolatok lezárva" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Szerver leállítása" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "A frissítés települt, kattints az OK-ra és újra tölt az oldal" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "A frissítés nem sikerült:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP hiba" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Időtúllépés a kapcsolódás során" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Általános hiba" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -481,7 +481,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -494,8 +494,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Hiba történt az e-könyv megnyitásakor. A fájl nem létezik vagy nem érhető el:" @@ -532,7 +532,7 @@ msgstr "Nem sikerült létrehozni az elérési utat (engedély megtagadva): %(pa msgid "Failed to store file %(file)s." msgstr "Nem sikerült elmenteni a %(file)s fájlt." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -690,7 +690,7 @@ msgstr "A \"%(file)s\" fájl nem található a Google Drive-on" msgid "Book path %(path)s not found on Google Drive" msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Már létezik felhasználó ehhez az e-mail címhez." @@ -724,34 +724,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Várakozás" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Nem sikerült" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Elindítva" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Végrehajtva" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Ismeretlen állapot" @@ -768,7 +772,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Be vagy jelentkezve mint: %(nickname)s" @@ -834,7 +838,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Belépés" @@ -850,7 +854,7 @@ msgstr "A token érvényessége lejárt." msgid "Success! Please return to your device" msgstr "Sikerült! Újra használható az eszköz." -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "" @@ -875,7 +879,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Legjobb könyvek" @@ -884,7 +888,7 @@ msgid "Show Top Rated Books" msgstr "Legjobbra értékelt könyvek mutatása" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Olvasott könyvek" @@ -893,7 +897,7 @@ msgid "Show read and unread" msgstr "Mutassa az olvasva/olvasatlan állapotot" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Olvasatlan könyvek" @@ -911,7 +915,7 @@ msgid "Show Random Books" msgstr "Mutass könyveket találomra" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Címkék" @@ -921,7 +925,7 @@ msgstr "Címke választó mutatása" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Sorozatok" @@ -939,7 +943,7 @@ msgid "Show author selection" msgstr "Szerző választó mutatása" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Kiadók" @@ -949,7 +953,7 @@ msgstr "Kiadó választó mutatása" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Nyelvek" @@ -973,7 +977,7 @@ msgstr "" msgid "Show file formats selection" msgstr "" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -981,7 +985,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1009,9 +1013,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "A könyv hozzá lett adva a következő polchoz: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Nincs jogosultságod könyvet tenni a következő polcra: %(name)s." +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1034,58 +1037,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "A könyv el lett távolítva a polcról: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Sajnálom, nincs jogosultságot eltávolítani könyvet erről a polcról: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Polc készítése" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Sajnálom, nincs jogosultságot eltávolítani könyvet erről a polcról: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Polc szerkesztése" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "A következő polc létre lett hozva: %(title)s" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "A következő polc megváltoztatva: %(title)s" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Hiba történt" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "A következő polc átrendezése: %(name)s" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Polc: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Hiba a polc megnyitásakor. A polc nem létezik vagy nem elérhető." @@ -1118,177 +1124,177 @@ msgstr "Új frissítés érhető el. Kattints az alábbi gombra a frissítéshez msgid "No release information available" msgstr "Nincs információ a kiadásról." -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Felfedezés (könyvek találomra)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Kelendő könyvek (legtöbbet letöltöttek)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Kiadó: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Sorozat: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Címke: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Nyelv: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Részletes keresés" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Keresés" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Letöltések" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Feladatok" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Kiadva ezután: " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Kiadva ezelőtt: " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Hiba történt a könyv küldésekor: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Először be kell állítani a kindle e-mail címet..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Regisztrálás" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Jóváhagyó levél elküldve az email címedre." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profilja" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "A profil frissítve." @@ -1301,31 +1307,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1359,212 +1365,212 @@ msgstr "Rendszergazda" msgid "Password" msgstr "Jelszó" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Feltöltés" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Letöltés" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Szerkesztés" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Törlés" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "SMTP e-mail kiszolgáló beállítások" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP szervernév" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP port" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP felhasználó" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Küldő e-mail cím" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Konfiguráció" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre adatbázis mappája:" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Naplózás szintje:" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port:" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Könyvek oldalanként:" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Feltöltés:" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Böngészés bejelentkezés nélkül:" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Nyílvános regisztráció:" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Távoli belépés:" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Calibre adatbázis mappája:" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Adminisztráció" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Újracsatlakozás a Calibre adatbázishoz" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "A Calibre adatbázis újraindítása" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "A Calibre adatbázis leállítása" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Frissítés" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Verzió" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Részletek" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Jelenlegi verzió" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Frissítés keresése" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Frissítés elkezdése" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Valóban újra akarod indítani a Calibre-Web-et?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Valóban le akarod állítani a Calibre-Web-et?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Frissítés folyamatban, ne töltsd újra az oldalt" @@ -1576,39 +1582,39 @@ msgstr "keresztül" msgid "In Library" msgstr "Könyvtárban" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "csökkentsd" @@ -1738,9 +1744,9 @@ msgid "Fetch Metadata" msgstr "Metaadatok beszerzése" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1763,7 +1769,7 @@ msgstr "Betöltés..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Bezárás" @@ -2243,50 +2249,50 @@ msgstr "Letöltés engedélyezése" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Feltöltés engedélyezése" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Szerkesztés engedélyezése" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Jelszó változtatásának engedélyezése" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Nyilvános polcok szerkesztésének engedélyezése" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Nyelvek kizárása" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Mutasd a könyveket a következő nyelvvel" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Új felhasználók alapértelmezett látható elemei" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Mutasson könyveket találomra a részletes nézetben" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2439,21 +2445,29 @@ msgstr "Vissza a kezdőlapra" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3058,15 +3072,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "A felhasználó törlése" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index 0fc468d181d7d04a0d2b165f980b4f850c308fc4..af9006f72a00eba1417a44252c9335b7badb8c5a 100644 GIT binary patch delta 11854 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 J+6yO3{SQmopx^)i delta 12030 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\n" "Language: it\n" @@ -15,17 +15,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "non installato" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "installato" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistiche" @@ -64,16 +64,16 @@ msgstr "Configurazione di base" msgid "UI Configuration" msgstr "Configurazione dell'interfaccia utente" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "Modifica gli utenti" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Tutti" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Utente non trovato" @@ -81,7 +81,7 @@ msgstr "Utente non trovato" msgid "{} users deleted successfully" msgstr "{} utente eliminato con successo" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "tutte le lingue presenti" @@ -90,7 +90,7 @@ msgstr "tutte le lingue presenti" msgid "Malformed request" msgstr "Richiesta non formulata correttamente" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Il nome dell'utente Guest (ospite) non può essere modificato" @@ -98,7 +98,7 @@ msgstr "Il nome dell'utente Guest (ospite) non può essere modificato" msgid "Guest can't have this role" msgstr "L'utente Guest (ospite) non può avere questo ruolo" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Non rimarrebbe nessun utente amministratore, non posso rimuovere il ruolo di amministratore" @@ -266,9 +266,9 @@ msgstr "LDAP Member User Filter contiene una parentesi senza la corrispettiva" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertificate, il certificato o la posizione della chiave non sono corretti, per favore indica il percorso corretto" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "I parametri del DB non sono scrivibili" @@ -296,7 +296,7 @@ msgstr "Configurazione del Database aggiornata" msgid "Database Configuration" msgstr "Configurazione del Database" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Per favore compila tutti i campi!" @@ -304,164 +304,164 @@ msgstr "Per favore compila tutti i campi!" msgid "E-mail is not from valid domain" msgstr "L'e-mail non proviene da un dominio valido" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Aggiungi un nuovo utente" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "L'utente '%(user)s' è stato creato" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "Trovato un account esistente con questo e-mail o nome di utente" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "L'utente '%(nick)s' è stato eliminato" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "Non posso eliminare l'utente Guest (ospite)" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Non rimarrebbe nessun utente amministratore, non posso eliminare l'utente" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica l'utente %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "L'utente '%(nick)s' è stato aggiornato" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto: per favore riprova." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Modifica le impostazioni del server e-mail" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "L'account Gmail è stato verificato con successo" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "L'e-mail di test è stato accodato con successo per essere spedito a %(email)s, per favore verifica tramite il pulsante 'Compito' il risultato" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Si è verificato un errore nell'invio dell'e-mail di test: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Per favore prima configura il tuo indirizzo e-mail..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Configurazione del server e-mail aggiornata" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "La password dell'utente %(user)s è stata resettata" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Configura dapprima le impostazioni del server SMTP..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Visualizzatore del Logfile" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Richiedo il pacchetto di aggiornamento" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Scarico il pacchetto di aggiornamento" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Decomprimo il pacchetto di aggiornamento" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Sostituisco i file" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Le connessioni al database sono chiuse" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Arresto il server" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Aggiornamento completato, per favore premi ok e ricarica la pagina" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Aggiornamento non riuscito:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "Errore HTTP" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Errore di connessione" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Tempo scaduto nello stabilire la connessione" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Errore generale" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "Il file di aggiornamento non può essere salvato nella cartella temporanea" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "Durante l'aggiornamento non è stato possibile sostituire alcuni file" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "Fallita l'estrazione di almeno un utente LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Fallita la creazione di almeno un utente LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Errore: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Errore: nessun utente restituito in risposta dal server LDAP" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Almeno un utente LDAP non è stato trovato nel database" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} utente importato con successo" @@ -473,7 +473,7 @@ msgstr "non configurato" msgid "Execution permissions missing" msgstr "Mancano i permessi di esecuzione" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "La colonna personale no.%(column)d non esiste nel database di Calibre" @@ -486,8 +486,8 @@ msgstr "Il formato del libro è stato eliminato con successo" msgid "Book Successfully Deleted" msgstr "Il libro é stato eliminato con successo" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Errore durante l'apertura del libro selezionato. Il file non esiste o il file non è accessibile" @@ -524,7 +524,7 @@ msgstr "Impossibile creare la cartella %(path)s (autorizzazione negata)." msgid "Failed to store file %(file)s." msgstr "Il salvataggio del file %(file)s non è riuscito." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Errore nel database: %(error)s." @@ -682,7 +682,7 @@ msgstr "File %(file)s non trovato su Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Non ho trovato la cartella %(path)s del libro su Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "Ho trovato un account creato in precedenza con questo indirizzo e-mail." @@ -715,34 +715,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Solamente i file nei formati jpg/jpeg/png/webp/bmp sono supportati per le copertine" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Solamente i file nei formati jpg/jpeg sono supportati per le copertine" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Non ho trovato il file binario di UnRar" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Errore nell'eseguire UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Attendi" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Non riuscito" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Avviato" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Terminato" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Stato sconosciuto" @@ -759,7 +763,7 @@ msgstr "Configurazione di Kobo" msgid "Register with %(provider)s" msgstr "Registra con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come: '%(nickname)s'" @@ -825,7 +829,7 @@ msgid "{} Stars" msgstr "{} Stelle" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Accesso" @@ -841,7 +845,7 @@ msgstr "Il token è scaduto" msgid "Success! Please return to your device" msgstr "Riuscito! Torna al tuo dispositivo" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Libri" @@ -866,7 +870,7 @@ msgstr "Libri scaricati" msgid "Show Downloaded Books" msgstr "Mostra l'opzione per la visualizzazione dei libri scaricati" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Libri meglio valutati" @@ -875,7 +879,7 @@ msgid "Show Top Rated Books" msgstr "Mostra l'opzione per la selezione dei libri meglio valutati" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Libri letti" @@ -884,7 +888,7 @@ msgid "Show read and unread" msgstr "Mostra l'opzione per la selezione letto e non letto" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Libri non letti" @@ -902,7 +906,7 @@ msgid "Show Random Books" msgstr "Mostra libri casualmente" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Categorie" @@ -912,7 +916,7 @@ msgstr "Mostra l'opzione per la selezione delle categorie" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Serie" @@ -930,7 +934,7 @@ msgid "Show author selection" msgstr "Mostra l'opzione per la selezione degli autori" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Editori" @@ -940,7 +944,7 @@ msgstr "Mostra l'opzione per la selezione degli editori" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Lingue" @@ -964,7 +968,7 @@ msgstr "Formati file" msgid "Show file formats selection" msgstr "Mostra l'opzione per la selezione del formato dei file" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Libri archiviati" @@ -972,7 +976,7 @@ msgstr "Libri archiviati" msgid "Show archived books" msgstr "Mostra l'opzione per la selezione dei libri archiviati" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Elenco libri" @@ -1000,9 +1004,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Il libro è stato aggiunto allo scaffale: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Non sei autorizzato ad aggiungere libri allo scaffale: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1025,57 +1028,60 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Il libro è stato rimosso dallo scaffale: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Spiacente, non sei autorizzato a togliere libri dallo scaffale: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crea uno scaffale" -#: cps/shelf.py:236 +#: cps/shelf.py:241 msgid "Sorry you are not allowed to edit this shelf" msgstr "Spiacente, non sei autorizzato a modificare questo scaffale" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Modifica uno scaffale" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Lo scaffale %(title)s è stato creato" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Lo scaffale %(title)s è stato modificato" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "C'era un errore" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Esiste già uno scaffale pubblico denominato '%(title)s'." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Esiste già uno scaffale privato denominato '%(title)s'." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifica l'ordine dello scaffale: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Scaffale: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Errore durante l'apertura dello scaffale. Lo scaffale non esiste o non è accessibile" @@ -1108,177 +1114,177 @@ msgstr "Nuovo aggiornamento disponibile. Clicca sul pulsante sottostante per agg msgid "No release information available" msgstr "Non sono disponibili informazioni sulla versione" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Scopri (libri casuali)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "I libri più richiesti" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "I libri scaricati da %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Autore: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Editore: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Valutazione: %(rating)s stelle" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Formato del file: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Ricerca avanzata" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Cerca" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Elenco delle valutazioni" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Elenco dei formati" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Compito" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Pubblicato dopo il " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Pubblicato prima del " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Valutazione <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Valutazione >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Stato di lettura = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Errore di ricerca nelle colonne personalizzate. Per favore riavvia Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro accodato con successo per essere spedito a %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Oops! Si è verificato un errore durante l'invio di questo libro: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Per favore aggiorna il tuo profilo con un indirizzo e-mail Kindle a cui inviare i libri." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registra" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Il tuo e-mail non è autorizzato alla registrazione" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Un messaggio di conferma è stato inviato al tuo recapito e-mail." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Non posso attivare l'autenticazione LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Non posso accedere: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Una nuova password è stata inviata al tuo recapito e-mail" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Per favore digita un nome di utente valido per resettare la password" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ora sei connesso come '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profilo aggiornato" @@ -1291,31 +1297,31 @@ msgstr "Ho trovato un gmail.json file senza informazione OAuth" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Non ho trovato il convertitore %(tool)s di libri di Calibre" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "Non ho trovato il formato %(format)s nel disco" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "La conversione del libro è terminata con un errore sconosciuto" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Si è verificato un errore con il convertitore Kepubify: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Non ho trovato il file convertito o ci sono più di un file nella cartella %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Errore nel convertitore: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Si è verificato un errore con Calibre: %(error)s" @@ -1349,211 +1355,211 @@ msgstr "Amministrazione" msgid "Password" msgstr "Password" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Upload" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Download" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Vedi libri" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Modifica" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Elimina" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Scaffale pubblico" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Aggiungi un nuovo utente" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importa gli utenti LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Configurazione server e-mail" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "Indirizzo server SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "Porta SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Crittografia" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Login SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "E-mail da" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "Servizio e-mail" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail via Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Configurazione" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Cartella del database di Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Livello di log" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Porta" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Porta esterna" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Libri per pagina" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Uploads" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Navigazione anonima" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Registrazione pubblica" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Magic Link Login remoto" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Login reverse proxy" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Nome dell'intestazione Reverse Proxy" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "Modifica la configurazione del Database di Calibre" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Modifica la configurazione di base" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Modifica la configurazione dell'interfaccia utente" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Amministrazione" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Scarica Debug Package" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Visualizza Logfile" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Ricollega il database di Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Riavvia Calibre-Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Arresta Calibre-Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Aggiornamento" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Versione" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Dettagli" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Versione attuale" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Ricerca aggiornamenti" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Esegui l'aggiornamento" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Vuoi veramente riavviare Calibre-Web?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Annulla" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Vuoi veramente arrestare Calibre-Web?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Aggiornamento, non ricaricare la pagina." @@ -1565,39 +1571,39 @@ msgstr "via" msgid "In Library" msgstr "Nella libreria" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Ordina secondo la data dei libri, prima i più recenti" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Ordina secondo la data dei libri, prima i più vecchi" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Ordina i titoli in ordine alfabetico" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Ordina i titoli in ordine alfabetico inverso" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Ordina secondo la data di pubblicazione, prima i più recenti" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Ordina secondo la data di pubblicazione, prima i più vecchi" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "riduci" @@ -1727,9 +1733,9 @@ msgid "Fetch Metadata" msgstr "Ottieni metadati" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Salva" @@ -1751,7 +1757,7 @@ msgstr "Caricamento in corso..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Chiudi" @@ -2230,48 +2236,48 @@ msgstr "Permetti il download" msgid "Allow eBook Viewer" msgstr "Permetti l'utilizzo del visualizzatore di libri" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Permetti l'upload" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Permetti la modifica" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Permetti l'eliminazione di libri" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Permetti la modifica della password" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Permetti la modifica degli scaffali pubblici" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 msgid "Default Language" msgstr "Lingua predefinita" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 msgid "Default Visible Language of Books" msgstr "Lingua predefinita di presentazione dei libri" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Visibilità predefinita per i nuovi utenti" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Mostra libri scelti aleatoriamente nella vista dettagliata" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Aggiungi categorie permesse/negate" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Aggiungi valori personali permetti/nega nelle colonne" @@ -2424,21 +2430,29 @@ msgstr "Ritorna alla pagina principale" msgid "Logout User" msgstr "Disconnetti l'utente" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Ordina gli autori in ordine alfabetico" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Ordina gli autori in ordine alfabetico inverso" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Ordina in ordine ascendente secondo l'indice della serie" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Ordina in ordine discendente secondo l'indice della serie" @@ -3040,15 +3054,15 @@ msgstr "Crea/Visualizza" msgid "Add allowed/Denied Custom Column Values" msgstr "Aggiungi valori personali permessi/negati nelle colonne" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Sincronizza con Kobo unicamene i libri negli scaffali selezionati" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Elimina utente" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Genera un URL di autenticazione per Kobo" diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index 35e759cf8829599e4ba14d3d1f5c6d311bf42d9b..3fad6032cea57a12fc26b55b45e0d9bcbdfdd301 100644 GIT binary patch delta 4609 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 diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index ca0705889..f8ce8069c 100644 --- a/cps/translations/ja/LC_MESSAGES/messages.po +++ b/cps/translations/ja/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: white \n" "Language: ja\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "インストールされていません" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "統計" @@ -65,16 +65,16 @@ msgstr "基本設定" msgid "UI Configuration" msgstr "UI設定" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -82,7 +82,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" @@ -91,7 +91,7 @@ msgstr "" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -99,7 +99,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -266,9 +266,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -298,7 +298,7 @@ msgstr "メールサーバの設定を更新しました" msgid "Database Configuration" msgstr "機能設定" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "全ての項目を入力してください" @@ -306,165 +306,165 @@ msgstr "全ての項目を入力してください" msgid "E-mail is not from valid domain" msgstr "このメールは有効なドメインからのものではありません" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "新規ユーザ追加" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "ユーザ '%(user)s' を作成しました" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "このメールアドレスかニックネームで登録されたアカウントが見つかりました" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "ユーザ '%(nick)s' を削除しました" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s を編集" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "ユーザ '%(nick)s' を更新しました" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "SMTP設定を変更" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "テストメールを %(res)s に送信中にエラーが発生しました" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "メールサーバの設定を更新しました" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "%(user)s 用のパスワードをリセット" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "初めにSMTPメールの設定をしてください" -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "更新データを要求中" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "更新データをダウンロード中" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "更新データを展開中" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "ファイルを置換中" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "データベースの接続を切断完了" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "サーバ停止中" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "アップデート完了、OKを押してページをリロードしてください" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "アップデート失敗:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTPエラー" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "接続エラー" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "接続を確立中にタイムアウトしました" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "エラー発生" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -476,7 +476,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -489,8 +489,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -527,7 +527,7 @@ msgstr "%(path)s の作成に失敗しました (Permission denied)。" msgid "Failed to store file %(file)s." msgstr "%(file)s を保存できません。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -685,7 +685,7 @@ msgstr "ファイル %(file)s はGoogleドライブ上にありません" msgid "Book path %(path)s not found on Google Drive" msgstr "本のパス %(path)s はGoogleドライブ上にありません" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "このメールアドレスで登録されたアカウントがあります" @@ -719,34 +719,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "待機中" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "失敗" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "開始" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "終了" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "不明" @@ -763,7 +767,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログイン中" @@ -829,7 +833,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "ログイン" @@ -845,7 +849,7 @@ msgstr "トークンが無効です" msgid "Success! Please return to your device" msgstr "成功です!端末に戻ってください" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "" @@ -870,7 +874,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "" @@ -879,7 +883,7 @@ msgid "Show Top Rated Books" msgstr "" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "読んだ本" @@ -888,7 +892,7 @@ msgid "Show read and unread" msgstr "既読の本と未読の本を表示" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "未読の本" @@ -906,7 +910,7 @@ msgid "Show Random Books" msgstr "ランダムで本を表示" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "カテゴリ" @@ -916,7 +920,7 @@ msgstr "カテゴリ選択を表示" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "シリーズ" @@ -934,7 +938,7 @@ msgid "Show author selection" msgstr "著者選択を表示" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "出版社" @@ -944,7 +948,7 @@ msgstr "出版社選択を表示" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "言語" @@ -968,7 +972,7 @@ msgstr "" msgid "Show file formats selection" msgstr "" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -976,7 +980,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1004,9 +1008,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "本を %(sname)s に追加しました" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "%(name)s に本を追加することが許可されていません" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1029,58 +1032,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "本が %(sname)s から削除されました" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "本棚を作成する" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "本棚を編集する" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s を作成しました" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s を変更しました" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "エラーが発生しました" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "'%(name)s' 内の本の順番を変更する" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "本棚: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "本棚を開けません。この本棚は存在しないかアクセスできません" @@ -1113,177 +1119,177 @@ msgstr "アップデートが利用可能です。下のボタンをクリック msgid "No release information available" msgstr "リリース情報がありません" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "本を見つける (ランダムで表示)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "シリーズ: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "カテゴリ: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "詳細検索" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "検索" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "タスク" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "これ以降に出版 " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "これ以前に出版 " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "評価 <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "評価 >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "本の %(kindlemail)s への送信がキューに追加されました" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "初めにKindleのメールアドレスを設定してください" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "登録" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "ユーザ名またはパスワードが違います" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "プロフィールを更新しました" @@ -1296,31 +1302,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter が失敗しました: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1354,212 +1360,212 @@ msgstr "管理者" msgid "Password" msgstr "パスワード" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "アップロード" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "ダウンロード" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "編集" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "削除" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "暗号化" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "設定" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "ログレベル" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "ポート番号" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Calibre-Web の設定を更新しました" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "アップデート" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "バージョン" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "詳細" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "現在のバージョン" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "更新を実行" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "" @@ -1571,39 +1577,39 @@ msgstr "経由" msgid "In Library" msgstr "ライブラリ内" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "減らす" @@ -1733,9 +1739,9 @@ msgid "Fetch Metadata" msgstr "" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1758,7 +1764,7 @@ msgstr "読み込み中..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "閉じる" @@ -2238,49 +2244,49 @@ msgstr "ダウンロードを許可" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "アップロードを許可" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "編集を許可" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "パスワード変更を許可" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "みんなの本棚の編集を許可" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "言語を除外" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 msgid "Default Visible Language of Books" msgstr "" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2433,21 +2439,29 @@ msgstr "" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3052,15 +3066,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index 91e2659d302c2e52bf6d614fe149101f8d82dfdb..f2839dab3bcea9add0c05d64c436d5e871268fef 100644 GIT binary patch delta 4105 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 %(rating)s" msgstr "ការវាយតម្លៃ >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "ចុះឈ្មោះ" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" @@ -1300,31 +1306,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1358,212 +1364,212 @@ msgstr "រដ្ឋបាល" msgid "Password" msgstr "លេខសម្ងាត់" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "អាប់ឡូដ" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "ទាញយក" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "កែប្រែ" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "លុប" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "ឈ្មោះម៉ាស៊ីន SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "លេខ port SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "អ្នកចូលប្រើ SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "ពីអ៊ីមែល" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "ការកំណត់" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "ទីតាំង database Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "លេខ port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "ចំនួនសៀវភៅក្នុងមួយទំព័រ" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "កំពុងអាប់ឡូដ" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "ការចុះឈ្មាះសាធារណៈ" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "ការចូលប្រើប្រាស់ពីចម្ងាយ" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "ទីតាំង database Calibre" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "កិច្ចការរដ្ឋបាល" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "ភ្ជាប់ទៅ database Calibre ម្តងទៀត" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "រកមើលបច្ចុប្បន្នភាព" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "ធ្វើបច្ចុប្បន្នភាព" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "បាទ/ចាស" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "កំពុងធ្វើបច្ចុប្បន្នភាព សូមកុំបើកទំព័រជាថ្មី" @@ -1575,39 +1581,39 @@ msgstr "តាមរយៈ" msgid "In Library" msgstr "នៅក្នុងបណ្ណាល័យ" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "" @@ -1737,9 +1743,9 @@ msgid "Fetch Metadata" msgstr "មើលទិន្នន័យមេតា" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1762,7 +1768,7 @@ msgstr "កំពុងដំណើរការ..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "បិទ" @@ -2241,50 +2247,50 @@ msgstr "អនុញ្ញាតឲទាញយក" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "អនុញ្ញាតឲអាប់ឡូត" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "អនុញ្ញាតឲកែប្រែ" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "អនុញ្ញាតឲលុបសៀវភៅ" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "អនុញ្ញាតឲប្តូរលេខសម្ងាត់" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "អនុញ្ញាតឲកែប្រែធ្នើសាធារណៈ" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "លើកលែងភាសា" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "បង្ហាញសៀវភៅដែលមានភាសា" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "ភាពមើលឃើញដែលមកស្រាប់សម្រាប់អ្នកប្រើប្រាស់ថ្មី" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "បង្ហាញសៀវភៅចៃដន្យក្នុងការបង្ហាញជាពិស្តារ" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2437,21 +2443,29 @@ msgstr "" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3056,15 +3070,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "លុបអ្នកប្រើប្រាស់នេះ" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index fb07d0353c1ad74ae2308d875a1e52d672a6cdd7..5f2aa6a7ca5260ca8eb7c72812a3dea3e863c486 100644 GIT binary patch delta 11332 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\n" "Language: nl\n" @@ -17,17 +17,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "niet geïnstalleerd" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "geïnstalleerd" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistieken" @@ -66,17 +66,17 @@ msgstr "Basisconfiguratie" msgid "UI Configuration" msgstr "Uiterlijk aanpassen" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Systeembeheerder" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Alles" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Gebruiker niet gevonden" @@ -84,7 +84,7 @@ msgstr "Gebruiker niet gevonden" msgid "{} users deleted successfully" msgstr "{} gebruikers succesvol verwijderd" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Alle talen" @@ -93,7 +93,7 @@ msgstr "Alle talen" msgid "Malformed request" msgstr "Misvormd verzoek" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Gast naam kan niet worden veranderd" @@ -101,7 +101,7 @@ msgstr "Gast naam kan niet worden veranderd" msgid "Guest can't have this role" msgstr "Gast kan deze rol niet hebben" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Kan systeembeheerder rol niet verwijderen van de laatste systeembeheerder" @@ -272,9 +272,9 @@ msgstr "LDAP Lid Gebruiker Filter heeft een niet-gebalanceerd haakje" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertficaat, Certificaat of Sleutel Locatie is ongeldig. Voer alsjeblieft een geldig pad in." -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "DB-instellingen niet opgeslagen" @@ -304,7 +304,7 @@ msgstr "E-mailserver-instellingen bijgewerkt" msgid "Database Configuration" msgstr "Databaseconfiguratie" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Vul alle velden in!" @@ -312,167 +312,167 @@ msgstr "Vul alle velden in!" msgid "E-mail is not from valid domain" msgstr "Het e-mailadres bevat geen geldige domeinnaam" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Gebruiker toevoegen" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Gebruiker '%(user)s' aangemaakt" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Bestaand account met dit e-mailadres of deze gebruikersnaam aangetroffen." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Gebruiker '%(nick)s' verwijderd" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "Kan Gast gebruiker niet verwijderen" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Kan laatste systeembeheerder niet verwijderen" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Gebruiker '%(nick)s' bewerken" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' bijgewerkt" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "SMTP-instellingen bewerken" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "Gmail Account succesvol geverifieerd" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail wordt verzonden naar %(email)s, controleer de taken voor het resultaat" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Fout opgetreden bij het versturen van de test-e-mail: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Gelieve eerst je e-mail adres configureren..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "E-mailserver-instellingen bijgewerkt" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Wachtwoord voor gebruiker %(user)s is hersteld" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Stel eerst SMTP-mail in..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Logbestand lezer" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Update opvragen" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Update downloaden" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Update uitpakken" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Update toepassen" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Databaseverbindingen zijn gesloten" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Bezig met stoppen van Calibre-Web" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Update voltooid, klik op 'Oké' en vernieuw de pagina" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Update mislukt:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP-fout" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Verbindingsfout" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Time-out tijdens maken van verbinding" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Algemene fout" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Geüpload bestand kon niet opgeslagen worden in de tijdelijke map" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Mislukt om minstens een LDAP gebruiker aan te maken" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Het is niet gelukt tenminste een LDAP gebruiker aan te maken" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fout: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Fout: No user returned in response of LDAP server" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Minstens een LDAP Gebruiker is niet gevonden in de Database" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} Gebruiker succesvol geïmporteerd" @@ -484,7 +484,7 @@ msgstr "niet geconfigureerd" msgid "Execution permissions missing" msgstr "Kan programma niet uitvoeren" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Aangepaste kolom Nr.%(column)d bestaat niet in de Calibre Database" @@ -497,8 +497,8 @@ msgstr "Het boekformaat is verwijderd" msgid "Book Successfully Deleted" msgstr "Het boek is verwijderd" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oeps! Geselecteerd boek is niet beschikbaar. Bestand bestaat niet of is niet toegankelijk" @@ -535,7 +535,7 @@ msgstr "Kan de locatie '%(path)s' niet aanmaken (niet gemachtigd)." msgid "Failed to store file %(file)s." msgstr "Kan %(file)s niet opslaan." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Database fout: %(error)s." @@ -693,7 +693,7 @@ msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boeken locatie '%(path)s' niet aangetroffen op Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Bestaand account met dit e-mailadres aangetroffen." @@ -727,34 +727,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Alleen jpg/jpeg/png/webp/bmp bestanden worden ondersteund als omslag" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Alleen jpg/jpeg bestanden zijn toegestaan als omslag" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Unrar executable niet gevonden" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Fout bij het uitvoeren van Unrar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Wachten" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Mislukt" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Gestart" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Voltooid" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Onbekende status" @@ -771,7 +775,7 @@ msgstr "Kobo Instellen" msgid "Register with %(provider)s" msgstr "Aanmelden bij %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "je bent ingelogd als: '%(nickname)s'" @@ -837,7 +841,7 @@ msgid "{} Stars" msgstr "{} sterren" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Inloggen" @@ -853,7 +857,7 @@ msgstr "Toegangssleutel is verlopen" msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Boeken" @@ -878,7 +882,7 @@ msgstr "Gedownloade boeken" msgid "Show Downloaded Books" msgstr "Gedownloade boeken tonen" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Best beoordeelde boeken" @@ -887,7 +891,7 @@ msgid "Show Top Rated Books" msgstr "Best beoordeelde boeken tonen" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Gelezen boeken" @@ -896,7 +900,7 @@ msgid "Show read and unread" msgstr "Gelezen/Ongelezen boeken tonen" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Ongelezen boeken" @@ -914,7 +918,7 @@ msgid "Show Random Books" msgstr "Willekeurige boeken tonen" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Categorieën" @@ -924,7 +928,7 @@ msgstr "Categoriekeuze tonen" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Boekenreeksen" @@ -942,7 +946,7 @@ msgid "Show author selection" msgstr "Auteurkeuze tonen" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Uitgevers" @@ -952,7 +956,7 @@ msgstr "Uitgeverskeuze tonen" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Talen" @@ -976,7 +980,7 @@ msgstr "Bestandsformaten" msgid "Show file formats selection" msgstr "Bestandsformaten tonen" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Gearchiveerde boeken" @@ -984,7 +988,7 @@ msgstr "Gearchiveerde boeken" msgid "Show archived books" msgstr "Gearchiveerde boeken tonen" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Boekenlijst" @@ -1012,9 +1016,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Het boek is toegevoegd aan boekenplank: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Je bent niet gemachtigd om boeken toe te voegen aan boekenplank: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1037,58 +1040,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Het boek is verwijderd van boekenplank: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Je bent niet gemachtigd om boeken te verwijderen van boekenplank: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Boekenplank maken" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Je bent niet gemachtigd deze boekenplank aan te passen" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Pas een boekenplank aan" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Boekenplank '%(title)s' aangemaakt" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Boekenplank '%(title)s' is aangepast" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Er is een fout opgetreden" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Een openbare boekenplank met de naam '%(title)s' bestaat al." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Een persoonlijke boekenplank met de naam '%(title)s' bestaat al." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Volgorde van boekenplank veranderen: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk" @@ -1121,177 +1127,177 @@ msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten na msgid "No release information available" msgstr "Geen update-informatie beschikbaar" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Verkennen (willekeurige boeken)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Populaire boeken (meest gedownload)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Gedownloade boeken door %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Auteur: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Uitgever: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Reeks: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Beoordeling: %(rating)s sterren" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Bestandsformaat: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Geavanceerd zoeken" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Zoeken" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Beoordelingen" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Alle bestandsformaten" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Taken" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Gepubliceerd na " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Gepubliceerd vóór " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Beoordeling <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Beoordeling >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Lees Status = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fout tijdens het zoeken van aangepaste kolommen, start Calibre-Web opnieuw op" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Stel je kindle-e-mailadres in..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registreren" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Kan de LDAP authenticatie niet activeren" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Terugvallen op login: '%(nickname)s', LDAP Server is onbereikbaar, of de gebruiker is onbekend" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Inloggen mislukt: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Verkeerde gebruikersnaam of wachtwoord" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Een nieuw wachtwoord is verzonden naar je e-mailadres" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Geef een geldige gebruikersnaam op om je wachtwoord te herstellen" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profiel" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profiel bijgewerkt" @@ -1304,31 +1310,31 @@ msgstr "Geen geldig gmail.json bestand gevonden met OAuth informatie" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s niet gevonden" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s formaat is niet gevonden op de schijf" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "E-Book converter mislukt met een onbekende foutmelding" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converteerder mislukt: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Omgezette bestand is niet gevonden of meer dan een bestand in map %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-boek-conversie mislukt: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre mislukt met foutmelding: %(error)s" @@ -1362,212 +1368,212 @@ msgstr "Beheer" msgid "Password" msgstr "Wachtwoord" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Uploaden" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Downloaden" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Boeken lezen" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Bewerken" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Verwijderen" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Openbare boekenplank" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Gebruiker toevoegen" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "LDAP gebruikers importeren" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "SMTP-serverinstellingen" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP-hostnaam (gebruik mail.example.org om wachtwoordherstel uit te schakelen)" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP-poort" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Encryptie" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP-gebruikersnaam" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Van e-mail" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "E-Mail Service" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail via OAuth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Instellingen" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre-database locatie" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Logniveau" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Poort" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Externe poort" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Aantal boeken per pagina" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Uploaden toestaan" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Anoniem verkennen" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Openbare registratie" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Inloggen op afstand" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Reverse Proxy Login" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Reverse proxy header naam" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Bewerk Calibre databaseconfiguratie" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Bewerk basisconfiguratie" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Bewerk gebruikersinterface configuratie" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Systeembeheer" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Download foutopsporingspakket" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Logboeken bekijken" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Opnieuw verbinden met Calibre database" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Calibre-Web herstarten" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Calibre-Web stoppen" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Bijwerken" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Versie" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Details" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Huidige versie" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Controleren op updates" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Update uitvoeren" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Weet je zeker dat je Calibre-Web wilt herstarten?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Oké" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Annuleren" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Weet je zeker dat je Calibre-Web wilt stoppen?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Bezig met bijwerken, vernieuw de pagina niet" @@ -1579,39 +1585,39 @@ msgstr "via" msgid "In Library" msgstr "In bibliotheek" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Sorteren op datum, nieuwste boeken eerst" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Sorteren op datum, oudste boeken eerst" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Sorteren op alfabetische volgorde" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Sorteren op omgekeerde alfabetische volgorde" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Sorteren op publicatiedatum, nieuwste boeken eerst" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Sorteren op publicatiedatum, oudste boeken eerst" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "beperken" @@ -1741,9 +1747,9 @@ msgid "Fetch Metadata" msgstr "Metagegevens ophalen" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Opslaan" @@ -1766,7 +1772,7 @@ msgstr "Bezig met laden..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Sluiten" @@ -2247,50 +2253,50 @@ msgstr "Downloads toestaan" msgid "Allow eBook Viewer" msgstr "Boeken lezen toestaan" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Uploads toestaan" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Bewerken toestaan" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Verwijderen van boeken toestaan" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Wachtwoord wijzigen toestaan" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Bewerken van openbare boekenplanken toestaan" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Talen uitsluiten" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Taal van boeken" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Standaard zichtbaar voor nieuwe gebruikers" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Willekeurige boeken tonen in gedetailleerde weergave" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Voeg toegestane/geweigerde tags toe" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Voeg toegestane/geweigerde aangepaste kolomwaarden toe" @@ -2444,21 +2450,29 @@ msgstr "Terug naar startpagina" msgid "Logout User" msgstr "Gebruiker uitloggen" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Auteurs sorteren op alfabetische volgorde" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Auteurs sorteren op omgekeerde alfabetische volgorde" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Sorteer oplopend volgens de serie index" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Sorteer aflopend volgens de serie index" @@ -3067,15 +3081,15 @@ msgstr "Aanmaken/Bekijken" msgid "Add allowed/Denied Custom Column Values" msgstr "Voeg toegestane/geweigerde aangepaste kolomwaarden toe" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Synchroniseer alleen boeken op geselecteerde boekenplanken met Kobo" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Gebruiker verwijderen" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Genereer Kobo Auth URL" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index d9f9d7a3c4bd2ef2284da1474c1db443f09e9dc0..e796b117b354abef952f2b2adba88c5807a01c94 100644 GIT binary patch delta 11328 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 Qu5{GyLxH6)9y?L)e>zz)l>h($ delta 11602 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 Kb^Z9$QvU(S8H^tQ diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index e50d7f9b5..1ecbe85fd 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2021-06-12 15:35+0200\n" "Last-Translator: Radosław Kierznowski \n" "Language: pl\n" @@ -17,17 +17,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "nie zainstalowane" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "zainstalowane" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statystyki" @@ -67,17 +67,17 @@ msgstr "Konfiguracja podstawowa" msgid "UI Configuration" msgstr "Konfiguracja Interfejsu" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "Edytuj użytkowników" # ??? #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Wszystko" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Nie znaleziono użytkownika" @@ -85,7 +85,7 @@ msgstr "Nie znaleziono użytkownika" msgid "{} users deleted successfully" msgstr "{} użytkowników usuniętych pomyślnie" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Pokaż wszystkie" @@ -94,7 +94,7 @@ msgstr "Pokaż wszystkie" msgid "Malformed request" msgstr "Nieprawidłowo sformułowane żądanie" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Nazwa gościa nie może być zmieniona" @@ -102,7 +102,7 @@ msgstr "Nazwa gościa nie może być zmieniona" msgid "Guest can't have this role" msgstr "Gość nie może pełnić tej roli" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Nie można odebrać praw administratora. Brak na serwerze innego konta z prawami administratora" @@ -272,9 +272,9 @@ msgstr "Filtr użytkownika członka LDAP ma niedopasowane nawiasy" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Główny urząd certyfikatu LDAP, Certyfikat lub Lokalizacja Klucza nie jest prawidłowa, Proszę wprowadzić poprawną ścieżkę" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "Ustawienia Bazy Danych nie są zapisywalne" @@ -303,7 +303,7 @@ msgstr "Zaktualizowano ustawienia serwera poczty e-mail" msgid "Database Configuration" msgstr "Konfiguracja bazy danych" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" @@ -311,169 +311,169 @@ msgstr "Proszę wypełnić wszystkie pola!" msgid "E-mail is not from valid domain" msgstr "E-mail nie pochodzi z prawidłowej domeny" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 #, fuzzy msgid "Can't delete Guest User" msgstr "Nie można usunąć użytkownika gościa" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Nie można usunąć użytkownika. Brak na serwerze innego konta z prawami administratora" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Zmień ustawienia SMTP" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "Weryfikacja konta Gmail przebiegła pomyślnie" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, fuzzy, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testowy e-mail czeka w kolejce do wysłania do %(email)s, sprawdź zadania, aby uzyskać wynik" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Wystąpił błąd podczas wysyłania e-maila testowego: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Najpierw skonfiguruj swój adres e-mail..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Zaktualizowano ustawienia serwera poczty e-mail" # ??? -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Zrestartowano hasło użytkownika %(user)s" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Przeglądanie dziennika" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" # ??? -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Zastępowanie plików" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Zatrzymywanie serwera" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Aktualizacja nieudana:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "Błąd HTTP" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Błąd połączenia" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Przekroczono limit czasu podczas nawiązywania połączenia" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Błąd ogólny" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Plik aktualizacji nie mógł zostać zapisany w katalogu tymczasowym" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Błąd przy tworzeniu przynajmniej jednego użytkownika LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Błąd przy tworzeniu przynajmniej jednego użytkownika LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Błąd: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Błąd. LDAP nie zwrócił żadnego użytkownika" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Przynajmniej jeden użytkownik LDAP nie został znaleziony w bazie danych" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} Użytkownik pomyślnie zaimportowany" @@ -485,7 +485,7 @@ msgstr "nie skonfigurowane" msgid "Execution permissions missing" msgstr "Brak uprawnienia do wykonywania pliku" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Niestandardowa kolumna No.%(column)d nie istnieje w bazie calibre" @@ -498,8 +498,8 @@ msgstr "Plik książki w wybranym formacie został usunięty" msgid "Book Successfully Deleted" msgstr "Książka została usunięta" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub jest niedostępny" @@ -536,7 +536,7 @@ msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." msgid "Failed to store file %(file)s." msgstr "Nie można zapisać pliku %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Błąd bazy danych: %(error)s." @@ -696,7 +696,7 @@ msgstr "Nie znaleziono pliku %(file)s na Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Nie znaleziono ścieżki do książki %(path)s na Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "Znaleziono istniejące konto dla tego adresu e-mail" @@ -729,34 +729,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Jako plik okładki obsługiwane są tylko pliki jpg/jpeg/png/webp/bmp" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Plik wykonywalny programu unrar nie znaleziony" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Błąd przy wykonywaniu unrar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Oczekiwanie" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Nieudane" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Rozpoczynanie" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Zakończone" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Ststus nieznany" @@ -774,7 +778,7 @@ msgstr "Konfiguracja Kobo" msgid "Register with %(provider)s" msgstr "Zarejestruj się %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "zalogowałeś się jako: '%(nickname)s'" @@ -840,7 +844,7 @@ msgid "{} Stars" msgstr "{} Gwiazdek" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Zaloguj się" @@ -856,7 +860,7 @@ msgstr "Token wygasł" msgid "Success! Please return to your device" msgstr "Powodzenie! Wróć do swojego urządzenia" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Książki" @@ -881,7 +885,7 @@ msgstr "Pobrane książki" msgid "Show Downloaded Books" msgstr "Pokaż pobrane książki" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Najwyżej ocenione" @@ -890,7 +894,7 @@ msgid "Show Top Rated Books" msgstr "Pokaż menu najwyżej ocenionych książek" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Przeczytane" @@ -899,7 +903,7 @@ msgid "Show read and unread" msgstr "Pokaż menu przeczytane i nieprzeczytane" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Nieprzeczytane" @@ -917,7 +921,7 @@ msgid "Show Random Books" msgstr "Pokazuj losowe książki" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategorie" @@ -927,7 +931,7 @@ msgstr "Pokaż menu wyboru kategorii" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Cykle" @@ -945,7 +949,7 @@ msgid "Show author selection" msgstr "Pokaż menu wyboru autora" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Wydawcy" @@ -955,7 +959,7 @@ msgstr "Pokaż menu wyboru wydawcy" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Języki" @@ -979,7 +983,7 @@ msgstr "Formaty plików" msgid "Show file formats selection" msgstr "Pokaż menu formatu plików" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Zarchiwizowane książki" @@ -987,7 +991,7 @@ msgstr "Zarchiwizowane książki" msgid "Show archived books" msgstr "Pokaż zarchiwizowane książki" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Lista książek" @@ -1015,9 +1019,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Książka została dodana do półki: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Nie masz uprawnień do dodania ksiażki do półki: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1040,58 +1043,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Książka została usunięta z półki: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Niestety nie możesz usunąć książki z tej półki %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Utwórz półkę" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Niestety nie możesz usunąć książki z tej półki %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Publiczna półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Prywatna półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: „%(name)s”" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Błąd otwierania półki. Półka nie istnieje lub jest niedostępna" @@ -1124,178 +1130,178 @@ msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktual msgid "No release information available" msgstr "Brak dostępnych informacji o wersji" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Odkrywaj (losowe książki)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Książki pobrane przez %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Wydawca: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Cykl: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Ocena: %(rating)s gwiazdek" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Format pliku: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Wyszukiwanie" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Szukaj" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "DLS" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Lista z ocenami" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Lista formatów" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Zadania" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Opublikowane po " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Opublikowane przed " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Ocena <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Ocena >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Status przeczytania = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 #, fuzzy msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Błąd podczas wyszukiwania kolumn niestandardowych, proszę zrestartować Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Książka została umieszczona w kolejce do wysłania do %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Najpierw skonfiguruj adres e-mail Kindle..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Zarejestruj się" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Twój e-mail nie może się zarejestrować" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Nie można aktywować uwierzytelniania LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Nie można zalogować: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Nowe hasło zostało wysłane na Twój adres e-mail" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Wprowadź prawidłową nazwę użytkownika, aby zresetować hasło" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Jesteś teraz zalogowany jako: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Zaktualizowano profil" @@ -1308,31 +1314,31 @@ msgstr "Nie znaleziono poprawnego pliku gmail.json z informacjami OAuth" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Nie znaleziono narzędzia calibre %(tool)s do konwertowania" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "Nie znaleziono na dysku formatu %(format)s" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "Konwertowanie ebooka zakończyło się niepowodzeniem z nieznanego powodu" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter spowodowało błąd: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konwertowany plik nie został znaleziony, lub więcej niż jeden plik w folderze %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Konwertowanie nie powiodło się: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, fuzzy, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre nie powiodło się z błędem: %(error)s" @@ -1367,213 +1373,213 @@ msgstr "Panel administratora" msgid "Password" msgstr "Hasło" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Wysyłanie" # ??? -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Pobieranie" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Przeglądanie" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Edycja" # ??? -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Usuń" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Półka publiczna" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Dodaj nowego użytkownika" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importuj użytkowników LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Ustawienia serwera e-mail SMTP" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "Adres serwera SMTP" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "Port serwera SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Nazwa użytkownika SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Wyślij z adresu e-mail" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "Usługa e-mail" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail przez Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Konfiguracja" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Folder bazy danych Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Poziom dziennika" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Port zewnętrzny" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Liczba książek na stronie" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Wysyłanie" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Anonimowe przeglądanie" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Publiczna rejestracja" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Zdalne logowanie (Magic Link)" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Logowanie reverse proxy" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Nazwa nagłowka reverse proxy" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "Edytuj konfigurację bazy danych Calibre" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Edytuj podstawową konfigurację" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Edytuj konfigurację interfejsu" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Zarządzanie" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Pobierz pakiet Debug" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Podgląd dziennika" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Połącz ponownie z bazą danych Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Uruchom ponownie Calibre Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Zatrzymaj Calibre Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Update (aktualizacja)" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Wersja" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Szczegóły" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Bieżąca wersja" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Sprawdź aktualizacje" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Wykonaj aktualizację" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "OK" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Anuluj" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Na pewno chcesz zatrzymać Calibre Web?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Aktualizowanie, proszę nie odświeżać strony" @@ -1585,39 +1591,39 @@ msgstr "przez" msgid "In Library" msgstr "W Bibliotece" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Sortuj książki według daty, najnowsze jako pierwsze" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Sortuj książki według daty, najstarsze jako pierwsze" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Sortuj tytuły w porządku alfabetycznym" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Sortuj tytuły w odwrotnym porządku alfabetycznym" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Sortuj według daty publikacji, najnowsze jako pierwsze" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Sortuj według daty publikacji, najstarsze jako pierwsze" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "zwiń" @@ -1748,9 +1754,9 @@ msgid "Fetch Metadata" msgstr "Uzyskaj metadane" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Zapisz" @@ -1773,7 +1779,7 @@ msgstr "Ładowanie..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Zamknij" @@ -2259,50 +2265,50 @@ msgstr "Zezwalaj na pobieranie" msgid "Allow eBook Viewer" msgstr "Zezwalaj na przeglądanie e-booków" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Zezwalaj na wysyłanie" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Zezwalaj na edycję" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Zezwalaj na usuwanie książek" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Zezwalaj na zmianę hasła" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Zezwalaj na edycję półek publicznych" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Wyklucz języki" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Pokaż książki w języku" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Domyślne ustawienia widoku dla nowych użytkowników" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Pokaz losowe książki w widoku szczegółowym" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Dodaj dozwolone/zabronione etykiety" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Dodaj dozwolone/zabronione wartości własnych kolumn" @@ -2458,21 +2464,29 @@ msgstr "Powrót do głównego menu" msgid "Logout User" msgstr "Wyloguj użytkownika" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Sortuj autorów w porządku alfabetycznym" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Posortuj autorów w odwrotnym porządku alfabetycznym" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Sortuj rosnąco według indeksu serii" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Sortuj malejąco według indeksu serii" @@ -3083,15 +3097,15 @@ msgstr "Utwórz/Przeglądaj" msgid "Add allowed/Denied Custom Column Values" msgstr "Dodaj dozwolone/zabronione wartości własnych kolumn" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "Synchronizuj z Kobo tylko książki z wybranych półek" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Usuń tego użytkownika" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Generuj Kobo Auth URL" diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.mo b/cps/translations/pt_BR/LC_MESSAGES/messages.mo index 47fddac2753e77a66f8c6edf11b3745a65bb19f4..d1f3e9543f8b24643f5b6c6b618c471a21b8f442 100644 GIT binary patch delta 10231 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 delta 10477 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 BsL}uc diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.po b/cps/translations/pt_BR/LC_MESSAGES/messages.po index 6a9a773bc..d2bcdb067 100644 --- a/cps/translations/pt_BR/LC_MESSAGES/messages.po +++ b/cps/translations/pt_BR/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: br\n" @@ -13,17 +13,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "não instalado" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "instalado" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Estatística" @@ -62,17 +62,17 @@ msgstr "Configuração Básica" msgid "UI Configuration" msgstr "Configuração de UI" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Usuário Admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Todos" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Usuário não encontrado" @@ -81,7 +81,7 @@ msgstr "Usuário não encontrado" msgid "{} users deleted successfully" msgstr "{} Usuário Importado com Sucesso" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar tudo" @@ -90,7 +90,7 @@ msgstr "Mostrar tudo" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -98,7 +98,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Nenhum usuário administrador restante, não pode remover a função de administrador" @@ -270,9 +270,9 @@ msgstr "Filtro de usuário de membro LDAP tem parênteses incomparáveis" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertificate, Certificados ou chave de localização não é válida, Insira o caminho correto" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "O banco de dados de configurações não é gravável" @@ -302,7 +302,7 @@ msgstr "Atualização das configurações do servidor de e-mail" msgid "Database Configuration" msgstr "Configuração das Características" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Por favor, preencha todos os campos!" @@ -310,167 +310,167 @@ msgstr "Por favor, preencha todos os campos!" msgid "E-mail is not from valid domain" msgstr "O e-mail não é de um domínio válido" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Adicionar novo usuário" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Usuário '%(user)s' criado" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Encontrei uma conta existente para este endereço de e-mail ou apelido." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuário '%(nick)s' excluído" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Nenhum usuário administrador restante, não é possível excluir o usuário" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Editar usuário %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuário '%(nick)s' atualizado" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Editar configurações do servidor de e-mail" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocorreu um erro ao enviar o e-mail de teste: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure seu endereço de e-mail primeiro..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "Atualização das configurações do servidor de e-mail" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Senha para redefinição do usuário %(user)s" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "visualizador de arquivo de registro" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Solicitação de pacote de atualização" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Download do pacote de atualização" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Descompactação de pacote de atualização" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Substituição de arquivos" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "As ligações à base de dados estão fechadas" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Parar servidor" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Atualização concluída, pressione okay e recarregue a página" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Atualização falhou:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Erro de conexão" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Tempo limite durante o estabelecimento da conexão" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Erro geral" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Arquivo de atualização não pôde ser salvo no diretório temporário" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Falha na criação no mínimo de um usuário LDAP" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Falha na criação no mínimo de um usuário LDAP" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: Nenhum usuário retornado em resposta do servidor LDAP" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "No mínimo um usuário LDAP não encontrado no banco de dados" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} Usuário Importado com Sucesso" @@ -482,7 +482,7 @@ msgstr "não configurado" msgid "Execution permissions missing" msgstr "Faltam as permissões de execução" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "A coluna personalizada No.%(column)d não existe no banco de dados do calibre" @@ -495,8 +495,8 @@ msgstr "Formato do Livro Eliminado com Sucesso" msgid "Book Successfully Deleted" msgstr "Livro Eliminado com Sucesso" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oops! O título do livro seleccionado não está disponível. O arquivo não existe ou não é acessível" @@ -533,7 +533,7 @@ msgstr "Falha ao criar o caminho %(path)s (Permission denied)." msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o arquivo %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Erro de banco de dados: %(error)s." @@ -691,7 +691,7 @@ msgstr "Arquivo %(file)s não encontrado no Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Caminho do livro %(path)s não encontrado no Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Encontrado uma conta existente para este endereço de e-mail." @@ -725,34 +725,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Apenas ficheiros jpg/jpeg/png/webp/bmp são suportados como arquivos de capa" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Apenas arquivos jpg/jpeg são suportados como arquivos de capa" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Unrar arquivo binário não encontrado" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Erro excecutando UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Aguardando" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Falha" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Iniciado em" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Concluído" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Status Desconhecido" @@ -769,7 +773,7 @@ msgstr "Configuração Kobo" msgid "Register with %(provider)s" msgstr "Registre-se com %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "agora você está logado como: '%(nickname)s'" @@ -835,7 +839,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Login" @@ -851,7 +855,7 @@ msgstr "O Token expirou" msgid "Success! Please return to your device" msgstr "Sucesso! Por favor, volte ao seu aparelho" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Livros" @@ -876,7 +880,7 @@ msgstr "Livros descarregados" msgid "Show Downloaded Books" msgstr "Mostrar Livros Descarregados" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Livros Mais Bem Avaliados" @@ -885,7 +889,7 @@ msgid "Show Top Rated Books" msgstr "Mostrar os melhores livros avaliados" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Livros Lidos" @@ -894,7 +898,7 @@ msgid "Show read and unread" msgstr "Mostrar lido e não lido" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Livros Não Lidos" @@ -912,7 +916,7 @@ msgid "Show Random Books" msgstr "Mostrar Livros Aleatórios" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Categorias" @@ -922,7 +926,7 @@ msgstr "Mostrar seleção de categoria" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Série" @@ -940,7 +944,7 @@ msgid "Show author selection" msgstr "Mostrar selecção de autor" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Editores" @@ -950,7 +954,7 @@ msgstr "Mostrar selecção de editores" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Idiomas" @@ -974,7 +978,7 @@ msgstr "Formatos de arquivo" msgid "Show file formats selection" msgstr "Mostrar seleção de formatos de arquivo" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Livros Arquivados" @@ -982,7 +986,7 @@ msgstr "Livros Arquivados" msgid "Show archived books" msgstr "Mostrar livros arquivados" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Lista de Livros" @@ -1010,9 +1014,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "O livro foi adicionado à estante: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Você não tem permissão para adicionar um livro à estante: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1035,58 +1038,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "O livro foi removido da estante: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Desculpe, você não tem permissão para remover um livro desta estante: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crie uma estante" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Desculpe, você não tem permissão para remover um livro desta estante: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Editar uma estante" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s criada" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s alterada" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Houve um erro" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante pública com o nome '%(title)s' ." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante privada com o nome'%(title)s' ." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Alterar ordem da Estante: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erro ao abrir estante. A estante não existe ou não está acessível" @@ -1119,177 +1125,177 @@ msgstr "Uma nova atualização está disponível. Clique no botão abaixo para a msgid "No release information available" msgstr "Não há informações de lançamento disponíveis" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Descobrir (Livros Aleatórios)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Hot Books (Os Mais Descarregados)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livros baixados por %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Editor: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Avaliação: %(rating)s estrelas" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Formato do arquivo: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Pesquisa Avançada" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Pesquisa" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Lista de classificações" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Lista de formatos de arquivo" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Tarefas" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Publicado depois de " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Publicado antes de " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Avaliação <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Avaliação >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Status de leitura = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Livro enfileirado com sucesso para envio para %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Ups! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Por favor, atualize seu perfil com um endereço de e-mail válido para Kindle." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registe-se" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Seu e-mail não tem permissão para registrar" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "O e-mail de confirmação foi enviado para a sua conta de e-mail." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Não é possível ativar a autenticação LDAP" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Login de reserva como:'%(nickname)s', servidor LDAP não acessível ou usuário desconhecido" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Não foi possível fazer o login: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Nome de usuário ou senha incorretos" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Nova senha foi enviada para seu endereço de e-mail" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Por favor, digite um nome de usuário válido para redefinir a senha" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Você agora está logado como: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s's" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Perfil atualizado" @@ -1302,31 +1308,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s não encontrado" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s não encontrado no disco" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "O conversor de Ebook falhou com erro desconhecido" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "O conversor de Kepubify falhou: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Arquivo convertido não encontrado ou mais de um arquivo na pasta %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Conversor de ebook falhou: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falhou com erro: %(error)s" @@ -1360,212 +1366,212 @@ msgstr "Admin" msgid "Password" msgstr "Senha" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Upload" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Baixar" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Ver Livros" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Editar" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Eliminar" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Estante Pública" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Adicionar Novo Usuário" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importar usuários LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Configurações do servidor de e-mail" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP Nome do anfitrião" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "Porto SMTP" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Criptografia" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "Login SMTP" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Do E-mail" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Configuração" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Diretório do Banco de Dados de Calibres" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Nível de registo" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Porto" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Porto externo" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Livros por página" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Uploads" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Navegação Anónima" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Inscrição Pública" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Login remoto Magic Link" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Login de Proxy Reversa" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Nome do cabeçalho do Proxy Reverso" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Editar Configuração Básica" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Editar Configuração Básica" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Editar configuração da IU" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Administração" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Download do Pacote de Depuração" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Ver Logs" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Reconectar base de dados de calibração" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Reinicie" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Encerramento" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Atualização" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Versão" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Detalhes" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Versão atual" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Verificar Atualizações" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Realizar Atualizações" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Tem a certeza que quer recomeçar?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Cancelar" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Tens a certeza que queres fechar?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Atualizando, por favor, não recarregue esta página" @@ -1577,39 +1583,39 @@ msgstr "via" msgid "In Library" msgstr "Na Biblioteca" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Classificar de acordo com a data do livro, o mais recente primeiro" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Classificar de acordo com a data do livro, o mais antigo primeiro" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Classificar título em ordem alfabética" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Classificar título em ordem alfabética inversa" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Classificar de acordo com a data de publicação, o mais novo primeiro" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Classificar de acordo com a data de publicação, primeiro mais antigo" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "reduzir" @@ -1739,9 +1745,9 @@ msgid "Fetch Metadata" msgstr "Buscar Metadados" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Salvar" @@ -1764,7 +1770,7 @@ msgstr "A carregar..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Fechar" @@ -2245,50 +2251,50 @@ msgstr "Permitir Downloads" msgid "Allow eBook Viewer" msgstr "Permitir que o eBook Viewer" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Permitir Uploads" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Permitir Editar" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Permitir Livros Excluídos" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Permitir mudança de senha" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Permitir a Edição de Prateleiras Públicas" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Excluir idiomas" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Língua dos Livros" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Visibilidades por defeito para novos utilizadores" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Mostrar Livros Aleatórios em Vista de Detalhe" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Adicionar Etiquetas permitidas/negadas" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Adicionar valores permitidos/negados da coluna personalizada" @@ -2442,21 +2448,29 @@ msgstr "Voltar para casa" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Ordenar os autores em ordem alfabética" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Ordenar os autores em ordem alfabética inversa" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Ordenar ascendente de acordo com o índice de série" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Ordenação decrescente de acordo com o índice de série" @@ -3065,15 +3079,15 @@ msgstr "Criar/Ver" msgid "Add allowed/Denied Custom Column Values" msgstr "Adicionar valores permitidos/definidos da coluna personalizada" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Eliminar Utilizador" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Gerar o Kobo Auth URL" diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index f712f2a541cffea1d7704e20898ba082b316f46a..486bb167640bee2302692f973c18bafc68dabe86 100644 GIT binary patch delta 8403 zcmYM&3w+P@9>?*onc2-4W5aASySwhvY&5&D1bQVRifq)gD;i7>cF|dSh375_@A$+=1y> zDbkoUV;qx7p%M*KF%w_F%D5jZ;-?slM==&Jqc8e4FvcHiVh~26o;P>f2fB_$jXw?b zp5wY01DM~eqEM9wo3SG9LcOpTHSvDb4$q?cT}KU6j@q#&VPH+BK32gtsQ%rtE)K^e zoQ*!X%YD8dgP7l(pwJMnAki_^qwRnxsF3%<+Bgrra6RgjwxA;QK0aC~dQv}&HL%RB z-$q61E^6TwVr-=R(b2>y6q?~6)PyUr1@6aGEXPXNjQBRjRE)=ASQD3_7O)xX;D>Jg zE7ZboV?FeVv(IBu{d3}ozh3A|LjX=jFP!IgT!Mkrx1u7m7d7B{)BtyJF#59^y_b)i zikXbs>1x#Yn^8w{0F`_vQRDe15PyZTNrIgy6SJvzLq(zhwey3hv;7oP@HFZ@AHt{G zQ3n;`PN-z;gX*7;emDaOf?0&hm3L6Nb4u~oi+4~F_!G5be`fc?FjUedU^2EqopC;f z<0K5j0@T3op(1ex_5KCdYp8MVqQ>{+92FU-76lEMh6SrWUqCHsF|n6tn{ebtdak3p$7)co=n!zQHQ^ z2P)~jo7yuCLoGNFwX;^J9LYl+(HPYD&!ZMtgaNo4eRcmop`aCiiF)B2>dbGT&iW3v z!sur9Y=@!l^E6aaZAVRf05$Ll)PgRdFWz#W-$xydZ=%hGKul(SlTJZrISym+CD&c3 zYg6W0j@n5uvv40??C>ulp` z=z+PYj;m1<9YTfdbJPTuh`t~C>Yf*1(l?2-1-2wJ`Rb#S%CVU>_dH+9-tx? z&g^=xnL{C%LVHZa!I*^wsL-EA?cgG6<+o8g_TV$7Q2V3W>!6ahF)BjI7>{YFjSNAJ z^8#w4FJlHeYbdm&a1M1=HCxz~C7~wjh_&!ZtchchHJCZ5WGg{Ud=$AT<~V8s4XUH_ zLtX3YsEwwea;+2czGM1Os7=EtRJPAS9mxjN0B>MJ+=<#*8ERpdQ2lP82mXRuz;CD! zM?Y?pI29wP55^pvgRIdU#xUJ~#X$pyqjnU98Za57Fco!n{ZIoq*aSbu?)WouVN4r7 z676v+_SAFK5!TMM3y4IG-x`%0-7(vtFrNb722+Z+|mOmtEK85dRQ5Y@T#$e%0NY6u-iTc)z85gEW%hkgo?oR*2G^QmVh?=B4HhDi$hTpzJ*H8 z64Xx5pcZ-^wbP$b5&H|(uL|E+^@~MCpe5=ka@=|zYQA2m_lG(ZwBiYHq=JmMSV|7kX&-iNeVi{A5ftw z$0)4Cd1yxo_$bLxACR`L1F-@1DX64egO%}Zx4s*_sh6TAJdRq}RaF1qF+%s>yS-gN zJn9SA3N_IasB1UYtuI0)>ju;S`%nWPLv7%)+kOup>Xu3-Vhau6xWvc==VRz zZFmkJg${LQOVJlsqIR~PKZh>cdos$@m%S?El0BY}UzssQO_d_35YuY)6fA5*4YhU2mWk{Lt0E zGx65~LOa_BjZqV3pmv;(ipX>B^ZBTquR;!)3OM5-k(Zr!9YKiffi+XQ7YMd#k2+c(0LLq9$ zYcU27qsDP=QqWHRMrCo8ZuSEciE8hUnrI9L;InS~TvX&%U^Og6P4p&eqPOu_1tN#- zsc-DTFDc$cUGD~jwJGzPb`?V>DJ9Wj|c0IE(s7)KOeR-I|Qi zHlm%7{5AP*{S$`*H^f}QSWFvZcQgnislSR5xDPwvdE^F}=%<*L9Mt1HQ-Uy8UKJ`7@Ti&B^4Ec5vWLQ zMTLGJ2I5hyg%@0ZMPKT^WMl%?#CE!HSrh_jcoDVYLbtvjGpK)oGth5>y+(^LhWc)7 zjTf*bMohE|?Tl8H*v znW&`u04w4htciC~3-f)}hBy&lr``%VHFE_uPq)cjc^rqa%x`W|(3u52XH7zN%)=lY zi?whzR>MNKj}uPPI8R!u4I$2k0Sg#8mF6qmZ1V@Fx09w?|Nn zkEtD%gjJvC4r3BNfh$pwxQY!hiu0+9?NDbs3_Ia+td18@8@P>)(QBstE~LyP{(A8> z8r0z<493$KiZ@Yb=R>^mFbUOfF6wBCuo>>g^>_uq!-6xJhbFJlg}0LPr7pcUOh?esqC?4~ZZ?Tay&`YNo4WvI}WV-m)( zT}{vrW3d4Jumly+QXGSq&=)%{wMp9(t7*pR6ufw_1l4gR#^ImHC&0wKWJA0fpQe5W ziLS|BX8*7#MZF)m+)fyR9@G<23r)ceI25^1W(Q8dc*2mc9T!p1weneE%s=rd`~rVR zfBa;n{q;M6@ziS-*o9;vO=dfG$IMr3&aA{t>Yl6YH@^+0Q!mBdSm9N>kiO_>$7d*b zV-~XqVSCisJ%!;o53A#5tcH8A6&^t?sB)oA%0yJiyP%G0r0aat*>A!yJc1hMY9aC0 zJ-+WY)L3m_jKTogb5P%bZm#(lNqvdy4%7lppay(^TCjhStv5nly9`t$2VyfEi#fQi zi1;_8aEXSI=)cCU^jU06eKjWGci0t!*4k_zhP|mDz`7W+&L(dPauLiftc{QJRZ=8- zqHf0w)NLw8ZS1_`Hr&H>8p8f%KQz5jJDQ6c=oQov>_CO~5QgKou79I$P51`;0ZK&G zv#|>Hz=}8+XW($0iOyvTl_?B*&E~);)I<}p56(j!#W$$X-9lw`*hc&F+8Nb82X(!Q zF%tJjn3D08+dc9$D zq9yjDo{#PDC^o_xZ`$Wss3V<(3HUbZ`Pc6AO53P2ze%Ie9*3hsxf2uc5^7?koq`;dNvNn&Da)wciJQGzLWU3prM$CZuk?n z!K`=e+093tRUzt{eTYh?uQ3^a#aN7e*G8->j-oytwbSoW@83tAedv4ksBas6 zskj)M;vv+$&d(I`D1_{@Ni`ZZz;x7EEksZJ67|Aq)PN5#7&AVw?>&iH$OzQJ7oZ|~ z3Tt6Gs(-Z-dz5iV6qH20Fc2qWD_mGoJU!z3_~K0+Mtc?X?H*n{s@u{El@lYH hrME~*Eq>5Fw?c)q;_N4m^(r2-hP$E+3Z@By;)>!zl=`TsshL{5W~S+6 z<&taQu9-Duy=nC@>6lAqnqxE0lFQVXqs{N{x!<+VeCB)3xzBx;>s;r4sFOc?ZTQ8@ zeL1-H8pA(zy^Lv!0|Hh1pMU1Kj7g+A7ZY#~s^2ASjrTAZo3*g*iAa+fguYmUzrklP z2fx5njB07j6UMmB(-i8^@G55DM)bkU=#78GQ2aB-pjRtn{4pNuV={(d57hJFPP^N2 z1#0|tsP{HGzJm>!-|VLlz=My_8_%F#_!>3wWz-ITLiO`w+Zrew6^Yi!+DvzBfQ6|3 zr5J&WF$v#5KRn|+zlA3n5$;AU z;3I5;mz?^~sD%f_8WV|esOOoe{spnbUk%UF&=A*PU3|;wxC4WzpF~CGYt(?hpauwG z75SKedT%9iN@fjer-xDFe}p=cZ&As28#P`+Jn>g32gTcop2qIfr=ucKjoSGY)Y<+K zJK|l`dvSzMw<8UejFVBxSdQwy66@gxBp7BJ>S#Tv+_|Ip>%~B3Qv@PWJ5IoQn2t)i ze)u@%q0V?EHpfbAhSjKne~*g9KTz-g%h8u}(>Nih@mr%J<4&QV0kcpqiJ}R@QK9aRoPrsFy>SUf;c0a1 zjBZoViv3CLAPhwk+{B^IJR5Z+qfk34Kn*wr193encXpzV=n!h+lc+5J2DPAHP~*2u zwvp_ZO#F4WeQ6kmMW~L4Q4@WK3fW&!6Wl>9?gGqYDb+={jyO>TIkg0I`tQk(=c05 z-;?vG4^srQDqdR$<-jJ%18a zFTx0{#3ykNY6m|dd1VsGFl}H0YQm|g+$cjO>0-w<&hxiX8{3WU$0&S7K_R_?TH!5J zySA&O2|s#{$X_Zj0Toc86Yew#2Fk6;Xbhl+q-FXFEcOS@ji z^uaXD#0u1er%=gx5w+8Qpcd-KcT_tKLPe|@s$W}Fzf4pFMxu_Qz^P9|%~ytczrsyH zD_)K2xDK`BtxmlP73ve{jh`Vm)qH`<0bdeA3+jm)r$5%lY}A5su@25ajbD!1*z=C= zwG_02tymWiIQ92XD?E*Q@jU7}-9Tk;FkwsLxlKW5TATPQG~w79qfk5QhmVpB^#K|0=*Cvm*P@d2DEi>%PW>$UQon(k@JH0b zeEQn{jnSq1A4@?C=!^QojYds06LsxYIQ4C)WIchJ@H}eZo2d7_`q}nS)Hrdd4P~Gf z(jOIxY~=LJNY$C&yg}h{+~#z+gj(q})Y;uefBYwEhu-~dy&h`7#;7xm#1_~Vqi`@P zXJ(;tqTF#FYTOER*Q2nEg6{VkEHP>GuGP1KIhpdxa~d43bM^ZTeI^crN7 zEfVWf?~FRCKB#{A*bs{y%TP(YWRT9E!eJWJ@hUdOKVbu`JJ^0OLNJ?p7t{nVp%%6g z)o%-Ghx<^ua}xdVGAf6DKpjEtA@;eSV+*%aNJS+{7Ao|4s0qe6?Zv1GrlWG90(CSi zQ4_s^akvBZ-dWT*-=HFN4V4QIksm(em1Q^X&Y%!YLosT=Rj3_pMrHM0)CcEdr~Oyd zgbjw;kcOiAN24Ox5d*O^YQh1i2oJ$iwMatjOT9PYOws*cMM3xdB(}$!s1HfRZ)|%q zwxgbhA-D`T;znGLU2}|i3eP*H47b;>64h@z>InLbunQ|hEnpV%Zy(0IPeC0ra_ztE zjzoQ0Uq)Te&rzWrm}eJQhFZv0RF)q@eF3jJ?R7@lYuE%8kuDgFJyEwM2NQ4srfP!S z6rR8zP&;YC{|&@>n2e`UA@mx>BC!qj#!0Aw-$i{1KSD+D2jqVyY_v_<*+@Q{Q&@sc zp0*oWj&3E>J__2=`>5iU>fzcsEGX@ z^`Y`DvS;1}Nj5VOo8Thsgqw=o_Qi8F=xl<=@sYu8&bc5E%5Jd3M8@#nrIuwBR9+}!x+4X+L8Apn`Eiz zqW%>2!?`#NKgBlKl=$jM`d~N~VkFMPDBR#Y{}2~acVDJZpF;i=`|Y2K+!(V9xfrI- zRJ-EQr~#*-&iHw3hDT7javl`{KQc^_>WlggJcU6x1skK=@fGyf1=~d-o(G4p4_?ED zm@v(*xHGDrk6m#Z&cWT7fNiGR57-FoN!^W|@pq_&{)#&Dq*D8@^8+!K`a*243%-Mb zlJ6oWVaN;{!c5czV^PVo8a2=-sD)fbC8cYoJ)%+QO}!Eu;aZHwU8o43!L9fma;j$8 zEaqW;bC<$A44iGxd==`<4mzGio#`D6!GJOw%GMZ2y)%x)0XQ7Dp>BzJhM!pI>9_@z zGk)AfnT_sL3Y#cw#`D-7=RC`26L+GLCg(Z3!#UWJdKEs6XE7U-IS)l*Ikv)2FamF) zj@D-`i^C)gMmILbm**1ywiLG0Fd5IGUhG9U)L{&UVi`8YRj9Mui9_%#s$Vo=)X{Xs z4mbig;xbgf*!eaI%h8|u3mA^C%%_8rYcCBN;C*b47f{Lc3npOt0=tk&sB2k)+Sv|_ z#6RFNyo=hvyoI*^YZySi3ftj_s14l07TCmHVef4h)QXBx6D-6qd3IVs1SEq$xkpogGAYUk9~3CD*OIE)PzUT3(ueydJg+x zU3UGfc9=zB8lJ|f*!3lQt#;yC>a||xj}Tmk^>KWq{q>uPanui^7IF>gVg~<*{SOmY zaXR(nHTKiI70Eku15-N{O03)a$MIG%qu2X*v zQ>lM|@pvD#qv+q-fjXg%APXb05S!yd$IYl)^C1S{8K?d|HlY3!dZWAc8}{ea7w6Kj z7=6%tv(15esEI-_7h_OIu>cjh)u^og06XH3PJ7gw_PXX^OWN}>1{Yxy+=_%eIU7v<-6x4Abs$PH!VF~uZmoNt}pf@J&wz-jv>Yt8UNPkp> z@=!@xic4@c`eNuFyAT%^Q17;f_!m)llZH(6+iTB03)84qVHW-sdtt`A_6!%Hj%+PH zx^AeXI){(rZH&R_DjT^$SWLYfwb84n_kXS;{!tVns_mI~$8OX|paxopdj2`a;T_Zf zk^AgUl2F+_6iaXxPQdFJjDz>vpYH8xf!hOKr=XRK=(P%27wP1Z(3LsNDDp^VB8!nCH0XfM>tjT{RV+eV)CZqv}?(!sR)lH$2rf6|R~E zF3= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "При отправке этой книги произошла ошибка: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Зарегистрироваться" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Ваш e-mail не подходит для регистрации" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Письмо с подтверждением отправлено вам на e-mail." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Не удается активировать LDAP аутентификацию" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Резервный вход в систему как: '%(nickname)s', LDAP-сервер недоступен или пользователь не известен" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Не удалось войти: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Новый пароль был отправлен на ваш адрес электронной почты" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Вы вошли как: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Профиль %(name)s's" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Профиль обновлён" @@ -1305,31 +1311,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "Ошибка Ebook-конвертора: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1363,212 +1369,212 @@ msgstr "Управление" msgid "Password" msgstr "Пароль" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Загрузить" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Скачать" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Посмотреть электронные книги" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Редактировать" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Удалить" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Добавить нового пользователя" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Импорт пользователей LDAP" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Настройки SMTP-сервера" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP-сервер" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP-порт" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP-логин" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Отправитель" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Настройки сервера" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Расположение базы данных Calibre" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Уровень логирования" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Порт" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Количество книг на странице" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Загрузка на сервер" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Анонимный просмотр" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Публичная регистрация" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Удалённый логин" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Логин обратного прокси" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Имя заголовка обратного прокси" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Изменить основные настройки" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Изменить основные настройки" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Изменить настройки интерфейса" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Управление" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Просмотреть лог файл" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Пере подключиться к базе жанных Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Перезагрузить Calibre-Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Остановить Calibre-Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Обновление" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Версия" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Подробности" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Текущая версия" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Проверка обновлений" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Установить обновления" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Вы действительно хотите перезагрузить Calibre-Web?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Отмена" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Вы действительно хотите остановить Calibre-Web?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Установка обновлений, пожалуйста, не обновляйте страницу" @@ -1580,39 +1586,39 @@ msgstr "с помощью" msgid "In Library" msgstr "В библиотеке" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "уменьшить" @@ -1742,9 +1748,9 @@ msgid "Fetch Metadata" msgstr "Получить метаданные" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Сохранить" @@ -1767,7 +1773,7 @@ msgstr "Загрузка..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Закрыть" @@ -2248,50 +2254,50 @@ msgstr "Разрешить скачивание с сервера" msgid "Allow eBook Viewer" msgstr "Разрешить чтение книг" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Разрешить загрузку на сервер" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Разрешить редактирование книг" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Разрешить удаление книг" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Разрешить смену пароля" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Разрешить редактирование публичных книжных полок" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Исключить языки" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Показать книги на языках" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Видимость для новых пользователей(по умолчанию)" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Показывать случайные книги при просмотре деталей" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Добавить разрешенные / запрещенные теги" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Добавить разрешенные / запрещенные значения индивидуальных столбцов" @@ -2445,21 +2451,29 @@ msgstr "Вернуться на главную" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3068,15 +3082,15 @@ msgstr "Создать/Просмотреть" msgid "Add allowed/Denied Custom Column Values" msgstr "Добавить разрешенные / запрещенные значения индивидуальных столбцов" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Удалить этого пользователя" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Создать Kobo Auth URL" diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo index 209d5f4ae401ae71509b2bc7d2fc59642e3d674e..8ff534943f8db1930a76678cc9d64a3ba819f6be 100644 GIT binary patch delta 11122 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\n" "Language: sv\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "inte installerad" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "installerad" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Statistik" @@ -65,16 +65,16 @@ msgstr "Grundläggande konfiguration" msgid "UI Configuration" msgstr "Användargränssnitt konfiguration" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "Redigera användare" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Alla" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "Användaren hittades inte" @@ -82,7 +82,7 @@ msgstr "Användaren hittades inte" msgid "{} users deleted successfully" msgstr "{} användare har tagits bort" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Visa alla" @@ -91,7 +91,7 @@ msgstr "Visa alla" msgid "Malformed request" msgstr "Felaktig begäran" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "Gästnamn kan inte ändras" @@ -99,7 +99,7 @@ msgstr "Gästnamn kan inte ändras" msgid "Guest can't have this role" msgstr "Gäst kan inte ha den här rollen" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "Ingen administratörsanvändare kvar, kan inte ta bort administratörsrollen" @@ -270,9 +270,9 @@ msgstr "Användarfilter för LDAP-medlemmar har omatchad parentes" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP-certifikat, certifikat eller nyckelplats är inte giltigt, vänligen ange rätt sökväg" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "Inställningar för DB är inte skrivbara" @@ -302,7 +302,7 @@ msgstr "E-postserverinställningar uppdaterade" msgid "Database Configuration" msgstr "Funktion konfiguration" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Fyll i alla fält!" @@ -310,167 +310,167 @@ msgstr "Fyll i alla fält!" msgid "E-mail is not from valid domain" msgstr "E-posten är inte från giltig domän" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Lägg till ny användare" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Användaren '%(user)s' skapad" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "Hittade ett befintligt konto för den här e-postadressen eller namnet." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Användaren '%(nick)s' borttagen" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "Det går inte att ta bort gästanvändaren" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Redigera användaren %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Användaren '%(nick)s' uppdaterad" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Ändra SMTP-inställningar" -#: cps/admin.py:1528 +#: cps/admin.py:1532 #, fuzzy msgid "Gmail Account Verification Successful" msgstr "Verifiering av G-mail-kontot lyckades" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testa e-post i kö för att skicka till %(email)s, vänligen kontrollera Uppgifter för resultat" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Det gick inte att skicka Testmeddelandet: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Vänligen konfigurera din e-postadress först..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "E-postserverinställningar uppdaterade" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "Lösenord för användaren %(user)s återställd" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Konfigurera SMTP-postinställningarna först..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Visaren för loggfil" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Begär uppdateringspaketet" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Hämtar uppdateringspaketet" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Packar upp uppdateringspaketet" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Ersätta filer" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Databasanslutningarna är stängda" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Stoppar server" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Uppdateringen misslyckades:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP-fel" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Anslutningsfel" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Tiden ute när du etablerade anslutning" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Allmänt fel" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Uppdateringsfilen kunde inte sparas i Temp Dir" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Det gick inte att skapa minst en LDAP-användare" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "Det gick inte att skapa minst en LDAP-användare" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fel: %(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "Fel: Ingen användare återges som svar på LDAP-servern" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "Minst en LDAP-användare hittades inte i databasen" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} användare har importerats" @@ -482,7 +482,7 @@ msgstr "inte konfigurerad" msgid "Execution permissions missing" msgstr "Körningstillstånd saknas" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Anpassad kolumn n.%(column)d finns inte i calibre-databasen" @@ -495,8 +495,8 @@ msgstr "Bokformat har tagits bort" msgid "Book Successfully Deleted" msgstr "Boken har tagits bort" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Hoppsan! Vald boktitel är inte tillgänglig. Filen finns inte eller är inte tillgänglig" @@ -533,7 +533,7 @@ msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." msgid "Failed to store file %(file)s." msgstr "Det gick inte att lagra filen %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "Databasfel: %(error)s." @@ -691,7 +691,7 @@ msgstr "Filen %(file)s hittades inte på Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boksökvägen %(path)s hittades inte på Google Drive" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "Hittade ett befintligt konto för den här e-postadressen" @@ -724,34 +724,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Endast jpg/jpeg/png/webp/bmp-filer stöds som omslagsfil" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Endast jpg/jpeg-filer stöds som omslagsfil" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "Unrar binär fil hittades inte" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "Fel vid körning av UnRar" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Väntar" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Misslyckades" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Startad" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Klar" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Okänd status" @@ -768,7 +772,7 @@ msgstr "Kobo-installation" msgid "Register with %(provider)s" msgstr "Registrera dig med %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "du är nu inloggad som: \"%(nickname)s\"" @@ -834,7 +838,7 @@ msgid "{} Stars" msgstr "{} stjärnor" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Logga in" @@ -850,7 +854,7 @@ msgstr "Token har löpt ut" msgid "Success! Please return to your device" msgstr "Lyckades! Vänligen återvänd till din enhet" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "Böcker" @@ -875,7 +879,7 @@ msgstr "Hämtade böcker" msgid "Show Downloaded Books" msgstr "Visa hämtade böcker" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Bäst rankade böcker" @@ -884,7 +888,7 @@ msgid "Show Top Rated Books" msgstr "Visa böcker med bästa betyg" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Lästa böcker" @@ -893,7 +897,7 @@ msgid "Show read and unread" msgstr "Visa lästa och olästa" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Olästa böcker" @@ -911,7 +915,7 @@ msgid "Show Random Books" msgstr "Visa slumpmässiga böcker" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategorier" @@ -921,7 +925,7 @@ msgstr "Visa kategorival" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Serier" @@ -939,7 +943,7 @@ msgid "Show author selection" msgstr "Visa författarval" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Förlag" @@ -949,7 +953,7 @@ msgstr "Visa urval av förlag" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Språk" @@ -973,7 +977,7 @@ msgstr "Filformat" msgid "Show file formats selection" msgstr "Visa val av filformat" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "Arkiverade böcker" @@ -981,7 +985,7 @@ msgstr "Arkiverade böcker" msgid "Show archived books" msgstr "Visa arkiverade böcker" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "Boklista" @@ -1009,9 +1013,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Boken har lagts till i hyllan: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Du får inte lägga till en bok i hyllan: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1034,58 +1037,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Boken har tagits bort från hyllan: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Skapa en hylla" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Redigera en hylla" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Hyllan %(title)s skapad" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Hyllan %(title)s ändrad" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Det fanns ett fel" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "En offentlig hylla med namnet \"%(title)s\" finns redan." -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "En privat hylla med namnet \"%(title)s\" finns redan." -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Ändra ordning på hyllan: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylla: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig" @@ -1118,177 +1124,177 @@ msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att up msgid "No release information available" msgstr "Ingen versionsinformation tillgänglig" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Upptäck (slumpmässiga böcker)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Heta böcker (mest hämtade)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "Hämtade böcker av %(user)s" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Författare: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Förlag: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Serier: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Betyg: %(rating)s stars" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Avancerad sökning" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Sök" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "Hämtningar" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Betygslista" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Lista över filformat" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Uppgifter" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Publicerad efter " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Publicerad före " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Betyg <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Betyg >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "Lässtatus = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Boken är i kö för att skicka till %(kindlemail)s" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Konfigurera din kindle-e-postadress först..." -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Registrera" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "Det går inte att aktivera LDAP-autentisering" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "Det gick inte att logga in: %(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Fel användarnamn eller lösenord" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Nytt lösenord skickades till din e-postadress" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Ange giltigt användarnamn för att återställa lösenordet" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profil" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profilen uppdaterad" @@ -1301,31 +1307,31 @@ msgstr "Hittade ingen giltig gmail.json-fil med OAuth-information" msgid "Calibre ebook-convert %(tool)s not found" msgstr "calibre e-bokkonverterings %(tool)s hittades inte" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s-format hittades inte på disken" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "E-bokkonverteraren misslyckades med okänt fel" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-konverteraren misslyckades: %(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konverterad fil hittades inte eller mer än en fil i mappen %(folder)s" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "E-bokkonverteraren misslyckades: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "calibre misslyckades med fel: %(error)s" @@ -1359,212 +1365,212 @@ msgstr "Administratör" msgid "Password" msgstr "Lösenord" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Ladda upp" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Hämta" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "Visa e-böcker" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Redigera" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Ta bort" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "Publik hylla" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "Lägg till ny användare" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "Importera LDAP-användare" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "Inställningar för SMTP-e-postserver" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP-värdnamn" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP-port" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP-inloggning" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Från meddelande" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "E-posttjänst" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "Gmail via Oauth2" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Konfiguration" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre DB dir" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Loggnivå" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "Extern port" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Böcker per sida" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Laddar upp" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Anonym surfning" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Publik registrering" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "Fjärrinloggning" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "Omvänd proxy inloggning" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Omvänt proxy rubriknamn" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Redigera grundläggande konfiguration" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "Redigera grundläggande konfiguration" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "Redigera UI-konfiguration" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Administration" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "Hämta felsökningspaketet" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "Visa loggfiler" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Anslut till Calibre DB igen" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "Starta om Calibre-Web" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "Stoppa Calibre-Web" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Uppdatera" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Version" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Detaljer" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Aktuell version" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Sök efter uppdatering" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Utför uppdatering" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "Är du säker på att du vill starta om Calibre-Web?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "Avbryt" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "Är du säker på att du vill stoppa Calibre-Web?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Uppdaterar, vänligen uppdatera inte sidan" @@ -1576,39 +1582,39 @@ msgstr "via" msgid "In Library" msgstr "I biblioteket" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "Sortera efter bokdatum, nyast först" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "Sortera efter bokdatum, äldsta först" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "Sortera titel i alfabetisk ordning" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "Sortera titel i omvänd alfabetisk ordning" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "Sortera efter publiceringsdatum, nyast först" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "Sortera efter publiceringsdatum, äldsta först" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "minska" @@ -1738,9 +1744,9 @@ msgid "Fetch Metadata" msgstr "Hämta metadata" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "Spara" @@ -1763,7 +1769,7 @@ msgstr "Läser in..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Stäng" @@ -2244,50 +2250,50 @@ msgstr "Tillåt Hämtningar" msgid "Allow eBook Viewer" msgstr "Tillåt bokvisare" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Tillåt Uppladdningar" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Tillåt Redigera" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "Tillåt borttagning av böcker" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Tillåt Ändra lösenord" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Tillåt Redigering av offentliga hyllor" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Uteslut språk" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Visa böcker med språk" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Standardvisibiliteter för nya användare" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Visa slumpmässiga böcker i detaljvyn" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "Lägg till tillåtna/avvisade taggar" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "Lägg till tillåtna/avvisade anpassade kolumnvärden" @@ -2442,21 +2448,29 @@ msgstr "Tillbaka till hemmet" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "Sortera författare i alfabetisk ordning" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "Sortera författare i omvänd alfabetisk ordning" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "Sortera stigande enligt serieindex" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "Sortera fallande enligt serieindex" @@ -3063,15 +3077,15 @@ msgstr "Skapa/Visa" msgid "Add allowed/Denied Custom Column Values" msgstr "Lägg till tillåtna/avvisade anpassade kolumnvärden" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Ta bort den här användaren" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "Skapa Kobo Auth URL" diff --git a/cps/translations/tr/LC_MESSAGES/messages.mo b/cps/translations/tr/LC_MESSAGES/messages.mo index 410fa7199435ba50882cf72a8e19a0f76440869b..4b905164648eeecf104d145134af46c3b7e3e36f 100644 GIT binary patch delta 5554 zcmYM$32>Ih8Nl(4Nq}6Cg!>8~5OQ$`0udV^0%8yl3<~I23tk{v1VKyDzMf!JDp;X9 zN=L{0fTB?c6vuHCMo?2msJz!)NmC{r}I*?jek(I}3+lf)_jXAgyyW&-`e=8dJMs(t>Sc#9~ zP&|O6@JBR*!(G?0 z$FaB>&D?%;&%B3briduJVITDQkywBY{mH+nYT|-5T7lO1PPE1kpeb*`0k{)g*}Lcf zhtcOgMFagIUN0(3C+>}wumbaN1a`uDG*gXbFUaDrJ^!O=_~1?GK-Ir|{~zeUAE5z%i>9=5d0O*u)9j5NM{7B#D*d8O#PRgkpc6fXo$xs{qc5Sy_04$w{VMWr zP5#9NYxy0zqP*(#6WbL{StYs|Yq0}PLO0VX(R0ueT#g;__vrJR&_Mo-j`INe-gb0P zyi!g6JJC481<(JNNLE4t`8ySBaXPL=BYy=g(LwY#;B$1MEb8L*&S-#D=!!?ieghWJ zpNc*|2ea|qgvN<97U2ZE2VKECXkdph7muI=evSt6L$qL6TB^S2#5L%1qtSpS#rq56 z{Uz9b{?Uvl>u8vgyRZPap?hK%wg-S7uOrc)(HDCTPpw9G`$_0?bJ0DqH1=;oOS2Vy z?>RJp*N}OWa5&yLjtfpxY)>Wn#Tyy>=VNF3m!O$hgJvwjd|Z#dcL$oOyOD2N zcnmpE;dOLReAO=X|CWXW{eWg5Yh?PNC_=y0W$68L(eK3h=xMkT4eSwQ8-(}JPi_Zp zI?)jHz0=T@&&4iyJ{IE@ILh;XBMn#ZEOy2h(G|Rbg?JE6;Ro^h_vmx}#(F%vpwFL- zmDq&ya0UAQUM#|cSb`s-rTPyhc{B@@OX*)7uiuWY z_)q9*+KTS-omhptu>wEFQY;)p{oQ;6$fFUCMFTn+UE$1l{Ty_KOR*R)M+d$R9rz}^ zCW~{8_4J3;an$fav?PzCn|dGm{xS5o;paN?pP|ujTnOi311`g@Xdrpx(-n0^Gt?X1 zBW2hfYtR8FqZyiurugjGzck)ojV@pv8qfxG;ZG(sJPt3To9JD1McFK)D-Od(oQ!7Z zdUWEAXsRDZH`SA90K3t1zXuKYF#6s{Xz9L218hT2OH#66p*zXA>PZnVaG(0~r03p|cy zFrRw1|Np;|hMS@mop>tF$EN80XePc#11aHu6Rw~f9k3pqXf}F(A-dvA(Y>?=hvW9> zKXCy4{3+z$M$MG;7|y^x^p~M8ti!(e4A$ZSoPpU>)0)plCrr>yc?bI4xEC$y6KL&^ zqM1F0mhw9^;M{3RnwsKi>4am^l`ck)gd(z zxHljtG2DS1tnemUx;!?H?lI_?2XT=5Yah4=+p`ya6YvrkX2cR@E_KcuW7 zgH$6dMc;2hOZ5U4;j3tXZ=rkTlV~n=@HZlZjyGWr`R`0)A{VM~78c``=)mi-7v7Ft z@KG$rooImja5BD)KHp<*`Xf_@?v<(N2Wlz0;sgzB3mVw=x#ZvDwl6;TZ**7x93Sj^ zMw+@Y(Rt_qtI+{BpaDLJX6{9F^Sz2@qz%nTc5|A^6122s=)$WK8XlMNSb_~$iKnAA zzY2ZfesqE-V*hFM`Q2z{TG3N;2;Iz?d1GVA9E8c=Y4A%J+R%vW z&rElDBRavE(Ti~u{Wa(&dK`=KSv2)~(G|5~2H!_Z^b=b1{IggTmZS5m!aC3YH8d{Z zLJK-Tuleb~mDr7bJ^Edkg>KSi=)k{0Kg~B{1wIhnj|TP?8rTU7(hTRLffS<)sKGqX ze;o}6n1rV8A{>aza13rhGx0L^z=N^>2|B@#Xka;#w7J38(}3`43e zTE6nKMXOp?cYnKA%f=D+=Cmvw)0EY5bY|3v6Kcn`>>68=l~v#Jdfn#!Ee|zs&;8>c H7Jl*KMu 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 F{{Skxr_BHW diff --git a/cps/translations/tr/LC_MESSAGES/messages.po b/cps/translations/tr/LC_MESSAGES/messages.po index d108c2c36..6abf48bb5 100644 --- a/cps/translations/tr/LC_MESSAGES/messages.po +++ b/cps/translations/tr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2020-04-23 22:47+0300\n" "Last-Translator: iz \n" "Language: tr\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "yüklü değil" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "yüklü" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "İstatistikler" @@ -65,16 +65,16 @@ msgstr "Temel Ayarlar" msgid "UI Configuration" msgstr "Arayüz Ayarları" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "Tümü" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -82,7 +82,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" @@ -91,7 +91,7 @@ msgstr "" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -99,7 +99,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -267,9 +267,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -299,7 +299,7 @@ msgstr "E-posta sunucusu ayarları güncellendi" msgid "Database Configuration" msgstr "Özellik Yapılandırması" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Lütfen tüm alanları doldurun!" @@ -307,166 +307,166 @@ msgstr "Lütfen tüm alanları doldurun!" msgid "E-mail is not from valid domain" msgstr "E-posta izin verilen bir servisten değil" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Yeni kullanıcı ekle" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "'%(user)s' kullanıcısı oluşturuldu" -#: cps/admin.py:1369 +#: cps/admin.py:1371 #, fuzzy msgid "Found an existing account for this e-mail address or name." msgstr "Bu e-posta adresi veya kullanıcı adı için zaten bir hesap var." -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Kullanıcı '%(nick)s' silindi" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "Başka yönetici kullanıcı olmadığından silinemedi" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s kullanıcısını düzenle" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "'%(nick)s' kullanıcısı güncellendi" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz." -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Deneme e-postası gönderilirken bir hata oluştu: %(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "Lütfen önce e-posta adresinizi ayarlayın..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "E-posta sunucusu ayarları güncellendi" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "%(user)s kullanıcısının şifresi sıfırlandı" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Lütfen önce SMTP e-posta ayarlarını ayarlayın..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "Log dosyası görüntüleyici" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Güncelleme paketi isteniyor" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Güncelleme paketi indiriliyor" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Güncelleme paketi ayıklanıyor" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "Dosyalar değiştiriliyor" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "Veritabanı bağlantıları kapalı" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "Sunucu durduruyor" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Güncelleme tamamlandı, sayfayı yenilemek için lütfen Tamam'a tıklayınız" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "Güncelleme başarısız:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP Hatası" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "Bağlantı hatası" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "Bağlantı kurulmaya çalışırken zaman aşımına uğradı" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "Genel hata" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "%(filename)s dosyası geçici dizine kaydedilemedi" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -478,7 +478,7 @@ msgstr "ayarlanmadı" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -491,8 +491,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -529,7 +529,7 @@ msgstr "%(path)s dizini oluşturulamadı. (İzin reddedildi)" msgid "Failed to store file %(file)s." msgstr "%(file)s dosyası kaydedilemedi." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -687,7 +687,7 @@ msgstr "%(file)s dosyası Google Drive'da bulunamadı" msgid "Book path %(path)s not found on Google Drive" msgstr "eKitap yolu %(path)s Google Drive'da bulunamadı" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Bu e-posta adresi için bir hesap mevcut." @@ -721,34 +721,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "Bekleniyor" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "Başarısız" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "Başladı" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "Bitti" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "Bilinmeyen Durum" @@ -765,7 +769,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "%(provider)s ile Kaydol" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "giriş yaptınız: '%(nickname)s'" @@ -831,7 +835,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Giriş" @@ -847,7 +851,7 @@ msgstr "Token süresi doldu" msgid "Success! Please return to your device" msgstr "Başarılı! Lütfen cihazınıza dönün" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "eKitaplar" @@ -872,7 +876,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "" @@ -881,7 +885,7 @@ msgid "Show Top Rated Books" msgstr "" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Okunanlar" @@ -890,7 +894,7 @@ msgid "Show read and unread" msgstr "Okunan ve okunmayanları göster" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Okunmamışlar" @@ -908,7 +912,7 @@ msgid "Show Random Books" msgstr "Rastgele Kitap Göster" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Kategoriler" @@ -918,7 +922,7 @@ msgstr "Kategori seçimini göster" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Seriler" @@ -936,7 +940,7 @@ msgid "Show author selection" msgstr "Yazar seçimini göster" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "Yayıncılar" @@ -946,7 +950,7 @@ msgstr "Yayıncı seçimini göster" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Diller" @@ -970,7 +974,7 @@ msgstr "Biçimler" msgid "Show file formats selection" msgstr "Dosya biçimi seçimini göster" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -978,7 +982,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1006,9 +1010,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "eKitap kitaplığa eklendi: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "Bu kitaplığa eKitap eklemenize izin verilmiyor: %(name)s" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1031,58 +1034,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "eKitap kitaplıktan silindi: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Maalesef bu kitaplıktan eKitap silmenize izin verilmiyor: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Kitaplık oluştur" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Maalesef bu kitaplıktan eKitap silmenize izin verilmiyor: %(sname)s" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Kitaplığı düzenle" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s kitaplığı oluşturuldu." -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s kitaplığı değiştirildi" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Bir hata oluştu" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Kitaplık sıralamasını değiştir: '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Kitaplık: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kitaplık açılırken hata oluştu. Kitaplık mevcut değil ya da erişilebilir değil" @@ -1115,177 +1121,177 @@ msgstr "Yeni bir güncelleme mevcut. Son sürüme güncellemek için aşağıdak msgid "No release information available" msgstr "Sürüm bilgisi mevcut değil" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Keşfet (Rastgele)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "Yazar: %(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "Yayınevi: %(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Seri: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "Değerlendirme: %(rating)s yıldız" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "Biçim: %(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Dil: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Gelişmiş Arama" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Ara" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "Değerlendirme listesi" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "Biçim listesi" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "Görevler" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "Yayınlanma (sonra)" -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Yayınlanma (önce)" -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "Değerlendirme <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "Değerlendirme >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "%(kindlemail)s'a gönderilmek üzere başarıyla sıraya alındı" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Kayıt ol" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "E-posta adresinizle kaydolunmasına izin verilmiyor" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Onay e-Postası hesabınıza gönderildi." -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "LDAP Kimlik Doğrulaması etkinleştirilemiyor" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Yanlış Kullanıcı adı ya da Şifre" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "Yeni şifre e-Posta adresinize gönderildi" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "Şifrenizi sıfırlayabilmek için lütfen geçerli bir kullanıcı adı giriniz" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Giriş yaptınız: '%(nickname)s'" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s Profili" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Profil güncellendi" @@ -1298,31 +1304,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "eKitap-Dönüştürücü hatası: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1356,212 +1362,212 @@ msgstr "Yönetim" msgid "Password" msgstr "Şifre" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Yükleme" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "İndirme" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Düzenleme" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Sil" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "Şifreleme" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Ayarlar" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "Log Seviyesi" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Port" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "Ters Proxy Header Adı" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Calibre-Web yapılandırması güncellendi" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Yönetim" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "Güncelleme" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "Sürüm" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "Detaylar" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "Geçerli sürüm" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Güncelle" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "" @@ -1573,39 +1579,39 @@ msgstr "ile" msgid "In Library" msgstr "Kitaplıkta" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "azalt" @@ -1735,9 +1741,9 @@ msgid "Fetch Metadata" msgstr "" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1760,7 +1766,7 @@ msgstr "Yükleniyor..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Kapak" @@ -2240,49 +2246,49 @@ msgstr "İndirmeye İzin Ver" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Yüklemeye izin ver" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Düzenlemeye İzin ver" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Şifre değiştirmeye izin ver" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Genel Kitaplıkları düzenlemeye izin ver" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Dilleri Hariç Tut" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 msgid "Default Visible Language of Books" msgstr "" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2436,21 +2442,29 @@ msgstr "" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3059,15 +3073,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index 1e4731af8aaa839d8ee730f1c15b02d98111642a..15e812be21cbf44387e0065234e619427ec50254 100644 GIT binary patch delta 3582 zcmYM$4Xl?{9S88kOI*0X<(&&5+{+~h0Ra(tx#CL@A}ybIy65=lst3opYY? zpz^R@CBg#=zn@0RsUz)hUUA96UKWybaz8~8TU;k)e4UZM4CDZN^SR1n^eeAb^?x!m z&uDt0FO#96Redru;F;{jrL5(F6$(k=?Hs|cFeBVXzp~RM9q(f@b$}V*%S?y=W-`_+ z|H;faPUpG2h^v`_KFB=x7}MWx2FZWc;z)JlZB9@>#mscf;QD~3FeARas(+RVbSu;G z*O)!Am6`dyRr`-n{d3*4CQ=gU@Kg*W^0)xSjS|b z#svHUler!2${#bCd8lfCwrYQ#bG0AlQVtU2Jg%-OWW@I|soBYCe3Vo92D2nXty4Rv zaVBqK0zb&S|1j;-(phmO@f9nOT!r%uMGq0TwZ->R`RLEvq!US4b)z>fsyOXoI zfyuy=OzKZEfj^{QX)vk`d^FSFcxL7^IFj?L``1uX%k>RPu!9M(jMgvuc75Fw=f-U;&|?72KolG6epPHKVaT(a6}TX-zfRd%tvd8vnxB8 zRIXtLxR!Zg9W#T?vkb^q(kp4iO!e1Hr2SLXOl9b5lSEMo@rJ)Y0QJeNJj)t9t3 zOCcRC~dk^S?zQo9hG}fO3XO-EjHLCvp*c@-Ft`CN}aO`jz`#a-I*;tL0U8W8=hn%A1(e zw1|_qijq*aa&pf9-s;BdoZ&`)PbFmwIEx$kDL&0~++ba{u{Sq!2Q%ZcUtn{^sU)mM&;#Ity>zU2?TPD@7FkiTCQ|p-+Nlj%Ovs71B?Q57N zTgwb!7ZdPlX2#8K&gX?}|BRJvk+J(m^RtG0z>RBVR^cT(2+SV)d`mL8z633R#;| z%-W2(q`oB6m>Df$j>~ecOsPN2;HuZB&MTqP_%+nWb4pC$)Twt?cA^ zIsY$JH+s&kzc7QNJ+P2I3FQXf%J1_!_HqPTxt7_S_izLsXB&?)892pcVC*OBE@LM8 z9ggBYj=e(RsDfw9Y35vC?2sPSHJsZzb$0u-8J!=tT-&9~tj;fv9@^6R{w0_8_%G-0YpnnP delta 3794 zcmYM#dr*}{7{~F&3mORu8hC^Al7Na-ctZt)z_hH!P}9jT4$|YZR_%*J}dxn3%@P8oxZ$zs0|G(yFW8$d(h+Xjl_Q1>5>$cs*7!yT%q%{`#nSoq- z;xJ6W99y4`JRdO6QqaIv@c~rF>uvjosDK+W8BZcV zbB#+Z-o^~L}e(=)^kx4c?9pmg&5ESB@~pxS8)Kofr@Y&@-sm$>iBz9rcR*({1eq-5Av>z z4Mt@q3rAr-=3+G}&<50V$58#9?oIx+78mV}o0v|$d!O)3N1_7CLq$Bt)_tgfR-igw zjoK5NQ8WL{wttPpXpW%X|H;;WMZN!5AM&3=;a?iG3C9vmJkCG`R>DPVR*PDKRj3TC zMGg1`Ds#KA6YfD}X0L5;we9Dyfc6VG4F@sENURP}P{d!NQWL}x_$_AQ->3|vu};}o zfMf7w)W8j>_xBydrK8S8HiWKd9Qa#3sYC~BrNPy@_GrOJyM zpaiw%FX15Ehzejol0LZCl1IHjuCIJ=ra8!R|Q8S-}i8#aFuSAk+UcgwL|Me6U`KPEzn^2J- zMGbHTmC80GizbrwkV&WvWT7_UY}E55sDYQ*_E*uNz5z8(BeD%lGbZT#|E2=oLUk0! zPSk@bsQNh63yr8{IF5n>&B2Z@9_sl*)cf<2$iD{k z(Vz@0wXU_+qf&Yp72t8y^DU?uTtHUET*uBB!{<}&ai{@Pts|}ZsOO$U1vuRkFy?9m zyO{s1M-#%-Ci!(uFC;bXH2**m)Xg0V-9CQ3EZr?VllIn_c$)Db(J$fD`c_oQ&gB!^dzXj-kE- z70_iIjcI9|6b#Izpfz2C>gZ$Kjt!_(F61!l!6nH4G4(hNkD_LfKpvH$9Gr=ZQJeBx zct>Fjv>@$Ow0_Y zdNk@wHw%@CO5_pq5^AZo+xEk#B|DA^;1+7Ycp6!LQ;HMuT?{xB&QQ=UzJ*cPkGyN3 z6pY1O)PRN91!v&|e8$$dU?=MJSdCxe^O(%KjmOp415cp##Az(TJ0r>e(-eH8!YMw4 zHPqWtd!n4Js)0kO$j_n&wLS{eLA4J+J0806Y*>cs@C2%Z>!_LEO*&*Q&cSljDftmO zFs4sl_*Pf>8VQHyL$^J&KoV}3@x(3P#8jD3+$g~`Tp zEW%=JMF;aA4sXVVIDq;pycf5kGI0!*sTn!y97du52{!*u^__<1_ve;KrlK2i3HXLX#VGn;f^%39Srm2-Sr)I__b;={Bjs QxOMIxw;>cvf2bhxKO5uUT>t<8 diff --git a/cps/translations/uk/LC_MESSAGES/messages.po b/cps/translations/uk/LC_MESSAGES/messages.po index 131da18fe..40684c5c0 100644 --- a/cps/translations/uk/LC_MESSAGES/messages.po +++ b/cps/translations/uk/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n" "Last-Translator: ABIS Team \n" "Language: uk\n" @@ -15,17 +15,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "не встановлено" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "Статистика" @@ -64,17 +64,17 @@ msgstr "Настройки сервера" msgid "UI Configuration" msgstr "Конфігурація інтерфейсу" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 #, fuzzy msgid "Edit Users" msgstr "Керування сервером" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -82,7 +82,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Показати всі" @@ -91,7 +91,7 @@ msgstr "Показати всі" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -99,7 +99,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -270,9 +270,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -302,7 +302,7 @@ msgstr "З'єднання з базою даних закрите" msgid "Database Configuration" msgstr "Особливі налаштування" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "Будь-ласка, заповніть всі поля!" @@ -310,164 +310,164 @@ msgstr "Будь-ласка, заповніть всі поля!" msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "Додати користувача" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "Користувач '%(user)s' додан" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "Користувача '%(nick)s' видалено" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "Змінити користувача %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "Користувача '%(nick)s' оновлено" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "Змінити налаштування SMTP" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "Перевірка оновлень" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "Завантаження оновлень" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "Розпакування оновлення" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "З'єднання з базою даних закрите" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -479,7 +479,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -492,8 +492,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." @@ -530,7 +530,7 @@ msgstr "" msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -688,7 +688,7 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "" @@ -721,34 +721,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "" @@ -765,7 +769,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Ви увійшли як користувач: '%(nickname)s'" @@ -831,7 +835,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "Ім'я користувача" @@ -847,7 +851,7 @@ msgstr "Час дії токено вичерпано" msgid "Success! Please return to your device" msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "" @@ -872,7 +876,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "Книги з найкращим рейтингом" @@ -881,7 +885,7 @@ msgid "Show Top Rated Books" msgstr "Показувати книги з найвищим рейтингом" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "Прочитані книги" @@ -890,7 +894,7 @@ msgid "Show read and unread" msgstr "Показувати прочитані та непрочитані книги" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "Непрочитані книги" @@ -908,7 +912,7 @@ msgid "Show Random Books" msgstr "Показувати випадкові книги" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "Категорії" @@ -918,7 +922,7 @@ msgstr "Показувати вибір категорії" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "Серії" @@ -936,7 +940,7 @@ msgid "Show author selection" msgstr "Показувати вибір автора" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "" @@ -946,7 +950,7 @@ msgstr "" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "Мови" @@ -970,7 +974,7 @@ msgstr "" msgid "Show file formats selection" msgstr "" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -978,7 +982,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -1006,8 +1010,7 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "Книга додана на книжкову полицю: %(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgid "You are not allowed to add a book to the shelf" msgstr "" #: cps/shelf.py:144 @@ -1031,58 +1034,61 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга видалена з книжкової полиці: %(sname)s" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "створити книжкову полицю" -#: cps/shelf.py:236 +#: cps/shelf.py:241 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "Змінити книжкову полицю" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "Створена книжкова полиця %(title)s" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжкова полиця %(title)s змінена" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "Сталась помилка" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Змінити розташування книжкової полиці '%(name)s'" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжкова полиця: '%(name)s'" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" @@ -1115,177 +1121,177 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "Огляд (випадкові книги)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "Популярні книги (найбільш завантажувані)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "Серії: %(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "Категорія: %(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "Розширений пошук" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "Пошук" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "DLS" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "" -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "Опубліковано до" -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Помилка при відправці книги: %(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "Зареєструватись" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "Профіль %(name)s" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "Профіль оновлено" @@ -1298,31 +1304,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1356,212 +1362,212 @@ msgstr "Адмін" msgid "Password" msgstr "Пароль" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "Додати нову книгу" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "Завантажити" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "Редагувати" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "Видалити" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP-сервер" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP-порт" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "SSL" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP логін" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "Відправник" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "Налаштування сервера" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Папка Calibre DB" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "Порт" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "Кількість книг на сторінці" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "Загрузка на сервер" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "Анонімний перегляд" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "Публічна реєстрація" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 #, fuzzy msgid "Edit Calibre Database Configuration" msgstr "Папка Calibre DB" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "Адміністрування" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "Повторне підключення до БД Calibre" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "Перевірка оновлень" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "Встановити оновлення" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "Ok" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "Встановлення оновлень, будь-ласка, не оновлюйте сторінку" @@ -1573,39 +1579,39 @@ msgstr "через" msgid "In Library" msgstr "У бібліотеці" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "" @@ -1735,9 +1741,9 @@ msgid "Fetch Metadata" msgstr "Отримати метадані" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1760,7 +1766,7 @@ msgstr "Завантаження..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "Закрити" @@ -2239,50 +2245,50 @@ msgstr "Дозволити завантажувати з сервера" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "Дозволити завантаження на сервер" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "Дозволити редагування книг" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "Дозволити зміну пароля" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "Дозволити редагування публічних книжкових полиць" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "Виключити мови" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "Показувати книги на мовах" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "Можливості за замовчуванням для нових користувачів" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "Показувати випадкові книги при перегляді деталей" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2435,21 +2441,29 @@ msgstr "" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3054,15 +3068,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "Видалити цього користувача" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index b529a3588cb1595e29d364d348fac7c51f03b325..bdf51f02dd11171eff9799ba12c81b94facdd645 100644 GIT binary patch delta 11757 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 delta 11921 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 P)89Q(K5O~miMjp\n" "Language: zh_CN\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "未安装" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "已安装" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "统计" @@ -65,16 +65,16 @@ msgstr "基本配置" msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "管理用户" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "找不到用户" @@ -82,7 +82,7 @@ msgstr "找不到用户" msgid "{} users deleted successfully" msgstr "成功删除 {} 个用户" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "显示全部" @@ -91,7 +91,7 @@ msgstr "显示全部" msgid "Malformed request" msgstr "格式错误的请求" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "访客名称无法更改" @@ -99,7 +99,7 @@ msgstr "访客名称无法更改" msgid "Guest can't have this role" msgstr "游客无法拥有此角色" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "理员账户不存在,无法删除管理员角色" @@ -266,9 +266,9 @@ msgstr "LDAP成员用户过滤器中有不匹配的括号" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA证书、证书或密钥位置无效,请输入正确的路径" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "设置数据库不可写入" @@ -297,7 +297,7 @@ msgstr "邮件服务器设置已更新" msgid "Database Configuration" msgstr "数据库配置" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "请填写所有字段!" @@ -305,165 +305,165 @@ msgstr "请填写所有字段!" msgid "E-mail is not from valid domain" msgstr "邮箱不在有效域中" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "添加新用户" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "用户“%(user)s”已创建" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "使用此邮箱或用户名的账号已经存在。" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户“%(nick)s”已删除" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "无法删除游客用户" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "管理员账户不存在,无法删除用户" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "用户“%(nick)s”已更新" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "编辑邮件服务器设置" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "G-Mail账号校验成功" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "发送给%(email)s的测试邮件已进入队列。请检查任务结果" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "发送测试邮件时出错:%(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "请先配置您的邮箱地址..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "邮件服务器设置已更新" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置SMTP邮箱设置..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "日志文件查看器" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "正在替换文件" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "正在停止服务器" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请点击确定并刷新页面" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "更新失败:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP错误" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "连接错误" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "建立连接超时" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "一般错误" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "更新文件无法保存在临时目录中" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "未能提取至少一个LDAP用户" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "未能创建至少一个LDAP用户" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "错误:%(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "错误:在LDAP服务器的响应中没有返回用户" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "数据库中没有找到至少一个LDAP用户" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} 用户被成功导入" @@ -475,7 +475,7 @@ msgstr "未配置" msgid "Execution permissions missing" msgstr "缺少执行权限" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "自定义列号:%(column)d在Calibre数据库中不存在" @@ -488,8 +488,8 @@ msgstr "书籍格式已成功删除" msgid "Book Successfully Deleted" msgstr "书籍已成功删除" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "糟糕!选择书名无法打开。文件不存在或者文件不可访问" @@ -526,7 +526,7 @@ msgstr "创建路径 %(path)s 失败(权限拒绝)。" msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失败。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "数据库错误:%(error)s。" @@ -684,7 +684,7 @@ msgstr "Google Drive上找不到文件 %(file)s" msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到书籍路径 %(path)s" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "使用此邮箱的账号已经存在。" @@ -717,34 +717,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "封面文件只支持jpg/jpeg/png/webp/bmp文件" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "仅将jpg、jpeg文件作为封面文件" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "找不到Unrar执行文件" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "执行UnRar时出错" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "等待中" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "失败" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "已开始" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "已完成" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "未知状态" @@ -761,7 +765,7 @@ msgstr "Kobo 设置" msgid "Register with %(provider)s" msgstr "使用 %(provider)s 注册" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" @@ -827,7 +831,7 @@ msgid "{} Stars" msgstr "{} 星" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "登录" @@ -843,7 +847,7 @@ msgstr "Token已过期" msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "书籍" @@ -868,7 +872,7 @@ msgstr "下载历史" msgid "Show Downloaded Books" msgstr "显示下载过的书籍" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "最高评分书籍" @@ -877,7 +881,7 @@ msgid "Show Top Rated Books" msgstr "显示最高评分书籍" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "已读书籍" @@ -886,7 +890,7 @@ msgid "Show read and unread" msgstr "显示阅读状态" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "未读书籍" @@ -904,7 +908,7 @@ msgid "Show Random Books" msgstr "显示随机书籍" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "分类" @@ -914,7 +918,7 @@ msgstr "显示分类选择" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "丛书" @@ -932,7 +936,7 @@ msgid "Show author selection" msgstr "显示作者选择" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "出版社" @@ -942,7 +946,7 @@ msgstr "显示出版社选择" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "语言" @@ -966,7 +970,7 @@ msgstr "文件格式" msgid "Show file formats selection" msgstr "显示文件格式选择" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "归档书籍" @@ -974,7 +978,7 @@ msgstr "归档书籍" msgid "Show archived books" msgstr "显示归档书籍" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "书籍列表" @@ -1001,9 +1005,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "此书籍已被添加到书架:%(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "您没有添加书籍到书架 %(name)s 的权限" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1026,57 +1029,60 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "此书已从书架 %(sname)s 中删除" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "创建书架" -#: cps/shelf.py:236 +#: cps/shelf.py:241 msgid "Sorry you are not allowed to edit this shelf" msgstr "对不起,您没有编辑这个书架的权限" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已创建" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已修改" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "发生错误" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "公共书架:%(title)s已经存在已经存在。" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有书架:%(title)s已经存在已经存在。" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 %(name)s 顺序" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架:%(name)s" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" @@ -1109,177 +1115,177 @@ msgstr "有新的更新。单击下面的按钮以更新到版本: %(version)s" msgid "No release information available" msgstr "无可用发布信息" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "发现(随机书籍)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "热门书籍(最多下载)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下载过的书籍" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "丛书:%(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "评分:%(rating)s 星" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "分类:%(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "语言:%(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "高级搜索" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "搜索" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "下载次数" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "评分列表" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "文件格式列表" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "任务列表" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "出版时间晚于 " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "出版时间早于 " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "评分 <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "评分 >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "阅读状态 = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜索自定义列时出错,请重启 Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "书籍已经成功加入 %(kindlemail)s 的发送队列" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "请先配置您的kindle邮箱。" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "邮件服务未配置,请联系网站管理员!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "注册" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "您的电子邮件不允许注册" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "确认邮件已经发送到您的邮箱。" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "无法激活LDAP认证" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "后备登录“%(nickname)s”:无法访问LDAP服务器,或用户未知" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "无法登录:%(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "新密码已发送到您的邮箱" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "请输入有效的用户名进行密码重置" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”登录" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的用户配置" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "资料已更新" @@ -1292,31 +1298,31 @@ msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre 电子书转换器%(tool)s没有发现" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "硬盘上找不到 %(format)s 格式" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "发生未知错误,书籍转换失败" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 转换失败:%(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到转换后的文件或文件夹%(folder)s中有多个文件" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "电子书转换器失败: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 运行失败,错误信息:%(error)s" @@ -1350,211 +1356,211 @@ msgstr "管理权限" msgid "Password" msgstr "密码" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "上传书籍" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "下载书籍" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "查看书籍" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "编辑书籍" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "删除数据" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "公共书架" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "添加新用户" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "导入LDAP用户" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "SMTP邮件服务器设置" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP主机名" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP端口" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "加密" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP用户名" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "发件人邮箱" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "电子邮件服务" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "通过Oauth2的Gmail" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "配置" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre 数据库路径" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "日志级别" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "端口" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "扩展端口" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "每页书籍数" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "上传" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "匿名浏览" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "开放注册" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "魔法链接远程登录" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "反向代理登录" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "反向代理头部名称" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "编辑Calibre数据库配置" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "编辑基本配置" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "编辑界面配置" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "下载Debug包" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "查看日志文件" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "重新连接到Calibre数据库" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "重启" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "停止" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "更新" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "版本" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "详情" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "当前版本" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "检查更新" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "执行更新" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "您确定要重启吗?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "确定" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "取消" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "您确定要关闭吗?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "正在更新,请不要刷新页面" @@ -1566,39 +1572,39 @@ msgstr "通过" msgid "In Library" msgstr "在书库" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "按图书日期排序,最新优先" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "按图书日期排序,最旧优先" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "按标题按字母顺序排序" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "按标题逆字母顺序排序" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "按出版日期排序,最新优先" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "按出版日期排序,最旧优先" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "减少" @@ -1728,9 +1734,9 @@ msgid "Fetch Metadata" msgstr "获取元数据" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "保存" @@ -1753,7 +1759,7 @@ msgstr "加载中..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "关闭" @@ -2233,50 +2239,50 @@ msgstr "允许下载书籍" msgid "Allow eBook Viewer" msgstr "允许在线阅读" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "允许上传书籍" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "允许编辑书籍" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "允许删除书籍" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "允许修改密码" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "允许编辑公共书架" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "排除语言" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "按语言显示书籍" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "新用户默认显示权限" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "在主页显示随机书籍" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "添加显示或隐藏书籍的标签值" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "添加显示或隐藏书籍的自定义栏目值" @@ -2429,21 +2435,29 @@ msgstr "回到首页" msgid "Logout User" msgstr "登出账号" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "按作者字母顺序排序" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "按作者逆字母顺序排序" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "按丛书编号排序" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "按丛书编号逆排序" @@ -3045,15 +3059,15 @@ msgstr "新建或查看" msgid "Add allowed/Denied Custom Column Values" msgstr "添加显示或隐藏书籍的自定义栏目值" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "仅同步所选书架中的书籍到 Kobo" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "删除此用户" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "生成Kobo Auth 地址" diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo index c3dea789fbd5233a95d206d957702bea67c6fd84..037dec2313027c16e82f0fc031cb4f246d1e1719 100644 GIT binary patch delta 11774 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 X={L5{`S*K^GH)F&n|\n" "Language: zh_TW\n" @@ -16,17 +16,17 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "未安裝" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "已安裝" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "統計" @@ -65,16 +65,16 @@ msgstr "基本配置" msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "管理用戶" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "找不到用戶" @@ -82,7 +82,7 @@ msgstr "找不到用戶" msgid "{} users deleted successfully" msgstr "成功刪除 {} 個用戶" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "顯示全部" @@ -91,7 +91,7 @@ msgstr "顯示全部" msgid "Malformed request" msgstr "格式錯誤的請求" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "訪客名稱無法更改" @@ -99,7 +99,7 @@ msgstr "訪客名稱無法更改" msgid "Guest can't have this role" msgstr "遊客無法擁有此角色" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "管理員賬戶不存在,無法刪除管理員角色" @@ -266,9 +266,9 @@ msgstr "LDAP成員用戶過濾器中有不匹配的括號" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA證書、證書或密鑰位置無效,請輸入正確的路徑" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "設置數據庫不可寫入" @@ -297,7 +297,7 @@ msgstr "郵件服務器設置已更新" msgid "Database Configuration" msgstr "數據庫配置" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "請填寫所有欄位!" @@ -305,165 +305,165 @@ msgstr "請填寫所有欄位!" msgid "E-mail is not from valid domain" msgstr "郵箱不在有效網域中" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "添加新用戶" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "用戶“%(user)s”已創建" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "使用此郵箱或用戶名的賬號已經存在。" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "用戶“%(nick)s”已刪除" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "無法刪除訪客用戶" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "管理員賬戶不存在,無法刪除用戶" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "編輯用戶 %(nick)s" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "用戶“%(nick)s”已更新" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "發生一個未知錯誤,請稍後再試。" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "編輯郵件服務器設置" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "G-Mail賬號驗證成功" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "發送給%(email)s的測試郵件已進入隊列。請檢查任務結果" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "發送測試郵件時出錯:%(res)s" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "請先配置您的郵箱地址..." -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "郵件服務器設置已更新" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "用戶 %(user)s 的密碼已重置" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "請先配置SMTP郵箱設置..." -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "日誌文件查看器" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "正在請求更新包" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "正在下載更新包" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "正在解壓更新包" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "正在替換文件" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "數據庫連接已關閉" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "正在停止服務器" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "更新完成,請點擊確定並刷新頁面" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "更新失敗:" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "HTTP錯誤" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "連接錯誤" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "建立連接超時" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "一般錯誤" -#: cps/admin.py:1696 +#: cps/admin.py:1701 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "更新文件無法保存在臨時目錄中" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "更新時檔案無法替換變更" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "未能提取至少一個LDAP用戶" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "未能創建至少一個LDAP用戶" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "錯誤:%(ldaperror)s" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "錯誤:在LDAP服務器的響應中沒有返回用戶" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "數據庫中沒有找到至少一個LDAP用戶" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "{} 用戶被成功導入" @@ -475,7 +475,7 @@ msgstr "未配置" msgid "Execution permissions missing" msgstr "缺少執行權限" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "自定義列號:%(column)d在Calibre數據庫中不存在" @@ -488,8 +488,8 @@ msgstr "書籍格式已成功刪除" msgid "Book Successfully Deleted" msgstr "書籍已成功刪除" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "糟糕!選擇書名無法打開。文件不存在或者文件不可訪問" @@ -526,7 +526,7 @@ msgstr "創建路徑 %(path)s 失敗(權限拒絕)。" msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失敗。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "數據庫錯誤:%(error)s。" @@ -684,7 +684,7 @@ msgstr "Google Drive上找不到文件 %(file)s" msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到書籍路徑 %(path)s" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "使用此郵箱的賬號已經存在。" @@ -717,34 +717,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "封面文件只支持jpg/jpeg/png/webp/bmp格式文件" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "僅將jpg、jpeg文件作為封面文件" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "找不到Unrar執行文件" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "執行UnRar時出錯" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "等待中" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "失敗" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "已開始" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "已完成" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "未知狀態" @@ -761,7 +765,7 @@ msgstr "Kobo 設置" msgid "Register with %(provider)s" msgstr "使用 %(provider)s 註冊" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”身份登入" @@ -827,7 +831,7 @@ msgid "{} Stars" msgstr "{} 星" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "登入" @@ -843,7 +847,7 @@ msgstr "Token已過期" msgid "Success! Please return to your device" msgstr "成功!請返回您的設備" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "書籍" @@ -868,7 +872,7 @@ msgstr "已下載書籍" msgid "Show Downloaded Books" msgstr "顯示下載過的書籍" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "最高評分書籍" @@ -877,7 +881,7 @@ msgid "Show Top Rated Books" msgstr "顯示最高評分書籍" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "已讀書籍" @@ -886,7 +890,7 @@ msgid "Show read and unread" msgstr "顯示閱讀狀態" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "未讀書籍" @@ -904,7 +908,7 @@ msgid "Show Random Books" msgstr "隨機顯示書籍" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "分類" @@ -914,7 +918,7 @@ msgstr "顯示分類選擇" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "叢書" @@ -932,7 +936,7 @@ msgid "Show author selection" msgstr "顯示作者選擇" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "出版社" @@ -942,7 +946,7 @@ msgstr "顯示出版社選擇" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "語言" @@ -966,7 +970,7 @@ msgstr "文件格式" msgid "Show file formats selection" msgstr "顯示文件格式選擇" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "歸檔書籍" @@ -974,7 +978,7 @@ msgstr "歸檔書籍" msgid "Show archived books" msgstr "顯示歸檔書籍" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "書籍列表" @@ -1001,9 +1005,8 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "此書籍已被添加到書架:%(sname)s" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" -msgstr "您沒有添加書籍到書架 %(name)s 的權限" +msgid "You are not allowed to add a book to the shelf" +msgstr "" #: cps/shelf.py:144 #, python-format @@ -1026,57 +1029,60 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "此書已從書架 %(sname)s 中刪除" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" -msgstr "對不起,您沒有從書架 %(sname)s 中刪除書籍的權限" +msgid "Sorry you are not allowed to remove a book from this shelf" +msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "創建書架" -#: cps/shelf.py:236 +#: cps/shelf.py:241 msgid "Sorry you are not allowed to edit this shelf" msgstr "對不起,您沒有編輯這個書架的權限" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "編輯書架" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "書架 %(title)s 已創建" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "書架 %(title)s 已修改" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "發生錯誤" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "公共書架:%(title)s已經存在已經存在。" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有書架:%(title)s已經存在。" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改書架 %(name)s 順序" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "書架:%(name)s" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打開書架出錯。書架不存在或不可訪問" @@ -1109,177 +1115,177 @@ msgstr "有新的更新。單擊下面的按鈕以更新到版本: %(version)s" msgid "No release information available" msgstr "無可用發佈信息" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "發現(隨機書籍)" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "熱門書籍(最多下載)" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下載過的書籍" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "叢書:%(serie)s" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "評分:%(rating)s 星" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "分類:%(name)s" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "語言:%(name)s" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "進階搜尋" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "搜尋" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "下載次數" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "評分列表" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "文件格式列表" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "任務列表" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "出版時間晚於 " -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "出版時間早於 " -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "評分 <= %(rating)s" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "評分 >= %(rating)s" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "閱讀狀態 = %(status)s" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜詢自定義欄位時出錯,請重啟 Calibre-Web" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "書籍已經成功加入 %(kindlemail)s 的發送隊列" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "糟糕!發送這本書籍的時候出現錯誤:%(res)s" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "請先設置您的kindle郵箱。" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "郵件服務未配置,請聯繫網站管理員!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "註冊" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "您的電子郵件不允許註冊" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認郵件已經發送到您的郵箱。" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "無法激活LDAP認證" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "備援登入“%(nickname)s”:無法訪問LDAP伺服器,或用戶未知" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "無法登入:%(message)s" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "用戶名或密碼錯誤" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "新密碼已發送到您的郵箱" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "請輸入有效的用戶名進行密碼重置" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”登入" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的用戶配置" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "資料已更新" @@ -1292,31 +1298,31 @@ msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" msgid "Calibre ebook-convert %(tool)s not found" msgstr "沒有發現Calibre 電子書轉換器%(tool)s" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "硬碟上找不到 %(format)s 格式" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "發生未知錯誤,書籍轉換失敗" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 轉換失敗:%(error)s" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到轉換後的文件或文件夾%(folder)s中有多個文件" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "電子書轉換器失敗: %(error)s" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 運行失敗,錯誤信息:%(error)s" @@ -1350,211 +1356,211 @@ msgstr "管理權限" msgid "Password" msgstr "密碼" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "上傳書籍" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "下載書籍" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "查看書籍" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "編輯書籍" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "刪除數據" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "公共書架" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "添加新用戶" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "導入LDAP用戶" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "SMTP郵件服務器設置" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "SMTP主機名" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "SMTP端口" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "加密" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "SMTP用戶名" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "發信人郵箱" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "電子郵件服務" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "通過Oauth2的Gmail" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "配置" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "Calibre 數據庫路徑" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "日誌級別" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "端口" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "擴展端口" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "每頁書籍數" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "上傳" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "匿名瀏覽" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "開放註冊" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "魔法連接遠程登錄" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "反向代理登入" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "反向代理標頭名稱" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "編輯Calibre數據庫配置" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "編輯基本配置" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "編輯界面配置" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "管理" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "下載除錯包" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "查看日誌文件" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "重新連接到Calibre數據庫" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "重啟" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "停止" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "更新" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "版本" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "詳情" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "當前版本" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "檢查更新" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "執行更新" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "您確定要重啟嗎?" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "確定" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "取消" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "您確定要關閉嗎?" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "正在更新,請不要刷新頁面" @@ -1566,39 +1572,39 @@ msgstr "通過" msgid "In Library" msgstr "在書庫" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "按圖書日期排序,最新優先" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "按圖書日期排序,最舊優先" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "按標題按字母順序排序" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "按標題逆字母順序排序" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "按出版日期排序,最新優先" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "按出版日期排序,最舊優先" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "減少" @@ -1728,9 +1734,9 @@ msgid "Fetch Metadata" msgstr "獲取元數據" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "儲存" @@ -1753,7 +1759,7 @@ msgstr "加載中..." #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "關閉" @@ -2233,50 +2239,50 @@ msgstr "允許下載書籍" msgid "Allow eBook Viewer" msgstr "允許在線閱讀" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "允許上傳書籍" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "允許編輯書籍" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "允許刪除書籍" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "允許修改密碼" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "允許編輯公共書架" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 #, fuzzy msgid "Default Language" msgstr "預設語言" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 #, fuzzy msgid "Default Visible Language of Books" msgstr "按預設語言顯示書籍" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "新用戶默認顯示權限" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "在主頁顯示隨機書籍" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "添加顯示或隱藏書籍的標籤值" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "添加顯示或隱藏書籍的自定義欄位值" @@ -2429,21 +2435,29 @@ msgstr "回到首頁" msgid "Logout User" msgstr "登出賬號" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "按作者字母順序排序" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "按作者逆字母順序排序" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "按叢書編號排序" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "按叢書編號逆排序" @@ -3045,15 +3059,15 @@ msgstr "新建或查看" msgid "Add allowed/Denied Custom Column Values" msgstr "添加顯示或隱藏書籍的自定義欄位值" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "僅同步所選書架中的書籍到 Kobo" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "刪除此用戶" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "生成Kobo Auth 地址" diff --git a/messages.pot b/messages.pot index b180986a2..ad2d6482b 100644 --- a/messages.pot +++ b/messages.pot @@ -8,24 +8,24 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-20 11:24+0100\n" +"POT-Creation-Date: 2021-11-21 09:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.0\n" +"Generated-By: Babel 2.8.0\n" -#: cps/about.py:34 cps/about.py:48 cps/about.py:64 cps/converter.py:31 +#: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" msgstr "" -#: cps/about.py:46 cps/about.py:62 +#: cps/about.py:47 cps/about.py:63 msgid "installed" msgstr "" -#: cps/about.py:117 +#: cps/about.py:138 msgid "Statistics" msgstr "" @@ -64,16 +64,16 @@ msgstr "" msgid "UI Configuration" msgstr "" -#: cps/admin.py:277 cps/templates/admin.html:46 +#: cps/admin.py:277 cps/templates/admin.html:50 msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:14 cps/templates/list.html:14 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:343 cps/admin.py:1572 +#: cps/admin.py:343 cps/admin.py:1576 msgid "User not found" msgstr "" @@ -81,7 +81,7 @@ msgstr "" msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:379 cps/templates/config_view_edit.html:129 +#: cps/admin.py:379 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" @@ -90,7 +90,7 @@ msgstr "" msgid "Malformed request" msgstr "" -#: cps/admin.py:418 cps/admin.py:1452 +#: cps/admin.py:418 cps/admin.py:1454 msgid "Guest Name can't be changed" msgstr "" @@ -98,7 +98,7 @@ msgstr "" msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:442 cps/admin.py:1410 +#: cps/admin.py:442 cps/admin.py:1412 msgid "No admin user remaining, can't remove admin role" msgstr "" @@ -265,9 +265,9 @@ msgstr "" msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1373 cps/admin.py:1479 -#: cps/admin.py:1547 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:270 cps/shelf.py:331 cps/shelf.py:366 cps/shelf.py:441 +#: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 +#: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 +#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 msgid "Settings DB is not Writeable" msgstr "" @@ -295,7 +295,7 @@ msgstr "" msgid "Database Configuration" msgstr "" -#: cps/admin.py:1340 cps/web.py:1471 +#: cps/admin.py:1340 cps/web.py:1497 msgid "Please fill out all fields!" msgstr "" @@ -303,164 +303,164 @@ msgstr "" msgid "E-mail is not from valid domain" msgstr "" -#: cps/admin.py:1352 cps/admin.py:1500 +#: cps/admin.py:1354 cps/admin.py:1504 msgid "Add new user" msgstr "" -#: cps/admin.py:1363 +#: cps/admin.py:1365 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/admin.py:1369 +#: cps/admin.py:1371 msgid "Found an existing account for this e-mail address or name." msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1391 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/admin.py:1391 cps/admin.py:1392 +#: cps/admin.py:1393 cps/admin.py:1394 msgid "Can't delete Guest User" msgstr "" -#: cps/admin.py:1395 +#: cps/admin.py:1397 msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:1467 cps/admin.py:1590 +#: cps/admin.py:1470 cps/admin.py:1595 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/admin.py:1471 +#: cps/admin.py:1474 #, python-format msgid "User '%(nick)s' updated" msgstr "" -#: cps/admin.py:1475 cps/admin.py:1605 cps/web.py:1496 cps/web.py:1559 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1509 cps/templates/admin.html:94 +#: cps/admin.py:1513 cps/templates/admin.html:98 msgid "Edit E-mail Server Settings" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1532 msgid "Gmail Account Verification Successful" msgstr "" -#: cps/admin.py:1554 +#: cps/admin.py:1558 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1557 +#: cps/admin.py:1561 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1559 +#: cps/admin.py:1563 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1561 +#: cps/admin.py:1565 msgid "E-mail server settings updated" msgstr "" -#: cps/admin.py:1602 +#: cps/admin.py:1607 #, python-format msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1608 cps/web.py:1436 +#: cps/admin.py:1613 cps/web.py:1462 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/admin.py:1619 +#: cps/admin.py:1624 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1685 +#: cps/admin.py:1690 msgid "Requesting update package" msgstr "" -#: cps/admin.py:1686 +#: cps/admin.py:1691 msgid "Downloading update package" msgstr "" -#: cps/admin.py:1687 +#: cps/admin.py:1692 msgid "Unzipping update package" msgstr "" -#: cps/admin.py:1688 +#: cps/admin.py:1693 msgid "Replacing files" msgstr "" -#: cps/admin.py:1689 +#: cps/admin.py:1694 msgid "Database connections are closed" msgstr "" -#: cps/admin.py:1690 +#: cps/admin.py:1695 msgid "Stopping server" msgstr "" -#: cps/admin.py:1691 +#: cps/admin.py:1696 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/admin.py:1692 cps/admin.py:1693 cps/admin.py:1694 cps/admin.py:1695 -#: cps/admin.py:1696 cps/admin.py:1697 +#: cps/admin.py:1697 cps/admin.py:1698 cps/admin.py:1699 cps/admin.py:1700 +#: cps/admin.py:1701 cps/admin.py:1702 msgid "Update failed:" msgstr "" -#: cps/admin.py:1692 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 +#: cps/admin.py:1697 cps/updater.py:385 cps/updater.py:595 cps/updater.py:597 msgid "HTTP Error" msgstr "" -#: cps/admin.py:1693 cps/updater.py:387 cps/updater.py:599 +#: cps/admin.py:1698 cps/updater.py:387 cps/updater.py:599 msgid "Connection error" msgstr "" -#: cps/admin.py:1694 cps/updater.py:389 cps/updater.py:601 +#: cps/admin.py:1699 cps/updater.py:389 cps/updater.py:601 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1695 cps/updater.py:391 cps/updater.py:603 +#: cps/admin.py:1700 cps/updater.py:391 cps/updater.py:603 msgid "General error" msgstr "" -#: cps/admin.py:1696 +#: cps/admin.py:1701 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1697 +#: cps/admin.py:1702 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1721 +#: cps/admin.py:1726 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1766 +#: cps/admin.py:1771 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1779 +#: cps/admin.py:1784 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1783 +#: cps/admin.py:1788 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1816 +#: cps/admin.py:1821 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1818 +#: cps/admin.py:1823 msgid "{} User Successfully Imported" msgstr "" @@ -472,7 +472,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:649 cps/web.py:1148 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -485,8 +485,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:511 cps/web.py:1698 -#: cps/web.py:1739 cps/web.py:1806 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 +#: cps/web.py:1765 cps/web.py:1832 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -523,7 +523,7 @@ msgstr "" msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1659 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -681,7 +681,7 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:507 cps/web.py:1654 +#: cps/helper.py:507 cps/web.py:1680 msgid "Found an existing account for this e-mail address" msgstr "" @@ -714,34 +714,38 @@ msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" #: cps/helper.py:651 +msgid "Invalid cover file content" +msgstr "" + +#: cps/helper.py:655 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:703 +#: cps/helper.py:707 msgid "Unrar binary file not found" msgstr "" -#: cps/helper.py:714 +#: cps/helper.py:718 msgid "Error excecuting UnRar" msgstr "" -#: cps/helper.py:762 +#: cps/helper.py:766 msgid "Waiting" msgstr "" -#: cps/helper.py:764 +#: cps/helper.py:768 msgid "Failed" msgstr "" -#: cps/helper.py:766 +#: cps/helper.py:770 msgid "Started" msgstr "" -#: cps/helper.py:768 +#: cps/helper.py:772 msgid "Finished" msgstr "" -#: cps/helper.py:770 +#: cps/helper.py:774 msgid "Unknown Status" msgstr "" @@ -758,7 +762,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1530 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" @@ -824,7 +828,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1579 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 msgid "Login" msgstr "" @@ -840,7 +844,7 @@ msgstr "" msgid "Success! Please return to your device" msgstr "" -#: cps/render_template.py:39 cps/web.py:413 +#: cps/render_template.py:39 cps/web.py:421 msgid "Books" msgstr "" @@ -865,7 +869,7 @@ msgstr "" msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:427 +#: cps/render_template.py:56 cps/templates/index.xml:32 cps/web.py:435 msgid "Top Rated Books" msgstr "" @@ -874,7 +878,7 @@ msgid "Show Top Rated Books" msgstr "" #: cps/render_template.py:59 cps/templates/index.xml:54 -#: cps/templates/index.xml:58 cps/web.py:658 +#: cps/templates/index.xml:58 cps/web.py:681 msgid "Read Books" msgstr "" @@ -883,7 +887,7 @@ msgid "Show read and unread" msgstr "" #: cps/render_template.py:63 cps/templates/index.xml:61 -#: cps/templates/index.xml:65 cps/web.py:661 +#: cps/templates/index.xml:65 cps/web.py:684 msgid "Unread Books" msgstr "" @@ -901,7 +905,7 @@ msgid "Show Random Books" msgstr "" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1035 +#: cps/templates/index.xml:83 cps/web.py:1060 msgid "Categories" msgstr "" @@ -911,7 +915,7 @@ msgstr "" #: cps/render_template.py:72 cps/templates/book_edit.html:90 #: cps/templates/book_table.html:68 cps/templates/index.xml:90 -#: cps/templates/search_form.html:69 cps/web.py:930 cps/web.py:940 +#: cps/templates/search_form.html:69 cps/web.py:954 cps/web.py:965 msgid "Series" msgstr "" @@ -929,7 +933,7 @@ msgid "Show author selection" msgstr "" #: cps/render_template.py:79 cps/templates/book_table.html:72 -#: cps/templates/index.xml:76 cps/web.py:907 +#: cps/templates/index.xml:76 cps/web.py:931 msgid "Publishers" msgstr "" @@ -939,7 +943,7 @@ msgstr "" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1012 +#: cps/web.py:1037 msgid "Languages" msgstr "" @@ -963,7 +967,7 @@ msgstr "" msgid "Show file formats selection" msgstr "" -#: cps/render_template.py:93 cps/web.py:685 +#: cps/render_template.py:93 cps/web.py:708 msgid "Archived Books" msgstr "" @@ -971,7 +975,7 @@ msgstr "" msgid "Show archived books" msgstr "" -#: cps/render_template.py:97 cps/web.py:761 +#: cps/render_template.py:97 cps/web.py:785 msgid "Books List" msgstr "" @@ -998,8 +1002,7 @@ msgid "Book has been added to shelf: %(sname)s" msgstr "" #: cps/shelf.py:126 -#, python-format -msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgid "You are not allowed to add a book to the shelf" msgstr "" #: cps/shelf.py:144 @@ -1023,57 +1026,60 @@ msgid "Book has been removed from shelf: %(sname)s" msgstr "" #: cps/shelf.py:218 -#, python-format -msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 cps/templates/layout.html:142 +#: cps/shelf.py:228 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:232 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "" -#: cps/shelf.py:236 +#: cps/shelf.py:241 msgid "Sorry you are not allowed to edit this shelf" msgstr "" -#: cps/shelf.py:238 +#: cps/shelf.py:243 msgid "Edit a shelf" msgstr "" -#: cps/shelf.py:257 +#: cps/shelf.py:262 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/shelf.py:260 +#: cps/shelf.py:265 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/shelf.py:274 +#: cps/shelf.py:279 msgid "There was an error" msgstr "" -#: cps/shelf.py:296 +#: cps/shelf.py:301 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:307 +#: cps/shelf.py:312 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:376 +#: cps/shelf.py:381 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:446 +#: cps/shelf.py:451 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:450 +#: cps/shelf.py:455 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" @@ -1106,177 +1112,177 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:5 cps/web.py:437 +#: cps/templates/index.html:5 cps/web.py:445 msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:463 +#: cps/web.py:476 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:496 +#: cps/web.py:512 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:527 +#: cps/web.py:544 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:542 +#: cps/web.py:559 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:555 +#: cps/web.py:574 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:568 +#: cps/web.py:587 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:581 +#: cps/web.py:602 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:597 +#: cps/web.py:620 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:613 +#: cps/web.py:636 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/layout.html:56 cps/web.py:719 cps/web.py:1364 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 msgid "Advanced Search" msgstr "" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:732 cps/web.py:1070 +#: cps/web.py:755 cps/web.py:1095 msgid "Search" msgstr "" -#: cps/templates/admin.html:16 cps/web.py:885 +#: cps/templates/admin.html:16 cps/web.py:909 msgid "Downloads" msgstr "" -#: cps/web.py:961 +#: cps/web.py:986 msgid "Ratings list" msgstr "" -#: cps/web.py:982 +#: cps/web.py:1007 msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1049 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 msgid "Tasks" msgstr "" -#: cps/web.py:1208 +#: cps/web.py:1233 msgid "Published after " msgstr "" -#: cps/web.py:1215 +#: cps/web.py:1240 msgid "Published before " msgstr "" -#: cps/web.py:1237 +#: cps/web.py:1262 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:1239 +#: cps/web.py:1264 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:1241 +#: cps/web.py:1266 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1346 +#: cps/web.py:1371 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1441 +#: cps/web.py:1467 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1445 +#: cps/web.py:1471 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1447 +#: cps/web.py:1473 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1464 +#: cps/web.py:1490 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1465 -#: cps/web.py:1472 cps/web.py:1478 cps/web.py:1497 cps/web.py:1501 -#: cps/web.py:1507 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 +#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 +#: cps/web.py:1533 msgid "Register" msgstr "" -#: cps/web.py:1499 +#: cps/web.py:1525 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1502 +#: cps/web.py:1528 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1519 +#: cps/web.py:1545 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1538 +#: cps/web.py:1564 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1544 +#: cps/web.py:1570 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1548 cps/web.py:1573 +#: cps/web.py:1574 cps/web.py:1599 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1555 +#: cps/web.py:1581 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1561 +#: cps/web.py:1587 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1568 +#: cps/web.py:1594 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1634 cps/web.py:1683 +#: cps/web.py:1660 cps/web.py:1709 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:1650 +#: cps/web.py:1676 msgid "Profile updated" msgstr "" @@ -1289,31 +1295,31 @@ msgstr "" msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:162 +#: cps/tasks/convert.py:163 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:166 +#: cps/tasks/convert.py:167 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:176 +#: cps/tasks/convert.py:177 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:198 +#: cps/tasks/convert.py:199 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:221 +#: cps/tasks/convert.py:222 #, python-format msgid "Ebook-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:240 +#: cps/tasks/convert.py:241 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" @@ -1347,211 +1353,211 @@ msgstr "" msgid "Password" msgstr "" -#: cps/templates/admin.html:19 cps/templates/layout.html:67 +#: cps/templates/admin.html:20 cps/templates/layout.html:67 #: cps/templates/user_table.html:145 msgid "Upload" msgstr "" -#: cps/templates/admin.html:20 cps/templates/detail.html:18 +#: cps/templates/admin.html:22 cps/templates/detail.html:18 #: cps/templates/detail.html:27 cps/templates/shelf.html:6 #: cps/templates/user_table.html:146 msgid "Download" msgstr "" -#: cps/templates/admin.html:21 +#: cps/templates/admin.html:23 msgid "View Books" msgstr "" -#: cps/templates/admin.html:22 cps/templates/user_table.html:131 +#: cps/templates/admin.html:24 cps/templates/user_table.html:131 #: cps/templates/user_table.html:148 msgid "Edit" msgstr "" -#: cps/templates/admin.html:23 cps/templates/book_edit.html:16 +#: cps/templates/admin.html:25 cps/templates/book_edit.html:16 #: cps/templates/book_table.html:97 cps/templates/modal_dialogs.html:63 #: cps/templates/modal_dialogs.html:116 cps/templates/user_edit.html:67 #: cps/templates/user_table.html:149 msgid "Delete" msgstr "" -#: cps/templates/admin.html:24 +#: cps/templates/admin.html:26 msgid "Public Shelf" msgstr "" -#: cps/templates/admin.html:47 +#: cps/templates/admin.html:51 msgid "Add New User" msgstr "" -#: cps/templates/admin.html:49 +#: cps/templates/admin.html:53 msgid "Import LDAP Users" msgstr "" -#: cps/templates/admin.html:56 +#: cps/templates/admin.html:60 msgid "E-mail Server Settings" msgstr "" -#: cps/templates/admin.html:61 cps/templates/email_edit.html:31 +#: cps/templates/admin.html:65 cps/templates/email_edit.html:31 msgid "SMTP Hostname" msgstr "" -#: cps/templates/admin.html:65 cps/templates/email_edit.html:35 +#: cps/templates/admin.html:69 cps/templates/email_edit.html:35 msgid "SMTP Port" msgstr "" -#: cps/templates/admin.html:69 cps/templates/email_edit.html:39 +#: cps/templates/admin.html:73 cps/templates/email_edit.html:39 msgid "Encryption" msgstr "" -#: cps/templates/admin.html:73 cps/templates/email_edit.html:47 +#: cps/templates/admin.html:77 cps/templates/email_edit.html:47 msgid "SMTP Login" msgstr "" -#: cps/templates/admin.html:77 cps/templates/admin.html:88 +#: cps/templates/admin.html:81 cps/templates/admin.html:92 #: cps/templates/email_edit.html:55 msgid "From E-mail" msgstr "" -#: cps/templates/admin.html:84 +#: cps/templates/admin.html:88 msgid "E-Mail Service" msgstr "" -#: cps/templates/admin.html:85 +#: cps/templates/admin.html:89 msgid "Gmail via Oauth2" msgstr "" -#: cps/templates/admin.html:100 +#: cps/templates/admin.html:104 msgid "Configuration" msgstr "" -#: cps/templates/admin.html:103 +#: cps/templates/admin.html:107 msgid "Calibre Database Directory" msgstr "" -#: cps/templates/admin.html:107 cps/templates/config_edit.html:68 +#: cps/templates/admin.html:111 cps/templates/config_edit.html:68 msgid "Log Level" msgstr "" -#: cps/templates/admin.html:111 +#: cps/templates/admin.html:115 msgid "Port" msgstr "" -#: cps/templates/admin.html:116 +#: cps/templates/admin.html:120 msgid "External Port" msgstr "" -#: cps/templates/admin.html:123 cps/templates/config_view_edit.html:28 +#: cps/templates/admin.html:127 cps/templates/config_view_edit.html:28 msgid "Books per Page" msgstr "" -#: cps/templates/admin.html:127 +#: cps/templates/admin.html:131 msgid "Uploads" msgstr "" -#: cps/templates/admin.html:131 +#: cps/templates/admin.html:135 msgid "Anonymous Browsing" msgstr "" -#: cps/templates/admin.html:135 +#: cps/templates/admin.html:139 msgid "Public Registration" msgstr "" -#: cps/templates/admin.html:139 +#: cps/templates/admin.html:143 msgid "Magic Link Remote Login" msgstr "" -#: cps/templates/admin.html:143 +#: cps/templates/admin.html:147 msgid "Reverse Proxy Login" msgstr "" -#: cps/templates/admin.html:148 cps/templates/config_edit.html:173 +#: cps/templates/admin.html:152 cps/templates/config_edit.html:173 msgid "Reverse Proxy Header Name" msgstr "" -#: cps/templates/admin.html:153 +#: cps/templates/admin.html:157 msgid "Edit Calibre Database Configuration" msgstr "" -#: cps/templates/admin.html:154 +#: cps/templates/admin.html:158 msgid "Edit Basic Configuration" msgstr "" -#: cps/templates/admin.html:155 +#: cps/templates/admin.html:159 msgid "Edit UI Configuration" msgstr "" -#: cps/templates/admin.html:160 +#: cps/templates/admin.html:164 msgid "Administration" msgstr "" -#: cps/templates/admin.html:161 +#: cps/templates/admin.html:165 msgid "Download Debug Package" msgstr "" -#: cps/templates/admin.html:162 +#: cps/templates/admin.html:166 msgid "View Logs" msgstr "" -#: cps/templates/admin.html:165 +#: cps/templates/admin.html:169 msgid "Reconnect Calibre Database" msgstr "" -#: cps/templates/admin.html:166 +#: cps/templates/admin.html:170 msgid "Restart" msgstr "" -#: cps/templates/admin.html:167 +#: cps/templates/admin.html:171 msgid "Shutdown" msgstr "" -#: cps/templates/admin.html:172 +#: cps/templates/admin.html:176 msgid "Update" msgstr "" -#: cps/templates/admin.html:176 +#: cps/templates/admin.html:180 msgid "Version" msgstr "" -#: cps/templates/admin.html:177 +#: cps/templates/admin.html:181 msgid "Details" msgstr "" -#: cps/templates/admin.html:183 +#: cps/templates/admin.html:187 msgid "Current version" msgstr "" -#: cps/templates/admin.html:191 +#: cps/templates/admin.html:195 msgid "Check for Update" msgstr "" -#: cps/templates/admin.html:192 +#: cps/templates/admin.html:196 msgid "Perform Update" msgstr "" -#: cps/templates/admin.html:205 +#: cps/templates/admin.html:209 msgid "Are you sure you want to restart?" msgstr "" -#: cps/templates/admin.html:210 cps/templates/admin.html:224 -#: cps/templates/admin.html:244 cps/templates/config_db.html:70 +#: cps/templates/admin.html:214 cps/templates/admin.html:228 +#: cps/templates/admin.html:248 cps/templates/config_db.html:70 #: cps/templates/shelf.html:96 msgid "OK" msgstr "" -#: cps/templates/admin.html:211 cps/templates/admin.html:225 +#: cps/templates/admin.html:215 cps/templates/admin.html:229 #: cps/templates/book_edit.html:217 cps/templates/book_table.html:124 #: cps/templates/config_db.html:54 cps/templates/config_edit.html:359 -#: cps/templates/config_view_edit.html:169 cps/templates/modal_dialogs.html:64 +#: cps/templates/config_view_edit.html:173 cps/templates/modal_dialogs.html:64 #: cps/templates/modal_dialogs.html:99 cps/templates/modal_dialogs.html:117 #: cps/templates/modal_dialogs.html:135 cps/templates/shelf.html:97 -#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:137 +#: cps/templates/shelf_edit.html:27 cps/templates/user_edit.html:141 msgid "Cancel" msgstr "" -#: cps/templates/admin.html:223 +#: cps/templates/admin.html:227 msgid "Are you sure you want to shutdown?" msgstr "" -#: cps/templates/admin.html:235 +#: cps/templates/admin.html:239 msgid "Updating, please do not reload this page" msgstr "" @@ -1563,39 +1569,39 @@ msgstr "" msgid "In Library" msgstr "" -#: cps/templates/author.html:26 cps/templates/index.html:68 +#: cps/templates/author.html:26 cps/templates/index.html:72 #: cps/templates/search.html:29 cps/templates/shelf.html:17 msgid "Sort according to book date, newest first" msgstr "" -#: cps/templates/author.html:27 cps/templates/index.html:69 +#: cps/templates/author.html:27 cps/templates/index.html:73 #: cps/templates/search.html:30 cps/templates/shelf.html:18 msgid "Sort according to book date, oldest first" msgstr "" -#: cps/templates/author.html:28 cps/templates/index.html:70 +#: cps/templates/author.html:28 cps/templates/index.html:74 #: cps/templates/search.html:31 cps/templates/shelf.html:19 msgid "Sort title in alphabetical order" msgstr "" -#: cps/templates/author.html:29 cps/templates/index.html:71 +#: cps/templates/author.html:29 cps/templates/index.html:75 #: cps/templates/search.html:32 cps/templates/shelf.html:20 msgid "Sort title in reverse alphabetical order" msgstr "" -#: cps/templates/author.html:30 cps/templates/index.html:74 +#: cps/templates/author.html:30 cps/templates/index.html:78 #: cps/templates/search.html:35 cps/templates/shelf.html:23 msgid "Sort according to publishing date, newest first" msgstr "" -#: cps/templates/author.html:31 cps/templates/index.html:75 +#: cps/templates/author.html:31 cps/templates/index.html:79 #: cps/templates/search.html:36 cps/templates/shelf.html:24 msgid "Sort according to publishing date, oldest first" msgstr "" #: cps/templates/author.html:57 cps/templates/author.html:117 #: cps/templates/discover.html:30 cps/templates/index.html:29 -#: cps/templates/index.html:106 cps/templates/search.html:65 +#: cps/templates/index.html:111 cps/templates/search.html:65 #: cps/templates/shelf.html:52 msgid "reduce" msgstr "" @@ -1725,9 +1731,9 @@ msgid "Fetch Metadata" msgstr "" #: cps/templates/book_edit.html:216 cps/templates/config_db.html:53 -#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:168 +#: cps/templates/config_edit.html:358 cps/templates/config_view_edit.html:172 #: cps/templates/email_edit.html:65 cps/templates/shelf_edit.html:25 -#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:135 +#: cps/templates/shelf_order.html:41 cps/templates/user_edit.html:139 msgid "Save" msgstr "" @@ -1749,7 +1755,7 @@ msgstr "" #: cps/templates/book_edit.html:254 cps/templates/layout.html:64 #: cps/templates/layout.html:188 cps/templates/modal_dialogs.html:34 -#: cps/templates/user_edit.html:156 +#: cps/templates/user_edit.html:160 msgid "Close" msgstr "" @@ -2227,48 +2233,48 @@ msgstr "" msgid "Allow eBook Viewer" msgstr "" -#: cps/templates/config_view_edit.html:100 cps/templates/user_edit.html:106 +#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107 msgid "Allow Uploads" msgstr "" -#: cps/templates/config_view_edit.html:104 cps/templates/user_edit.html:110 +#: cps/templates/config_view_edit.html:106 cps/templates/user_edit.html:112 msgid "Allow Edit" msgstr "" -#: cps/templates/config_view_edit.html:108 cps/templates/user_edit.html:114 +#: cps/templates/config_view_edit.html:111 cps/templates/user_edit.html:117 msgid "Allow Delete Books" msgstr "" -#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:119 +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 msgid "Allow Changing Password" msgstr "" -#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:123 +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:127 msgid "Allow Editing Public Shelves" msgstr "" -#: cps/templates/config_view_edit.html:119 +#: cps/templates/config_view_edit.html:123 msgid "Default Language" msgstr "" -#: cps/templates/config_view_edit.html:127 +#: cps/templates/config_view_edit.html:131 msgid "Default Visible Language of Books" msgstr "" -#: cps/templates/config_view_edit.html:143 +#: cps/templates/config_view_edit.html:147 msgid "Default Visibilities for New Users" msgstr "" -#: cps/templates/config_view_edit.html:159 cps/templates/user_edit.html:81 +#: cps/templates/config_view_edit.html:163 cps/templates/user_edit.html:81 #: cps/templates/user_table.html:154 msgid "Show Random Books in Detail View" msgstr "" -#: cps/templates/config_view_edit.html:161 cps/templates/user_edit.html:84 +#: cps/templates/config_view_edit.html:165 cps/templates/user_edit.html:84 msgid "Add Allowed/Denied Tags" msgstr "" -#: cps/templates/config_view_edit.html:162 +#: cps/templates/config_view_edit.html:166 msgid "Add Allowed/Denied custom column values" msgstr "" @@ -2421,21 +2427,29 @@ msgstr "" msgid "Logout User" msgstr "" -#: cps/templates/index.html:72 cps/templates/search.html:33 +#: cps/templates/index.html:69 +msgid "Sort ascending according to download count" +msgstr "" + +#: cps/templates/index.html:70 +msgid "Sort descending according to download count" +msgstr "" + +#: cps/templates/index.html:76 cps/templates/search.html:33 #: cps/templates/shelf.html:21 msgid "Sort authors in alphabetical order" msgstr "" -#: cps/templates/index.html:73 cps/templates/search.html:34 +#: cps/templates/index.html:77 cps/templates/search.html:34 #: cps/templates/shelf.html:22 msgid "Sort authors in reverse alphabetical order" msgstr "" -#: cps/templates/index.html:77 +#: cps/templates/index.html:81 msgid "Sort ascending according to series index" msgstr "" -#: cps/templates/index.html:78 +#: cps/templates/index.html:82 msgid "Sort descending according to series index" msgstr "" @@ -3037,15 +3051,15 @@ msgstr "" msgid "Add allowed/Denied Custom Column Values" msgstr "" -#: cps/templates/user_edit.html:130 +#: cps/templates/user_edit.html:134 msgid "Sync only books in selected shelves with Kobo" msgstr "" -#: cps/templates/user_edit.html:140 cps/templates/user_table.html:169 +#: cps/templates/user_edit.html:144 cps/templates/user_table.html:169 msgid "Delete User" msgstr "" -#: cps/templates/user_edit.html:152 +#: cps/templates/user_edit.html:156 msgid "Generate Kobo Auth URL" msgstr "" From 6cb713d62c2662b51765a6b52b98e7b193e02d92 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Sun, 21 Nov 2021 10:21:45 +0100 Subject: [PATCH 032/412] Added filtering of languages Bugfix show all allowed languages in user settings in case restrictions currently apply --- cps/admin.py | 2 +- cps/db.py | 15 ++++++++------- cps/templates/languages.html | 26 +++++++++++++++++++++----- cps/web.py | 31 +++++++++++++------------------ 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/cps/admin.py b/cps/admin.py index 068ac3560..f104aa29b 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -1575,7 +1575,7 @@ def edit_user(user_id): if not content or (not config.config_anonbrowse and content.name == "Guest"): flash(_(u"User not found"), category="error") return redirect(url_for('admin.admin')) - languages = calibre_db.speaking_language() + languages = calibre_db.speaking_language(return_all_languages=True) translations = babel.list_translations() + [LC('en')] kobo_support = feature_support['kobo'] and config.config_kobo_sync if request.method == "POST": diff --git a/cps/db.py b/cps/db.py index 800fb3dd1..4e76072d6 100644 --- a/cps/db.py +++ b/cps/db.py @@ -612,7 +612,7 @@ class CalibreDB(): return self.session.query(Data).filter(Data.book == book_id).filter(Data.format == file_format).first() # Language and content filters for displaying in the UI - def common_filters(self, allow_show_archived=False): + def common_filters(self, allow_show_archived=False, return_all_languages=False): if not allow_show_archived: archived_books = ( ub.session.query(ub.ArchivedBook) @@ -625,10 +625,10 @@ class CalibreDB(): else: archived_filter = true() - if current_user.filter_language() != "all": - lang_filter = Books.languages.any(Languages.lang_code == current_user.filter_language()) - else: + if current_user.filter_language() == "all" or return_all_languages: lang_filter = true() + else: + lang_filter = Books.languages.any(Languages.lang_code == current_user.filter_language()) negtags_list = current_user.list_denied_tags() postags_list = current_user.list_allowed_tags() neg_content_tags_filter = false() if negtags_list == [''] else Books.tags.any(Tags.name.in_(negtags_list)) @@ -796,18 +796,19 @@ class CalibreDB(): return result[offset:limit_all], result_count, pagination # Creates for all stored languages a translated speaking name in the array for the UI - def speaking_language(self, languages=None): + def speaking_language(self, languages=None, return_all_languages=False, reverse_order=False): from . import get_locale if not languages: languages = self.session.query(Languages) \ .join(books_languages_link) \ .join(Books) \ - .filter(self.common_filters()) \ + .filter(self.common_filters(return_all_languages=return_all_languages)) \ .group_by(text('books_languages_link.lang_code')).all() for lang in languages: lang.name = isoLanguages.get_language_name(get_locale(), lang.lang_code) - return languages + return sorted(languages, key=lambda x: x.name, reverse=reverse_order) + def update_title_sort(self, config, conn=None): # user defined sort function for calibre databases (Series, etc.) diff --git a/cps/templates/languages.html b/cps/templates/languages.html index 2b482e197..771d77cf2 100644 --- a/cps/templates/languages.html +++ b/cps/templates/languages.html @@ -1,19 +1,35 @@ {% extends "layout.html" %} {% block body %}

    {{title}}

    +
    - {% endblock %} +{% block js %} + +{% endblock %} diff --git a/cps/web.py b/cps/web.py index ea6faf197..cff0036ea 100644 --- a/cps/web.py +++ b/cps/web.py @@ -1012,30 +1012,25 @@ def formats_list(): @web.route("/language") @login_required_if_no_ano def language_overview(): - if current_user.check_visibility(constants.SIDEBAR_LANGUAGE): - charlist = list() - if current_user.filter_language() == u"all": - languages = calibre_db.speaking_language() - # ToDo: generate first character list for languages + if current_user.check_visibility(constants.SIDEBAR_LANGUAGE) and current_user.filter_language() == u"all": + if current_user.get_view_property('language', 'dir') == 'desc': + order = db.Languages.lang_code.desc() + order_no = 0 else: - #try: - # cur_l = LC.parse(current_user.filter_language()) - #except UnknownLocaleError: - # cur_l = None - - languages = calibre_db.session.query(db.Languages).filter( - db.Languages.lang_code == current_user.filter_language()).all() - languages[0].name = isoLanguages.get_language_name(get_locale(), languages[0].name.lang_code) - #if cur_l: - # languages[0].name = cur_l.get_language_name(get_locale()) - #else: - # languages[0].name = _(isoLanguages.get(part3=languages[0].lang_code).name) + order = db.Languages.lang_code.asc() + order_no = 1 + charlist = list() + languages = calibre_db.speaking_language(reverse_order=not order_no) + for lang in languages: + upper_lang = lang.name[0].upper() + if upper_lang not in charlist: + charlist.append(upper_lang) lang_counter = calibre_db.session.query(db.books_languages_link, func.count('books_languages_link.book').label('bookcount')).group_by( text('books_languages_link.lang_code')).all() return render_title_template('languages.html', languages=languages, lang_counter=lang_counter, charlist=charlist, title=_(u"Languages"), page="langlist", - data="language") + data="language", order=order_no) else: abort(404) From 1b8bd27b3cd57ef0d1b4207169b4744b0570dfe0 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 20 Nov 2021 13:53:49 +0100 Subject: [PATCH 033/412] Added cve number for csrf bug --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index afaf9b0b2..a71137858 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -23,7 +23,7 @@ To receive fixes for security vulnerabilities it is required to always upgrade t | V 0.6.13|JavaScript could get executed in the description series, categories or publishers title|| | V 0.6.13|JavaScript could get executed in the shelf title|| | V 0.6.13|Login with the old session cookie after logout. Thanks to @ibarrionuevo|| -| V 0.6.14|CSRF was possible. Thanks to @mik317 and Hagai Wechsler (WhiteSource) || +| V 0.6.14|CSRF was possible. Thanks to @mik317 and Hagai Wechsler (WhiteSource) |CVE-2021-25965| | V 0.6.14|Cross-Site Scripting vulnerability on typeahead inputs. Thanks to @notdodo|| From cbb9edac1950e5d4c50c9b719a74a2914f440f80 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 13:23:27 +0100 Subject: [PATCH 034/412] Bugfix search in books list Fix renaming upper to lowercase letters Update test results --- cps/editbooks.py | 2 +- cps/web.py | 2 +- test/Calibre-Web TestSummary_Linux.html | 2721 ++++++++++++++++++++--- 3 files changed, 2425 insertions(+), 300 deletions(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index 3403f46f7..929aa1a76 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -114,7 +114,7 @@ def search_objects_add(db_book_object, db_type, input_elements): type_elements = c_elements.value else: type_elements = c_elements.name - if inp_element.lower() == type_elements.lower(): # Lowercase check + if inp_element == type_elements: found = True break if not found: diff --git a/cps/web.py b/cps/web.py index cff0036ea..c061af30c 100644 --- a/cps/web.py +++ b/cps/web.py @@ -831,7 +831,7 @@ def list_books(): books = calibre_db.session.query(db.Books).filter(calibre_db.common_filters()).all() entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order) elif search: - entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *join) + entries, filtered_count, __ = calibre_db.get_search_results(search, off, [order,''], limit, *join) else: entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), limit, db.Books, True, order, *join) diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index 1733a51a3..95505cc4d 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
    -

    Start Time: 2021-10-30 19:49:15

    +

    Start Time: 2021-11-21 07:25:47

    -

    Stop Time: 2021-10-30 23:31:02

    +

    Stop Time: 2021-11-21 10:30:41

    -

    Duration: 3h 2 min

    +

    Duration: 2h 25 min

    @@ -102,12 +102,12 @@ - + TestAnonymous 13 - 13 - 0 + 12 0 + 1 0 Detail @@ -215,11 +215,33 @@ - +
    TestAnonymous - test_guest_restricted_settings_visibility
    - PASS + +
    + ERROR +
    + + + + @@ -872,11 +894,11 @@ - + TestEditBooks 35 - 34 - 0 + 30 + 4 0 1 @@ -904,11 +926,35 @@ - +
    TestEditBooks - test_edit_category
    - PASS + +
    + FAIL +
    + + + + @@ -1012,11 +1058,35 @@ - +
    TestEditBooks - test_edit_publisher
    - PASS + +
    + FAIL +
    + + + + @@ -1039,11 +1109,35 @@ - +
    TestEditBooks - test_edit_series
    - PASS + +
    + FAIL +
    + + + + @@ -1209,25 +1303,45 @@ - +
    TestEditBooks - test_upload_cover_hdd
    - PASS + +
    + FAIL +
    + + + + - + TestEditBooksList - 18 - 18 - 0 - 0 + 10 + 8 + 1 + 1 0 - Detail + Detail @@ -1253,7 +1367,7 @@ -
    TestEditBooksList - test_bookslist_edit_comment
    +
    TestEditBooksList - test_bookslist_edit_languages
    PASS @@ -1262,7 +1376,7 @@ -
    TestEditBooksList - test_bookslist_edit_cust_category
    +
    TestEditBooksList - test_bookslist_edit_publisher
    PASS @@ -1271,7 +1385,7 @@ -
    TestEditBooksList - test_bookslist_edit_cust_comment
    +
    TestEditBooksList - test_bookslist_edit_series
    PASS @@ -1280,7 +1394,7 @@ -
    TestEditBooksList - test_bookslist_edit_cust_enum
    +
    TestEditBooksList - test_bookslist_edit_seriesindex
    PASS @@ -1289,7 +1403,7 @@ -
    TestEditBooksList - test_bookslist_edit_cust_float
    +
    TestEditBooksList - test_bookslist_edit_title
    PASS @@ -1297,78 +1411,6 @@ - -
    TestEditBooksList - test_bookslist_edit_cust_int
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_cust_ratings
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_cust_text
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_languages
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_publisher
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_series
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_seriesindex
    - - PASS - - - - - - -
    TestEditBooksList - test_bookslist_edit_title
    - - PASS - - - - -
    TestEditBooksList - test_list_visibility
    @@ -1377,30 +1419,84 @@ - +
    TestEditBooksList - test_restricted_rights
    - PASS + +
    + ERROR +
    + + + + - +
    TestEditBooksList - test_search_books_list
    - PASS + +
    + FAIL +
    + + + + - + TestEditBooksOnGdrive 20 - 20 - 0 + 15 + 5 0 0 @@ -1428,11 +1524,35 @@ - +
    TestEditBooksOnGdrive - test_edit_category
    - PASS + +
    + FAIL +
    + + + + @@ -1518,11 +1638,35 @@ - +
    TestEditBooksOnGdrive - test_edit_publisher
    - PASS + +
    + FAIL +
    + + + + @@ -1536,11 +1680,35 @@ - +
    TestEditBooksOnGdrive - test_edit_series
    - PASS + +
    + FAIL +
    + + + + @@ -1572,20 +1740,60 @@ - +
    TestEditBooksOnGdrive - test_upload_cover_hdd
    - PASS + +
    + FAIL +
    + + + + - +
    TestEditBooksOnGdrive - test_watch_metadata
    - PASS + +
    + FAIL +
    + + + + @@ -1759,15 +1967,15 @@ - + TestFilePicker + 3 + 2 + 0 + 0 1 - 1 - 0 - 0 - 0 - Detail + Detail @@ -1781,6 +1989,41 @@ + + + +
    TestFilePicker - test_filepicker_new_file
    + + +
    + SKIP +
    + + + + + + + + + + +
    TestFilePicker - test_two_filepickers
    + + PASS + + + @@ -1849,12 +2092,12 @@ - + TestKoboSync 10 - 10 - 0 - 0 + 5 + 4 + 1 0 Detail @@ -1881,29 +2124,91 @@ - +
    TestKoboSync - test_kobo_sync_selected_shelfs
    - PASS + +
    + ERROR +
    + + + + - +
    TestKoboSync - test_shelves_add_remove_books
    - PASS + +
    + FAIL +
    + + + + - +
    TestKoboSync - test_sync_changed_book
    - PASS + +
    + FAIL +
    + + + + @@ -1926,11 +2231,31 @@ - +
    TestKoboSync - test_sync_shelf
    - PASS + +
    + FAIL +
    + + + + @@ -1944,22 +2269,42 @@ - +
    TestKoboSync - test_sync_upload
    - PASS + +
    + FAIL +
    + + + + - + TestKoboSyncBig 4 - 4 - 0 - 0 + 1 + 1 + 2 0 Detail @@ -1968,20 +2313,62 @@ - +
    TestKoboSyncBig - test_kobo_sync_selected_shelfs
    - PASS + +
    + ERROR +
    + + + + - +
    TestKoboSyncBig - test_sync_changed_book
    - PASS + +
    + ERROR +
    + + + + @@ -1995,22 +2382,42 @@ - +
    TestKoboSyncBig - test_sync_shelf
    - PASS + +
    + FAIL +
    + + + + - + TestLdapLogin 13 - 13 - 0 + 11 0 + 2 0 Detail @@ -2055,20 +2462,72 @@ - +
    TestLdapLogin - test_LDAP_import
    - PASS + +
    + ERROR +
    + + + + - +
    TestLdapLogin - test_LDAP_import_memberfield
    - PASS + +
    + ERROR +
    + + + + @@ -2400,12 +2859,12 @@ - + TestMergeBooksList 2 - 2 - 0 + 1 0 + 1 0 Detail @@ -2414,11 +2873,31 @@ - +
    TestMergeBooksList - test_delete_book
    - PASS + +
    + ERROR +
    + + + + @@ -3196,13 +3675,13 @@ - + TestUserList 18 + 0 + 0 18 0 - 0 - 0 Detail @@ -3210,164 +3689,1810 @@ - +
    TestUserList - test_edit_user_email
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_list_visibility
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_admin_role
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_check_sort
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_denied_tags
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_download_role
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_button
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_email
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_kindle
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_language
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_locale
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_name
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_edit_visiblility
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_guest_edit
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_remove_admin
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_requests
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_search
    - PASS + +
    + ERROR +
    + + + + - +
    TestUserList - test_user_list_sort
    - PASS + +
    + ERROR +
    + + + + + + + + + + + _ErrorHolder + 1 + 0 + 0 + 1 + 0 + + Detail + + + + + + + +
    tearDownClass (test_user_list)
    + + +
    + ERROR +
    + + + + @@ -3381,13 +5506,13 @@ 0 0 - Detail + Detail - +
    TestUserLoad - test_user_change_vis
    @@ -3405,13 +5530,13 @@ 0 0 - Detail + Detail - +
    TestUserTemplate - test_allow_column_restriction
    @@ -3420,7 +5545,7 @@ - +
    TestUserTemplate - test_allow_tag_restriction
    @@ -3429,7 +5554,7 @@ - +
    TestUserTemplate - test_archived_format_template
    @@ -3438,7 +5563,7 @@ - +
    TestUserTemplate - test_author_user_template
    @@ -3447,7 +5572,7 @@ - +
    TestUserTemplate - test_best_user_template
    @@ -3456,7 +5581,7 @@ - +
    TestUserTemplate - test_category_user_template
    @@ -3465,7 +5590,7 @@ - +
    TestUserTemplate - test_deny_column_restriction
    @@ -3474,7 +5599,7 @@ - +
    TestUserTemplate - test_deny_tag_restriction
    @@ -3483,7 +5608,7 @@ - +
    TestUserTemplate - test_detail_random_user_template
    @@ -3492,7 +5617,7 @@ - +
    TestUserTemplate - test_download_user_template
    @@ -3501,7 +5626,7 @@ - +
    TestUserTemplate - test_format_user_template
    @@ -3510,7 +5635,7 @@ - +
    TestUserTemplate - test_hot_user_template
    @@ -3519,7 +5644,7 @@ - +
    TestUserTemplate - test_language_user_template
    @@ -3528,7 +5653,7 @@ - +
    TestUserTemplate - test_limit_book_languages
    @@ -3537,7 +5662,7 @@ - +
    TestUserTemplate - test_list_user_template
    @@ -3546,7 +5671,7 @@ - +
    TestUserTemplate - test_publisher_user_template
    @@ -3555,7 +5680,7 @@ - +
    TestUserTemplate - test_random_user_template
    @@ -3564,7 +5689,7 @@ - +
    TestUserTemplate - test_read_user_template
    @@ -3573,7 +5698,7 @@ - +
    TestUserTemplate - test_recent_user_template
    @@ -3582,7 +5707,7 @@ - +
    TestUserTemplate - test_series_user_template
    @@ -3591,7 +5716,7 @@ - +
    TestUserTemplate - test_ui_language_settings
    @@ -3609,13 +5734,13 @@ 0 0 - Detail + Detail - +
    TestCalibreWebVisibilitys - test_about
    @@ -3624,7 +5749,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_SMTP_Settings
    @@ -3633,7 +5758,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_add_user
    @@ -3642,7 +5767,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_password
    @@ -3651,7 +5776,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_archived
    @@ -3660,7 +5785,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_authors
    @@ -3669,7 +5794,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_category
    @@ -3678,7 +5803,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_file_formats
    @@ -3687,7 +5812,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_hot
    @@ -3696,7 +5821,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_language
    @@ -3705,7 +5830,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_publisher
    @@ -3714,7 +5839,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_random
    @@ -3723,7 +5848,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_rated
    @@ -3732,7 +5857,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_rating
    @@ -3741,7 +5866,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_read
    @@ -3750,7 +5875,7 @@ - +
    TestCalibreWebVisibilitys - test_admin_change_visibility_series
    @@ -3759,7 +5884,7 @@ - +
    TestCalibreWebVisibilitys - test_allow_columns
    @@ -3768,7 +5893,7 @@ - +
    TestCalibreWebVisibilitys - test_allow_tags
    @@ -3777,7 +5902,7 @@ - +
    TestCalibreWebVisibilitys - test_archive_books
    @@ -3786,7 +5911,7 @@ - +
    TestCalibreWebVisibilitys - test_authors_max_settings
    @@ -3795,7 +5920,7 @@ - +
    TestCalibreWebVisibilitys - test_change_title
    @@ -3804,7 +5929,7 @@ - +
    TestCalibreWebVisibilitys - test_checked_logged_in
    @@ -3813,7 +5938,7 @@ - +
    TestCalibreWebVisibilitys - test_hide_custom_column
    @@ -3822,7 +5947,7 @@ - +
    TestCalibreWebVisibilitys - test_link_column_to_read_status
    @@ -3831,7 +5956,7 @@ - +
    TestCalibreWebVisibilitys - test_random_books_available
    @@ -3840,7 +5965,7 @@ - +
    TestCalibreWebVisibilitys - test_request_link_column_to_read_status
    @@ -3849,7 +5974,7 @@ - +
    TestCalibreWebVisibilitys - test_restrict_columns
    @@ -3858,7 +5983,7 @@ - +
    TestCalibreWebVisibilitys - test_restrict_tags
    @@ -3867,7 +5992,7 @@ - +
    TestCalibreWebVisibilitys - test_save_views_recent
    @@ -3876,7 +6001,7 @@ - +
    TestCalibreWebVisibilitys - test_search_functions
    @@ -3885,7 +6010,7 @@ - +
    TestCalibreWebVisibilitys - test_search_order
    @@ -3894,7 +6019,7 @@ - +
    TestCalibreWebVisibilitys - test_search_string
    @@ -3903,7 +6028,7 @@ - +
    TestCalibreWebVisibilitys - test_user_email_available
    @@ -3912,7 +6037,7 @@ - +
    TestCalibreWebVisibilitys - test_user_visibility_sidebar
    @@ -3930,13 +6055,13 @@ 0 0 - Detail + Detail - +
    TestCalibreHelper - test_author_sort
    @@ -3945,7 +6070,7 @@ - +
    TestCalibreHelper - test_author_sort_comma
    @@ -3954,7 +6079,7 @@ - +
    TestCalibreHelper - test_author_sort_junior
    @@ -3963,7 +6088,7 @@ - +
    TestCalibreHelper - test_author_sort_oneword
    @@ -3972,7 +6097,7 @@ - +
    TestCalibreHelper - test_author_sort_roman
    @@ -3981,7 +6106,7 @@ - +
    TestCalibreHelper - test_check_Limit_Length
    @@ -3990,7 +6115,7 @@ - +
    TestCalibreHelper - test_check_char_replacement
    @@ -3999,7 +6124,7 @@ - +
    TestCalibreHelper - test_check_chinese_Characters
    @@ -4008,7 +6133,7 @@ - +
    TestCalibreHelper - test_check_deg_eur_replacement
    @@ -4017,7 +6142,7 @@ - +
    TestCalibreHelper - test_check_doubleS
    @@ -4026,7 +6151,7 @@ - +
    TestCalibreHelper - test_check_finish_Dot
    @@ -4035,7 +6160,7 @@ - +
    TestCalibreHelper - test_check_high23
    @@ -4044,7 +6169,7 @@ - +
    TestCalibreHelper - test_check_umlauts
    @@ -4053,7 +6178,7 @@ - +
    TestCalibreHelper - test_random_password
    @@ -4062,7 +6187,7 @@ - +
    TestCalibreHelper - test_split_authors
    @@ -4071,7 +6196,7 @@ - +
    TestCalibreHelper - test_whitespaces
    @@ -4082,11 +6207,11 @@ Total - 366 - 360 - 0 - 0 - 6 + 361 + 312 + 15 + 27 + 7   @@ -4114,7 +6239,7 @@ Platform - Linux 5.11.0-38-generic #42~20.04.1-Ubuntu SMP Tue Sep 28 20:41:07 UTC 2021 x86_64 x86_64 + Linux 5.13.0-21-generic #21~20.04.1-Ubuntu SMP Tue Oct 26 15:49:20 UTC 2021 x86_64 x86_64 Basic @@ -4240,7 +6365,7 @@ SQLAlchemy - 1.4.26 + 1.4.27 Basic @@ -4270,13 +6395,13 @@ google-api-python-client - 2.28.0 + 2.31.0 TestCliGdrivedb httplib2 - 0.20.1 + 0.20.2 TestCliGdrivedb @@ -4300,13 +6425,13 @@ google-api-python-client - 2.28.0 + 2.31.0 TestEbookConvertCalibreGDrive httplib2 - 0.20.1 + 0.20.2 TestEbookConvertCalibreGDrive @@ -4330,13 +6455,13 @@ google-api-python-client - 2.28.0 + 2.31.0 TestEbookConvertGDriveKepubify httplib2 - 0.20.1 + 0.20.2 TestEbookConvertGDriveKepubify @@ -4372,13 +6497,13 @@ google-api-python-client - 2.28.0 + 2.31.0 TestEditBooksOnGdrive httplib2 - 0.20.1 + 0.20.2 TestEditBooksOnGdrive @@ -4402,13 +6527,13 @@ google-api-python-client - 2.28.0 + 2.31.0 TestSetupGdrive httplib2 - 0.20.1 + 0.20.2 TestSetupGdrive @@ -4444,13 +6569,13 @@ jsonschema - 4.1.2 + 4.2.1 TestKoboSync jsonschema - 4.1.2 + 4.2.1 TestKoboSyncBig @@ -4462,7 +6587,7 @@ jsonschema - 4.1.2 + 4.2.1 TestLdapLogin @@ -4474,7 +6599,7 @@ Flask-Dance - 5.0.0 + 5.1.0 TestOAuthLogin @@ -4492,7 +6617,7 @@

    From e880238cb9765f03ae0627c4478b5637d17dbd18 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 16:19:32 +0100 Subject: [PATCH 035/412] Add missing filter for current user in KoboSyncedBooks queries --- cps/kobo.py | 3 -- cps/kobo_sync_status.py | 65 +++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/cps/kobo.py b/cps/kobo.py index 8a395821a..ee2317ba9 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -142,9 +142,6 @@ def HandleSyncRequest(): if not current_app.wsgi_app.is_proxied: log.debug('Kobo: Received unproxied request, changed request port to external server port') - # TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header - # instead so that the device triggers another sync. - new_books_last_modified = sync_token.books_last_modified new_books_last_created = sync_token.books_last_created new_reading_state_last_modified = sync_token.reading_state_last_modified diff --git a/cps/kobo_sync_status.py b/cps/kobo_sync_status.py index f4a666048..b88cb6ace 100644 --- a/cps/kobo_sync_status.py +++ b/cps/kobo_sync_status.py @@ -22,25 +22,31 @@ from . import ub import datetime from sqlalchemy.sql.expression import or_ - +# Add the current book id to kobo_synced_books table for current user, if entry is already present, +# do nothing (safety precaution) def add_synced_books(book_id): - synced_book = ub.KoboSyncedBooks() - synced_book.user_id = current_user.id - synced_book.book_id = book_id - ub.session.add(synced_book) - ub.session_commit() + is_present = ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id)\ + .filter(ub.KoboSyncedBooks.user_id == current_user.id).count() + if not is_present: + synced_book = ub.KoboSyncedBooks() + synced_book.user_id = current_user.id + synced_book.book_id = book_id + ub.session.add(synced_book) + ub.session_commit() +# Select all entries of current book in kobo_synced_books table, which are from current user and delete them def remove_synced_book(book_id): - ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).delete() + ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id) \ + .filter(ub.KoboSyncedBooks.user_id == current_user.id).delete() ub.session_commit() + def add_archived_books(book_id): - archived_book = ( - ub.session.query(ub.ArchivedBook) - .filter(ub.ArchivedBook.book_id == book_id) - .first() - ) + archived_book = (ub.session.query(ub.ArchivedBook) + .filter(ub.ArchivedBook.book_id == book_id) + .filter(ub.ArchivedBook.user_id == current_user.id) + .first()) if not archived_book: archived_book = ub.ArchivedBook(user_id=current_user.id, book_id=book_id) archived_book.is_archived = True @@ -50,22 +56,23 @@ def add_archived_books(book_id): ub.session_commit() - # select all books which are synced by the current user and do not belong to a synced shelf and them to archive -# select all shelfs from current user which are synced and do not belong to the "only sync" shelfs -def update_on_sync_shelfs(content_id): - books_to_archive = (ub.session.query(ub.KoboSyncedBooks) - .join(ub.BookShelf, ub.KoboSyncedBooks.book_id == ub.BookShelf.book_id, isouter=True) - .join(ub.Shelf, ub.Shelf.user_id == content_id, isouter=True) - .filter(or_(ub.Shelf.kobo_sync == 0, ub.Shelf.kobo_sync == None)) - .filter(ub.KoboSyncedBooks.user_id == content_id).all()) - for b in books_to_archive: - add_archived_books(b.book_id) - ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == b.book_id).filter(ub.KoboSyncedBooks.user_id == content_id).delete() - ub.session_commit() +# select all shelves from current user which are synced and do not belong to the "only sync" shelves +def update_on_sync_shelfs(user_id): + books_to_archive = (ub.session.query(ub.KoboSyncedBooks) + .join(ub.BookShelf, ub.KoboSyncedBooks.book_id == ub.BookShelf.book_id, isouter=True) + .join(ub.Shelf, ub.Shelf.user_id == user_id, isouter=True) + .filter(or_(ub.Shelf.kobo_sync == 0, ub.Shelf.kobo_sync == None)) + .filter(ub.KoboSyncedBooks.user_id == user_id).all()) + for b in books_to_archive: + add_archived_books(b.book_id) + ub.session.query(ub.KoboSyncedBooks) \ + .filter(ub.KoboSyncedBooks.book_id == b.book_id) \ + .filter(ub.KoboSyncedBooks.user_id == user_id).delete() + ub.session_commit() - shelfs_to_archive = ub.session.query(ub.Shelf).filter(ub.Shelf.user_id == content_id).filter( - ub.Shelf.kobo_sync == 0).all() - for a in shelfs_to_archive: - ub.session.add(ub.ShelfArchive(uuid=a.uuid, user_id=content_id)) - ub.session_commit() + shelves_to_archive = ub.session.query(ub.Shelf).filter(ub.Shelf.user_id == user_id).filter( + ub.Shelf.kobo_sync == 0).all() + for a in shelves_to_archive: + ub.session.add(ub.ShelfArchive(uuid=a.uuid, user_id=user_id)) + ub.session_commit() From d084a06e635b7228279e308aeb5ba5dddafa4502 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 16:21:27 +0100 Subject: [PATCH 036/412] Bugfix create shelf for users not allowed to create public shelfs --- cps/shelf.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cps/shelf.py b/cps/shelf.py index 97147a716..5f6a66bf2 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -224,12 +224,8 @@ def remove_from_shelf(shelf_id, book_id): @shelf.route("/shelf/create", methods=["GET", "POST"]) @login_required def create_shelf(): - if not current_user.role_edit_shelfs() and request.method == 'POST': - flash(_(u"Sorry you are not allowed to create a public shelf"), category="error") - return redirect(url_for('web.index')) - else: - shelf = ub.Shelf() - return create_edit_shelf(shelf, page_title=_(u"Create a Shelf"), page="shelfcreate") + shelf = ub.Shelf() + return create_edit_shelf(shelf, page_title=_(u"Create a Shelf"), page="shelfcreate") @@ -249,6 +245,9 @@ def create_edit_shelf(shelf, page_title, page, shelf_id=False): # calibre_db.session.query(ub.Shelf).filter(ub.Shelf.user_id == current_user.id).filter(ub.Shelf.kobo_sync).count() if request.method == "POST": to_save = request.form.to_dict() + if not current_user.role_edit_shelfs() and to_save.get("is_public") == "on": + flash(_(u"Sorry you are not allowed to create a public shelf"), category="error") + return redirect(url_for('web.index')) shelf.is_public = 1 if to_save.get("is_public") else 0 if config.config_kobo_sync: shelf.kobo_sync = True if to_save.get("kobo_sync") else False From 2e0d0a24290e024b1dc6332f138872b706478207 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sun, 21 Nov 2021 18:31:35 +0100 Subject: [PATCH 037/412] Update requirements --- optional-requirements.txt | 14 +++++++------- requirements.txt | 6 +++--- setup.cfg | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/optional-requirements.txt b/optional-requirements.txt index c9a05fc00..03f58bb56 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,18 +1,18 @@ # GDrive Integration gevent>20.6.0,<22.0.0 greenlet>=0.4.17,<1.2.0 -httplib2>=0.9.2,<0.20.0 +httplib2>=0.9.2,<0.21.0 oauth2client>=4.0.0,<4.1.4 -uritemplate>=3.0.0,<3.1.0 +uritemplate>=3.0.0,<4.2.0 pyasn1-modules>=0.0.8,<0.3.0 pyasn1>=0.1.9,<0.5.0 -PyDrive2>=1.3.1,<1.9.0 +PyDrive2>=1.3.1,<1.11.0 PyYAML>=3.12 rsa>=3.4.2,<4.8.0 six>=1.10.0,<1.17.0 # Gdrive and Gmail integration -google-api-python-client>=1.7.11,<2.1.0 +google-api-python-client>=1.7.11,<2.32.0 # Gmail google-auth-oauthlib>=0.4.3,<0.5.0 @@ -26,16 +26,16 @@ python-ldap>=3.0.0,<3.4.0 Flask-SimpleLDAP>=1.4.0,<1.5.0 #oauth -Flask-Dance>=2.0.0,<5.1.0 +Flask-Dance>=2.0.0,<5.2.0 SQLAlchemy-Utils>=0.33.5,<0.38.0 # extracting metadata rarfile>=2.7 -scholarly>=1.2.0, <1.3 +scholarly>=1.2.0, <1.5 # other natsort>=2.2.0,<8.1.0 comicapi>=2.2.0,<2.3.0 #Kobo integration -jsonschema>=3.2.0,<3.3.0 +jsonschema>=3.2.0,<4.3.0 diff --git a/requirements.txt b/requirements.txt index dc1b0d95f..1db961fef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ -Babel>=1.3, <3.0 +Babel>=1.3,<3.0 Flask-Babel>=0.11.1,<2.1.0 Flask-Login>=0.3.2,<0.5.1 Flask-Principal>=0.3.2,<0.5.1 backports_abc>=0.4 Flask>=1.0.2,<2.1.0 iso-639>=0.4.5,<0.5.0 -PyPDF3>=1.0.0,<1.0.4 +PyPDF3>=1.0.0,<1.0.6 pytz>=2016.10 requests>=2.11.1,<2.25.0 SQLAlchemy>=1.3.0,<1.5.0 @@ -13,4 +13,4 @@ tornado>=4.1,<6.2 Wand>=0.4.4,<0.7.0 unidecode>=0.04.19,<1.3.0 lxml>=3.8.0,<4.7.0 -flask-wtf>=0.14.2,<0.16.0 +flask-wtf>=0.14.2,<1.1.0 diff --git a/setup.cfg b/setup.cfg index 76f7e4052..3f1b1f8dd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,7 +29,7 @@ keywords = calibre calibre-web library -python_requires = >=3.0 +python_requires = >=3.5 [options.entry_points] console_scripts = @@ -82,7 +82,7 @@ oauth = SQLAlchemy-Utils>=0.33.5,<0.38.0 metadata = rarfile>=2.7 - scholarly>=1.2.0, <1.3 + scholarly>=1.2.0,<1.3 comics = natsort>=2.2.0,<7.2.0 comicapi>= 2.2.0,<2.3.0 From a1d372630d6be75f9df5eac90ea2bda53a42dd0a Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Tue, 23 Nov 2021 19:32:11 +0100 Subject: [PATCH 038/412] Added missing language bit (fixes #2187) Added handling of wrong .jpg cover file content Guest sorting options are now stored in the session Updated teststatus --- cps/helper.py | 2 +- cps/iso_language_names.py | 20 + cps/translations/cs/LC_MESSAGES/messages.mo | Bin 39635 -> 39635 bytes cps/translations/cs/LC_MESSAGES/messages.po | 117 +- cps/translations/de/LC_MESSAGES/messages.mo | Bin 53698 -> 53698 bytes cps/translations/de/LC_MESSAGES/messages.po | 117 +- cps/translations/el/LC_MESSAGES/messages.mo | Bin 57858 -> 57858 bytes cps/translations/el/LC_MESSAGES/messages.po | 117 +- cps/translations/es/LC_MESSAGES/messages.mo | Bin 51420 -> 51420 bytes cps/translations/es/LC_MESSAGES/messages.po | 117 +- cps/translations/fi/LC_MESSAGES/messages.mo | Bin 27521 -> 27521 bytes cps/translations/fi/LC_MESSAGES/messages.po | 117 +- cps/translations/fr/LC_MESSAGES/messages.mo | Bin 53763 -> 53763 bytes cps/translations/fr/LC_MESSAGES/messages.po | 117 +- cps/translations/hu/LC_MESSAGES/messages.mo | Bin 25272 -> 25272 bytes cps/translations/hu/LC_MESSAGES/messages.po | 117 +- cps/translations/it/LC_MESSAGES/messages.mo | Bin 56390 -> 56390 bytes cps/translations/it/LC_MESSAGES/messages.po | 117 +- cps/translations/ja/LC_MESSAGES/messages.mo | Bin 19949 -> 19949 bytes cps/translations/ja/LC_MESSAGES/messages.po | 117 +- cps/translations/km/LC_MESSAGES/messages.mo | Bin 24546 -> 24546 bytes cps/translations/km/LC_MESSAGES/messages.po | 117 +- cps/translations/nl/LC_MESSAGES/messages.mo | Bin 50584 -> 50584 bytes cps/translations/nl/LC_MESSAGES/messages.po | 117 +- cps/translations/pl/LC_MESSAGES/messages.mo | Bin 52511 -> 52511 bytes cps/translations/pl/LC_MESSAGES/messages.po | 117 +- .../pt_BR/LC_MESSAGES/messages.mo | Bin 47022 -> 47022 bytes .../pt_BR/LC_MESSAGES/messages.po | 117 +- cps/translations/ru/LC_MESSAGES/messages.mo | Bin 48070 -> 48070 bytes cps/translations/ru/LC_MESSAGES/messages.po | 117 +- cps/translations/sv/LC_MESSAGES/messages.mo | Bin 48854 -> 48854 bytes cps/translations/sv/LC_MESSAGES/messages.po | 117 +- cps/translations/tr/LC_MESSAGES/messages.mo | Bin 22880 -> 22880 bytes cps/translations/tr/LC_MESSAGES/messages.po | 117 +- cps/translations/uk/LC_MESSAGES/messages.mo | Bin 18028 -> 18028 bytes cps/translations/uk/LC_MESSAGES/messages.po | 117 +- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 48654 -> 48654 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 117 +- .../zh_Hant_TW/LC_MESSAGES/messages.mo | Bin 48977 -> 48977 bytes .../zh_Hant_TW/LC_MESSAGES/messages.po | 117 +- cps/ub.py | 10 +- messages.pot | 117 +- test/Calibre-Web TestSummary_Linux.html | 2816 +++-------------- 43 files changed, 1644 insertions(+), 3544 deletions(-) diff --git a/cps/helper.py b/cps/helper.py index 08970d0ff..d966b331a 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -646,7 +646,7 @@ def save_cover(img, book_path): imgc.format = 'jpeg' imgc.transform_colorspace("rgb") img = imgc - except BlobError: + except (BlobError, MissingDelegateError): log.error("Invalid cover file content") return False, _("Invalid cover file content") else: diff --git a/cps/iso_language_names.py b/cps/iso_language_names.py index 11e5e67bf..8bd9a0d3a 100644 --- a/cps/iso_language_names.py +++ b/cps/iso_language_names.py @@ -51,6 +51,7 @@ LANGUAGE_NAMES = { "bel": "běloruština", "bem": "bemba (Zambie)", "ben": "bengálština", + "berinomo": "bit", "bho": "bhódžpurština", "bik": "bikolština", "bin": "bini", @@ -473,6 +474,7 @@ LANGUAGE_NAMES = { "bel": "Weißrussisch", "bem": "Bemba (Sambia)", "ben": "Bengalisch", + "berinomo": "Bit", "bho": "Bhojpuri", "bik": "Bikol", "bin": "Bini", @@ -899,6 +901,7 @@ LANGUAGE_NAMES = { "byn": "Bilin", "bin": "Bini", "bis": "Bislama", + "berinomo": "Bit", "zbl": "Blissymbols", "bos": "Βοσνιακά", "bra": "Braj", @@ -1272,6 +1275,7 @@ LANGUAGE_NAMES = { "bel": "Bielorruso", "bem": "Bemba (Zambia)", "ben": "Bengalí", + "berinomo": "Bit", "bho": "Bopurí", "bik": "Bicolano", "bin": "Bini", @@ -1694,6 +1698,7 @@ LANGUAGE_NAMES = { "bel": "valkovenäjä", "bem": "Bemba (Zambia)", "ben": "bengali", + "berinomo": "Bit", "bho": "bhojpuri", "bik": "bikol", "bin": "bini", @@ -2116,6 +2121,7 @@ LANGUAGE_NAMES = { "bel": "biélorusse", "bem": "bemba (Zambie)", "ben": "bengali", + "berinomo": "bit", "bho": "bhojpuri", "bik": "bikol", "bin": "bini", @@ -2538,6 +2544,7 @@ LANGUAGE_NAMES = { "bel": "belarusz", "bem": "Bemba (Zambia)", "ben": "bengáli", + "berinomo": "Bit", "bho": "bhodzspuri", "bik": "bikol", "bin": "bini", @@ -2960,6 +2967,7 @@ LANGUAGE_NAMES = { "bel": "Bielorusso", "bem": "Bemba (Zambia)", "ben": "Bengalese", + "berinomo": "Bit", "bho": "Bhojpuri", "bik": "bicol", "bin": "Bini", @@ -3382,6 +3390,7 @@ LANGUAGE_NAMES = { "bel": "白ロシア語", "bem": "Bemba (Zambia)", "ben": "ベンガル語", + "berinomo": "Bit", "bho": "ボージプリー語", "bik": "ビコル語", "bin": "ビニ語", @@ -3804,6 +3813,7 @@ LANGUAGE_NAMES = { "bel": "Belarusian", "bem": "Bemba (Zambia)", "ben": "Bengali", + "berinomo": "Bit", "bho": "Bhojpuri", "bik": "Bikol", "bin": "Bini", @@ -4226,6 +4236,7 @@ LANGUAGE_NAMES = { "bel": "Wit-Russisch; Belarussisch", "bem": "Bemba (Zambia)", "ben": "Bengaals", + "berinomo": "Bit", "bho": "Bhojpuri", "bik": "Bikol", "bin": "Bini; Edo", @@ -4648,6 +4659,7 @@ LANGUAGE_NAMES = { "bel": "białoruski", "bem": "bemba (Zambia)", "ben": "bengalski", + "berinomo": "Bit", "bho": "bhodźpuri", "bik": "bikol", "bin": "edo", @@ -5074,6 +5086,7 @@ LANGUAGE_NAMES = { "byn": "Bilin", "bin": "Bini", "bis": "Bislama", + "berinomo": "Bit", "zbl": "Blissymbols", "bos": "Bosnian", "bra": "Braj", @@ -5445,6 +5458,7 @@ LANGUAGE_NAMES = { "bel": "Белорусский", "bem": "Бемба (Замбия)", "ben": "Бенгальский", + "berinomo": "Bit", "bho": "Бходжпури", "bik": "Бикольский", "bin": "Бини", @@ -5867,6 +5881,7 @@ LANGUAGE_NAMES = { "bel": "Vitryska", "bem": "Bemba (Zambia)", "ben": "Bengaliska", + "berinomo": "Bit", "bho": "Bhojpuri", "bik": "Bikol", "bin": "Edo (bini)", @@ -6293,6 +6308,7 @@ LANGUAGE_NAMES = { "byn": "Bilin", "bin": "Bini (Afrika)", "bis": "Bislama (Vanuatu; Kuzey Pasifik)", + "berinomo": "Bit", "zbl": "Blis Sembolleri", "bos": "Boşnakça", "bra": "Braj (Hindistan)", @@ -6664,6 +6680,7 @@ LANGUAGE_NAMES = { "bel": "білоруська", "bem": "бемба (Замбія)", "ben": "бенгальська", + "berinomo": "біт", "bho": "бходжпурі", "bik": "бікольська", "bin": "біні", @@ -7086,6 +7103,7 @@ LANGUAGE_NAMES = { "bel": "白俄罗斯语", "bem": "本巴语(赞比亚)", "ben": "孟加拉语", + "berinomo": "布兴话", "bho": "博杰普尔语", "bik": "比科尔语", "bin": "比尼语", @@ -7512,6 +7530,7 @@ LANGUAGE_NAMES = { "byn": "Bilin", "bin": "Bini", "bis": "Bislama", + "berinomo": "Bit", "zbl": "布利斯符號", "bos": "Bosnian", "bra": "Braj", @@ -7887,6 +7906,7 @@ LANGUAGE_NAMES = { "bik": "Bikol", "bin": "Bini", "bis": "Bislama", + "bit": "Berinomo", "bla": "Siksika", "bod": "Tibetan", "bos": "Bosnian", diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo index d03dc08c93d654e22a38d2bcb5f0de3efa426db5..efd55ce457763285f1b3aa18002502afc948b7fa 100644 GIT binary patch delta 29 lcmcb-mFeM diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po index 6a6705473..931da8327 100644 --- a/cps/translations/cs/LC_MESSAGES/messages.po +++ b/cps/translations/cs/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-06-09 21:11+0100\n" "Last-Translator: Lukas Heroudek \n" "Language: cs_CZ\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "Uživatel admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Vše" @@ -273,7 +274,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -303,7 +304,7 @@ msgstr "Nastavení e-mailového serveru aktualizováno" msgid "Database Configuration" msgstr "Konfigurace funkcí" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Vyplňte všechna pole!" @@ -348,7 +349,7 @@ msgstr "Upravit uživatele %(nick)s" msgid "User '%(nick)s' updated" msgstr "Uživatel '%(nick)s' aktualizován" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." @@ -383,7 +384,7 @@ msgstr "Nastavení e-mailového serveru aktualizováno" msgid "Password for user %(user)s reset" msgstr "Heslo pro uživatele %(user)s resetováno" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." @@ -483,7 +484,7 @@ msgstr "není nakonfigurováno" msgid "Execution permissions missing" msgstr "Chybí povolení k exekuci" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Vlastní sloupec %(column)d neexistuje v databázi" @@ -496,8 +497,8 @@ msgstr "Formát knihy úspěšně smazán" msgid "Book Successfully Deleted" msgstr "Kniha úspěšně smazána" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Jejda! Vybraná kniha není k dispozici. Soubor neexistuje nebo není přístupný" @@ -534,7 +535,7 @@ msgstr "Nepodařilo se vytvořit cestu %(path)s (oprávnění odepřeno)." msgid "Failed to store file %(file)s." msgstr "Uložení souboru %(file)s se nezdařilo." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Chyba databáze: %(error)s." @@ -692,7 +693,7 @@ msgstr "Soubor %(file)s nenalezen na Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." @@ -774,7 +775,7 @@ msgstr "Kobo nastavení" msgid "Register with %(provider)s" msgstr "Registrovat s %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "nyní jste přihlášen jako: '%(nickname)s'" @@ -840,7 +841,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Přihlásit" @@ -917,7 +918,7 @@ msgid "Show Random Books" msgstr "Zobrazit náhodné knihy" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Kategorie" @@ -955,7 +956,7 @@ msgstr "Zobrazit výběr vydavatele" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Jazyky" @@ -1042,58 +1043,58 @@ msgstr "Kniha byla odebrána z police: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Vytvořit polici" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Lituji, nejste oprávněni odebrat knihu z této police: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Upravit polici" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Police %(title)s vytvořena" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Police %(title)s změněna" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Došlo k chybě" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Veřejná police s názvem '%(title)s' již existuje." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Osobní police s názvem ‘%(title)s’ již existuje." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Změnit pořadí Police: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Police: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Chyba otevírání police. Police neexistuje nebo není přístupná" @@ -1174,14 +1175,14 @@ msgstr "Kategorie: %(name)s" msgid "Language: %(name)s" msgstr "Jazyky: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Rozšířené hledání" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Hledat" @@ -1197,106 +1198,106 @@ msgstr "Seznam hodnocení" msgid "File formats list" msgstr "Seznam formátů" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Úlohy" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Vydáno po " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Vydáno před " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Hodnocení <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Hodnocení >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registrovat" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Váš e-mail nemá povolení k registraci" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Potvrzovací e-mail byl odeslán na váš účet." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Nelze aktivovat ověření LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Záložní přihlášení jako: ‘%(nickname)s’, server LDAP není dosažitelný nebo neznámý uživatel" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Nelze se přihlásit: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Špatné uživatelské jméno nebo heslo" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Nové heslo bylo zasláno na vaši emailovou adresu" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Nyní jste přihlášeni jako: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profil" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profil aktualizován" diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index 88ec0827506a04563a01db93551d73241ad1cf99..b7c0207f3363ee0af804c72aa387d8e1e571a59b 100644 GIT binary patch delta 29 lcmX@KnEB9R<_+J<*o_qoEv<|!H~%eTW@NP7%vfpHvcVSW@NP3%vf= %(rating)s" msgstr "Bewertung >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Lesestatus = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fehler bei der Suche nach eigenen Spalten, bitte Calibre-Web neustarten" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registrieren" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Rückfall Login als: '%(nickname)s', LDAP Server ist nicht erreichbar, oder der Nutzer ist unbekannt" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Login nicht erfolgreich: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Eingeloggt als: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's Profil" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profil aktualisiert" diff --git a/cps/translations/el/LC_MESSAGES/messages.mo b/cps/translations/el/LC_MESSAGES/messages.mo index 47ef49892936030cc3503c49ae16fb00590c85fb..066c68c548c15550a7e5eced6924b6fc5bcac03a 100644 GIT binary patch delta 29 lcmZoV!rXL(dBe##c4GxYODiMG%@^W085u1%--_300sy1^3XT8( delta 29 lcmZoV!rXL(dBe##c0&aNODiL@%@^W085u1$--_300sy0#3Wopy diff --git a/cps/translations/el/LC_MESSAGES/messages.po b/cps/translations/el/LC_MESSAGES/messages.po index 3e5b003de..36a350578 100644 --- a/cps/translations/el/LC_MESSAGES/messages.po +++ b/cps/translations/el/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Depountis Georgios\n" "Language: el\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "Χρήστης Διαχειριστής" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Όλα" @@ -273,7 +274,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "Οι ρυθμίσεις DB δεν μπορούν να Γραφτούν" @@ -303,7 +304,7 @@ msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομισ msgid "Database Configuration" msgstr "Διαμόρφωση Λειτουργίας" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Παρακαλούμε συμπλήρωσε όλα τα πεδία!" @@ -348,7 +349,7 @@ msgstr "Επεξεργασία χρήστη %(nick)s" msgid "User '%(nick)s' updated" msgstr "Χρήστης/ες '%(nick)s' ενημερώθηκαν" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Προέκυψε ένα άγνωστο σφάλμα. Παρακαλούμε δοκίμασε ξανά αργότερα." @@ -383,7 +384,7 @@ msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομισ msgid "Password for user %(user)s reset" msgstr "Κωδικός για επαναφορά %(user) χρήστη/ών" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Παρακαλούμε διαμόρφωσε πρώτα τις ρυθμίσεις ταχυδρομείου SMTP..." @@ -483,7 +484,7 @@ msgstr "δεν διαμορφώθηκε" msgid "Execution permissions missing" msgstr "Λείπουν άδειες εκτέλεσης" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Η ειδικά προσαρμοσμένη στήλη No.%(column)d δεν υπάρχει στο επίπεδο βάσης δεδομένων" @@ -496,8 +497,8 @@ msgstr "Η μορφή βιβλίου Διαγράφηκε Επιτυχώς" msgid "Book Successfully Deleted" msgstr "Το Βιβλίο Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oυπς! Ο επιλεγμένος τίτλος βιβλίου δεν είναι διαθέσιμος. Το αρχείο δεν υπάρχει ή δεν είναι προσβάσιμο" @@ -534,7 +535,7 @@ msgstr "Αποτυχεία δημιουργίας πορείας %(path)s (Η ά msgid "Failed to store file %(file)s." msgstr "Αποτυχία αποθήκευσης αρχείου %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Σφάλμα βάσης δεδομένων: %(error)s." @@ -692,7 +693,7 @@ msgstr "Το αρχείο %(file)s δεν βρέθηκε στο Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Η πορεία βιβλίου %(path)s δεν βρέθηκε στο Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Βρέθηκε ένας ήδη υπάρχον λογαριασμός για αυτή τη διεύθυνση e-mail." @@ -774,7 +775,7 @@ msgstr "Καθορισμός Kobo" msgid "Register with %(provider)s" msgstr "Εγγραφή με %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" @@ -840,7 +841,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Σύνδεση" @@ -917,7 +918,7 @@ msgid "Show Random Books" msgstr "Προβολή Τυχαίων Βιβλίων" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Κατηγορίες" @@ -955,7 +956,7 @@ msgstr "Προβολή επιλογών εκδότη" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Γλώσσες" @@ -1042,58 +1043,58 @@ msgstr "Το βιβλίο έχει αφαιρεθεί από το ράφι: %(sn msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Δημιούργησε ένα Ράφι" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Συγγνώμη αλλά δεν σου επιτρέπεται η αφαίρεση ενός βιβλίου από αυτό το ράφι: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Επεξεργασία ενός ραφιού" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Το ράφι %(title)s δημιουργήθηκε" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Το ράφι %(title)s άλλαξε" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Υπήρξε ένα σφάλμα" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Ένα δημόσιο ράφι με το όνομα '%(title)s' υπάρχει ήδη." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ένα ιδιωτικό ράφι με το όνομα '%(title)s' υπάρχει ήδη." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Αλλαγή σειράς του Ραφιού: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Ράφι: '%(name)s" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Σφάλμα κατά το άνοιγμα του ραφιού. Το ράφι δεν υπάρχει ή δεν είναι προσβάσιμο" @@ -1174,14 +1175,14 @@ msgstr "Κατηγορία: %(name)s" msgid "Language: %(name)s" msgstr "Γλώσσα: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Προχωρημένη Αναζήτηση" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Αναζήτηση" @@ -1197,106 +1198,106 @@ msgstr "Λίστα αξιολογήσεων" msgid "File formats list" msgstr "Λίστα μορφών αρχείου" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Εργασίες" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Εκδόθηκε μετά" -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Εκδόθηκε πριν" -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Αξιολόγηση <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Αξιολόγηση >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Το βιβλίο έχει επιτυχώς μπει σε σειρά για αποστολή στο %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Oυπς! Υπήρξε ένα σφάλμα κατά την αποστολή αυτού του βιβλίου: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Παρακαλούμε ενημέρωσε το προφίλ σου με μια έγκυρη Διεύθυνση E-mail Αποστολής στο Kindle." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Εγγραφή" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Η διεύθυνση e-mail σου δεν επιτρέπεται να εγγραφεί" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Το e-mail επιβεβαίωσης έχει σταλεί στον e-mail λογαριασμό σου." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Δεν μπόρεσε να ενεργοποιηθεί η επαλήθευση LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Εναλλακτική Σύνδεση ως: '%(nickname)s', Ο Διακομιστής LDAP δεν είναι προσβάσιμος, ή ο χρήστης δεν είναι γνωστός" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Δεν μπόρεσε να συνδεθεί: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Λανθασμένο Όνομα Χρήστη ή Κωδικός" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Ο Νέος Κωδικός έχει σταλεί στη διεύθυνση email σου" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Παρακαλούμε συμπλήρωσε ένα έγκυρο όνομα χρήστη για επαναφορά του κωδικού" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Έχεις συνδεθεί ως: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's προφίλ" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Το προφίλ ενημερώθηκε" diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index 82ed25531ba509e2edfc2e09850d3af6c598f121..4c9a8b5354c5ce76cca614e7bd490ec715e5f635 100644 GIT binary patch delta 29 lcmcaJk@?O<<_(Mm?8XX)mR3fVn>h*;7#S@$YZh(}2LO~-2}l3{ delta 29 lcmcaJk@?O<<_(Mm?1l;kmR3e)n>h*;7#S@#YZh(}2LO}u2|)k= diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index d57c31cc4..fee74d1f8 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-05-25 17:22+0200\n" "Last-Translator: minakmostoles \n" "Language: es\n" @@ -18,7 +18,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -74,7 +74,8 @@ msgid "Edit Users" msgstr "Editar usuarios" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Todo" @@ -277,7 +278,7 @@ msgstr "Ubicaciones del certificado de la CA del LDAP, del certificado o de la c #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "La base de datos de configuración no es modificable" @@ -307,7 +308,7 @@ msgstr "Actualizados los ajustes del servidor de correo electrónico" msgid "Database Configuration" msgstr "Configuración de la base de datos" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "¡Por favor, rellena todos los campos!" @@ -352,7 +353,7 @@ msgstr "Editar Usuario %(nick)s" msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." @@ -387,7 +388,7 @@ msgstr "Actualizados los ajustes del servidor de correo electrónico" msgid "Password for user %(user)s reset" msgstr "Contraseña para el usuario %(user)s reinicializada" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Configura primero los parámetros del servidor SMTP..." @@ -487,7 +488,7 @@ msgstr "no configurado" msgid "Execution permissions missing" msgstr "Faltan permisos de ejecución" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Columna personalizada No.%(column)d no existe en la base de datos calibre" @@ -500,8 +501,8 @@ msgstr "Formato de libro eliminado con éxito" msgid "Book Successfully Deleted" msgstr "Libro eliminado con éxito" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "oh, oh, el libro seleccionado no está disponible. El archivo no existe o no es accesible" @@ -538,7 +539,7 @@ msgstr "Fallo al crear la ruta %(path)s (permiso denegado)" msgid "Failed to store file %(file)s." msgstr "Fallo al guardar el archivo %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Error en la base de datos: %(error)s." @@ -696,7 +697,7 @@ msgstr "Fichero %(file)s no encontrado en Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico" @@ -778,7 +779,7 @@ msgstr "Configuración de Kobo" msgid "Register with %(provider)s" msgstr "Registrado con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "has iniciado sesión como : '%(nickname)s'" @@ -844,7 +845,7 @@ msgid "{} Stars" msgstr "{} Estrellas" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Inicio de sesión" @@ -921,7 +922,7 @@ msgid "Show Random Books" msgstr "Mostrar libros al azar" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Categorías" @@ -959,7 +960,7 @@ msgstr "Mostrar selección de editores" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Idiomas" @@ -1046,58 +1047,58 @@ msgstr "El libro fue eliminado del estante: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crear un estante" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Ya existe un estante público con el nombre '%(title)s'." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ya existe un estante privado con el nombre '%(title)s'." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Error al abrir un estante. El estante no existe o no es accesible" @@ -1178,14 +1179,14 @@ msgstr "Categoría : %(name)s" msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Búsqueda avanzada" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Buscar" @@ -1201,106 +1202,106 @@ msgstr "Lista de calificaciones" msgid "File formats list" msgstr "Lista de formatos" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Tareas" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Publicado después de " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Publicado antes de " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Calificación <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Calificación >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Estado de lectura = $(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Error en la búsqueda de columnas personalizadas, por favor reinicia Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro puesto en la cola de envío a %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Ha sucedido un error en el envío del libro: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Por favor actualiza tu perfil con la dirección de correo de su kindle..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "El servidor de correo no está configurado, por favor, ¡avisa a tu administrador!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registro" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Su correo electrónico no está permitido para registrarse" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "No se puede activar la autenticación LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login como: '%(nickname)s', no se puede acceder al servidor LDAP o usuario desconocido" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "No se pudo entrar: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Usuario o contraseña inválido" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Una nueva contraseña se ha enviado a su cuenta de correo electrónico" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Por favor, introduce un usuario válido para restablecer la contraseña" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ahora estás conectado como: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Perfil actualizado" diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo index cf1a75d3ad6928ed40cd57e099dbfbfa9a8f302b..bf9771a25e71dfc2d8b6ea6e419f24f8739418ab 100644 GIT binary patch delta 29 lcmZp?&e(XJal\n" "Language: fi\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -71,7 +71,8 @@ msgid "Edit Users" msgstr "Pääkäyttäjä" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Kaikki" @@ -273,7 +274,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -303,7 +304,7 @@ msgstr "Sähköpostipalvelimen tiedot päivitetty" msgid "Database Configuration" msgstr "Ominaisuuksien asetukset" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Ole hyvä ja täytä kaikki kentät!" @@ -348,7 +349,7 @@ msgstr "Muokkaa käyttäjää %(nick)s" msgid "User '%(nick)s' updated" msgstr "Käyttäjä '%(nick)s' päivitetty" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." @@ -383,7 +384,7 @@ msgstr "Sähköpostipalvelimen tiedot päivitetty" msgid "Password for user %(user)s reset" msgstr "Käyttäjän %(user)s salasana palautettu" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..." @@ -481,7 +482,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -494,8 +495,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:" @@ -532,7 +533,7 @@ msgstr "Polun %(path)s luonti epäonnistui (Ei oikeutta)." msgid "Failed to store file %(file)s." msgstr "Tiedoston %(file)s tallennus epäonnistui." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -690,7 +691,7 @@ msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta" msgid "Book path %(path)s not found on Google Drive" msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus." @@ -772,7 +773,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "Rekisteröi tuottajalle %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" @@ -838,7 +839,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Kirjaudu sisään" @@ -915,7 +916,7 @@ msgid "Show Random Books" msgstr "Näytä satunnausia kirjoja" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Kategoriat" @@ -953,7 +954,7 @@ msgstr "Näytä julkaisijavalinta" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Kielet" @@ -1040,58 +1041,58 @@ msgstr "Kirja on poistettu hyllystä: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "luo hylly" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Valitettavsti sinulla ei ole oikeutta poistaa kirjaa hyllystä: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Muokkaa hyllyä" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Hylly %(title)s luotu" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Hylly %(title)s muutettu" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Tapahtui virhe" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Muuta hyllyn: '%(name)s' järjestystä" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylly: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Virhe hyllyn avauksessa. Hyllyä ei ole tai se ei ole saatavilla" @@ -1172,14 +1173,14 @@ msgstr "Kategoria: %(name)s" msgid "Language: %(name)s" msgstr "Kieli: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Edistynyt haku" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Hae" @@ -1195,106 +1196,106 @@ msgstr "Arvostelulistaus" msgid "File formats list" msgstr "Tiedostomuotolistaus" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Tehtävät" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Julkaistu alkaen " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Julkaisut ennen " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Arvostelu <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Arvostelu >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Ole hyvä ja aseta Kindle sähköpostiosoite ensin..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Rekisteröi" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "LDAP autnetikoinnin aktivointi ei onnistu" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Väärä käyttäjätunnus tai salasana" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "olet kirjautunut tunnuksella: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)sn profiili" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profiili päivitetty" diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index 02501df2de235322a46bda7d407673c4b99f4c99..942ea659c8ff73c4776903bec3bbda6de74f740e 100644 GIT binary patch delta 29 lcmZo(!rZ)sdBfIxc4GxYODiMG&3p1W85u1%A1km;1OS}-3OfJ* delta 29 lcmZo(!rZ)sdBfIxc0&aNODiL@&3p1W85u1$A1km;1OS|u3N!!! diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 5ffff5d74..53716e5e2 100644 --- a/cps/translations/fr/LC_MESSAGES/messages.po +++ b/cps/translations/fr/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-06-07 06:47+0200\n" "Last-Translator: \n" "Language: fr\n" @@ -31,7 +31,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -86,7 +86,8 @@ msgid "Edit Users" msgstr "Utilisateur admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Tout" @@ -289,7 +290,7 @@ msgstr "LDAP CACertificat, certificat ou emplacement de clé non valide, veuille #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "Les paramètres de la base de données ne sont pas accessibles en écriture" @@ -319,7 +320,7 @@ msgstr "Les paramètres du serveur de courriels ont été mis à jour" msgid "Database Configuration" msgstr "Configuration des options" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Veuillez compléter tous les champs !" @@ -364,7 +365,7 @@ msgstr "Éditer l'utilisateur %(nick)s" msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." @@ -399,7 +400,7 @@ msgstr "Les paramètres du serveur de courriels ont été mis à jour" msgid "Password for user %(user)s reset" msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez configurer les paramètres SMTP au préalable..." @@ -499,7 +500,7 @@ msgstr "non configuré" msgid "Execution permissions missing" msgstr "Les permissions d'exécutions manquantes" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "La colonne personnalisée No.%(column)d n'existe pas dans la base de données calibre" @@ -512,8 +513,8 @@ msgstr "Le format du livre a été supprimé avec succès" msgid "Book Successfully Deleted" msgstr "Le livre a été supprimé avec succès" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible" @@ -550,7 +551,7 @@ msgstr "Impossible de créer le chemin %(path)s (Permission refusée)." msgid "Failed to store file %(file)s." msgstr "Échec de la sauvegarde du fichier %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Erreur de la base de données: %(error)s." @@ -708,7 +709,7 @@ msgstr "Le fichier %(file)s n'a pas été trouvé dans Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Le chemin du livre %(path)s n'a pas été trouvé dans Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Un compte existant a été trouvé pour cette adresse de courriel." @@ -790,7 +791,7 @@ msgstr "Configuration Kobo" msgid "Register with %(provider)s" msgstr "Enregistrer avec %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté comme : '%(nickname)s'" @@ -856,7 +857,7 @@ msgid "{} Stars" msgstr "{} Étoiles" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Connexion" @@ -933,7 +934,7 @@ msgid "Show Random Books" msgstr "Montrer des livres au hasard" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Catégories" @@ -971,7 +972,7 @@ msgstr "Montrer la sélection par éditeur" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Langues" @@ -1058,58 +1059,58 @@ msgstr "Le livre a été supprimé de l'étagère %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Créer une étagère" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "L’étagère %(title)s a été modifiée" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Une étagère publique avec le nom '%(title)s' existe déjà." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Une étagère privée avec le nom '%(title)s' existe déjà." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible" @@ -1190,14 +1191,14 @@ msgstr "Catégorie : %(name)s" msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Recherche avancée" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Chercher" @@ -1213,106 +1214,106 @@ msgstr "Liste des évaluations" msgid "File formats list" msgstr "Liste de formats de fichiers" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Tâches" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Publié après le " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Publié avant le " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Évaluation <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Évaluation >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Status de lecture = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erreur lors de la recherche de colonnes personnalisées, veuillez redémarrer Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Le livre a été mis en file de traitement avec succès pour un envoi vers %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Veuillez mettre à jour votre profil avec une adresse de courriel Kindle valide." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Créer un compte" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Impossible d’activer l’authentification LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Connexion de secours comme: '%(nickname)s', le serveur LDAP est indisponible, ou l'utilisateur est inconnu" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Impossible de se connecter: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Le nouveau mot de passe a été envoyé vers votre adresse de courriel" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Veuillez entrer un nom d'utilisateur valide pour réinitialiser le mot de passe" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Vous êtes maintenant connecté en tant que : ‘%(nickname)s’" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profil mis à jour" diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo index bd42e50e5d6c9bffb314495577357be7bf9c5ab5..66c1dc52f8bc75270bfa0b1e1916f0e9c8d6dba3 100644 GIT binary patch delta 28 kcmdmSlyS#V#tqNR*o_qoEv<|!C%-lO&S<&$srh9s0Ic*2pCcicN&S= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Hiba történt a könyv küldésekor: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Először be kell állítani a kindle e-mail címet..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Regisztrálás" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Jóváhagyó levél elküldve az email címedre." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s profilja" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "A profil frissítve." diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index af9006f72a00eba1417a44252c9335b7badb8c5a..edf183ba61484d57446c7abdc739e5c5751136b0 100644 GIT binary patch delta 29 lcmX@MgZbDF<_%31?8XX)mR3fVn>#Cn85u1%&#hdU1OTeC3hV#? delta 29 lcmX@MgZbDF<_%31?1l;kmR3e)n>#Cn85u1$&#hdU1OTc|3grL* diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index 6e1dda304..2fb8119bd 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" "Last-Translator: ElQuimm \n" "Language: it\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -69,7 +69,8 @@ msgid "Edit Users" msgstr "Modifica gli utenti" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Tutti" @@ -268,7 +269,7 @@ msgstr "LDAP CACertificate, il certificato o la posizione della chiave non sono #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "I parametri del DB non sono scrivibili" @@ -296,7 +297,7 @@ msgstr "Configurazione del Database aggiornata" msgid "Database Configuration" msgstr "Configurazione del Database" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Per favore compila tutti i campi!" @@ -340,7 +341,7 @@ msgstr "Modifica l'utente %(nick)s" msgid "User '%(nick)s' updated" msgstr "L'utente '%(nick)s' è stato aggiornato" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto: per favore riprova." @@ -375,7 +376,7 @@ msgstr "Configurazione del server e-mail aggiornata" msgid "Password for user %(user)s reset" msgstr "La password dell'utente %(user)s è stata resettata" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Configura dapprima le impostazioni del server SMTP..." @@ -473,7 +474,7 @@ msgstr "non configurato" msgid "Execution permissions missing" msgstr "Mancano i permessi di esecuzione" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "La colonna personale no.%(column)d non esiste nel database di Calibre" @@ -486,8 +487,8 @@ msgstr "Il formato del libro è stato eliminato con successo" msgid "Book Successfully Deleted" msgstr "Il libro é stato eliminato con successo" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Errore durante l'apertura del libro selezionato. Il file non esiste o il file non è accessibile" @@ -524,7 +525,7 @@ msgstr "Impossibile creare la cartella %(path)s (autorizzazione negata)." msgid "Failed to store file %(file)s." msgstr "Il salvataggio del file %(file)s non è riuscito." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Errore nel database: %(error)s." @@ -682,7 +683,7 @@ msgstr "File %(file)s non trovato su Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Non ho trovato la cartella %(path)s del libro su Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "Ho trovato un account creato in precedenza con questo indirizzo e-mail." @@ -763,7 +764,7 @@ msgstr "Configurazione di Kobo" msgid "Register with %(provider)s" msgstr "Registra con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come: '%(nickname)s'" @@ -829,7 +830,7 @@ msgid "{} Stars" msgstr "{} Stelle" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Accesso" @@ -906,7 +907,7 @@ msgid "Show Random Books" msgstr "Mostra libri casualmente" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Categorie" @@ -944,7 +945,7 @@ msgstr "Mostra l'opzione per la selezione degli editori" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Lingue" @@ -1031,57 +1032,57 @@ msgstr "Il libro è stato rimosso dallo scaffale: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crea uno scaffale" -#: cps/shelf.py:241 +#: cps/shelf.py:237 msgid "Sorry you are not allowed to edit this shelf" msgstr "Spiacente, non sei autorizzato a modificare questo scaffale" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Modifica uno scaffale" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Lo scaffale %(title)s è stato creato" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Lo scaffale %(title)s è stato modificato" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "C'era un errore" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Esiste già uno scaffale pubblico denominato '%(title)s'." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Esiste già uno scaffale privato denominato '%(title)s'." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modifica l'ordine dello scaffale: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Scaffale: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Errore durante l'apertura dello scaffale. Lo scaffale non esiste o non è accessibile" @@ -1162,14 +1163,14 @@ msgstr "Categoria: %(name)s" msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Ricerca avanzata" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Cerca" @@ -1185,106 +1186,106 @@ msgstr "Elenco delle valutazioni" msgid "File formats list" msgstr "Elenco dei formati" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Compito" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Pubblicato dopo il " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Pubblicato prima del " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Valutazione <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Valutazione >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Stato di lettura = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Errore di ricerca nelle colonne personalizzate. Per favore riavvia Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Libro accodato con successo per essere spedito a %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Oops! Si è verificato un errore durante l'invio di questo libro: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Per favore aggiorna il tuo profilo con un indirizzo e-mail Kindle a cui inviare i libri." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registra" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Il tuo e-mail non è autorizzato alla registrazione" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Un messaggio di conferma è stato inviato al tuo recapito e-mail." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Non posso attivare l'autenticazione LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Non posso accedere: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Una nuova password è stata inviata al tuo recapito e-mail" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Per favore digita un nome di utente valido per resettare la password" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ora sei connesso come '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profilo aggiornato" diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index 3fad6032cea57a12fc26b55b45e0d9bcbdfdd301..f0f34b232cfbe9fd10dfc3e74de09fc9b895c3f9 100644 GIT binary patch delta 29 lcmaDmoAK>z#tmz<*o_qoEv<|!H*eOGW@NP7d|q2l2>_>b3Dp1q delta 29 lcmaDmoAK>z#tmz<*bNm7EUk>pHgDFFW@NP3d|q2l2>_=M3C;ij diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index f8ce8069c..4b560850c 100644 --- a/cps/translations/ja/LC_MESSAGES/messages.po +++ b/cps/translations/ja/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: white \n" "Language: ja\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "" @@ -268,7 +269,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -298,7 +299,7 @@ msgstr "メールサーバの設定を更新しました" msgid "Database Configuration" msgstr "機能設定" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "全ての項目を入力してください" @@ -343,7 +344,7 @@ msgstr "%(nick)s を編集" msgid "User '%(nick)s' updated" msgstr "ユーザ '%(nick)s' を更新しました" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" @@ -378,7 +379,7 @@ msgstr "メールサーバの設定を更新しました" msgid "Password for user %(user)s reset" msgstr "%(user)s 用のパスワードをリセット" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "初めにSMTPメールの設定をしてください" @@ -476,7 +477,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -489,8 +490,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -527,7 +528,7 @@ msgstr "%(path)s の作成に失敗しました (Permission denied)。" msgid "Failed to store file %(file)s." msgstr "%(file)s を保存できません。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -685,7 +686,7 @@ msgstr "ファイル %(file)s はGoogleドライブ上にありません" msgid "Book path %(path)s not found on Google Drive" msgstr "本のパス %(path)s はGoogleドライブ上にありません" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "このメールアドレスで登録されたアカウントがあります" @@ -767,7 +768,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログイン中" @@ -833,7 +834,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "ログイン" @@ -910,7 +911,7 @@ msgid "Show Random Books" msgstr "ランダムで本を表示" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "カテゴリ" @@ -948,7 +949,7 @@ msgstr "出版社選択を表示" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "言語" @@ -1035,58 +1036,58 @@ msgstr "本が %(sname)s から削除されました" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "本棚を作成する" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "申し訳ありませんが、%(sname)s から本を削除することが許可されていません" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "本棚を編集する" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s を作成しました" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s を変更しました" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "エラーが発生しました" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "'%(name)s' 内の本の順番を変更する" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "本棚: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "本棚を開けません。この本棚は存在しないかアクセスできません" @@ -1167,14 +1168,14 @@ msgstr "カテゴリ: %(name)s" msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "詳細検索" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "検索" @@ -1190,106 +1191,106 @@ msgstr "" msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "タスク" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "これ以降に出版 " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "これ以前に出版 " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "評価 <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "評価 >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "本の %(kindlemail)s への送信がキューに追加されました" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "初めにKindleのメールアドレスを設定してください" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "登録" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "ユーザ名またはパスワードが違います" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "プロフィールを更新しました" diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index f2839dab3bcea9add0c05d64c436d5e871268fef..b85040b6dd652428607cfbe3964ac6f50e3e2449 100644 GIT binary patch delta 28 kcmaE~pYhRt#tny5*o_qoEv<|!C!bXL%xJlJud1pQ0ISRjpCZAOK%xJNBud1pQ0IO~a-T(jq diff --git a/cps/translations/km/LC_MESSAGES/messages.po b/cps/translations/km/LC_MESSAGES/messages.po index 983a9b034..8f7f70e98 100644 --- a/cps/translations/km/LC_MESSAGES/messages.po +++ b/cps/translations/km/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2018-08-27 17:06+0700\n" "Last-Translator: \n" "Language: km_KH\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -72,7 +72,8 @@ msgid "Edit Users" msgstr "អ្នកប្រើប្រាស់រដ្ឋបាល" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "" @@ -274,7 +275,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -304,7 +305,7 @@ msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្ msgid "Database Configuration" msgstr "ការកំណត់មុខងារ" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "សូមបំពេញចន្លោះទាំងអស់!" @@ -348,7 +349,7 @@ msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s" msgid "User '%(nick)s' updated" msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានកែប្រែ" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "" @@ -383,7 +384,7 @@ msgstr "" msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" @@ -481,7 +482,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -494,8 +495,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -532,7 +533,7 @@ msgstr "មិនអាចបង្កើតទីតាំង %(path)s (ពុ msgid "Failed to store file %(file)s." msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -690,7 +691,7 @@ msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google msgid "Book path %(path)s not found on Google Drive" msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "" @@ -771,7 +772,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" @@ -837,7 +838,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "ចូលប្រើប្រាស់" @@ -914,7 +915,7 @@ msgid "Show Random Books" msgstr "បង្ហាញសៀវភៅចៃដន្យ" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "ប្រភេទនានា" @@ -952,7 +953,7 @@ msgstr "" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "ភាសានានា" @@ -1039,58 +1040,58 @@ msgstr "សៀវភៅត្រូវបានដកចេញពីធ្នើ msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "បង្កើតធ្នើ" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "សូមអភ័យទោស អ្នកមិនមានសិទ្ធិដកសៀវភៅចេញពីធ្នើនេះទេ៖ %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "កែប្រែធ្នើ" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានបង្កើត" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានប្តូរ" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "មានបញ្ហា" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "ប្តូរលំដាប់ធ្នើ៖ ‘%(name)s’" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "ធ្នើ៖ ‘%(name)s’" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន" @@ -1171,14 +1172,14 @@ msgstr "ប្រភេទ៖ %(name)s" msgid "Language: %(name)s" msgstr "ភាសា៖ %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "ស្វែងរកកម្រិតខ្ពស់" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "ស្វែងរក" @@ -1194,106 +1195,106 @@ msgstr "" msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "កិច្ចការនានា" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "បានបោះពុម្ភក្រោយ " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "បានបោះពុម្ភមុន " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "ការវាយតម្លៃ <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "ការវាយតម្លៃ >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "ចុះឈ្មោះ" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index 5f2aa6a7ca5260ca8eb7c72812a3dea3e863c486..8dc8d59d65c55e294a17bb834ad709984216b83a 100644 GIT binary patch delta 29 kcmbQy%{-%\n" "Language: nl\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -72,7 +72,8 @@ msgid "Edit Users" msgstr "Systeembeheerder" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Alles" @@ -274,7 +275,7 @@ msgstr "LDAP CACertficaat, Certificaat of Sleutel Locatie is ongeldig. Voer alsj #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "DB-instellingen niet opgeslagen" @@ -304,7 +305,7 @@ msgstr "E-mailserver-instellingen bijgewerkt" msgid "Database Configuration" msgstr "Databaseconfiguratie" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Vul alle velden in!" @@ -349,7 +350,7 @@ msgstr "Gebruiker '%(nick)s' bewerken" msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' bijgewerkt" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." @@ -384,7 +385,7 @@ msgstr "E-mailserver-instellingen bijgewerkt" msgid "Password for user %(user)s reset" msgstr "Wachtwoord voor gebruiker %(user)s is hersteld" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Stel eerst SMTP-mail in..." @@ -484,7 +485,7 @@ msgstr "niet geconfigureerd" msgid "Execution permissions missing" msgstr "Kan programma niet uitvoeren" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Aangepaste kolom Nr.%(column)d bestaat niet in de Calibre Database" @@ -497,8 +498,8 @@ msgstr "Het boekformaat is verwijderd" msgid "Book Successfully Deleted" msgstr "Het boek is verwijderd" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oeps! Geselecteerd boek is niet beschikbaar. Bestand bestaat niet of is niet toegankelijk" @@ -535,7 +536,7 @@ msgstr "Kan de locatie '%(path)s' niet aanmaken (niet gemachtigd)." msgid "Failed to store file %(file)s." msgstr "Kan %(file)s niet opslaan." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Database fout: %(error)s." @@ -693,7 +694,7 @@ msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boeken locatie '%(path)s' niet aangetroffen op Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Bestaand account met dit e-mailadres aangetroffen." @@ -775,7 +776,7 @@ msgstr "Kobo Instellen" msgid "Register with %(provider)s" msgstr "Aanmelden bij %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "je bent ingelogd als: '%(nickname)s'" @@ -841,7 +842,7 @@ msgid "{} Stars" msgstr "{} sterren" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Inloggen" @@ -918,7 +919,7 @@ msgid "Show Random Books" msgstr "Willekeurige boeken tonen" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Categorieën" @@ -956,7 +957,7 @@ msgstr "Uitgeverskeuze tonen" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Talen" @@ -1043,58 +1044,58 @@ msgstr "Het boek is verwijderd van boekenplank: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Boekenplank maken" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Je bent niet gemachtigd deze boekenplank aan te passen" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Pas een boekenplank aan" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Boekenplank '%(title)s' aangemaakt" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Boekenplank '%(title)s' is aangepast" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Er is een fout opgetreden" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Een openbare boekenplank met de naam '%(title)s' bestaat al." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Een persoonlijke boekenplank met de naam '%(title)s' bestaat al." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Volgorde van boekenplank veranderen: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk" @@ -1175,14 +1176,14 @@ msgstr "Categorie: %(name)s" msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Geavanceerd zoeken" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Zoeken" @@ -1198,106 +1199,106 @@ msgstr "Beoordelingen" msgid "File formats list" msgstr "Alle bestandsformaten" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Taken" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Gepubliceerd na " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Gepubliceerd vóór " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Beoordeling <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Beoordeling >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Lees Status = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fout tijdens het zoeken van aangepaste kolommen, start Calibre-Web opnieuw op" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Stel je kindle-e-mailadres in..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registreren" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Kan de LDAP authenticatie niet activeren" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Terugvallen op login: '%(nickname)s', LDAP Server is onbereikbaar, of de gebruiker is onbekend" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Inloggen mislukt: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Verkeerde gebruikersnaam of wachtwoord" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Een nieuw wachtwoord is verzonden naar je e-mailadres" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Geef een geldige gebruikersnaam op om je wachtwoord te herstellen" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profiel" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profiel bijgewerkt" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index e796b117b354abef952f2b2adba88c5807a01c94..b6d4e65ef195d33fa66b94d8fde6e66bf4f3b496 100644 GIT binary patch delta 29 lcmbO~i+TPm<_(vM*o_qoEv<|!H{UEuV`Q}4>`-z)0syCb3ljhU delta 29 lcmbO~i+TPm<_(vM*bNm7EUk>pHs35tV`Q}0>`-z)0syBM3k(1N diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 1ecbe85fd..51c59e156 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2021-06-12 15:35+0200\n" "Last-Translator: Radosław Kierznowski \n" "Language: pl\n" @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -73,7 +73,8 @@ msgstr "Edytuj użytkowników" # ??? #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Wszystko" @@ -274,7 +275,7 @@ msgstr "Główny urząd certyfikatu LDAP, Certyfikat lub Lokalizacja Klucza nie #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "Ustawienia Bazy Danych nie są zapisywalne" @@ -303,7 +304,7 @@ msgstr "Zaktualizowano ustawienia serwera poczty e-mail" msgid "Database Configuration" msgstr "Konfiguracja bazy danych" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" @@ -348,7 +349,7 @@ msgstr "Edytuj użytkownika %(nick)s" msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." @@ -384,7 +385,7 @@ msgstr "Zaktualizowano ustawienia serwera poczty e-mail" msgid "Password for user %(user)s reset" msgstr "Zrestartowano hasło użytkownika %(user)s" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." @@ -485,7 +486,7 @@ msgstr "nie skonfigurowane" msgid "Execution permissions missing" msgstr "Brak uprawnienia do wykonywania pliku" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Niestandardowa kolumna No.%(column)d nie istnieje w bazie calibre" @@ -498,8 +499,8 @@ msgstr "Plik książki w wybranym formacie został usunięty" msgid "Book Successfully Deleted" msgstr "Książka została usunięta" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub jest niedostępny" @@ -536,7 +537,7 @@ msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." msgid "Failed to store file %(file)s." msgstr "Nie można zapisać pliku %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Błąd bazy danych: %(error)s." @@ -696,7 +697,7 @@ msgstr "Nie znaleziono pliku %(file)s na Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Nie znaleziono ścieżki do książki %(path)s na Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "Znaleziono istniejące konto dla tego adresu e-mail" @@ -778,7 +779,7 @@ msgstr "Konfiguracja Kobo" msgid "Register with %(provider)s" msgstr "Zarejestruj się %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "zalogowałeś się jako: '%(nickname)s'" @@ -844,7 +845,7 @@ msgid "{} Stars" msgstr "{} Gwiazdek" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Zaloguj się" @@ -921,7 +922,7 @@ msgid "Show Random Books" msgstr "Pokazuj losowe książki" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Kategorie" @@ -959,7 +960,7 @@ msgstr "Pokaż menu wyboru wydawcy" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Języki" @@ -1046,58 +1047,58 @@ msgstr "Książka została usunięta z półki: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Utwórz półkę" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Niestety nie możesz usunąć książki z tej półki %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Publiczna półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Prywatna półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: „%(name)s”" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Błąd otwierania półki. Półka nie istnieje lub jest niedostępna" @@ -1178,14 +1179,14 @@ msgstr "Kategoria: %(name)s" msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Wyszukiwanie" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Szukaj" @@ -1201,107 +1202,107 @@ msgstr "Lista z ocenami" msgid "File formats list" msgstr "Lista formatów" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Zadania" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Opublikowane po " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Opublikowane przed " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Ocena <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Ocena >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Status przeczytania = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 #, fuzzy msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Błąd podczas wyszukiwania kolumn niestandardowych, proszę zrestartować Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Książka została umieszczona w kolejce do wysłania do %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Najpierw skonfiguruj adres e-mail Kindle..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Zarejestruj się" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Twój e-mail nie może się zarejestrować" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Nie można aktywować uwierzytelniania LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Nie można zalogować: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Nowe hasło zostało wysłane na Twój adres e-mail" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Wprowadź prawidłową nazwę użytkownika, aby zresetować hasło" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Jesteś teraz zalogowany jako: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Zaktualizowano profil" diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.mo b/cps/translations/pt_BR/LC_MESSAGES/messages.mo index d1f3e9543f8b24643f5b6c6b618c471a21b8f442..f08ccf569a4417124062409bc30ed22345ace903 100644 GIT binary patch delta 29 lcmZ4Yo@w2CrVX3Y*o_qoEv<|!H}6cdVPdr0{4HaL9{{&-3()`o delta 29 lcmZ4Yo@w2CrVX3Y*bNm7EUk>pHt$TcVPdq{{4HaL9{{%u3(5ch diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.po b/cps/translations/pt_BR/LC_MESSAGES/messages.po index d2bcdb067..64bed06f7 100644 --- a/cps/translations/pt_BR/LC_MESSAGES/messages.po +++ b/cps/translations/pt_BR/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: br\n" @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -68,7 +68,8 @@ msgid "Edit Users" msgstr "Usuário Admin" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Todos" @@ -272,7 +273,7 @@ msgstr "LDAP CACertificate, Certificados ou chave de localização não é váli #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "O banco de dados de configurações não é gravável" @@ -302,7 +303,7 @@ msgstr "Atualização das configurações do servidor de e-mail" msgid "Database Configuration" msgstr "Configuração das Características" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Por favor, preencha todos os campos!" @@ -347,7 +348,7 @@ msgstr "Editar usuário %(nick)s" msgid "User '%(nick)s' updated" msgstr "Usuário '%(nick)s' atualizado" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." @@ -382,7 +383,7 @@ msgstr "Atualização das configurações do servidor de e-mail" msgid "Password for user %(user)s reset" msgstr "Senha para redefinição do usuário %(user)s" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." @@ -482,7 +483,7 @@ msgstr "não configurado" msgid "Execution permissions missing" msgstr "Faltam as permissões de execução" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "A coluna personalizada No.%(column)d não existe no banco de dados do calibre" @@ -495,8 +496,8 @@ msgstr "Formato do Livro Eliminado com Sucesso" msgid "Book Successfully Deleted" msgstr "Livro Eliminado com Sucesso" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Oops! O título do livro seleccionado não está disponível. O arquivo não existe ou não é acessível" @@ -533,7 +534,7 @@ msgstr "Falha ao criar o caminho %(path)s (Permission denied)." msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o arquivo %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Erro de banco de dados: %(error)s." @@ -691,7 +692,7 @@ msgstr "Arquivo %(file)s não encontrado no Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Caminho do livro %(path)s não encontrado no Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Encontrado uma conta existente para este endereço de e-mail." @@ -773,7 +774,7 @@ msgstr "Configuração Kobo" msgid "Register with %(provider)s" msgstr "Registre-se com %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "agora você está logado como: '%(nickname)s'" @@ -839,7 +840,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Login" @@ -916,7 +917,7 @@ msgid "Show Random Books" msgstr "Mostrar Livros Aleatórios" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Categorias" @@ -954,7 +955,7 @@ msgstr "Mostrar selecção de editores" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Idiomas" @@ -1041,58 +1042,58 @@ msgstr "O livro foi removido da estante: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Crie uma estante" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Desculpe, você não tem permissão para remover um livro desta estante: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Editar uma estante" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s criada" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s alterada" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Houve um erro" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante pública com o nome '%(title)s' ." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante privada com o nome'%(title)s' ." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Alterar ordem da Estante: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erro ao abrir estante. A estante não existe ou não está acessível" @@ -1173,14 +1174,14 @@ msgstr "Categoria: %(name)s" msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Pesquisa Avançada" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Pesquisa" @@ -1196,106 +1197,106 @@ msgstr "Lista de classificações" msgid "File formats list" msgstr "Lista de formatos de arquivo" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Tarefas" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Publicado depois de " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Publicado antes de " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Avaliação <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Avaliação >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Status de leitura = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Livro enfileirado com sucesso para envio para %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Ups! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Por favor, atualize seu perfil com um endereço de e-mail válido para Kindle." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registe-se" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Seu e-mail não tem permissão para registrar" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "O e-mail de confirmação foi enviado para a sua conta de e-mail." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Não é possível ativar a autenticação LDAP" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Login de reserva como:'%(nickname)s', servidor LDAP não acessível ou usuário desconhecido" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Não foi possível fazer o login: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Nome de usuário ou senha incorretos" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Nova senha foi enviada para seu endereço de e-mail" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Por favor, digite um nome de usuário válido para redefinir a senha" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Você agora está logado como: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s's" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Perfil atualizado" diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index 486bb167640bee2302692f973c18bafc68dabe86..c9e01aa727415d38b3f381d25a5ba2ac02b5982b 100644 GIT binary patch delta 29 lcmX^1o$1(jrVW8X?8XX)mR3fVn= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "При отправке этой книги произошла ошибка: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Зарегистрироваться" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Ваш e-mail не подходит для регистрации" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Письмо с подтверждением отправлено вам на e-mail." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Не удается активировать LDAP аутентификацию" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Резервный вход в систему как: '%(nickname)s', LDAP-сервер недоступен или пользователь не известен" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Не удалось войти: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Новый пароль был отправлен на ваш адрес электронной почты" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Вы вошли как: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Профиль %(name)s's" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Профиль обновлён" diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo index 8ff534943f8db1930a76678cc9d64a3ba819f6be..bcc70e3b1748b341296777a03c40c681dd90da56 100644 GIT binary patch delta 29 lcmccim+9JHrVXM6?8XX)mR3fVn`H`A85u1%I~7jx1purP3NHWv delta 29 lcmccim+9JHrVXM6?1l;kmR3e)n`H`A85u1$I~7jx1puqA3Mc>o diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po index 713896761..9f5a6a412 100644 --- a/cps/translations/sv/LC_MESSAGES/messages.po +++ b/cps/translations/sv/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2021-05-13 11:00+0000\n" "Last-Translator: Jonatan Nyberg \n" "Language: sv\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "Redigera användare" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Alla" @@ -272,7 +273,7 @@ msgstr "LDAP-certifikat, certifikat eller nyckelplats är inte giltigt, vänlige #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "Inställningar för DB är inte skrivbara" @@ -302,7 +303,7 @@ msgstr "E-postserverinställningar uppdaterade" msgid "Database Configuration" msgstr "Funktion konfiguration" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Fyll i alla fält!" @@ -346,7 +347,7 @@ msgstr "Redigera användaren %(nick)s" msgid "User '%(nick)s' updated" msgstr "Användaren '%(nick)s' uppdaterad" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." @@ -382,7 +383,7 @@ msgstr "E-postserverinställningar uppdaterade" msgid "Password for user %(user)s reset" msgstr "Lösenord för användaren %(user)s återställd" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Konfigurera SMTP-postinställningarna först..." @@ -482,7 +483,7 @@ msgstr "inte konfigurerad" msgid "Execution permissions missing" msgstr "Körningstillstånd saknas" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "Anpassad kolumn n.%(column)d finns inte i calibre-databasen" @@ -495,8 +496,8 @@ msgstr "Bokformat har tagits bort" msgid "Book Successfully Deleted" msgstr "Boken har tagits bort" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Hoppsan! Vald boktitel är inte tillgänglig. Filen finns inte eller är inte tillgänglig" @@ -533,7 +534,7 @@ msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." msgid "Failed to store file %(file)s." msgstr "Det gick inte att lagra filen %(file)s." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "Databasfel: %(error)s." @@ -691,7 +692,7 @@ msgstr "Filen %(file)s hittades inte på Google Drive" msgid "Book path %(path)s not found on Google Drive" msgstr "Boksökvägen %(path)s hittades inte på Google Drive" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "Hittade ett befintligt konto för den här e-postadressen" @@ -772,7 +773,7 @@ msgstr "Kobo-installation" msgid "Register with %(provider)s" msgstr "Registrera dig med %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "du är nu inloggad som: \"%(nickname)s\"" @@ -838,7 +839,7 @@ msgid "{} Stars" msgstr "{} stjärnor" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Logga in" @@ -915,7 +916,7 @@ msgid "Show Random Books" msgstr "Visa slumpmässiga böcker" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Kategorier" @@ -953,7 +954,7 @@ msgstr "Visa urval av förlag" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Språk" @@ -1040,58 +1041,58 @@ msgstr "Boken har tagits bort från hyllan: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Skapa en hylla" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Redigera en hylla" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Hyllan %(title)s skapad" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Hyllan %(title)s ändrad" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Det fanns ett fel" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "En offentlig hylla med namnet \"%(title)s\" finns redan." -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "En privat hylla med namnet \"%(title)s\" finns redan." -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Ändra ordning på hyllan: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylla: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig" @@ -1172,14 +1173,14 @@ msgstr "Kategori: %(name)s" msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Avancerad sökning" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Sök" @@ -1195,106 +1196,106 @@ msgstr "Betygslista" msgid "File formats list" msgstr "Lista över filformat" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Uppgifter" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Publicerad efter " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Publicerad före " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Betyg <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Betyg >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "Lässtatus = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "Boken är i kö för att skicka till %(kindlemail)s" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "Konfigurera din kindle-e-postadress först..." -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Registrera" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "Det går inte att aktivera LDAP-autentisering" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "Det gick inte att logga in: %(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Fel användarnamn eller lösenord" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Nytt lösenord skickades till din e-postadress" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Ange giltigt användarnamn för att återställa lösenordet" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)ss profil" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profilen uppdaterad" diff --git a/cps/translations/tr/LC_MESSAGES/messages.mo b/cps/translations/tr/LC_MESSAGES/messages.mo index 4b905164648eeecf104d145134af46c3b7e3e36f..5c8bf24905e2de521ca9a7a8a5b74016a6790148 100644 GIT binary patch delta 29 lcmaE`iSfZE#tr-??8XX)mR3fVo5f5785u1%YnWQ7005K22si)$ delta 29 lcmaE`iSfZE#tr-??1l;kmR3e)o5f5785u1$YnWQ7005I;2r&Qv diff --git a/cps/translations/tr/LC_MESSAGES/messages.po b/cps/translations/tr/LC_MESSAGES/messages.po index 6abf48bb5..71dd6a59a 100644 --- a/cps/translations/tr/LC_MESSAGES/messages.po +++ b/cps/translations/tr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-04-23 22:47+0300\n" "Last-Translator: iz \n" "Language: tr\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "Tümü" @@ -269,7 +270,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -299,7 +300,7 @@ msgstr "E-posta sunucusu ayarları güncellendi" msgid "Database Configuration" msgstr "Özellik Yapılandırması" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Lütfen tüm alanları doldurun!" @@ -344,7 +345,7 @@ msgstr "%(nick)s kullanıcısını düzenle" msgid "User '%(nick)s' updated" msgstr "'%(nick)s' kullanıcısı güncellendi" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz." @@ -379,7 +380,7 @@ msgstr "E-posta sunucusu ayarları güncellendi" msgid "Password for user %(user)s reset" msgstr "%(user)s kullanıcısının şifresi sıfırlandı" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Lütfen önce SMTP e-posta ayarlarını ayarlayın..." @@ -478,7 +479,7 @@ msgstr "ayarlanmadı" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -491,8 +492,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -529,7 +530,7 @@ msgstr "%(path)s dizini oluşturulamadı. (İzin reddedildi)" msgid "Failed to store file %(file)s." msgstr "%(file)s dosyası kaydedilemedi." -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -687,7 +688,7 @@ msgstr "%(file)s dosyası Google Drive'da bulunamadı" msgid "Book path %(path)s not found on Google Drive" msgstr "eKitap yolu %(path)s Google Drive'da bulunamadı" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 #, fuzzy msgid "Found an existing account for this e-mail address" msgstr "Bu e-posta adresi için bir hesap mevcut." @@ -769,7 +770,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "%(provider)s ile Kaydol" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "giriş yaptınız: '%(nickname)s'" @@ -835,7 +836,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Giriş" @@ -912,7 +913,7 @@ msgid "Show Random Books" msgstr "Rastgele Kitap Göster" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Kategoriler" @@ -950,7 +951,7 @@ msgstr "Yayıncı seçimini göster" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Diller" @@ -1037,58 +1038,58 @@ msgstr "eKitap kitaplıktan silindi: %(sname)s" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "Kitaplık oluştur" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Maalesef bu kitaplıktan eKitap silmenize izin verilmiyor: %(sname)s" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Kitaplığı düzenle" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "%(title)s kitaplığı oluşturuldu." -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "%(title)s kitaplığı değiştirildi" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Bir hata oluştu" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Kitaplık sıralamasını değiştir: '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Kitaplık: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kitaplık açılırken hata oluştu. Kitaplık mevcut değil ya da erişilebilir değil" @@ -1169,14 +1170,14 @@ msgstr "Kategori: %(name)s" msgid "Language: %(name)s" msgstr "Dil: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Gelişmiş Arama" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Ara" @@ -1192,106 +1193,106 @@ msgstr "Değerlendirme listesi" msgid "File formats list" msgstr "Biçim listesi" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "Görevler" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "Yayınlanma (sonra)" -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Yayınlanma (önce)" -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "Değerlendirme <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "Değerlendirme >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "%(kindlemail)s'a gönderilmek üzere başarıyla sıraya alındı" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Kayıt ol" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "E-posta adresinizle kaydolunmasına izin verilmiyor" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "Onay e-Postası hesabınıza gönderildi." -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "LDAP Kimlik Doğrulaması etkinleştirilemiyor" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Yanlış Kullanıcı adı ya da Şifre" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "Yeni şifre e-Posta adresinize gönderildi" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "Şifrenizi sıfırlayabilmek için lütfen geçerli bir kullanıcı adı giriniz" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Giriş yaptınız: '%(nickname)s'" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s Profili" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Profil güncellendi" diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index 15e812be21cbf44387e0065234e619427ec50254..548354ee56f661f107269a1cdadd51637ed35d36 100644 GIT binary patch delta 29 lcmaFU!}z9$al=A+c4GxYODiMG%`4\n" "Language: uk\n" @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "Керування сервером" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "" @@ -272,7 +273,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -302,7 +303,7 @@ msgstr "З'єднання з базою даних закрите" msgid "Database Configuration" msgstr "Особливі налаштування" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "Будь-ласка, заповніть всі поля!" @@ -346,7 +347,7 @@ msgstr "Змінити користувача %(nick)s" msgid "User '%(nick)s' updated" msgstr "Користувача '%(nick)s' оновлено" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "" @@ -381,7 +382,7 @@ msgstr "" msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" @@ -479,7 +480,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -492,8 +493,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." @@ -530,7 +531,7 @@ msgstr "" msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -688,7 +689,7 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "" @@ -769,7 +770,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Ви увійшли як користувач: '%(nickname)s'" @@ -835,7 +836,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "Ім'я користувача" @@ -912,7 +913,7 @@ msgid "Show Random Books" msgstr "Показувати випадкові книги" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "Категорії" @@ -950,7 +951,7 @@ msgstr "" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "Мови" @@ -1037,58 +1038,58 @@ msgstr "Книга видалена з книжкової полиці: %(sname) msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "створити книжкову полицю" -#: cps/shelf.py:241 +#: cps/shelf.py:237 #, fuzzy msgid "Sorry you are not allowed to edit this shelf" msgstr "Вибачте, але у вас немає дозволу для видалення книги з цієї полиці" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "Змінити книжкову полицю" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "Створена книжкова полиця %(title)s" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжкова полиця %(title)s змінена" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "Сталась помилка" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Змінити розташування книжкової полиці '%(name)s'" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжкова полиця: '%(name)s'" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" @@ -1169,14 +1170,14 @@ msgstr "Категорія: %(name)s" msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "Розширений пошук" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "Пошук" @@ -1192,106 +1193,106 @@ msgstr "" msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "" -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "Опубліковано до" -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "Помилка при відправці книги: %(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "Зареєструватись" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "Профіль %(name)s" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "Профіль оновлено" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index bdf51f02dd11171eff9799ba12c81b94facdd645..68c4f8e70b30fc4186edd49a73bf732f79810a61 100644 GIT binary patch delta 29 lcmeDC!_@bOX~U#)c4GxYODiMG%`?l@85u1%AFS|o1puz-3f=$! delta 29 lcmeDC!_@bOX~U#)c0&aNODiL@%`?l@85u1$AFS|o1puyu3fBMt diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index f8643957a..da32d2cb8 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-09-27 22:18+0800\n" "Last-Translator: xlivevil \n" "Language: zh_CN\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "管理用户" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "全部" @@ -268,7 +269,7 @@ msgstr "LDAP CA证书、证书或密钥位置无效,请输入正确的路径" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "设置数据库不可写入" @@ -297,7 +298,7 @@ msgstr "邮件服务器设置已更新" msgid "Database Configuration" msgstr "数据库配置" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "请填写所有字段!" @@ -341,7 +342,7 @@ msgstr "编辑用户 %(nick)s" msgid "User '%(nick)s' updated" msgstr "用户“%(nick)s”已更新" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试。" @@ -376,7 +377,7 @@ msgstr "邮件服务器设置已更新" msgid "Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置SMTP邮箱设置..." @@ -475,7 +476,7 @@ msgstr "未配置" msgid "Execution permissions missing" msgstr "缺少执行权限" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "自定义列号:%(column)d在Calibre数据库中不存在" @@ -488,8 +489,8 @@ msgstr "书籍格式已成功删除" msgid "Book Successfully Deleted" msgstr "书籍已成功删除" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "糟糕!选择书名无法打开。文件不存在或者文件不可访问" @@ -526,7 +527,7 @@ msgstr "创建路径 %(path)s 失败(权限拒绝)。" msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失败。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "数据库错误:%(error)s。" @@ -684,7 +685,7 @@ msgstr "Google Drive上找不到文件 %(file)s" msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到书籍路径 %(path)s" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "使用此邮箱的账号已经存在。" @@ -765,7 +766,7 @@ msgstr "Kobo 设置" msgid "Register with %(provider)s" msgstr "使用 %(provider)s 注册" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" @@ -831,7 +832,7 @@ msgid "{} Stars" msgstr "{} 星" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "登录" @@ -908,7 +909,7 @@ msgid "Show Random Books" msgstr "显示随机书籍" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "分类" @@ -946,7 +947,7 @@ msgstr "显示出版社选择" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "语言" @@ -1032,57 +1033,57 @@ msgstr "此书已从书架 %(sname)s 中删除" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "创建书架" -#: cps/shelf.py:241 +#: cps/shelf.py:237 msgid "Sorry you are not allowed to edit this shelf" msgstr "对不起,您没有编辑这个书架的权限" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已创建" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已修改" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "发生错误" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "公共书架:%(title)s已经存在已经存在。" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有书架:%(title)s已经存在已经存在。" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 %(name)s 顺序" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架:%(name)s" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" @@ -1163,14 +1164,14 @@ msgstr "分类:%(name)s" msgid "Language: %(name)s" msgstr "语言:%(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "高级搜索" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "搜索" @@ -1186,106 +1187,106 @@ msgstr "评分列表" msgid "File formats list" msgstr "文件格式列表" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "任务列表" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "出版时间晚于 " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "出版时间早于 " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "评分 <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "评分 >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "阅读状态 = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜索自定义列时出错,请重启 Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "书籍已经成功加入 %(kindlemail)s 的发送队列" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "请先配置您的kindle邮箱。" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "邮件服务未配置,请联系网站管理员!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "注册" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "您的电子邮件不允许注册" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "确认邮件已经发送到您的邮箱。" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "无法激活LDAP认证" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "后备登录“%(nickname)s”:无法访问LDAP服务器,或用户未知" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "无法登录:%(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "新密码已发送到您的邮箱" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "请输入有效的用户名进行密码重置" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”登录" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的用户配置" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "资料已更新" diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo index 037dec2313027c16e82f0fc031cb4f246d1e1719..324e990bdac690c75208d4558db1c608c8c531cd 100644 GIT binary patch delta 29 lcmcckkLlt+rVT0;?8XX)mR3fVo3$&{85u1%2Uq@c1pu#A3eo@o delta 29 lcmcckkLlt+rVT0;?1l;kmR3e)o3$&{85u1$2Uq@c1puz`3d;Zh diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po index 32d7baa25..fd59f532e 100644 --- a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: 2020-09-27 22:18+0800\n" "Last-Translator: xlivevil \n" "Language: zh_TW\n" @@ -16,7 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -70,7 +70,8 @@ msgid "Edit Users" msgstr "管理用戶" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "全部" @@ -268,7 +269,7 @@ msgstr "LDAP CA證書、證書或密鑰位置無效,請輸入正確的路徑" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "設置數據庫不可寫入" @@ -297,7 +298,7 @@ msgstr "郵件服務器設置已更新" msgid "Database Configuration" msgstr "數據庫配置" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "請填寫所有欄位!" @@ -341,7 +342,7 @@ msgstr "編輯用戶 %(nick)s" msgid "User '%(nick)s' updated" msgstr "用戶“%(nick)s”已更新" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "發生一個未知錯誤,請稍後再試。" @@ -376,7 +377,7 @@ msgstr "郵件服務器設置已更新" msgid "Password for user %(user)s reset" msgstr "用戶 %(user)s 的密碼已重置" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "請先配置SMTP郵箱設置..." @@ -475,7 +476,7 @@ msgstr "未配置" msgid "Execution permissions missing" msgstr "缺少執行權限" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "自定義列號:%(column)d在Calibre數據庫中不存在" @@ -488,8 +489,8 @@ msgstr "書籍格式已成功刪除" msgid "Book Successfully Deleted" msgstr "書籍已成功刪除" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "糟糕!選擇書名無法打開。文件不存在或者文件不可訪問" @@ -526,7 +527,7 @@ msgstr "創建路徑 %(path)s 失敗(權限拒絕)。" msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失敗。" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "數據庫錯誤:%(error)s。" @@ -684,7 +685,7 @@ msgstr "Google Drive上找不到文件 %(file)s" msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到書籍路徑 %(path)s" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "使用此郵箱的賬號已經存在。" @@ -765,7 +766,7 @@ msgstr "Kobo 設置" msgid "Register with %(provider)s" msgstr "使用 %(provider)s 註冊" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”身份登入" @@ -831,7 +832,7 @@ msgid "{} Stars" msgstr "{} 星" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "登入" @@ -908,7 +909,7 @@ msgid "Show Random Books" msgstr "隨機顯示書籍" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "分類" @@ -946,7 +947,7 @@ msgstr "顯示出版社選擇" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "語言" @@ -1032,57 +1033,57 @@ msgstr "此書已從書架 %(sname)s 中刪除" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "創建書架" -#: cps/shelf.py:241 +#: cps/shelf.py:237 msgid "Sorry you are not allowed to edit this shelf" msgstr "對不起,您沒有編輯這個書架的權限" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "編輯書架" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "書架 %(title)s 已創建" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "書架 %(title)s 已修改" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "發生錯誤" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "公共書架:%(title)s已經存在已經存在。" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有書架:%(title)s已經存在。" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改書架 %(name)s 順序" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "書架:%(name)s" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打開書架出錯。書架不存在或不可訪問" @@ -1163,14 +1164,14 @@ msgstr "分類:%(name)s" msgid "Language: %(name)s" msgstr "語言:%(name)s" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "進階搜尋" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "搜尋" @@ -1186,106 +1187,106 @@ msgstr "評分列表" msgid "File formats list" msgstr "文件格式列表" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "任務列表" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "出版時間晚於 " -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "出版時間早於 " -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "評分 <= %(rating)s" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "評分 >= %(rating)s" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "閱讀狀態 = %(status)s" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜詢自定義欄位時出錯,請重啟 Calibre-Web" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "書籍已經成功加入 %(kindlemail)s 的發送隊列" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "糟糕!發送這本書籍的時候出現錯誤:%(res)s" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "請先設置您的kindle郵箱。" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "郵件服務未配置,請聯繫網站管理員!" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "註冊" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "您的電子郵件不允許註冊" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "確認郵件已經發送到您的郵箱。" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "無法激活LDAP認證" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "備援登入“%(nickname)s”:無法訪問LDAP伺服器,或用戶未知" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "無法登入:%(message)s" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "用戶名或密碼錯誤" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "新密碼已發送到您的郵箱" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "請輸入有效的用戶名進行密碼重置" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”登入" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的用戶配置" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "資料已更新" diff --git a/cps/ub.py b/cps/ub.py index 405b0865a..6b3c27ca5 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -300,11 +300,11 @@ class Anonymous(AnonymousUserMixin, UserBase): return None def set_view_property(self, page, prop, value): - if 'view' in flask_session: - if not flask_session['view'].get(page): - flask_session['view'][page] = dict() - flask_session['view'][page][prop] = value - return None + if not 'view' in flask_session: + flask_session['view'] = dict() + if not flask_session['view'].get(page): + flask_session['view'][page] = dict() + flask_session['view'][page][prop] = value class User_Sessions(Base): __tablename__ = 'user_session' diff --git a/messages.pot b/messages.pot index ad2d6482b..489258860 100644 --- a/messages.pot +++ b/messages.pot @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2021-11-21 09:26+0100\n" +"POT-Creation-Date: 2021-11-23 19:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.0\n" #: cps/about.py:34 cps/about.py:49 cps/about.py:65 cps/converter.py:31 msgid "not installed" @@ -69,7 +69,8 @@ msgid "Edit Users" msgstr "" #: cps/admin.py:318 cps/opds.py:109 cps/opds.py:198 cps/opds.py:275 -#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/list.html:13 +#: cps/opds.py:327 cps/templates/grid.html:13 cps/templates/languages.html:9 +#: cps/templates/list.html:13 msgid "All" msgstr "" @@ -267,7 +268,7 @@ msgstr "" #: cps/admin.py:1176 cps/admin.py:1278 cps/admin.py:1375 cps/admin.py:1482 #: cps/admin.py:1551 cps/shelf.py:100 cps/shelf.py:160 cps/shelf.py:203 -#: cps/shelf.py:275 cps/shelf.py:336 cps/shelf.py:371 cps/shelf.py:446 +#: cps/shelf.py:274 cps/shelf.py:335 cps/shelf.py:370 cps/shelf.py:445 msgid "Settings DB is not Writeable" msgstr "" @@ -295,7 +296,7 @@ msgstr "" msgid "Database Configuration" msgstr "" -#: cps/admin.py:1340 cps/web.py:1497 +#: cps/admin.py:1340 cps/web.py:1492 msgid "Please fill out all fields!" msgstr "" @@ -339,7 +340,7 @@ msgstr "" msgid "User '%(nick)s' updated" msgstr "" -#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1522 cps/web.py:1585 +#: cps/admin.py:1478 cps/admin.py:1610 cps/web.py:1517 cps/web.py:1580 msgid "An unknown error occurred. Please try again later." msgstr "" @@ -374,7 +375,7 @@ msgstr "" msgid "Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1613 cps/web.py:1462 +#: cps/admin.py:1613 cps/web.py:1457 msgid "Please configure the SMTP mail settings first..." msgstr "" @@ -472,7 +473,7 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:651 cps/web.py:672 cps/web.py:1173 +#: cps/db.py:651 cps/web.py:672 cps/web.py:1168 #, python-format msgid "Custom Column No.%(column)d is not existing in calibre database" msgstr "" @@ -485,8 +486,8 @@ msgstr "" msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1724 -#: cps/web.py:1765 cps/web.py:1832 +#: cps/editbooks.py:373 cps/editbooks.py:760 cps/web.py:528 cps/web.py:1719 +#: cps/web.py:1760 cps/web.py:1827 msgid "Oops! Selected book title is unavailable. File does not exist or is not accessible" msgstr "" @@ -523,7 +524,7 @@ msgstr "" msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1685 +#: cps/editbooks.py:670 cps/editbooks.py:1065 cps/web.py:1680 #, python-format msgid "Database error: %(error)s." msgstr "" @@ -681,7 +682,7 @@ msgstr "" msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:507 cps/web.py:1680 +#: cps/helper.py:507 cps/web.py:1675 msgid "Found an existing account for this e-mail address" msgstr "" @@ -762,7 +763,7 @@ msgstr "" msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1556 +#: cps/oauth_bb.py:138 cps/remotelogin.py:133 cps/web.py:1551 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" @@ -828,7 +829,7 @@ msgid "{} Stars" msgstr "" #: cps/remotelogin.py:65 cps/templates/layout.html:86 -#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1605 +#: cps/templates/login.html:4 cps/templates/login.html:21 cps/web.py:1600 msgid "Login" msgstr "" @@ -905,7 +906,7 @@ msgid "Show Random Books" msgstr "" #: cps/render_template.py:69 cps/templates/book_table.html:67 -#: cps/templates/index.xml:83 cps/web.py:1060 +#: cps/templates/index.xml:83 cps/web.py:1055 msgid "Categories" msgstr "" @@ -943,7 +944,7 @@ msgstr "" #: cps/render_template.py:82 cps/templates/book_table.html:70 #: cps/templates/index.xml:97 cps/templates/search_form.html:107 -#: cps/web.py:1037 +#: cps/web.py:1032 msgid "Languages" msgstr "" @@ -1029,57 +1030,57 @@ msgstr "" msgid "Sorry you are not allowed to remove a book from this shelf" msgstr "" -#: cps/shelf.py:228 -msgid "Sorry you are not allowed to create a public shelf" -msgstr "" - -#: cps/shelf.py:232 cps/templates/layout.html:142 +#: cps/shelf.py:228 cps/templates/layout.html:142 msgid "Create a Shelf" msgstr "" -#: cps/shelf.py:241 +#: cps/shelf.py:237 msgid "Sorry you are not allowed to edit this shelf" msgstr "" -#: cps/shelf.py:243 +#: cps/shelf.py:239 msgid "Edit a shelf" msgstr "" -#: cps/shelf.py:262 +#: cps/shelf.py:249 +msgid "Sorry you are not allowed to create a public shelf" +msgstr "" + +#: cps/shelf.py:261 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/shelf.py:265 +#: cps/shelf.py:264 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/shelf.py:279 +#: cps/shelf.py:278 msgid "There was an error" msgstr "" -#: cps/shelf.py:301 +#: cps/shelf.py:300 #, python-format msgid "A public shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:312 +#: cps/shelf.py:311 #, python-format msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:381 +#: cps/shelf.py:380 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:451 +#: cps/shelf.py:450 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:455 +#: cps/shelf.py:454 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" @@ -1160,14 +1161,14 @@ msgstr "" msgid "Language: %(name)s" msgstr "" -#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1389 +#: cps/templates/layout.html:56 cps/web.py:742 cps/web.py:1384 msgid "Advanced Search" msgstr "" #: cps/templates/book_edit.html:239 cps/templates/feed.xml:33 #: cps/templates/index.xml:11 cps/templates/layout.html:45 #: cps/templates/layout.html:48 cps/templates/search_form.html:226 -#: cps/web.py:755 cps/web.py:1095 +#: cps/web.py:755 cps/web.py:1090 msgid "Search" msgstr "" @@ -1183,106 +1184,106 @@ msgstr "" msgid "File formats list" msgstr "" -#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1074 +#: cps/templates/layout.html:75 cps/templates/tasks.html:7 cps/web.py:1069 msgid "Tasks" msgstr "" -#: cps/web.py:1233 +#: cps/web.py:1228 msgid "Published after " msgstr "" -#: cps/web.py:1240 +#: cps/web.py:1235 msgid "Published before " msgstr "" -#: cps/web.py:1262 +#: cps/web.py:1257 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/web.py:1264 +#: cps/web.py:1259 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/web.py:1266 +#: cps/web.py:1261 #, python-format msgid "Read Status = %(status)s" msgstr "" -#: cps/web.py:1371 +#: cps/web.py:1366 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/web.py:1467 +#: cps/web.py:1462 #, python-format msgid "Book successfully queued for sending to %(kindlemail)s" msgstr "" -#: cps/web.py:1471 +#: cps/web.py:1466 #, python-format msgid "Oops! There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:1473 +#: cps/web.py:1468 msgid "Please update your profile with a valid Send to Kindle E-mail Address." msgstr "" -#: cps/web.py:1490 +#: cps/web.py:1485 msgid "E-Mail server is not configured, please contact your administrator!" msgstr "" -#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1491 -#: cps/web.py:1498 cps/web.py:1504 cps/web.py:1523 cps/web.py:1527 -#: cps/web.py:1533 +#: cps/templates/layout.html:87 cps/templates/register.html:17 cps/web.py:1486 +#: cps/web.py:1493 cps/web.py:1499 cps/web.py:1518 cps/web.py:1522 +#: cps/web.py:1528 msgid "Register" msgstr "" -#: cps/web.py:1525 +#: cps/web.py:1520 msgid "Your e-mail is not allowed to register" msgstr "" -#: cps/web.py:1528 +#: cps/web.py:1523 msgid "Confirmation e-mail was send to your e-mail account." msgstr "" -#: cps/web.py:1545 +#: cps/web.py:1540 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1564 +#: cps/web.py:1559 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1570 +#: cps/web.py:1565 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1574 cps/web.py:1599 +#: cps/web.py:1569 cps/web.py:1594 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1581 +#: cps/web.py:1576 msgid "New Password was send to your email address" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1582 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1594 +#: cps/web.py:1589 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1660 cps/web.py:1709 +#: cps/web.py:1655 cps/web.py:1704 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:1676 +#: cps/web.py:1671 msgid "Profile updated" msgstr "" diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index 95505cc4d..55c6bf1ea 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
    -

    Start Time: 2021-11-21 07:25:47

    +

    Start Time: 2021-11-22 21:51:33

    -

    Stop Time: 2021-11-21 10:30:41

    +

    Stop Time: 2021-11-23 01:35:04

    -

    Duration: 2h 25 min

    +

    Duration: 3h 2 min

    @@ -215,28 +215,35 @@ - +
    TestAnonymous - test_guest_restricted_settings_visibility
    + PASS + + + + + + +
    TestAnonymous - test_guest_visibility_sidebar
    +
    - ERROR + ERROR
    -
    Traceback (most recent call last):
    -  File "/home/ozzie/Development/calibre-web-test/test/test_edit_books.py", line 781, in test_upload_cover_hdd
    +  File "/home/ozzie/Development/calibre-web-test/test/test_edit_books.py", line 783, in test_upload_cover_hdd
         self.assertGreater(diff('original.png', 'jpeg.png', delete_diff_file=True), 0.02)
     AssertionError: 0.0 not greater than 0.02
    @@ -1333,15 +1268,15 @@ AssertionError: 0.0 not greater than 0.02 - + TestEditBooksList - 10 - 8 - 1 - 1 + 18 + 18 + 0 + 0 0 - Detail + Detail @@ -1367,7 +1302,7 @@ AssertionError: 0.0 not greater than 0.02 -
    TestEditBooksList - test_bookslist_edit_languages
    +
    TestEditBooksList - test_bookslist_edit_comment
    PASS @@ -1376,7 +1311,7 @@ AssertionError: 0.0 not greater than 0.02 -
    TestEditBooksList - test_bookslist_edit_publisher
    +
    TestEditBooksList - test_bookslist_edit_cust_category
    PASS @@ -1385,7 +1320,7 @@ AssertionError: 0.0 not greater than 0.02 -
    TestEditBooksList - test_bookslist_edit_series
    +
    TestEditBooksList - test_bookslist_edit_cust_comment
    PASS @@ -1394,7 +1329,7 @@ AssertionError: 0.0 not greater than 0.02 -
    TestEditBooksList - test_bookslist_edit_seriesindex
    +
    TestEditBooksList - test_bookslist_edit_cust_enum
    PASS @@ -1403,7 +1338,7 @@ AssertionError: 0.0 not greater than 0.02 -
    TestEditBooksList - test_bookslist_edit_title
    +
    TestEditBooksList - test_bookslist_edit_cust_float
    PASS @@ -1411,6 +1346,78 @@ AssertionError: 0.0 not greater than 0.02 + +
    TestEditBooksList - test_bookslist_edit_cust_int
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_cust_ratings
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_cust_text
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_languages
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_publisher
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_series
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_seriesindex
    + + PASS + + + + + + +
    TestEditBooksList - test_bookslist_edit_title
    + + PASS + + + + +
    TestEditBooksList - test_list_visibility
    @@ -1419,74 +1426,20 @@ AssertionError: 0.0 not greater than 0.02 - +
    TestEditBooksList - test_restricted_rights
    - -
    - ERROR -
    - - - - + PASS - +
    TestEditBooksList - test_search_books_list
    - -
    - FAIL -
    - - - - + PASS @@ -1495,8 +1448,8 @@ AssertionError: 4 != 1 TestEditBooksOnGdrive 20 - 15 - 5 + 18 + 2 0 0 @@ -1524,35 +1477,11 @@ AssertionError: 4 != 1 - +
    TestEditBooksOnGdrive - test_edit_category
    - -
    - FAIL -
    - - - - + PASS @@ -1638,35 +1567,11 @@ AssertionError: 'gênot' != 'Gênot' - +
    TestEditBooksOnGdrive - test_edit_publisher
    - -
    - FAIL -
    - - - - + PASS @@ -1680,35 +1585,11 @@ AssertionError: 'Gênot' != 'gênot' - +
    TestEditBooksOnGdrive - test_edit_series
    - -
    - FAIL -
    - - - - + PASS @@ -1788,7 +1669,7 @@ AssertionError: 0.0 not greater than 0.02
    Traceback (most recent call last):
       File "/home/ozzie/Development/calibre-web-test/test/test_edit_ebooks_gdrive.py", line 928, in test_watch_metadata
         self.assertNotIn('series', book)
    -AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5?edit=fe811995-f72a-4fbc-b4f7-f4b9d32fb6c8', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
    +AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5?edit=a92e572d-f9d5-45d0-a088-9751aaed41ca', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1 of test', 'series_index': '1', 'series': 'test', 'cust_columns': []}
    @@ -1967,15 +1848,15 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestFilePicker - 3 - 2 - 0 - 0 1 + 1 + 0 + 0 + 0 - Detail + Detail @@ -1989,41 +1870,6 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - - - -
    TestFilePicker - test_filepicker_new_file
    - - -
    - SKIP -
    - - - - - - - - - - -
    TestFilePicker - test_two_filepickers
    - - PASS - - - @@ -2092,12 +1938,12 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - + TestKoboSync 10 - 5 - 4 - 1 + 10 + 0 + 0 0 Detail @@ -2124,91 +1970,29 @@ AssertionError: 'series' unexpectedly found in {'id': 5, 're - +
    TestKoboSync - test_kobo_sync_selected_shelfs
    - -
    - ERROR -
    - - - - + PASS - +
    TestKoboSync - test_shelves_add_remove_books
    - -
    - FAIL -
    - - - - + PASS - +
    TestKoboSync - test_sync_changed_book
    - -
    - FAIL -
    - - - - + PASS @@ -2231,31 +2015,11 @@ AssertionError: 1 != 0 - +
    TestKoboSync - test_sync_shelf
    - -
    - FAIL -
    - - - - + PASS @@ -2269,42 +2033,22 @@ AssertionError: 1 != 0 - +
    TestKoboSync - test_sync_upload
    - -
    - FAIL -
    - - - - + PASS - + TestKoboSyncBig 4 - 1 - 1 - 2 + 4 + 0 + 0 0 Detail @@ -2313,62 +2057,20 @@ AssertionError: 1 != 0 - +
    TestKoboSyncBig - test_kobo_sync_selected_shelfs
    - -
    - ERROR -
    - - - - + PASS - +
    TestKoboSyncBig - test_sync_changed_book
    - -
    - ERROR -
    - - - - + PASS @@ -2382,42 +2084,22 @@ IndexError: list index out of range - +
    TestKoboSyncBig - test_sync_shelf
    - -
    - FAIL -
    - - - - + PASS - + TestLdapLogin 13 - 11 + 13 + 0 0 - 2 0 Detail @@ -2462,72 +2144,20 @@ AssertionError: 1 != 0 - +
    TestLdapLogin - test_LDAP_import
    - -
    - ERROR -
    - - - - + PASS - +
    TestLdapLogin - test_LDAP_import_memberfield
    - -
    - ERROR -
    - - - - + PASS @@ -2596,15 +2226,15 @@ AttributeError: 'bool' object has no attribute 'is_selected' - TestLogging - 9 + + TestCalibreWebListOrders + 8 8 0 0 - 1 + 0 - Detail + Detail @@ -2612,7 +2242,7 @@ AttributeError: 'bool' object has no attribute 'is_selected' -
    TestLogging - test_access_log_recover
    +
    TestCalibreWebListOrders - test_author_sort
    PASS @@ -2621,7 +2251,7 @@ AttributeError: 'bool' object has no attribute 'is_selected' -
    TestLogging - test_debug_log
    +
    TestCalibreWebListOrders - test_download_sort
    PASS @@ -2630,7 +2260,7 @@ AttributeError: 'bool' object has no attribute 'is_selected' -
    TestLogging - test_debuginfo_download
    +
    TestCalibreWebListOrders - test_format_sort
    PASS @@ -2638,6 +2268,93 @@ AttributeError: 'bool' object has no attribute 'is_selected' + +
    TestCalibreWebListOrders - test_lang_sort
    + + PASS + + + + + + +
    TestCalibreWebListOrders - test_publisher_sort
    + + PASS + + + + + + +
    TestCalibreWebListOrders - test_ratings_sort
    + + PASS + + + + + + +
    TestCalibreWebListOrders - test_series_sort
    + + PASS + + + + + + +
    TestCalibreWebListOrders - test_tags_sort
    + + PASS + + + + + + + TestLogging + 9 + 8 + 0 + 0 + 1 + + Detail + + + + + + + +
    TestLogging - test_access_log_recover
    + + PASS + + + + + + +
    TestLogging - test_debug_log
    + + PASS + + + + + + +
    TestLogging - test_debuginfo_download
    + + PASS + + + + +
    TestLogging - test_failed_login
    @@ -2646,19 +2363,19 @@ AttributeError: 'bool' object has no attribute 'is_selected' +
    TestLogging - test_failed_register
    - SKIP + SKIP
    -