Merge branch Develop into thumbnails
This commit is contained in:
commit
18ce310b30
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -31,7 +31,7 @@ If applicable, add screenshots to help explain your problem.
|
|||
- OS: [e.g. Windows 10/Raspberry Pi OS]
|
||||
- Python version: [e.g. python2.7]
|
||||
- Calibre-Web version: [e.g. 0.6.8 or 087c4c59 (git rev-parse --short HEAD)]:
|
||||
- Docker container: [None/Technosoft2000/LinuxServer]:
|
||||
- Docker container: [None/LinuxServer]:
|
||||
- Special Hardware: [e.g. Rasperry Pi Zero]
|
||||
- Browser: [e.g. Chrome 83.0.4103.97, Safari 13.3.7, Firefox 68.0.1 ESR]
|
||||
|
||||
|
|
24
README.md
24
README.md
|
@ -19,7 +19,7 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d
|
|||
- full graphical setup
|
||||
- User management with fine-grained per-user permissions
|
||||
- Admin interface
|
||||
- User Interface in brazilian, czech, dutch, english, finnish, french, german, greek, hungarian, italian, japanese, khmer, polish, russian, simplified chinese, spanish, swedish, turkish, ukrainian
|
||||
- User Interface in brazilian, czech, dutch, english, finnish, french, german, greek, hungarian, italian, japanese, khmer, korean, polish, russian, simplified and traditional chinese, spanish, swedish, turkish, ukrainian
|
||||
- OPDS feed for eBook reader apps
|
||||
- Filter and search by titles, authors, tags, series and language
|
||||
- Create a custom book collection (shelves)
|
||||
|
@ -37,9 +37,9 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d
|
|||
- "Magic Link" login to make it easy to log on eReaders
|
||||
- Login via LDAP, google/github oauth and via proxy authentication
|
||||
|
||||
## Quick start
|
||||
## Installation
|
||||
|
||||
#### Install via pip
|
||||
#### Installation via pip (recommended)
|
||||
1. Install calibre web via pip with the command `pip install calibreweb` (Depending on your OS and or distro the command could also be `pip3`).
|
||||
2. Optional features can also be installed via pip, please refer to [this page](https://github.com/janeczku/calibre-web/wiki/Dependencies-in-Calibre-Web-Linux-Windows) for details
|
||||
3. Calibre-Web can be started afterwards by typing `cps` or `python3 -m cps`
|
||||
|
@ -48,17 +48,20 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d
|
|||
1. Install dependencies by running `pip3 install --target vendor -r requirements.txt` (python3.x). Alternativly set up a python virtual environment.
|
||||
2. Execute the command: `python3 cps.py` (or `nohup python3 cps.py` - recommended if you want to exit the terminal window)
|
||||
|
||||
Issues with Ubuntu:
|
||||
Please note that running the above install command can fail on some versions of Ubuntu, saying `"can't combine user with prefix"`. This is a [known bug](https://github.com/pypa/pip/issues/3826) and can be remedied by using the command `pip install --system --target vendor -r requirements.txt` instead.
|
||||
|
||||
## Quick start
|
||||
|
||||
Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
|
||||
Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button\
|
||||
Optionally a Google Drive can be used to host the calibre library [-> Using Google Drive integration](https://github.com/janeczku/calibre-web/wiki/Configuration#using-google-drive-integration)
|
||||
Go to Login page
|
||||
|
||||
**Default admin login:**\
|
||||
#### Default admin login:
|
||||
*Username:* admin\
|
||||
*Password:* admin123
|
||||
|
||||
**Issues with Ubuntu:**
|
||||
Please note that running the above install command can fail on some versions of Ubuntu, saying `"can't combine user with prefix"`. This is a [known bug](https://github.com/pypa/pip/issues/3826) and can be remedied by using the command `pip install --system --target vendor -r requirements.txt` instead.
|
||||
|
||||
## Requirements
|
||||
|
||||
|
@ -72,14 +75,7 @@ Optionally, to enable on-the-fly conversion from one ebook format to another whe
|
|||
|
||||
## Docker Images
|
||||
|
||||
Pre-built Docker images are available in these Docker Hub repositories:
|
||||
|
||||
#### **Technosoft2000 - x64**
|
||||
+ Docker Hub - [https://hub.docker.com/r/technosoft2000/calibre-web](https://hub.docker.com/r/technosoft2000/calibre-web)
|
||||
+ Github - [https://github.com/Technosoft2000/docker-calibre-web](https://github.com/Technosoft2000/docker-calibre-web)
|
||||
|
||||
Includes the Calibre `ebook-convert` binary.
|
||||
+ The "path to convertertool" should be set to `/opt/calibre/ebook-convert`
|
||||
A pre-built Docker image is available in these Docker Hub repository (maintained by the LinuxServer team):
|
||||
|
||||
#### **LinuxServer - x64, armhf, aarch64**
|
||||
+ Docker Hub - [https://hub.docker.com/r/linuxserver/calibre-web](https://hub.docker.com/r/linuxserver/calibre-web)
|
||||
|
|
34
SECURITY.md
34
SECURITY.md
|
@ -3,3 +3,37 @@
|
|||
## Reporting a Vulnerability
|
||||
|
||||
Please report security issues to ozzie.fernandez.isaacs@googlemail.com
|
||||
|
||||
## Supported Versions
|
||||
|
||||
To receive fixes for security vulnerabilities it is required to always upgrade to the latest version of Calibre-Web. See https://github.com/janeczku/calibre-web/releases/latest for the latest release.
|
||||
|
||||
## History
|
||||
|
||||
| Fixed in | Description |CVE number |
|
||||
|---------------|--------------------------------------------------------------------------------------------------------------------|---------|
|
||||
| 3rd July 2018 | Guest access acts as a backdoor ||
|
||||
| V 0.6.7 | Hardcoded secret key for sessions |CVE-2020-12627 |
|
||||
| V 0.6.13 | Calibre-Web Metadata cross site scripting |CVE-2021-25964|
|
||||
| V 0.6.13 | Name of Shelves are only visible to users who can access the corresponding shelf Thanks to @ibarrionuevo ||
|
||||
| V 0.6.13 | JavaScript could get executed in the description field. Thanks to @ranjit-git and Hagai Wechsler (WhiteSource) ||
|
||||
| V 0.6.13 | JavaScript could get executed in a custom column of type "comment" field ||
|
||||
| V 0.6.13 | JavaScript could get executed after converting a book to another format with a title containing javascript code ||
|
||||
| V 0.6.13 | JavaScript could get executed after converting a book to another format with a username containing javascript code ||
|
||||
| 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) |CVE-2021-25965|
|
||||
| V 0.6.14 | Migrated some routes to POST-requests (CSRF protection). Thanks to @scara31 ||
|
||||
| V 0.6.15 | Fix for "javascript:" script links in identifier. Thanks to @scara31 ||
|
||||
| V 0.6.15 | Cross-Site Scripting vulnerability on uploaded cover file names. Thanks to @ibarrionuevo ||
|
||||
| V 0.6.15 | Creating public shelfs is now denied if user is missing the edit public shelf right. Thanks to @ibarrionuevo ||
|
||||
| V 0.6.15 | Changed error message in case of trying to delete a shelf unauthorized. Thanks to @ibarrionuevo ||
|
||||
| V 0.6.16 | JavaScript could get executed on authors page. Thanks to @alicaz ||
|
||||
| V 0.6.16 | Localhost can no longer be used to upload covers. Thanks to @scara31 ||
|
||||
| V 0.6.16 | Another case where public shelfs could be created without permission is prevented. Thanks to @ibarrionuevo ||
|
||||
|
||||
|
||||
## Staement regarding Log4j (CVE-2021-44228 and related)
|
||||
|
||||
Calibre-web is not affected by bugs related to Log4j. Calibre-Web is a python program, therefore not using Java, and not using the Java logging feature log4j.
|
||||
|
|
16
cps.py
16
cps.py
|
@ -16,19 +16,19 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
try:
|
||||
from gevent import monkey
|
||||
monkey.patch_all()
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
# Insert local directories into path
|
||||
if sys.version_info < (3, 0):
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__.decode('utf-8'))), 'vendor'))
|
||||
else:
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor'))
|
||||
|
||||
|
||||
from cps import create_app
|
||||
|
@ -50,7 +50,7 @@ try:
|
|||
from cps.kobo import kobo, get_kobo_activated
|
||||
from cps.kobo_auth import kobo_auth
|
||||
kobo_available = get_kobo_activated()
|
||||
except ImportError:
|
||||
except (ImportError, AttributeError): # Catch also error for not installed flask-WTF (missing csrf decorator)
|
||||
kobo_available = False
|
||||
|
||||
try:
|
||||
|
|
34
cps/MyLoginManager.py
Normal file
34
cps/MyLoginManager.py
Normal file
|
@ -0,0 +1,34 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
||||
# Copyright (C) 2018-2019 OzzieIsaacs, cervinko, jkrehm, bodybybuddha, ok11,
|
||||
# andy29485, idalin, Kyosfonica, wuqi, Kennyl, lemmsh,
|
||||
# falgh1, grunjol, csitko, ytils, xybydy, trasba, vrabe,
|
||||
# ruben-herold, marblepebble, JackED42, SiphonSquirrel,
|
||||
# apetresc, nanu-c, mutschler, GammaC0de, vuolter
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from flask_login import LoginManager
|
||||
from flask import session
|
||||
|
||||
|
||||
class MyLoginManager(LoginManager):
|
||||
def _session_protection_failed(self):
|
||||
sess = session._get_current_object()
|
||||
ident = self._session_identifier_generator()
|
||||
if(sess and not (len(sess) == 1 and sess.get('csrf_token', None))) and ident != sess.get('_id', None):
|
||||
return super(). _session_protection_failed()
|
||||
return False
|
|
@ -19,8 +19,8 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
__package__ = "cps"
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
import mimetypes
|
||||
|
@ -29,13 +29,14 @@ from babel import Locale as LC
|
|||
from babel import negotiate_locale
|
||||
from babel.core import UnknownLocaleError
|
||||
from flask import Flask, request, g
|
||||
from flask_login import LoginManager
|
||||
from .MyLoginManager import MyLoginManager
|
||||
from flask_babel import Babel
|
||||
from flask_principal import Principal
|
||||
|
||||
from . import config_sql, logger, cache_buster, cli, ub, db
|
||||
from .reverseproxy import ReverseProxied
|
||||
from .server import WebServer
|
||||
from .dep_check import dependency_check
|
||||
|
||||
try:
|
||||
import lxml
|
||||
|
@ -43,6 +44,12 @@ try:
|
|||
except ImportError:
|
||||
lxml_present = False
|
||||
|
||||
try:
|
||||
from flask_wtf.csrf import CSRFProtect
|
||||
wtf_present = True
|
||||
except ImportError:
|
||||
wtf_present = False
|
||||
|
||||
mimetypes.init()
|
||||
mimetypes.add_type('application/xhtml+xml', '.xhtml')
|
||||
mimetypes.add_type('application/epub+zip', '.epub')
|
||||
|
@ -61,20 +68,29 @@ mimetypes.add_type('application/mp4', '.m4a')
|
|||
mimetypes.add_type('application/mp4', '.m4b')
|
||||
mimetypes.add_type('application/ogg', '.ogg')
|
||||
mimetypes.add_type('application/ogg', '.oga')
|
||||
mimetypes.add_type('text/css', '.css')
|
||||
mimetypes.add_type('text/javascript; charset=UTF-8', '.js')
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.update(
|
||||
SESSION_COOKIE_HTTPONLY=True,
|
||||
SESSION_COOKIE_SAMESITE='Lax',
|
||||
REMEMBER_COOKIE_SAMESITE='Lax', # will be available in flask-login 0.5.1 earliest
|
||||
WTF_CSRF_SSL_STRICT=False
|
||||
)
|
||||
|
||||
|
||||
lm = LoginManager()
|
||||
lm = MyLoginManager()
|
||||
lm.login_view = 'web.login'
|
||||
lm.anonymous_user = ub.Anonymous
|
||||
lm.session_protection = 'strong'
|
||||
|
||||
if wtf_present:
|
||||
csrf = CSRFProtect()
|
||||
csrf.init_app(app)
|
||||
else:
|
||||
csrf = None
|
||||
|
||||
ub.init_db(cli.settingspath)
|
||||
# pylint: disable=no-member
|
||||
config = config_sql.load_configuration(ub.session)
|
||||
|
@ -86,6 +102,7 @@ _BABEL_TRANSLATIONS = set()
|
|||
|
||||
log = logger.create()
|
||||
|
||||
|
||||
from . import services
|
||||
|
||||
db.CalibreDB.update_config(config)
|
||||
|
@ -100,17 +117,24 @@ def create_app():
|
|||
'*** Python2 is EOL since end of 2019, this version of Calibre-Web is no longer supporting Python2, please update your installation to Python3 ***')
|
||||
print(
|
||||
'*** Python2 is EOL since end of 2019, this version of Calibre-Web is no longer supporting Python2, please update your installation to Python3 ***')
|
||||
web_server.stop(True)
|
||||
sys.exit(5)
|
||||
if not lxml_present:
|
||||
log.info('*** "lxml" is needed for calibre-web to run. Please install it using pip: "pip install lxml" ***')
|
||||
print('*** "lxml" is needed for calibre-web to run. Please install it using pip: "pip install lxml" ***')
|
||||
web_server.stop(True)
|
||||
sys.exit(6)
|
||||
if not wtf_present:
|
||||
log.info('*** "flask-WTF" is needed for calibre-web to run. Please install it using pip: "pip install flask-WTF" ***')
|
||||
print('*** "flask-WTF" is needed for calibre-web to run. Please install it using pip: "pip install flask-WTF" ***')
|
||||
web_server.stop(True)
|
||||
sys.exit(7)
|
||||
for res in dependency_check() + dependency_check(True):
|
||||
log.info('*** "{}" version does not fit the requirements. Should: {}, Found: {}, please consider installing required version ***'
|
||||
.format(res['name'],
|
||||
res['target'],
|
||||
res['found']))
|
||||
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
||||
# For python2 convert path to unicode
|
||||
if sys.version_info < (3, 0):
|
||||
app.static_folder = app.static_folder.decode('utf-8')
|
||||
app.root_path = app.root_path.decode('utf-8')
|
||||
app.instance_path = app.instance_path.decode('utf-8')
|
||||
|
||||
if os.environ.get('FLASK_DEBUG'):
|
||||
cache_buster.init_cache_busting(app)
|
||||
|
|
96
cps/about.py
96
cps/about.py
|
@ -20,7 +20,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import platform
|
||||
import sqlite3
|
||||
|
@ -29,9 +28,14 @@ from collections import OrderedDict
|
|||
import babel, pytz, requests, sqlalchemy
|
||||
import werkzeug, flask, flask_login, flask_principal, jinja2
|
||||
from flask_babel import gettext as _
|
||||
try:
|
||||
from flask_wtf import __version__ as flaskwtf_version
|
||||
except ImportError:
|
||||
flaskwtf_version = _(u'not installed')
|
||||
|
||||
from . import db, calibre_db, converter, uploader, server, isoLanguages, constants
|
||||
from . import db, calibre_db, converter, uploader, server, isoLanguages, constants, gdriveutils, dep_check
|
||||
from .render_template import render_title_template
|
||||
|
||||
try:
|
||||
from flask_login import __version__ as flask_loginVersion
|
||||
except ImportError:
|
||||
|
@ -64,37 +68,65 @@ from . import services
|
|||
|
||||
about = flask.Blueprint('about', __name__)
|
||||
|
||||
ret = dict()
|
||||
req = dep_check.load_dependencys(False)
|
||||
opt = dep_check.load_dependencys(True)
|
||||
for i in (req + opt):
|
||||
ret[i[1]] = i[0]
|
||||
|
||||
_VERSIONS = OrderedDict(
|
||||
Platform = '{0[0]} {0[2]} {0[3]} {0[4]} {0[5]}'.format(platform.uname()),
|
||||
Python=sys.version,
|
||||
Calibre_Web=constants.STABLE_VERSION['version'] + ' - '
|
||||
+ constants.NIGHTLY_VERSION[0].replace('%','%%') + ' - '
|
||||
+ constants.NIGHTLY_VERSION[1].replace('%','%%'),
|
||||
WebServer=server.VERSION,
|
||||
Flask=flask.__version__,
|
||||
Flask_Login=flask_loginVersion,
|
||||
Flask_Principal=flask_principal.__version__,
|
||||
Werkzeug=werkzeug.__version__,
|
||||
Babel=babel.__version__,
|
||||
Jinja2=jinja2.__version__,
|
||||
Requests=requests.__version__,
|
||||
SqlAlchemy=sqlalchemy.__version__,
|
||||
pySqlite=sqlite3.version,
|
||||
SQLite=sqlite3.sqlite_version,
|
||||
iso639=isoLanguages.__version__,
|
||||
pytz=pytz.__version__,
|
||||
Unidecode = unidecode_version,
|
||||
Scholarly = scholarly_version,
|
||||
Flask_SimpleLDAP = u'installed' if bool(services.ldap) else None,
|
||||
python_LDAP = services.ldapVersion if bool(services.ldapVersion) else None,
|
||||
Goodreads = u'installed' if bool(services.goodreads_support) else None,
|
||||
jsonschema = services.SyncToken.__version__ if bool(services.SyncToken) else None,
|
||||
flask_dance = flask_danceVersion,
|
||||
greenlet = greenlet_Version
|
||||
)
|
||||
_VERSIONS.update(uploader.get_versions())
|
||||
if constants.NIGHTLY_VERSION[0] == "$Format:%H$":
|
||||
calibre_web_version = constants.STABLE_VERSION['version']
|
||||
else:
|
||||
calibre_web_version = (constants.STABLE_VERSION['version'] + ' - '
|
||||
+ constants.NIGHTLY_VERSION[0].replace('%','%%') + ' - '
|
||||
+ constants.NIGHTLY_VERSION[1].replace('%','%%'))
|
||||
if getattr(sys, 'frozen', False):
|
||||
calibre_web_version += " - Exe-Version"
|
||||
elif constants.HOME_CONFIG:
|
||||
calibre_web_version += " - pyPi"
|
||||
|
||||
if not ret:
|
||||
_VERSIONS = OrderedDict(
|
||||
Platform = '{0[0]} {0[2]} {0[3]} {0[4]} {0[5]}'.format(platform.uname()),
|
||||
Python=sys.version,
|
||||
Calibre_Web=calibre_web_version,
|
||||
WebServer=server.VERSION,
|
||||
Flask=flask.__version__,
|
||||
Flask_Login=flask_loginVersion,
|
||||
Flask_Principal=flask_principal.__version__,
|
||||
Flask_WTF=flaskwtf_version,
|
||||
Werkzeug=werkzeug.__version__,
|
||||
Babel=babel.__version__,
|
||||
Jinja2=jinja2.__version__,
|
||||
Requests=requests.__version__,
|
||||
SqlAlchemy=sqlalchemy.__version__,
|
||||
pySqlite=sqlite3.version,
|
||||
SQLite=sqlite3.sqlite_version,
|
||||
iso639=isoLanguages.__version__,
|
||||
pytz=pytz.__version__,
|
||||
Unidecode=unidecode_version,
|
||||
Scholarly=scholarly_version,
|
||||
Flask_SimpleLDAP=u'installed' if bool(services.ldap) else None,
|
||||
python_LDAP=services.ldapVersion if bool(services.ldapVersion) else None,
|
||||
Goodreads=u'installed' if bool(services.goodreads_support) else None,
|
||||
jsonschema=services.SyncToken.__version__ if bool(services.SyncToken) else None,
|
||||
flask_dance=flask_danceVersion,
|
||||
greenlet=greenlet_Version
|
||||
)
|
||||
_VERSIONS.update(gdriveutils.get_versions())
|
||||
_VERSIONS.update(uploader.get_versions(True))
|
||||
else:
|
||||
_VERSIONS = OrderedDict(
|
||||
Platform = '{0[0]} {0[2]} {0[3]} {0[4]} {0[5]}'.format(platform.uname()),
|
||||
Python = sys.version,
|
||||
Calibre_Web=calibre_web_version,
|
||||
Werkzeug = werkzeug.__version__,
|
||||
Jinja2=jinja2.__version__,
|
||||
pySqlite = sqlite3.version,
|
||||
SQLite = sqlite3.sqlite_version,
|
||||
)
|
||||
_VERSIONS.update(ret)
|
||||
_VERSIONS.update(uploader.get_versions(False))
|
||||
|
||||
def collect_stats():
|
||||
_VERSIONS['ebook converter'] = _(converter.get_calibre_version())
|
||||
|
@ -111,5 +143,3 @@ def stats():
|
|||
series = calibre_db.session.query(db.Series).count()
|
||||
return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=collect_stats(),
|
||||
categorycounter=categorys, seriecounter=series, title=_(u"Statistics"), page="stat")
|
||||
|
||||
|
||||
|
|
106
cps/admin.py
106
cps/admin.py
|
@ -20,7 +20,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import re
|
||||
import base64
|
||||
|
@ -41,7 +40,8 @@ from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError
|
|||
from sqlalchemy.sql.expression import func, or_, text
|
||||
|
||||
from . import constants, logger, helper, services
|
||||
from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils, schedule
|
||||
from . import db, calibre_db, ub, web_server, get_locale, config, updater_thread, babel, gdriveutils, \
|
||||
kobo_sync_status, 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
|
||||
|
@ -131,11 +131,11 @@ def admin_forbidden():
|
|||
abort(403)
|
||||
|
||||
|
||||
@admi.route("/shutdown")
|
||||
@admi.route("/shutdown", methods=["POST"])
|
||||
@login_required
|
||||
@admin_required
|
||||
def shutdown():
|
||||
task = int(request.args.get("parameter").strip())
|
||||
task = request.get_json().get('parameter', -1)
|
||||
showtext = {}
|
||||
if task in (0, 1): # valid commandos received
|
||||
# close all database connections
|
||||
|
@ -147,7 +147,7 @@ def shutdown():
|
|||
else:
|
||||
showtext['text'] = _(u'Performing shutdown of server, please close window')
|
||||
# stop gevent/tornado server
|
||||
web_server.stop(task==0)
|
||||
web_server.stop(task == 0)
|
||||
return json.dumps(showtext)
|
||||
|
||||
if task == 2:
|
||||
|
@ -239,8 +239,12 @@ def view_configuration():
|
|||
.filter(and_(db.Custom_Columns.datatype == 'bool', db.Custom_Columns.mark_for_delete == 0)).all()
|
||||
restrict_columns = calibre_db.session.query(db.Custom_Columns)\
|
||||
.filter(and_(db.Custom_Columns.datatype == 'text', db.Custom_Columns.mark_for_delete == 0)).all()
|
||||
languages = calibre_db.speaking_language()
|
||||
translations = [LC('en')] + babel.list_translations()
|
||||
return render_title_template("config_view_edit.html", conf=config, readColumns=read_column,
|
||||
restrictColumns=restrict_columns,
|
||||
languages=languages,
|
||||
translations=translations,
|
||||
title=_(u"UI Configuration"), page="uiconfig")
|
||||
|
||||
|
||||
|
@ -529,9 +533,6 @@ def check_valid_restricted_column(column):
|
|||
def update_view_configuration():
|
||||
to_save = request.form.to_dict()
|
||||
|
||||
# _config_string = lambda x: config.set_from_dictionary(to_save, x, lambda y: y.strip() if y else y)
|
||||
# _config_int = lambda x: config.set_from_dictionary(to_save, x, int)
|
||||
|
||||
_config_string(to_save, "config_calibre_web_title")
|
||||
_config_string(to_save, "config_columns_to_ignore")
|
||||
if _config_string(to_save, "config_title_regex"):
|
||||
|
@ -553,6 +554,8 @@ def update_view_configuration():
|
|||
_config_int(to_save, "config_random_books")
|
||||
_config_int(to_save, "config_books_per_page")
|
||||
_config_int(to_save, "config_authors_max")
|
||||
_config_string(to_save, "config_default_language")
|
||||
_config_string(to_save, "config_default_locale")
|
||||
|
||||
config.config_default_role = constants.selected_roles(to_save)
|
||||
config.config_default_role &= ~constants.ROLE_ANONYMOUS
|
||||
|
@ -595,6 +598,8 @@ def load_dialogtexts(element_id):
|
|||
texts["main"] = _('Are you sure you want to change shelf sync behavior for the selected user(s)?')
|
||||
elif element_id == "db_submit":
|
||||
texts["main"] = _('Are you sure you want to change Calibre library location?')
|
||||
elif element_id == "btnfullsync":
|
||||
texts["main"] = _("Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?")
|
||||
return json.dumps(texts)
|
||||
|
||||
|
||||
|
@ -759,7 +764,12 @@ def prepare_tags(user, action, tags_name, id_list):
|
|||
return ",".join(saved_tags_list)
|
||||
|
||||
|
||||
@admi.route("/ajax/addrestriction/<int:res_type>", defaults={"user_id": 0}, methods=['POST'])
|
||||
@admi.route("/ajax/addrestriction/<int:res_type>", methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def add_user_0_restriction(res_type):
|
||||
return add_restriction(res_type, 0)
|
||||
|
||||
@admi.route("/ajax/addrestriction/<int:res_type>/<int:user_id>", methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
|
@ -806,7 +816,13 @@ def add_restriction(res_type, user_id):
|
|||
return ""
|
||||
|
||||
|
||||
@admi.route("/ajax/deleterestriction/<int:res_type>", defaults={"user_id": 0}, methods=['POST'])
|
||||
@admi.route("/ajax/deleterestriction/<int:res_type>", methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def delete_user_0_restriction(res_type):
|
||||
return delete_restriction(res_type, 0)
|
||||
|
||||
|
||||
@admi.route("/ajax/deleterestriction/<int:res_type>/<int:user_id>", methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
|
@ -894,10 +910,18 @@ def list_restriction(res_type, user_id):
|
|||
else:
|
||||
json_dumps = ""
|
||||
js = json.dumps(json_dumps)
|
||||
response = make_response(js) #.replace("'", '"')
|
||||
response = make_response(js)
|
||||
response.headers["Content-Type"] = "application/json; charset=utf-8"
|
||||
return response
|
||||
|
||||
@admi.route("/ajax/fullsync", methods=["POST"])
|
||||
@login_required
|
||||
def ajax_fullsync():
|
||||
count = ub.session.query(ub.KoboSyncedBooks).filter(current_user.id == ub.KoboSyncedBooks.user_id).delete()
|
||||
message = _("{} sync entries deleted").format(count)
|
||||
ub.session_commit(message)
|
||||
return Response(json.dumps([{"type": "success", "message": message}]), mimetype='application/json')
|
||||
|
||||
|
||||
@admi.route("/ajax/pathchooser/")
|
||||
@login_required
|
||||
|
@ -1191,11 +1215,20 @@ def _db_configuration_update_helper():
|
|||
if not calibre_db.setup_db(to_save['config_calibre_dir'], ub.app_DB_path):
|
||||
return _db_configuration_result(_('DB Location is not Valid, Please Enter Correct Path'),
|
||||
gdrive_error)
|
||||
# if db changed -> delete shelfs, delete download books, delete read books, kobo sync...
|
||||
ub.session.query(ub.Downloads).delete()
|
||||
ub.session.query(ub.ArchivedBook).delete()
|
||||
ub.session.query(ub.ReadBook).delete()
|
||||
ub.session.query(ub.BookShelf).delete()
|
||||
ub.session.query(ub.Bookmark).delete()
|
||||
ub.session.query(ub.KoboReadingState).delete()
|
||||
ub.session.query(ub.KoboStatistics).delete()
|
||||
ub.session.query(ub.KoboSyncedBooks).delete()
|
||||
ub.session_commit()
|
||||
_config_string(to_save, "config_calibre_dir")
|
||||
calibre_db.update_config(config)
|
||||
if not os.access(os.path.join(config.config_calibre_dir, "metadata.db"), os.W_OK):
|
||||
flash(_(u"DB is not Writeable"), category="warning")
|
||||
# warning = {'type': "warning", 'message': _(u"DB is not Writeable")}
|
||||
config.save()
|
||||
return _db_configuration_result(None, gdrive_error)
|
||||
|
||||
|
@ -1205,7 +1238,7 @@ def _configuration_update_helper():
|
|||
to_save = request.form.to_dict()
|
||||
try:
|
||||
reboot_required |= _config_int(to_save, "config_port")
|
||||
|
||||
reboot_required |= _config_string(to_save, "config_trustedhosts")
|
||||
reboot_required |= _config_string(to_save, "config_keyfile")
|
||||
if config.config_keyfile and not os.path.isfile(config.config_keyfile):
|
||||
return _configuration_result(_('Keyfile Location is not Valid, Please Enter Correct Path'))
|
||||
|
@ -1355,7 +1388,9 @@ def _handle_new_user(to_save, content, languages, translations, kobo_support):
|
|||
raise Exception(_(u"E-mail is not from valid domain"))
|
||||
except Exception as ex:
|
||||
flash(str(ex), category="error")
|
||||
return render_title_template("user_edit.html", new_user=1, content=content, translations=translations,
|
||||
return render_title_template("user_edit.html", new_user=1, content=content,
|
||||
config=config,
|
||||
translations=translations,
|
||||
languages=languages, title=_(u"Add new user"), page="newuser",
|
||||
kobo_support=kobo_support, registered_oauth=oauth_check)
|
||||
try:
|
||||
|
@ -1391,16 +1426,25 @@ def _delete_user(content):
|
|||
for us in ub.session.query(ub.Shelf).filter(content.id == ub.Shelf.user_id):
|
||||
ub.session.query(ub.BookShelf).filter(us.id == ub.BookShelf.shelf).delete()
|
||||
ub.session.query(ub.Shelf).filter(content.id == ub.Shelf.user_id).delete()
|
||||
ub.session.query(ub.Bookmark).filter(content.id == ub.Bookmark.user_id).delete()
|
||||
ub.session.query(ub.User).filter(ub.User.id == content.id).delete()
|
||||
ub.session.query(ub.ArchivedBook).filter(ub.ArchivedBook.user_id == content.id).delete()
|
||||
ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == content.id).delete()
|
||||
ub.session.query(ub.User_Sessions).filter(ub.User_Sessions.user_id == content.id).delete()
|
||||
ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.user_id == content.id).delete()
|
||||
# delete KoboReadingState and all it's children
|
||||
kobo_entries = ub.session.query(ub.KoboReadingState).filter(ub.KoboReadingState.user_id == content.id).all()
|
||||
for kobo_entry in kobo_entries:
|
||||
ub.session.delete(kobo_entry)
|
||||
ub.session_commit()
|
||||
log.info(u"User {} deleted".format(content.name))
|
||||
return(_(u"User '%(nick)s' deleted", nick=content.name))
|
||||
log.info("User {} deleted".format(content.name))
|
||||
return(_("User '%(nick)s' deleted", nick=content.name))
|
||||
else:
|
||||
log.warning(_(u"Can't delete Guest User"))
|
||||
raise Exception(_(u"Can't delete Guest User"))
|
||||
log.warning(_("Can't delete Guest User"))
|
||||
raise Exception(_("Can't delete Guest User"))
|
||||
else:
|
||||
log.warning(u"No admin user remaining, can't delete user")
|
||||
raise Exception(_(u"No admin user remaining, can't delete user"))
|
||||
log.warning("No admin user remaining, can't delete user")
|
||||
raise Exception(_("No admin user remaining, can't delete user"))
|
||||
|
||||
|
||||
def _handle_edit_user(to_save, content, languages, translations, kobo_support):
|
||||
|
@ -1440,8 +1484,13 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
|
|||
else:
|
||||
content.sidebar_view &= ~constants.DETAIL_RANDOM
|
||||
|
||||
old_state = content.kobo_only_shelves_sync
|
||||
content.kobo_only_shelves_sync = int(to_save.get("kobo_only_shelves_sync") == "on") or 0
|
||||
|
||||
# 1 -> 0: nothing has to be done
|
||||
# 0 -> 1: all synced books have to be added to archived books, + currently synced shelfs
|
||||
# which don't have to be synced have to be removed (added to Shelf archive)
|
||||
if old_state == 0 and content.kobo_only_shelves_sync == 1:
|
||||
kobo_sync_status.update_on_sync_shelfs(content.id)
|
||||
if to_save.get("default_language"):
|
||||
content.default_language = to_save["default_language"]
|
||||
if to_save.get("locale"):
|
||||
|
@ -1466,6 +1515,7 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
|
|||
kobo_support=kobo_support,
|
||||
new_user=0,
|
||||
content=content,
|
||||
config=config,
|
||||
registered_oauth=oauth_check,
|
||||
title=_(u"Edit User %(nick)s", nick=content.name),
|
||||
page="edituser")
|
||||
|
@ -1497,7 +1547,10 @@ def new_user():
|
|||
else:
|
||||
content.role = config.config_default_role
|
||||
content.sidebar_view = config.config_default_show
|
||||
return render_title_template("user_edit.html", new_user=1, content=content, translations=translations,
|
||||
content.locale = config.config_default_locale
|
||||
content.default_language = config.config_default_language
|
||||
return render_title_template("user_edit.html", new_user=1, content=content,
|
||||
config=config, translations=translations,
|
||||
languages=languages, title=_(u"Add new user"), page="newuser",
|
||||
kobo_support=kobo_support, registered_oauth=oauth_check)
|
||||
|
||||
|
@ -1611,7 +1664,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":
|
||||
|
@ -1624,6 +1677,7 @@ def edit_user(user_id):
|
|||
languages=languages,
|
||||
new_user=0,
|
||||
content=content,
|
||||
config=config,
|
||||
registered_oauth=oauth_check,
|
||||
mail_configured=config.get_mail_server_configured(),
|
||||
kobo_support=kobo_support,
|
||||
|
@ -1631,7 +1685,7 @@ def edit_user(user_id):
|
|||
page="edituser")
|
||||
|
||||
|
||||
@admi.route("/admin/resetpassword/<int:user_id>")
|
||||
@admi.route("/admin/resetpassword/<int:user_id>", methods=["POST"])
|
||||
@login_required
|
||||
@admin_required
|
||||
def reset_user_password(user_id):
|
||||
|
@ -1788,6 +1842,8 @@ def ldap_import_create_user(user, user_data):
|
|||
content.password = '' # dummy password which will be replaced by ldap one
|
||||
content.email = useremail
|
||||
content.kindle_mail = kindlemail
|
||||
content.default_language = config.config_default_language
|
||||
content.locale = config.config_default_locale
|
||||
content.role = config.config_default_role
|
||||
content.sidebar_view = config.config_default_show
|
||||
content.allowed_tags = config.config_allowed_tags
|
||||
|
@ -1805,7 +1861,7 @@ def ldap_import_create_user(user, user_data):
|
|||
return 0, message
|
||||
|
||||
|
||||
@admi.route('/import_ldap_users')
|
||||
@admi.route('/import_ldap_users', methods=["POST"])
|
||||
@login_required
|
||||
@admin_required
|
||||
def import_ldap_users():
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
# Inspired by https://github.com/ChrisTM/Flask-CacheBust
|
||||
# Uses query strings so CSS font files are found without having to resort to absolute URLs
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import hashlib
|
||||
|
||||
|
|
17
cps/cli.py
17
cps/cli.py
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
import argparse
|
||||
|
@ -46,21 +45,9 @@ parser.add_argument('-v', '--version', action='version', help='Shows version num
|
|||
parser.add_argument('-i', metavar='ip-address', help='Server IP-Address to listen')
|
||||
parser.add_argument('-s', metavar='user:pass', help='Sets specific username to new password')
|
||||
parser.add_argument('-f', action='store_true', help='Flag is depreciated and will be removed in next version')
|
||||
parser.add_argument('-l', action='store_true', help='Allow loading covers from localhost')
|
||||
args = parser.parse_args()
|
||||
|
||||
if sys.version_info < (3, 0):
|
||||
if args.p:
|
||||
args.p = args.p.decode('utf-8')
|
||||
if args.g:
|
||||
args.g = args.g.decode('utf-8')
|
||||
if args.k:
|
||||
args.k = args.k.decode('utf-8')
|
||||
if args.c:
|
||||
args.c = args.c.decode('utf-8')
|
||||
if args.s:
|
||||
args.s = args.s.decode('utf-8')
|
||||
|
||||
|
||||
settingspath = args.p or os.path.join(_CONFIG_DIR, "app.db")
|
||||
gdpath = args.g or os.path.join(_CONFIG_DIR, "gdrive.db")
|
||||
|
||||
|
@ -91,6 +78,8 @@ if (args.k and not args.c) or (not args.k and args.c):
|
|||
if args.k == "":
|
||||
keyfilepath = ""
|
||||
|
||||
# load covers from localhost
|
||||
allow_localhost = args.l or None
|
||||
# handle and check ip address argument
|
||||
ip_address = args.i or None
|
||||
if ip_address:
|
||||
|
|
29
cps/comic.py
29
cps/comic.py
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
|
||||
from . import logger, isoLanguages
|
||||
|
@ -57,25 +56,25 @@ COVER_EXTENSIONS = ['.png', '.webp', '.bmp', '.jpg', '.jpeg']
|
|||
|
||||
def _cover_processing(tmp_file_name, img, extension):
|
||||
tmp_cover_name = os.path.join(os.path.dirname(tmp_file_name), 'cover.jpg')
|
||||
if use_IM:
|
||||
# convert to jpg because calibre only supports jpg
|
||||
if extension in NO_JPEG_EXTENSIONS:
|
||||
with Image(filename=tmp_file_name) as imgc:
|
||||
if extension in NO_JPEG_EXTENSIONS:
|
||||
if use_IM:
|
||||
with Image(blob=img) as imgc:
|
||||
imgc.format = 'jpeg'
|
||||
imgc.transform_colorspace('rgb')
|
||||
imgc.save(tmp_cover_name)
|
||||
imgc.save(filename=tmp_cover_name)
|
||||
return tmp_cover_name
|
||||
|
||||
if not img:
|
||||
else:
|
||||
return None
|
||||
if img:
|
||||
with open(tmp_cover_name, 'wb') as f:
|
||||
f.write(img)
|
||||
return tmp_cover_name
|
||||
else:
|
||||
return None
|
||||
|
||||
with open(tmp_cover_name, 'wb') as f:
|
||||
f.write(img)
|
||||
return tmp_cover_name
|
||||
|
||||
|
||||
def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecutable):
|
||||
cover_data = None
|
||||
cover_data = extension = None
|
||||
if original_file_extension.upper() == '.CBZ':
|
||||
cf = zipfile.ZipFile(tmp_file_name)
|
||||
for name in cf.namelist():
|
||||
|
@ -107,7 +106,7 @@ def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecu
|
|||
break
|
||||
except Exception as ex:
|
||||
log.debug('Rarfile failed with error: %s', ex)
|
||||
return cover_data
|
||||
return cover_data, extension
|
||||
|
||||
|
||||
def _extractCover(tmp_file_name, original_file_extension, rarExecutable):
|
||||
|
@ -122,7 +121,7 @@ def _extractCover(tmp_file_name, original_file_extension, rarExecutable):
|
|||
cover_data = archive.getPage(index)
|
||||
break
|
||||
else:
|
||||
cover_data = _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecutable)
|
||||
cover_data, extension = _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecutable)
|
||||
return _cover_processing(tmp_file_name, cover_data, extension)
|
||||
|
||||
|
||||
|
|
|
@ -16,8 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
@ -68,7 +66,7 @@ class _Settings(_Base):
|
|||
config_external_port = Column(Integer, default=constants.DEFAULT_PORT)
|
||||
config_certfile = Column(String)
|
||||
config_keyfile = Column(String)
|
||||
|
||||
config_trustedhosts = Column(String,default='')
|
||||
config_calibre_web_title = Column(String, default=u'Calibre-Web')
|
||||
config_books_per_page = Column(Integer, default=60)
|
||||
config_random_books = Column(Integer, default=4)
|
||||
|
@ -91,6 +89,8 @@ class _Settings(_Base):
|
|||
|
||||
config_default_role = Column(SmallInteger, default=0)
|
||||
config_default_show = Column(SmallInteger, default=constants.ADMIN_USER_SIDEBAR)
|
||||
config_default_language = Column(String(3), default="all")
|
||||
config_default_locale = Column(String(2), default="en")
|
||||
config_columns_to_ignore = Column(String)
|
||||
|
||||
config_denied_tags = Column(String, default="")
|
||||
|
@ -366,10 +366,6 @@ def _migrate_table(session, orm_class):
|
|||
session.query(column).first()
|
||||
except OperationalError as err:
|
||||
log.debug("%s: %s", column_name, err.args[0])
|
||||
if column.default is not None:
|
||||
if sys.version_info < (3, 0):
|
||||
if isinstance(column.default.arg, unicode):
|
||||
column.default.arg = column.default.arg.encode('utf-8')
|
||||
if column.default is None:
|
||||
column_default = ""
|
||||
else:
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
from collections import namedtuple
|
||||
|
@ -34,12 +33,7 @@ HOME_CONFIG = os.path.isfile(os.path.join(os.path.dirname(os.path.abspath(__file
|
|||
UPDATER_AVAILABLE = True
|
||||
|
||||
# Base dir is parent of current file, necessary if called from different folder
|
||||
if sys.version_info < (3, 0):
|
||||
BASE_DIR = os.path.abspath(os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),os.pardir)).decode('utf-8')
|
||||
else:
|
||||
BASE_DIR = os.path.abspath(os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),os.pardir))
|
||||
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.pardir))
|
||||
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')
|
||||
|
@ -164,7 +158,7 @@ def selected_roles(dictionary):
|
|||
BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, '
|
||||
'series_id, languages, publisher')
|
||||
|
||||
STABLE_VERSION = {'version': '0.6.13 Beta'}
|
||||
STABLE_VERSION = {'version': '0.6.17 Beta'}
|
||||
|
||||
NIGHTLY_VERSION = {}
|
||||
NIGHTLY_VERSION[0] = '$Format:%H$'
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import re
|
||||
from flask_babel import gettext as _
|
||||
|
|
250
cps/db.py
250
cps/db.py
|
@ -17,13 +17,13 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import ast
|
||||
import json
|
||||
from datetime import datetime
|
||||
from urllib.parse import quote
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy import Table, Column, ForeignKey, CheckConstraint
|
||||
|
@ -41,8 +41,6 @@ from sqlalchemy.pool import StaticPool
|
|||
from sqlalchemy.sql.expression import and_, true, false, text, func, or_
|
||||
from sqlalchemy.ext.associationproxy import association_proxy
|
||||
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
|
||||
|
||||
|
@ -167,6 +165,8 @@ class Identifiers(Base):
|
|||
return u"https://portal.issn.org/resource/ISSN/{0}".format(self.val)
|
||||
elif format_type == "isfdb":
|
||||
return u"http://www.isfdb.org/cgi-bin/pl.cgi?{0}".format(self.val)
|
||||
elif self.val.lower().startswith("javascript:"):
|
||||
return quote(self.val)
|
||||
else:
|
||||
return u"{0}".format(self.val)
|
||||
|
||||
|
@ -175,8 +175,8 @@ class Comments(Base):
|
|||
__tablename__ = 'comments'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
book = Column(Integer, ForeignKey('books.id'), nullable=False, unique=True)
|
||||
text = Column(String(collation='NOCASE'), nullable=False)
|
||||
book = Column(Integer, ForeignKey('books.id'), nullable=False)
|
||||
|
||||
def __init__(self, text, book):
|
||||
self.text = text
|
||||
|
@ -339,15 +339,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):
|
||||
|
@ -387,8 +387,6 @@ class Custom_Columns(Base):
|
|||
|
||||
def get_display_dict(self):
|
||||
display_dict = ast.literal_eval(self.display)
|
||||
if sys.version_info < (3, 0):
|
||||
display_dict['enum_values'] = [x.decode('unicode_escape') for x in display_dict['enum_values']]
|
||||
return display_dict
|
||||
|
||||
|
||||
|
@ -398,7 +396,7 @@ class AlchemyEncoder(json.JSONEncoder):
|
|||
if isinstance(o.__class__, DeclarativeMeta):
|
||||
# an SQLAlchemy class
|
||||
fields = {}
|
||||
for field in [x for x in dir(o) if not x.startswith('_') and x != 'metadata' and x!="password"]:
|
||||
for field in [x for x in dir(o) if not x.startswith('_') and x != 'metadata' and x != "password"]:
|
||||
if field == 'books':
|
||||
continue
|
||||
data = o.__getattribute__(field)
|
||||
|
@ -407,8 +405,11 @@ class AlchemyEncoder(json.JSONEncoder):
|
|||
data = data.replace("'", "\'")
|
||||
elif isinstance(data, InstrumentedList):
|
||||
el = list()
|
||||
# ele = None
|
||||
for ele in data:
|
||||
if ele.get:
|
||||
if hasattr(ele, 'value'): # converter for custom_column values
|
||||
el.append(str(ele.value))
|
||||
elif ele.get:
|
||||
el.append(ele.get())
|
||||
else:
|
||||
el.append(json.dumps(ele, cls=AlchemyEncoder))
|
||||
|
@ -550,11 +551,8 @@ class CalibreDB():
|
|||
|
||||
@classmethod
|
||||
def setup_db(cls, config_calibre_dir, app_db_path):
|
||||
# cls.config = config
|
||||
cls.dispose()
|
||||
|
||||
# toDo: if db changed -> delete shelfs, delete download books, delete read boks, kobo sync??
|
||||
|
||||
if not config_calibre_dir:
|
||||
cls.config.invalidate()
|
||||
return False
|
||||
|
@ -605,6 +603,26 @@ 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):
|
||||
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()
|
||||
|
||||
|
@ -612,7 +630,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 +643,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))
|
||||
|
@ -659,9 +677,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])
|
||||
|
@ -675,11 +696,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, database, db_filter, order, False, *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, database, db_filter, order, allow_show_archived,
|
||||
*join):
|
||||
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) \
|
||||
|
@ -689,20 +712,43 @@ class CalibreDB():
|
|||
.all()
|
||||
else:
|
||||
randm = false()
|
||||
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:
|
||||
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:
|
||||
query = self.session.query(database)
|
||||
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()
|
||||
|
@ -713,34 +759,47 @@ 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)
|
||||
# display authors in right order
|
||||
entries = self.order_authors(entries, True, join_archive_read)
|
||||
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 entry
|
||||
def order_authors(self, entries, list_return=False, combined=False):
|
||||
for entry in entries:
|
||||
if combined:
|
||||
sort_authors = entry.Books.author_sort.split('&')
|
||||
ids = [a.id for a in entry.Books.authors]
|
||||
|
||||
else:
|
||||
sort_authors = entry.author_sort.split('&')
|
||||
ids = [a.id for a in entry.authors]
|
||||
authors_ordered = list()
|
||||
error = False
|
||||
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:
|
||||
if combined:
|
||||
entry.Books.authors = authors_ordered
|
||||
else:
|
||||
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 ''
|
||||
self.session.connection().connection.connection.create_function("lower", 1, lcase)
|
||||
entries = self.session.query(database).filter(tag_filter). \
|
||||
filter(func.lower(database.name).ilike("%" + query + "%")).all()
|
||||
# json_dumps = json.dumps([dict(name=escape(r.name.replace(*replace))) for r in entries])
|
||||
json_dumps = json.dumps([dict(name=r.name.replace(*replace)) for r in entries])
|
||||
return json_dumps
|
||||
|
||||
|
@ -754,14 +813,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)
|
||||
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:
|
||||
|
@ -779,10 +853,11 @@ 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):
|
||||
order = order or [Books.sort]
|
||||
def get_search_results(self, term, offset=None, order=None, limit=None, allow_show_archived=False,
|
||||
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)
|
||||
|
@ -792,26 +867,35 @@ class CalibreDB():
|
|||
offset = 0
|
||||
limit_all = result_count
|
||||
|
||||
ub.store_ids(result)
|
||||
return result[offset:limit_all], result_count, pagination
|
||||
ub.store_combo_ids(result)
|
||||
entries = self.order_authors(result[offset:limit_all], list_return=True, combined=True)
|
||||
|
||||
return entries, 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, with_count=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()) \
|
||||
.group_by(text('books_languages_link.lang_code')).all()
|
||||
for lang in languages:
|
||||
try:
|
||||
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
|
||||
if with_count:
|
||||
if not languages:
|
||||
languages = self.session.query(Languages, func.count('books_languages_link.book'))\
|
||||
.join(books_languages_link).join(Books)\
|
||||
.filter(self.common_filters(return_all_languages=return_all_languages)) \
|
||||
.group_by(text('books_languages_link.lang_code')).all()
|
||||
for lang in languages:
|
||||
lang[0].name = isoLanguages.get_language_name(get_locale(), lang[0].lang_code)
|
||||
return sorted(languages, key=lambda x: x[0].name, reverse=reverse_order)
|
||||
else:
|
||||
if not languages:
|
||||
languages = self.session.query(Languages) \
|
||||
.join(books_languages_link) \
|
||||
.join(Books) \
|
||||
.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 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.)
|
||||
|
|
96
cps/dep_check.py
Normal file
96
cps/dep_check.py
Normal file
|
@ -0,0 +1,96 @@
|
|||
import os
|
||||
import re
|
||||
|
||||
from .constants import BASE_DIR
|
||||
try:
|
||||
from importlib_metadata import version
|
||||
importlib = True
|
||||
ImportNotFound = BaseException
|
||||
except ImportError:
|
||||
importlib = False
|
||||
|
||||
|
||||
if not importlib:
|
||||
try:
|
||||
import pkg_resources
|
||||
from pkg_resources import DistributionNotFound as ImportNotFound
|
||||
pkgresources = True
|
||||
except ImportError as e:
|
||||
pkgresources = False
|
||||
|
||||
def load_dependencys(optional=False):
|
||||
deps = list()
|
||||
if importlib or pkgresources:
|
||||
if optional:
|
||||
req_path = os.path.join(BASE_DIR, "optional-requirements.txt")
|
||||
else:
|
||||
req_path = os.path.join(BASE_DIR, "requirements.txt")
|
||||
if os.path.exists(req_path):
|
||||
with open(req_path, 'r') as f:
|
||||
for line in f:
|
||||
if not line.startswith('#') and not line == '\n' and not line.startswith('git'):
|
||||
res = re.match(r'(.*?)([<=>\s]+)([\d\.]+),?\s?([<=>\s]+)?([\d\.]+)?', line.strip())
|
||||
try:
|
||||
if importlib:
|
||||
dep_version = version(res.group(1))
|
||||
else:
|
||||
dep_version = pkg_resources.get_distribution(res.group(1)).version
|
||||
except ImportNotFound:
|
||||
if optional:
|
||||
continue
|
||||
dep_version = "not installed"
|
||||
deps.append([dep_version, res.group(1), res.group(2), res.group(3), res.group(4), res.group(5)])
|
||||
return deps
|
||||
|
||||
|
||||
def dependency_check(optional=False):
|
||||
d = list()
|
||||
deps = load_dependencys(optional)
|
||||
for dep in deps:
|
||||
try:
|
||||
dep_version_int = [int(x) for x in dep[0].split('.')]
|
||||
low_check = [int(x) for x in dep[3].split('.')]
|
||||
high_check = [int(x) for x in dep[5].split('.')]
|
||||
except AttributeError:
|
||||
high_check = None
|
||||
except ValueError:
|
||||
d.append({'name': dep[1],
|
||||
'target': "available",
|
||||
'found': "Not available"
|
||||
})
|
||||
continue
|
||||
|
||||
if dep[2].strip() == "==":
|
||||
if dep_version_int != low_check:
|
||||
d.append({'name': dep[1],
|
||||
'found': dep[0],
|
||||
"target": dep[2] + dep[3]})
|
||||
continue
|
||||
elif dep[2].strip() == ">=":
|
||||
if dep_version_int < low_check:
|
||||
d.append({'name': dep[1],
|
||||
'found': dep[0],
|
||||
"target": dep[2] + dep[3]})
|
||||
continue
|
||||
elif dep[2].strip() == ">":
|
||||
if dep_version_int <= low_check:
|
||||
d.append({'name': dep[1],
|
||||
'found': dep[0],
|
||||
"target": dep[2] + dep[3]})
|
||||
continue
|
||||
if dep[4] and dep[5]:
|
||||
if dep[4].strip() == "<":
|
||||
if dep_version_int >= high_check:
|
||||
d.append(
|
||||
{'name': dep[1],
|
||||
'found': dep[0],
|
||||
"target": dep[4] + dep[5]})
|
||||
continue
|
||||
elif dep[4].strip() == "<=":
|
||||
if dep_version_int > high_check:
|
||||
d.append(
|
||||
{'name': dep[1],
|
||||
'found': dep[0],
|
||||
"target": dep[4] + dep[5]})
|
||||
continue
|
||||
return d
|
204
cps/editbooks.py
Normal file → Executable file
204
cps/editbooks.py
Normal file → Executable file
|
@ -20,19 +20,19 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
from datetime import datetime
|
||||
import json
|
||||
from shutil import copyfile
|
||||
from uuid import uuid4
|
||||
from markupsafe import escape
|
||||
from functools import wraps
|
||||
|
||||
try:
|
||||
from lxml.html.clean import clean_html
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
# Improve this to check if scholarly is available in a global way, like other pythonic libraries
|
||||
try:
|
||||
from scholarly import scholarly
|
||||
|
@ -40,27 +40,19 @@ try:
|
|||
except ImportError:
|
||||
have_scholar = False
|
||||
|
||||
from babel import Locale as LC
|
||||
from babel.core import UnknownLocaleError
|
||||
from flask import Blueprint, request, flash, redirect, url_for, abort, Markup, Response
|
||||
from flask_babel import gettext as _
|
||||
from flask_login import current_user, login_required
|
||||
from sqlalchemy.exc import OperationalError, IntegrityError
|
||||
from sqlite3 import OperationalError as sqliteOperationalError
|
||||
from . import constants, logger, isoLanguages, gdriveutils, uploader, helper
|
||||
from . import constants, logger, isoLanguages, gdriveutils, uploader, helper, kobo_sync_status
|
||||
from . import config, get_locale, ub, db
|
||||
from . import calibre_db
|
||||
from .services.worker import WorkerThread
|
||||
from .tasks.upload import TaskUpload
|
||||
from .render_template import render_title_template
|
||||
from .usermanagement import login_required_if_no_ano
|
||||
|
||||
try:
|
||||
from functools import wraps
|
||||
except ImportError:
|
||||
pass # We're not using Python 3
|
||||
|
||||
|
||||
from .kobo_sync_status import change_archived_books
|
||||
|
||||
|
||||
editbook = Blueprint('editbook', __name__)
|
||||
|
@ -70,7 +62,7 @@ log = logger.create()
|
|||
def upload_required(f):
|
||||
@wraps(f)
|
||||
def inner(*args, **kwargs):
|
||||
if current_user.role_upload() or current_user.role_admin():
|
||||
if current_user.role_upload():
|
||||
return f(*args, **kwargs)
|
||||
abort(403)
|
||||
|
||||
|
@ -174,7 +166,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
|
||||
|
@ -185,7 +177,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
|
||||
|
@ -241,17 +233,17 @@ def modify_identifiers(input_identifiers, db_identifiers, db_session):
|
|||
changed = True
|
||||
return changed, error
|
||||
|
||||
@editbook.route("/ajax/delete/<int:book_id>")
|
||||
@editbook.route("/ajax/delete/<int:book_id>", methods=["POST"])
|
||||
@login_required
|
||||
def delete_book_from_details(book_id):
|
||||
return Response(delete_book(book_id, "", True), mimetype='application/json')
|
||||
return Response(delete_book_from_table(book_id, "", True), mimetype='application/json')
|
||||
|
||||
|
||||
@editbook.route("/delete/<int:book_id>", defaults={'book_format': ""})
|
||||
@editbook.route("/delete/<int:book_id>/<string:book_format>")
|
||||
@editbook.route("/delete/<int:book_id>", defaults={'book_format': ""}, methods=["POST"])
|
||||
@editbook.route("/delete/<int:book_id>/<string:book_format>", methods=["POST"])
|
||||
@login_required
|
||||
def delete_book_ajax(book_id, book_format):
|
||||
return delete_book(book_id, book_format, False)
|
||||
return delete_book_from_table(book_id, book_format, False)
|
||||
|
||||
|
||||
def delete_whole_book(book_id, book):
|
||||
|
@ -321,7 +313,7 @@ def render_delete_book_result(book_format, jsonResponse, warning, book_id):
|
|||
return redirect(url_for('web.index'))
|
||||
|
||||
|
||||
def delete_book(book_id, book_format, jsonResponse):
|
||||
def delete_book_from_table(book_id, book_format, jsonResponse):
|
||||
warning = {}
|
||||
if current_user.role_delete_books():
|
||||
book = calibre_db.get_book(book_id)
|
||||
|
@ -350,6 +342,8 @@ def delete_book(book_id, book_format, jsonResponse):
|
|||
else:
|
||||
calibre_db.session.query(db.Data).filter(db.Data.book == book.id).\
|
||||
filter(db.Data.format == book_format).delete()
|
||||
if book_format.upper() in ['KEPUB', 'EPUB', 'EPUB3']:
|
||||
kobo_sync_status.remove_synced_book(book.id, True)
|
||||
calibre_db.session.commit()
|
||||
except Exception as ex:
|
||||
log.debug_or_exception(ex)
|
||||
|
@ -366,7 +360,16 @@ def delete_book(book_id, book_format, jsonResponse):
|
|||
else:
|
||||
# book not found
|
||||
log.error('Book with id "%s" could not be deleted: not found', book_id)
|
||||
return render_delete_book_result(book_format, jsonResponse, warning, book_id)
|
||||
return render_delete_book_result(book_format, jsonResponse, warning, book_id)
|
||||
message = _("You are missing permissions to delete books")
|
||||
if jsonResponse:
|
||||
return json.dumps({"location": url_for("editbook.edit_book", book_id=book_id),
|
||||
"type": "danger",
|
||||
"format": "",
|
||||
"message": message})
|
||||
else:
|
||||
flash(message, category="error")
|
||||
return redirect(url_for('editbook.edit_book', book_id=book_id))
|
||||
|
||||
|
||||
def render_edit_book(book_id):
|
||||
|
@ -379,7 +382,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:
|
||||
|
@ -457,11 +460,12 @@ def edit_book_series_index(series_index, book):
|
|||
if not series_index.replace('.', '', 1).isdigit():
|
||||
flash(_("%(seriesindex)s is not a valid number, skipping", seriesindex=series_index), category="warning")
|
||||
return False
|
||||
if book.series_index != series_index:
|
||||
if str(book.series_index) != series_index:
|
||||
book.series_index = series_index
|
||||
modif_date = True
|
||||
return modif_date
|
||||
|
||||
|
||||
# Handle book comments/description
|
||||
def edit_book_comments(comments, book):
|
||||
modif_date = False
|
||||
|
@ -486,11 +490,11 @@ def edit_book_languages(languages, book, upload=False, invalid=None):
|
|||
else:
|
||||
input_l = isoLanguages.get_valid_language_codes(get_locale(), input_languages, unknown_languages)
|
||||
for l in unknown_languages:
|
||||
log.error('%s is not a valid language', l)
|
||||
log.error("'%s' is not a valid language", l)
|
||||
if isinstance(invalid, list):
|
||||
invalid.append(l)
|
||||
else:
|
||||
flash(_(u"%(langname)s is not a valid language", langname=l), category="warning")
|
||||
raise ValueError(_(u"'%(langname)s' is not a valid language", langname=l))
|
||||
# ToDo: Not working correct
|
||||
if upload and len(input_l) == 1:
|
||||
# If the language of the file is excluded from the users view, it's not imported, to allow the user to view
|
||||
|
@ -576,10 +580,19 @@ def edit_cc_data_string(book, c, to_save, cc_db_value, cc_string):
|
|||
getattr(book, cc_string).append(new_cc)
|
||||
return changed, to_save
|
||||
|
||||
def edit_single_cc_data(book_id, book, column_id, to_save):
|
||||
cc = (calibre_db.session.query(db.Custom_Columns)
|
||||
.filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions))
|
||||
.filter(db.Custom_Columns.id == column_id)
|
||||
.all())
|
||||
return edit_cc_data(book_id, book, to_save, cc)
|
||||
|
||||
def edit_cc_data(book_id, book, to_save):
|
||||
changed = False
|
||||
def edit_all_cc_data(book_id, book, to_save):
|
||||
cc = calibre_db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
|
||||
return edit_cc_data(book_id, book, to_save, cc)
|
||||
|
||||
def edit_cc_data(book_id, book, to_save, cc):
|
||||
changed = False
|
||||
for c in cc:
|
||||
cc_string = "custom_column_" + str(c.id)
|
||||
if not c.is_multiple:
|
||||
|
@ -703,6 +716,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
|
||||
|
@ -711,6 +725,18 @@ def handle_author_on_edit(book, author_name, update_stored=True):
|
|||
if input_authors == ['']:
|
||||
input_authors = [_(u'Unknown')] # prevent empty Author
|
||||
|
||||
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
|
||||
|
@ -727,7 +753,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/<int:book_id>", methods=['GET', 'POST'])
|
||||
|
@ -767,7 +793,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
|
||||
|
@ -777,7 +803,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:
|
||||
|
@ -816,7 +843,7 @@ def edit_book(book_id):
|
|||
# handle book ratings
|
||||
modif_date |= edit_book_ratings(to_save, book)
|
||||
# handle cc data
|
||||
modif_date |= edit_cc_data(book_id, book, to_save)
|
||||
modif_date |= edit_all_cc_data(book_id, book, to_save)
|
||||
|
||||
if to_save["pubdate"]:
|
||||
try:
|
||||
|
@ -828,6 +855,8 @@ def edit_book(book_id):
|
|||
|
||||
if modif_date:
|
||||
book.last_modified = datetime.utcnow()
|
||||
kobo_sync_status.remove_synced_book(edited_books_id, all=True)
|
||||
|
||||
calibre_db.session.merge(book)
|
||||
calibre_db.session.commit()
|
||||
if config.config_use_google_drive:
|
||||
|
@ -841,6 +870,10 @@ def edit_book(book_id):
|
|||
calibre_db.session.rollback()
|
||||
flash(error, category="error")
|
||||
return render_edit_book(book_id)
|
||||
except ValueError as e:
|
||||
calibre_db.session.rollback()
|
||||
flash(str(e), category="error")
|
||||
return redirect(url_for('web.show_book', book_id=book.id))
|
||||
except Exception as ex:
|
||||
log.debug_or_exception(ex)
|
||||
calibre_db.session.rollback()
|
||||
|
@ -896,6 +929,18 @@ def prepare_authors_on_upload(title, authr):
|
|||
if input_authors == ['']:
|
||||
input_authors = [_(u'Unknown')] # prevent empty Author
|
||||
|
||||
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)
|
||||
|
||||
sort_authors_list = list()
|
||||
db_author = None
|
||||
for inp in input_authors:
|
||||
|
@ -912,13 +957,13 @@ def prepare_authors_on_upload(title, authr):
|
|||
sort_author = stored_author.sort
|
||||
sort_authors_list.append(sort_author)
|
||||
sort_authors = ' & '.join(sort_authors_list)
|
||||
return sort_authors, input_authors, db_author
|
||||
return sort_authors, input_authors, db_author, renamed
|
||||
|
||||
|
||||
def create_book_on_upload(modif_date, meta):
|
||||
title = meta.title
|
||||
authr = meta.author
|
||||
sort_authors, input_authors, db_author = prepare_authors_on_upload(title, authr)
|
||||
sort_authors, input_authors, db_author, renamed_authors = prepare_authors_on_upload(title, authr)
|
||||
|
||||
title_dir = helper.get_valid_filename(title)
|
||||
author_dir = helper.get_valid_filename(db_author.name)
|
||||
|
@ -937,7 +982,11 @@ def create_book_on_upload(modif_date, meta):
|
|||
modif_date |= edit_book_series_index(meta.series_id, db_book)
|
||||
|
||||
# add languages
|
||||
modif_date |= edit_book_languages(meta.languages, db_book, upload=True)
|
||||
invalid=[]
|
||||
modif_date |= edit_book_languages(meta.languages, db_book, upload=True, invalid=invalid)
|
||||
if invalid:
|
||||
for l in invalid:
|
||||
flash(_(u"'%(langname)s' is not a valid language", langname=l), category="warning")
|
||||
|
||||
# handle tags
|
||||
modif_date |= edit_book_tags(meta.tags, db_book)
|
||||
|
@ -956,7 +1005,7 @@ def create_book_on_upload(modif_date, meta):
|
|||
|
||||
# flush content, get db_book.id available
|
||||
calibre_db.session.flush()
|
||||
return db_book, input_authors, title_dir
|
||||
return db_book, input_authors, title_dir, renamed_authors
|
||||
|
||||
def file_handling_on_upload(requested_file):
|
||||
# check if file extension is correct
|
||||
|
@ -1000,7 +1049,7 @@ def move_coverfile(meta, db_book):
|
|||
category="error")
|
||||
|
||||
|
||||
@editbook.route("/upload", methods=["GET", "POST"])
|
||||
@editbook.route("/upload", methods=["POST"])
|
||||
@login_required_if_no_ano
|
||||
@upload_required
|
||||
def upload():
|
||||
|
@ -1018,7 +1067,7 @@ def upload():
|
|||
if error:
|
||||
return error
|
||||
|
||||
db_book, input_authors, title_dir = create_book_on_upload(modif_date, meta)
|
||||
db_book, input_authors, title_dir, renamed_authors = create_book_on_upload(modif_date, meta)
|
||||
|
||||
# Comments needs book id therefore only possible after flush
|
||||
modif_date |= edit_book_comments(Markup(meta.description).unescape(), db_book)
|
||||
|
@ -1030,7 +1079,8 @@ def upload():
|
|||
config.config_calibre_dir,
|
||||
input_authors[0],
|
||||
meta.file_path,
|
||||
title_dir + meta.extension.lower())
|
||||
title_dir + meta.extension.lower(),
|
||||
renamed_author=renamed_authors)
|
||||
|
||||
move_coverfile(meta, db_book)
|
||||
|
||||
|
@ -1058,6 +1108,7 @@ def upload():
|
|||
flash(_(u"Database error: %(error)s.", error=e), category="error")
|
||||
return Response(json.dumps({"location": url_for("web.index")}), mimetype='application/json')
|
||||
|
||||
|
||||
@editbook.route("/admin/book/convert/<int:book_id>", methods=['POST'])
|
||||
@login_required_if_no_ano
|
||||
@edit_required
|
||||
|
@ -1082,23 +1133,18 @@ def convert_bookformat(book_id):
|
|||
flash(_(u"There was an error converting this book: %(res)s", res=rtn), category="error")
|
||||
return redirect(url_for('editbook.edit_book', book_id=book_id))
|
||||
|
||||
@editbook.route("/scholarsearch/<query>",methods=['GET'])
|
||||
@login_required_if_no_ano
|
||||
@edit_required
|
||||
def scholar_search(query):
|
||||
if have_scholar:
|
||||
scholar_gen = scholarly.search_pubs(' '.join(query.split('+')))
|
||||
i=0
|
||||
result = []
|
||||
for publication in scholar_gen:
|
||||
del publication['source']
|
||||
result.append(publication)
|
||||
i+=1
|
||||
if(i>=10):
|
||||
break
|
||||
return Response(json.dumps(result),mimetype='application/json')
|
||||
else:
|
||||
return "[]"
|
||||
@editbook.route("/ajax/getcustomenum/<int:c_id>")
|
||||
@login_required
|
||||
def table_get_custom_enum(c_id):
|
||||
ret = list()
|
||||
cc = (calibre_db.session.query(db.Custom_Columns)
|
||||
.filter(db.Custom_Columns.id == c_id)
|
||||
.filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).one_or_none())
|
||||
ret.append({'value': "", 'text': ""})
|
||||
for idx, en in enumerate(cc.get_display_dict()['enum_values']):
|
||||
ret.append({'value': en, 'text': en})
|
||||
return json.dumps(ret)
|
||||
|
||||
|
||||
@editbook.route("/ajax/editbooks/<param>", methods=['POST'])
|
||||
@login_required_if_no_ano
|
||||
|
@ -1133,10 +1179,7 @@ def edit_list_book(param):
|
|||
else:
|
||||
lang_names = list()
|
||||
for lang in book.languages:
|
||||
try:
|
||||
lang_names.append(LC.parse(lang.lang_code).get_language_name(get_locale()))
|
||||
except UnknownLocaleError:
|
||||
lang_names.append(_(isoLanguages.get(part3=lang.lang_code).name))
|
||||
lang_names.append(isoLanguages.get_language_name(get_locale(), lang.lang_code))
|
||||
ret = Response(json.dumps({'success': True, 'newValue': ', '.join(lang_names)}),
|
||||
mimetype='application/json')
|
||||
elif param =='author_sort':
|
||||
|
@ -1146,19 +1189,42 @@ 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':
|
||||
book.sort = vals['value']
|
||||
ret = Response(json.dumps({'success': True, 'newValue': book.sort}),
|
||||
mimetype='application/json')
|
||||
elif param =='comments':
|
||||
edit_book_comments(vals['value'], book)
|
||||
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')
|
||||
elif param =='is_archived':
|
||||
change_archived_books(book.id, vals['value']=="True")
|
||||
ret = ""
|
||||
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)
|
||||
# ToDo: Very hacky find better solution
|
||||
if vals['value'] in ["True", "False"]:
|
||||
ret = ""
|
||||
else:
|
||||
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()
|
||||
|
@ -1237,10 +1303,11 @@ def merge_list_book():
|
|||
element.format,
|
||||
element.uncompressed_size,
|
||||
to_name))
|
||||
delete_book(from_book.id,"", True)
|
||||
delete_book_from_table(from_book.id,"", True)
|
||||
return json.dumps({'success': True})
|
||||
return ""
|
||||
|
||||
|
||||
@editbook.route("/ajax/xchange", methods=['POST'])
|
||||
@login_required
|
||||
@edit_required
|
||||
|
@ -1251,13 +1318,13 @@ 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))
|
||||
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
|
||||
|
@ -1266,7 +1333,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:
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import zipfile
|
||||
from lxml import etree
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
from lxml import etree
|
||||
|
||||
from .constants import BookMeta
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import sys
|
||||
import hashlib
|
||||
import json
|
||||
import tempfile
|
||||
|
@ -34,7 +32,7 @@ from flask import Blueprint, flash, request, redirect, url_for, abort
|
|||
from flask_babel import gettext as _
|
||||
from flask_login import login_required
|
||||
|
||||
from . import logger, gdriveutils, config, ub, calibre_db
|
||||
from . import logger, gdriveutils, config, ub, calibre_db, csrf
|
||||
from .admin import admin_required
|
||||
|
||||
gdrive = Blueprint('gdrive', __name__, url_prefix='/gdrive')
|
||||
|
@ -111,50 +109,50 @@ def revoke_watch_gdrive():
|
|||
try:
|
||||
gdriveutils.stopChannel(gdriveutils.Gdrive.Instance().drive, last_watch_response['id'],
|
||||
last_watch_response['resourceId'])
|
||||
except HttpError:
|
||||
except (HttpError, AttributeError):
|
||||
pass
|
||||
config.config_google_drive_watch_changes_response = {}
|
||||
config.save()
|
||||
return redirect(url_for('admin.db_configuration'))
|
||||
|
||||
try:
|
||||
@csrf.exempt
|
||||
@gdrive.route("/watch/callback", methods=['GET', 'POST'])
|
||||
def on_received_watch_confirmation():
|
||||
if not config.config_google_drive_watch_changes_response:
|
||||
return ''
|
||||
if request.headers.get('X-Goog-Channel-Token') != gdrive_watch_callback_token \
|
||||
or request.headers.get('X-Goog-Resource-State') != 'change' \
|
||||
or not request.data:
|
||||
return ''
|
||||
|
||||
@gdrive.route("/watch/callback", methods=['GET', 'POST'])
|
||||
def on_received_watch_confirmation():
|
||||
if not config.config_google_drive_watch_changes_response:
|
||||
return ''
|
||||
if request.headers.get('X-Goog-Channel-Token') != gdrive_watch_callback_token \
|
||||
or request.headers.get('X-Goog-Resource-State') != 'change' \
|
||||
or not request.data:
|
||||
return ''
|
||||
log.debug('%r', request.headers)
|
||||
log.debug('%r', request.data)
|
||||
log.info('Change received from gdrive')
|
||||
|
||||
log.debug('%r', request.headers)
|
||||
log.debug('%r', request.data)
|
||||
log.info('Change received from gdrive')
|
||||
|
||||
try:
|
||||
j = json.loads(request.data)
|
||||
log.info('Getting change details')
|
||||
response = gdriveutils.getChangeById(gdriveutils.Gdrive.Instance().drive, j['id'])
|
||||
log.debug('%r', response)
|
||||
if response:
|
||||
if sys.version_info < (3, 0):
|
||||
dbpath = os.path.join(config.config_calibre_dir, "metadata.db")
|
||||
else:
|
||||
try:
|
||||
j = json.loads(request.data)
|
||||
log.info('Getting change details')
|
||||
response = gdriveutils.getChangeById(gdriveutils.Gdrive.Instance().drive, j['id'])
|
||||
log.debug('%r', response)
|
||||
if response:
|
||||
dbpath = os.path.join(config.config_calibre_dir, "metadata.db").encode()
|
||||
if not response['deleted'] and response['file']['title'] == 'metadata.db' \
|
||||
and response['file']['md5Checksum'] != hashlib.md5(dbpath): # nosec
|
||||
tmp_dir = os.path.join(tempfile.gettempdir(), 'calibre_web')
|
||||
if not os.path.isdir(tmp_dir):
|
||||
os.mkdir(tmp_dir)
|
||||
if not response['deleted'] and response['file']['title'] == 'metadata.db' \
|
||||
and response['file']['md5Checksum'] != hashlib.md5(dbpath): # nosec
|
||||
tmp_dir = os.path.join(tempfile.gettempdir(), 'calibre_web')
|
||||
if not os.path.isdir(tmp_dir):
|
||||
os.mkdir(tmp_dir)
|
||||
|
||||
log.info('Database file updated')
|
||||
copyfile(dbpath, os.path.join(tmp_dir, "metadata.db_" + str(current_milli_time())))
|
||||
log.info('Backing up existing and downloading updated metadata.db')
|
||||
gdriveutils.downloadFile(None, "metadata.db", os.path.join(tmp_dir, "tmp_metadata.db"))
|
||||
log.info('Setting up new DB')
|
||||
# prevent error on windows, as os.rename does on existing files, also allow cross hdd move
|
||||
move(os.path.join(tmp_dir, "tmp_metadata.db"), dbpath)
|
||||
calibre_db.reconnect_db(config, ub.app_DB_path)
|
||||
except Exception as ex:
|
||||
log.debug_or_exception(ex)
|
||||
return ''
|
||||
log.info('Database file updated')
|
||||
copyfile(dbpath, os.path.join(tmp_dir, "metadata.db_" + str(current_milli_time())))
|
||||
log.info('Backing up existing and downloading updated metadata.db')
|
||||
gdriveutils.downloadFile(None, "metadata.db", os.path.join(tmp_dir, "tmp_metadata.db"))
|
||||
log.info('Setting up new DB')
|
||||
# prevent error on windows, as os.rename does on existing files, also allow cross hdd move
|
||||
move(os.path.join(tmp_dir, "tmp_metadata.db"), dbpath)
|
||||
calibre_db.reconnect_db(config, ub.app_DB_path)
|
||||
except Exception as ex:
|
||||
log.debug_or_exception(ex)
|
||||
return ''
|
||||
except AttributeError:
|
||||
pass
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import json
|
||||
import shutil
|
||||
|
@ -36,6 +35,15 @@ except ImportError:
|
|||
from sqlalchemy.exc import OperationalError, InvalidRequestError
|
||||
from sqlalchemy.sql.expression import text
|
||||
|
||||
try:
|
||||
from six import __version__ as six_version
|
||||
except ImportError:
|
||||
six_version = "not installed"
|
||||
try:
|
||||
from httplib2 import __version__ as httplib2_version
|
||||
except ImportError:
|
||||
httplib2_version = "not installed"
|
||||
|
||||
try:
|
||||
from apiclient import errors
|
||||
from httplib2 import ServerNotFoundError
|
||||
|
@ -48,11 +56,13 @@ try:
|
|||
from pydrive2.auth import GoogleAuth
|
||||
from pydrive2.drive import GoogleDrive
|
||||
from pydrive2.auth import RefreshError
|
||||
from pydrive2.files import ApiRequestError
|
||||
except ImportError as err:
|
||||
try:
|
||||
from pydrive.auth import GoogleAuth
|
||||
from pydrive.drive import GoogleDrive
|
||||
from pydrive.auth import RefreshError
|
||||
from pydrive.files import ApiRequestError
|
||||
except ImportError as err:
|
||||
importError = err
|
||||
gdrive_support = False
|
||||
|
@ -314,6 +324,11 @@ def getFolderId(path, drive):
|
|||
log.error("gdrive.db DB is not Writeable")
|
||||
log.debug('Database error: %s', ex)
|
||||
session.rollback()
|
||||
except ApiRequestError as ex:
|
||||
log.error('{} {}'.format(ex.error['message'], path))
|
||||
session.rollback()
|
||||
except RefreshError as ex:
|
||||
log.error(ex)
|
||||
return currentFolderId
|
||||
|
||||
|
||||
|
@ -340,6 +355,30 @@ def downloadFile(path, filename, output):
|
|||
f = getFileFromEbooksFolder(path, filename)
|
||||
f.GetContentFile(output)
|
||||
|
||||
'''def renameGdriveFolderRemote(origin_file, target_folder):
|
||||
drive = getDrive(Gdrive.Instance().drive)
|
||||
previous_parents = ",".join([parent["id"] for parent in origin_file.get('parents')])
|
||||
children = drive.auth.service.children().list(folderId=previous_parents).execute()
|
||||
gFileTargetDir = getFileFromEbooksFolder(None, target_folder)
|
||||
if not gFileTargetDir or gFileTargetDir['title'] != target_folder:
|
||||
# Folder is not existing, rename folder
|
||||
drive.auth.service.files().patch(fileId=origin_file['id'],
|
||||
body={'title': target_folder},
|
||||
fields='title').execute()
|
||||
# gFileTargetDir = drive.CreateFile(
|
||||
# {'title': target_folder, 'parents': [{"kind": "drive#fileLink", 'id': getEbooksFolderId()}],
|
||||
# "mimeType": "application/vnd.google-apps.folder"})
|
||||
# gFileTargetDir.Upload()
|
||||
else:
|
||||
# Move the file to the new folder
|
||||
drive.auth.service.files().update(fileId=origin_file['id'],
|
||||
addParents=gFileTargetDir['id'],
|
||||
removeParents=previous_parents,
|
||||
fields='id, parents').execute()
|
||||
# if previous_parents has no children anymore, delete original fileparent
|
||||
if len(children['items']) == 1:
|
||||
deleteDatabaseEntry(previous_parents)
|
||||
drive.auth.service.files().delete(fileId=previous_parents).execute()'''
|
||||
|
||||
def moveGdriveFolderRemote(origin_file, target_folder):
|
||||
drive = getDrive(Gdrive.Instance().drive)
|
||||
|
@ -347,16 +386,27 @@ def moveGdriveFolderRemote(origin_file, target_folder):
|
|||
children = drive.auth.service.children().list(folderId=previous_parents).execute()
|
||||
gFileTargetDir = getFileFromEbooksFolder(None, target_folder)
|
||||
if not gFileTargetDir:
|
||||
# Folder is not existing, create, and move folder
|
||||
gFileTargetDir = drive.CreateFile(
|
||||
{'title': target_folder, 'parents': [{"kind": "drive#fileLink", 'id': getEbooksFolderId()}],
|
||||
"mimeType": "application/vnd.google-apps.folder"})
|
||||
gFileTargetDir.Upload()
|
||||
# Move the file to the new folder
|
||||
drive.auth.service.files().update(fileId=origin_file['id'],
|
||||
addParents=gFileTargetDir['id'],
|
||||
removeParents=previous_parents,
|
||||
fields='id, parents').execute()
|
||||
# Move the file to the new folder
|
||||
drive.auth.service.files().update(fileId=origin_file['id'],
|
||||
addParents=gFileTargetDir['id'],
|
||||
removeParents=previous_parents,
|
||||
fields='id, parents').execute()
|
||||
|
||||
elif gFileTargetDir['title'] != target_folder:
|
||||
# Folder is not existing, create, and move folder
|
||||
drive.auth.service.files().patch(fileId=origin_file['id'],
|
||||
body={'title': target_folder},
|
||||
fields='title').execute()
|
||||
else:
|
||||
# Move the file to the new folder
|
||||
drive.auth.service.files().update(fileId=origin_file['id'],
|
||||
addParents=gFileTargetDir['id'],
|
||||
removeParents=previous_parents,
|
||||
fields='id, parents').execute()
|
||||
# if previous_parents has no children anymore, delete original fileparent
|
||||
if len(children['items']) == 1:
|
||||
deleteDatabaseEntry(previous_parents)
|
||||
|
@ -660,3 +710,8 @@ def get_error_text(client_secrets=None):
|
|||
return 'Callback url (redirect url) is missing in client_secrets.json'
|
||||
if client_secrets:
|
||||
client_secrets.update(filedata['web'])
|
||||
|
||||
|
||||
def get_versions():
|
||||
return {'six': six_version,
|
||||
'httplib2': httplib2_version}
|
||||
|
|
186
cps/helper.py
186
cps/helper.py
|
@ -17,19 +17,18 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
import io
|
||||
import mimetypes
|
||||
import re
|
||||
import shutil
|
||||
import time
|
||||
import socket
|
||||
import unicodedata
|
||||
from datetime import datetime, timedelta
|
||||
from tempfile import gettempdir
|
||||
|
||||
from urllib.parse import urlparse
|
||||
import requests
|
||||
|
||||
from babel.dates import format_datetime
|
||||
from babel.units import format_unit
|
||||
from flask import send_from_directory, make_response, redirect, abort, url_for
|
||||
|
@ -39,11 +38,7 @@ 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
|
||||
|
||||
try:
|
||||
from urllib.parse import quote
|
||||
except ImportError:
|
||||
from urllib import quote
|
||||
from urllib.parse import quote
|
||||
|
||||
try:
|
||||
import unidecode
|
||||
|
@ -51,9 +46,9 @@ try:
|
|||
except ImportError:
|
||||
use_unidecode = False
|
||||
|
||||
from . import calibre_db
|
||||
from . import calibre_db, cli
|
||||
from .tasks.convert import TaskConvert
|
||||
from . import logger, config, get_locale, db, fs, ub
|
||||
from . import logger, config, get_locale, db, ub, kobo_sync_status, fs
|
||||
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
|
||||
|
@ -66,7 +61,7 @@ log = logger.create()
|
|||
|
||||
try:
|
||||
from wand.image import Image
|
||||
from wand.exceptions import MissingDelegateError
|
||||
from wand.exceptions import MissingDelegateError, BlobError
|
||||
use_IM = True
|
||||
except (ImportError, RuntimeError) as e:
|
||||
log.debug('Cannot import Image, generating covers from non jpg files will not work: %s', e)
|
||||
|
@ -236,7 +231,7 @@ def get_valid_filename(value, replace_whitespace=True):
|
|||
value = value[:-1]+u'_'
|
||||
value = value.replace("/", "_").replace(":", "_").strip('\0')
|
||||
if use_unidecode:
|
||||
if not config.config_unicode_filename:
|
||||
if config.config_unicode_filename:
|
||||
value = (unidecode.unidecode(value))
|
||||
else:
|
||||
value = value.replace(u'§', u'SS')
|
||||
|
@ -338,8 +333,44 @@ def delete_book_file(book, calibrepath, book_format=None):
|
|||
path=book.path)
|
||||
|
||||
|
||||
def clean_author_database(renamed_author, calibrepath, local_book=None, gdrive=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:
|
||||
if not gdrive:
|
||||
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())))
|
||||
else:
|
||||
gFile = gd.getFileFromEbooksFolder(all_new_path,
|
||||
file_format.name + '.' + file_format.format.lower())
|
||||
if gFile:
|
||||
gd.moveGdriveFileRemote(gFile, all_new_name + u'.' + file_format.format.lower())
|
||||
gd.updateDatabaseOnEdit(gFile['id'], all_new_name + u'.' + file_format.format.lower())
|
||||
else:
|
||||
log.error("File {} not found on gdrive"
|
||||
.format(all_new_path, file_format.name + '.' + file_format.format.lower()))
|
||||
file_format.name = all_new_name
|
||||
|
||||
|
||||
# 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:
|
||||
|
@ -355,21 +386,35 @@ 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:
|
||||
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:
|
||||
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", 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))
|
||||
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)
|
||||
|
@ -381,7 +426,6 @@ def update_dir_structure_file(book_id, calibrepath, first_author, orignal_filepa
|
|||
for file in file_list:
|
||||
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:
|
||||
|
@ -392,31 +436,38 @@ 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:
|
||||
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", new_path, new_name, ex)
|
||||
except (OSError, FileNotFoundError) as 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):
|
||||
def update_dir_structure_gdrive(book_id, first_author, renamed_author):
|
||||
error = False
|
||||
book = calibre_db.get_book(book_id)
|
||||
path = book.path
|
||||
|
||||
authordir = book.path.split('/')[0]
|
||||
if first_author:
|
||||
new_authordir = get_valid_filename(first_author)
|
||||
for r in renamed_author:
|
||||
# Todo: Rename all authors on gdrive
|
||||
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)
|
||||
gFile = gd.getFileFromEbooksFolder(None, old_author_dir)
|
||||
if gFile:
|
||||
gd.moveGdriveFolderRemote(gFile, new_author_rename_dir)
|
||||
else:
|
||||
error = _(u'File %(file)s not found on Google Drive', file=authordir) # file not found
|
||||
else:
|
||||
new_authordir = get_valid_filename(book.authors[0].name)
|
||||
|
||||
titledir = book.path.split('/')[1]
|
||||
new_titledir = get_valid_filename(book.title) + u" (" + str(book_id) + u")"
|
||||
|
||||
|
@ -426,31 +477,27 @@ def update_dir_structure_gdrive(book_id, first_author):
|
|||
gFile['title'] = new_titledir
|
||||
gFile.Upload()
|
||||
book.path = book.path.split('/')[0] + u'/' + new_titledir
|
||||
path = book.path
|
||||
gd.updateDatabaseOnEdit(gFile['id'], book.path) # only child folder affected
|
||||
else:
|
||||
error = _(u'File %(file)s not found on Google Drive', file=book.path) # file not found
|
||||
|
||||
if authordir != new_authordir:
|
||||
if authordir != new_authordir and authordir not in renamed_author:
|
||||
gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), new_titledir)
|
||||
if gFile:
|
||||
gd.moveGdriveFolderRemote(gFile, new_authordir)
|
||||
book.path = new_authordir + u'/' + book.path.split('/')[1]
|
||||
path = book.path
|
||||
gd.updateDatabaseOnEdit(gFile['id'], book.path)
|
||||
else:
|
||||
error = _(u'File %(file)s not found on Google Drive', file=authordir) # file not found
|
||||
# Rename all files from old names to new names
|
||||
|
||||
if authordir != new_authordir or titledir != new_titledir:
|
||||
new_name = get_valid_filename(book.title) + u' - ' + get_valid_filename(new_authordir)
|
||||
for file_format in book.data:
|
||||
gFile = gd.getFileFromEbooksFolder(path, file_format.name + u'.' + file_format.format.lower())
|
||||
if not gFile:
|
||||
error = _(u'File %(file)s not found on Google Drive', file=file_format.name) # file not found
|
||||
break
|
||||
gd.moveGdriveFileRemote(gFile, new_name + u'.' + file_format.format.lower())
|
||||
file_format.name = new_name
|
||||
# change location in database to new author/title path
|
||||
book.path = os.path.join(new_authordir, new_titledir).replace('\\', '/')
|
||||
|
||||
# Rename all files from old names to new names
|
||||
clean_author_database(renamed_author, "", gdrive=True)
|
||||
if first_author not in renamed_author:
|
||||
clean_author_database([first_author], "", book, gdrive=True)
|
||||
|
||||
return error
|
||||
|
||||
|
||||
|
@ -493,10 +540,7 @@ def reset_password(user_id):
|
|||
def generate_random_password():
|
||||
s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%&*()?"
|
||||
passlen = 8
|
||||
if sys.version_info < (3, 0):
|
||||
return "".join(s[ord(c) % len(s)] for c in os.urandom(passlen))
|
||||
else:
|
||||
return "".join(s[c % len(s)] for c in os.urandom(passlen))
|
||||
return "".join(s[c % len(s)] for c in os.urandom(passlen))
|
||||
|
||||
|
||||
def uniq(inpt):
|
||||
|
@ -536,11 +580,20 @@ 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:
|
||||
return update_dir_structure_gdrive(book_id, first_author)
|
||||
return update_dir_structure_gdrive(book_id, first_author, renamed_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):
|
||||
|
@ -659,10 +712,17 @@ def get_series_thumbnail(series_id, resolution):
|
|||
# saves book cover from url
|
||||
def save_cover_from_url(url, book_path):
|
||||
try:
|
||||
if not cli.allow_localhost:
|
||||
# 127.0.x.x, localhost, [::1], [::ffff:7f00:1]
|
||||
ip = socket.getaddrinfo(urlparse(url).hostname, 0)[0][4][0]
|
||||
if ip.startswith("127.") or ip.startswith('::ffff:7f') or ip == "::1":
|
||||
log.error("Localhost was accessed for cover upload")
|
||||
return False, _("You are not allowed to access localhost for cover uploads")
|
||||
img = requests.get(url, timeout=(10, 200)) # ToDo: Error Handling
|
||||
img.raise_for_status()
|
||||
return save_cover(img, book_path)
|
||||
except (requests.exceptions.HTTPError,
|
||||
except (socket.gaierror,
|
||||
requests.exceptions.HTTPError,
|
||||
requests.exceptions.ConnectionError,
|
||||
requests.exceptions.Timeout) as ex:
|
||||
log.info(u'Cover Download Error %s', ex)
|
||||
|
@ -709,13 +769,17 @@ def save_cover(img, book_path):
|
|||
return False, _("Only jpg/jpeg/png/webp/bmp files are supported as coverfile")
|
||||
# convert to jpg because calibre only supports jpg
|
||||
if content_type != 'image/jpg':
|
||||
if hasattr(img, 'stream'):
|
||||
imgc = Image(blob=img.stream)
|
||||
else:
|
||||
imgc = Image(blob=io.BytesIO(img.content))
|
||||
imgc.format = 'jpeg'
|
||||
imgc.transform_colorspace("rgb")
|
||||
img = imgc
|
||||
try:
|
||||
if hasattr(img, 'stream'):
|
||||
imgc = Image(blob=img.stream)
|
||||
else:
|
||||
imgc = Image(blob=io.BytesIO(img.content))
|
||||
imgc.format = 'jpeg'
|
||||
imgc.transform_colorspace("rgb")
|
||||
img = imgc
|
||||
except (BlobError, MissingDelegateError):
|
||||
log.error("Invalid cover file content")
|
||||
return False, _("Invalid cover file content")
|
||||
else:
|
||||
if content_type not in 'image/jpeg':
|
||||
log.error("Only jpg/jpeg files are supported as coverfile")
|
||||
|
@ -740,9 +804,9 @@ def save_cover(img, book_path):
|
|||
|
||||
def do_download_file(book, book_format, client, data, headers):
|
||||
if config.config_use_google_drive:
|
||||
startTime = time.time()
|
||||
#startTime = time.time()
|
||||
df = gd.getFileFromEbooksFolder(book.path, data.name + "." + book_format)
|
||||
log.debug('%s', time.time() - startTime)
|
||||
#log.debug('%s', time.time() - startTime)
|
||||
if df:
|
||||
return gd.do_gdrive_download(df, headers)
|
||||
else:
|
||||
|
@ -774,8 +838,6 @@ def check_unrar(unrarLocation):
|
|||
return _('Unrar binary file not found')
|
||||
|
||||
try:
|
||||
if sys.version_info < (3, 0):
|
||||
unrarLocation = unrarLocation.encode(sys.getfilesystemencoding())
|
||||
unrarLocation = [unrarLocation]
|
||||
value = process_wait(unrarLocation, pattern='UNRAR (.*) freeware')
|
||||
if value:
|
||||
|
@ -902,7 +964,7 @@ def get_cc_columns(filter_config_custom_read=False):
|
|||
|
||||
def get_download_link(book_id, book_format, client):
|
||||
book_format = book_format.split(".")[0]
|
||||
book = calibre_db.get_filtered_book(book_id)
|
||||
book = calibre_db.get_filtered_book(book_id, allow_show_archived=True)
|
||||
if book:
|
||||
data1 = calibre_db.get_book_format(book.id, book_format.upper())
|
||||
else:
|
||||
|
|
|
@ -16,9 +16,10 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
|
||||
from .iso_language_names import LANGUAGE_NAMES as _LANGUAGE_NAMES
|
||||
from . import logger
|
||||
|
||||
log = logger.create()
|
||||
|
||||
|
||||
try:
|
||||
|
@ -52,7 +53,11 @@ def get_language_names(locale):
|
|||
|
||||
|
||||
def get_language_name(locale, lang_code):
|
||||
return get_language_names(locale)[lang_code]
|
||||
try:
|
||||
return get_language_names(locale)[lang_code]
|
||||
except KeyError:
|
||||
log.error('Missing translation for language name: {}'.format(lang_code))
|
||||
return "Unknown"
|
||||
|
||||
|
||||
def get_language_codes(locale, language_names, remainder=None):
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -22,7 +22,6 @@
|
|||
|
||||
# custom jinja filters
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import datetime
|
||||
import mimetypes
|
||||
from uuid import uuid4
|
||||
|
|
196
cps/kobo.py
196
cps/kobo.py
|
@ -19,15 +19,11 @@
|
|||
|
||||
import base64
|
||||
import datetime
|
||||
import sys
|
||||
import os
|
||||
import uuid
|
||||
from time import gmtime, strftime
|
||||
|
||||
try:
|
||||
from urllib import unquote
|
||||
except ImportError:
|
||||
from urllib.parse import unquote
|
||||
import json
|
||||
from urllib.parse import unquote
|
||||
|
||||
from flask import (
|
||||
Blueprint,
|
||||
|
@ -47,7 +43,8 @@ from sqlalchemy.exc import StatementError
|
|||
from sqlalchemy.sql import select
|
||||
import requests
|
||||
|
||||
from . import config, logger, kobo_auth, db, calibre_db, helper, shelf as shelf_lib, ub
|
||||
|
||||
from . import config, logger, kobo_auth, db, calibre_db, helper, shelf as shelf_lib, ub, csrf, kobo_sync_status
|
||||
from .constants import sqlalchemy_version2
|
||||
from .helper import get_download_link
|
||||
from .services import SyncToken as SyncToken
|
||||
|
@ -102,6 +99,8 @@ def make_request_to_kobo_store(sync_token=None):
|
|||
allow_redirects=False,
|
||||
timeout=(2, 10)
|
||||
)
|
||||
log.debug("Content: " + str(store_response.content))
|
||||
log.debug("StatusCode: " + str(store_response.status_code))
|
||||
return store_response
|
||||
|
||||
|
||||
|
@ -110,7 +109,8 @@ def redirect_or_proxy_request():
|
|||
if request.method == "GET":
|
||||
return redirect(get_store_url_for_current_request(), 307)
|
||||
else:
|
||||
# The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves.
|
||||
# The Kobo device turns other request types into GET requests on redirects,
|
||||
# so we instead proxy to the Kobo store ourselves.
|
||||
store_response = make_request_to_kobo_store()
|
||||
|
||||
response_headers = store_response.headers
|
||||
|
@ -129,7 +129,7 @@ def convert_to_kobo_timestamp_string(timestamp):
|
|||
return timestamp.strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
except AttributeError as exc:
|
||||
log.debug("Timestamp not valid: {}".format(exc))
|
||||
return datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
return datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
|
||||
|
||||
@kobo.route("/v1/library/sync")
|
||||
|
@ -142,12 +142,16 @@ 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.
|
||||
# if no books synced don't respect sync_token
|
||||
if not ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.user_id == current_user.id).count():
|
||||
sync_token.books_last_modified = datetime.datetime.min
|
||||
sync_token.books_last_created = datetime.datetime.min
|
||||
sync_token.reading_state_last_modified = datetime.datetime.min
|
||||
|
||||
new_books_last_modified = sync_token.books_last_modified
|
||||
new_books_last_created = sync_token.books_last_created
|
||||
new_books_last_modified = sync_token.books_last_modified # needed for sync selected shelfs only
|
||||
new_books_last_created = sync_token.books_last_created # needed to distinguish between new and changed entitlement
|
||||
new_reading_state_last_modified = sync_token.reading_state_last_modified
|
||||
|
||||
new_archived_last_modified = datetime.datetime.min
|
||||
sync_results = []
|
||||
|
||||
|
@ -169,10 +173,13 @@ def HandleSyncRequest():
|
|||
ub.BookShelf.date_added,
|
||||
ub.ArchivedBook.is_archived)
|
||||
changed_entries = (changed_entries
|
||||
.join(db.Data).outerjoin(ub.ArchivedBook, db.Books.id == ub.ArchivedBook.book_id)
|
||||
.filter(or_(db.Books.last_modified > sync_token.books_last_modified,
|
||||
ub.BookShelf.date_added > sync_token.books_last_modified))
|
||||
.filter(db.Data.format.in_(KOBO_FORMATS)).filter(calibre_db.common_filters())
|
||||
.join(db.Data).outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id,
|
||||
ub.ArchivedBook.user_id == current_user.id))
|
||||
.filter(db.Books.id.notin_(calibre_db.session.query(ub.KoboSyncedBooks.book_id)
|
||||
.filter(ub.KoboSyncedBooks.user_id == current_user.id)))
|
||||
.filter(ub.BookShelf.date_added > sync_token.books_last_modified)
|
||||
.filter(db.Data.format.in_(KOBO_FORMATS))
|
||||
.filter(calibre_db.common_filters(allow_show_archived=True))
|
||||
.order_by(db.Books.id)
|
||||
.order_by(ub.ArchivedBook.last_modified)
|
||||
.join(ub.BookShelf, db.Books.id == ub.BookShelf.book_id)
|
||||
|
@ -189,22 +196,23 @@ def HandleSyncRequest():
|
|||
ub.ArchivedBook.last_modified,
|
||||
ub.ArchivedBook.is_archived)
|
||||
changed_entries = (changed_entries
|
||||
.join(db.Data).outerjoin(ub.ArchivedBook, db.Books.id == ub.ArchivedBook.book_id)
|
||||
.filter(db.Books.last_modified > sync_token.books_last_modified)
|
||||
.filter(calibre_db.common_filters())
|
||||
.filter(db.Data.format.in_(KOBO_FORMATS))
|
||||
.order_by(db.Books.last_modified)
|
||||
.order_by(db.Books.id)
|
||||
.join(db.Data).outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id,
|
||||
ub.ArchivedBook.user_id == current_user.id))
|
||||
.filter(db.Books.id.notin_(calibre_db.session.query(ub.KoboSyncedBooks.book_id)
|
||||
.filter(ub.KoboSyncedBooks.user_id == current_user.id)))
|
||||
.filter(calibre_db.common_filters(allow_show_archived=True))
|
||||
.filter(db.Data.format.in_(KOBO_FORMATS))
|
||||
.order_by(db.Books.last_modified)
|
||||
.order_by(db.Books.id)
|
||||
)
|
||||
|
||||
if sync_token.books_last_id > -1:
|
||||
changed_entries = changed_entries.filter(db.Books.id > sync_token.books_last_id)
|
||||
|
||||
reading_states_in_new_entitlements = []
|
||||
if sqlalchemy_version2:
|
||||
books = calibre_db.session.execute(changed_entries.limit(SYNC_ITEM_LIMIT))
|
||||
else:
|
||||
books = changed_entries.limit(SYNC_ITEM_LIMIT)
|
||||
log.debug("Books to Sync: {}".format(len(books.all())))
|
||||
for book in books:
|
||||
formats = [data.format for data in book.Books.data]
|
||||
if not 'KEPUB' in formats and config.config_kepubifypath and 'EPUB' in formats:
|
||||
|
@ -244,14 +252,17 @@ def HandleSyncRequest():
|
|||
pass
|
||||
|
||||
new_books_last_created = max(ts_created, new_books_last_created)
|
||||
kobo_sync_status.add_synced_books(book.Books.id)
|
||||
|
||||
if sqlalchemy_version2:
|
||||
max_change = calibre_db.session.execute(changed_entries
|
||||
.filter(ub.ArchivedBook.is_archived)
|
||||
.filter(ub.ArchivedBook.user_id == current_user.id)
|
||||
.order_by(func.datetime(ub.ArchivedBook.last_modified).desc()))\
|
||||
.columns(db.Books).first()
|
||||
else:
|
||||
max_change = changed_entries.from_self().filter(ub.ArchivedBook.is_archived) \
|
||||
max_change = changed_entries.from_self().filter(ub.ArchivedBook.is_archived)\
|
||||
.filter(ub.ArchivedBook.user_id==current_user.id) \
|
||||
.order_by(func.datetime(ub.ArchivedBook.last_modified).desc()).first()
|
||||
|
||||
max_change = max_change.last_modified if max_change else new_archived_last_modified
|
||||
|
@ -263,11 +274,10 @@ def HandleSyncRequest():
|
|||
entries = calibre_db.session.execute(changed_entries).all()
|
||||
book_count = len(entries)
|
||||
else:
|
||||
entries = changed_entries.all()
|
||||
book_count = changed_entries.count()
|
||||
# last entry:
|
||||
books_last_id = entries[-1].Books.id or -1 if book_count else -1
|
||||
|
||||
cont_sync = bool(book_count)
|
||||
log.debug("Remaining books to Sync: {}".format(book_count))
|
||||
# generate reading state data
|
||||
changed_reading_states = ub.session.query(ub.KoboReadingState)
|
||||
|
||||
|
@ -278,18 +288,19 @@ def HandleSyncRequest():
|
|||
.filter(current_user.id == ub.Shelf.user_id)\
|
||||
.filter(ub.Shelf.kobo_sync,
|
||||
or_(
|
||||
func.datetime(ub.KoboReadingState.last_modified) > sync_token.reading_state_last_modified,
|
||||
ub.KoboReadingState.last_modified > sync_token.reading_state_last_modified,
|
||||
func.datetime(ub.BookShelf.date_added) > sync_token.books_last_modified
|
||||
)).distinct()
|
||||
else:
|
||||
changed_reading_states = changed_reading_states.filter(
|
||||
func.datetime(ub.KoboReadingState.last_modified) > sync_token.reading_state_last_modified)
|
||||
ub.KoboReadingState.last_modified > sync_token.reading_state_last_modified)
|
||||
|
||||
changed_reading_states = changed_reading_states.filter(
|
||||
and_(ub.KoboReadingState.user_id == current_user.id,
|
||||
ub.KoboReadingState.book_id.notin_(reading_states_in_new_entitlements)))
|
||||
|
||||
for kobo_reading_state in changed_reading_states.all():
|
||||
ub.KoboReadingState.book_id.notin_(reading_states_in_new_entitlements)))\
|
||||
.order_by(ub.KoboReadingState.last_modified)
|
||||
cont_sync |= bool(changed_reading_states.count() > SYNC_ITEM_LIMIT)
|
||||
for kobo_reading_state in changed_reading_states.limit(SYNC_ITEM_LIMIT).all():
|
||||
book = calibre_db.session.query(db.Books).filter(db.Books.id == kobo_reading_state.book_id).one_or_none()
|
||||
if book:
|
||||
sync_results.append({
|
||||
|
@ -301,18 +312,19 @@ def HandleSyncRequest():
|
|||
|
||||
sync_shelves(sync_token, sync_results, only_kobo_shelves)
|
||||
|
||||
sync_token.books_last_created = new_books_last_created
|
||||
# update last created timestamp to distinguish between new and changed entitlements
|
||||
if not cont_sync:
|
||||
sync_token.books_last_created = new_books_last_created
|
||||
sync_token.books_last_modified = new_books_last_modified
|
||||
sync_token.archive_last_modified = new_archived_last_modified
|
||||
sync_token.reading_state_last_modified = new_reading_state_last_modified
|
||||
sync_token.books_last_id = books_last_id
|
||||
|
||||
return generate_sync_response(sync_token, sync_results, book_count)
|
||||
return generate_sync_response(sync_token, sync_results, cont_sync)
|
||||
|
||||
|
||||
def generate_sync_response(sync_token, sync_results, set_cont=False):
|
||||
extra_headers = {}
|
||||
if config.config_kobo_proxy:
|
||||
if config.config_kobo_proxy and not set_cont:
|
||||
# Merge in sync results from the official Kobo store.
|
||||
try:
|
||||
store_response = make_request_to_kobo_store(sync_token)
|
||||
|
@ -330,9 +342,10 @@ def generate_sync_response(sync_token, sync_results, set_cont=False):
|
|||
extra_headers["x-kobo-sync"] = "continue"
|
||||
sync_token.to_headers(extra_headers)
|
||||
|
||||
log.debug("Kobo Sync Content: {}".format(sync_results))
|
||||
response = make_response(jsonify(sync_results), extra_headers)
|
||||
|
||||
# log.debug("Kobo Sync Content: {}".format(sync_results))
|
||||
# jsonify decodes the unicode string different to what kobo expects
|
||||
response = make_response(json.dumps(sync_results), extra_headers)
|
||||
response.headers["Content-Type"] = "application/json; charset=utf-8"
|
||||
return response
|
||||
|
||||
|
||||
|
@ -349,7 +362,9 @@ def HandleMetadataRequest(book_uuid):
|
|||
return redirect_or_proxy_request()
|
||||
|
||||
metadata = get_metadata(book)
|
||||
return jsonify([metadata])
|
||||
response = make_response(json.dumps([metadata], ensure_ascii=False))
|
||||
response.headers["Content-Type"] = "application/json; charset=utf-8"
|
||||
return response
|
||||
|
||||
|
||||
def get_download_url_for_book(book, book_format):
|
||||
|
@ -377,10 +392,10 @@ def get_download_url_for_book(book, book_format):
|
|||
|
||||
|
||||
def create_book_entitlement(book, archived):
|
||||
book_uuid = book.uuid
|
||||
book_uuid = str(book.uuid)
|
||||
return {
|
||||
"Accessibility": "Full",
|
||||
"ActivePeriod": {"From": convert_to_kobo_timestamp_string(datetime.datetime.now())},
|
||||
"ActivePeriod": {"From": convert_to_kobo_timestamp_string(datetime.datetime.utcnow())},
|
||||
"Created": convert_to_kobo_timestamp_string(book.timestamp),
|
||||
"CrossRevisionId": book_uuid,
|
||||
"Id": book_uuid,
|
||||
|
@ -404,18 +419,15 @@ def get_description(book):
|
|||
return book.comments[0].text
|
||||
|
||||
|
||||
# TODO handle multiple authors
|
||||
def get_author(book):
|
||||
if not book.authors:
|
||||
return {"Contributors": None}
|
||||
if len(book.authors) > 1:
|
||||
author_list = []
|
||||
autor_roles = []
|
||||
for author in book.authors:
|
||||
autor_roles.append({"Name":author.name, "Role":"Author"})
|
||||
author_list.append(author.name)
|
||||
return {"ContributorRoles": autor_roles, "Contributors":author_list}
|
||||
return {"ContributorRoles": [{"Name":book.authors[0].name, "Role":"Author"}], "Contributors": book.authors[0].name}
|
||||
author_list = []
|
||||
autor_roles = []
|
||||
for author in book.authors:
|
||||
autor_roles.append({"Name":author.name}) #.encode('unicode-escape').decode('latin-1')
|
||||
author_list.append(author.name)
|
||||
return {"ContributorRoles": autor_roles, "Contributors":author_list}
|
||||
|
||||
|
||||
def get_publisher(book):
|
||||
|
@ -472,9 +484,7 @@ def get_metadata(book):
|
|||
"IsSocialEnabled": True,
|
||||
"Language": "en",
|
||||
"PhoneticPronunciations": {},
|
||||
# TODO: Fix book.pubdate to return a datetime object so that we can easily
|
||||
# convert it to the format Kobo devices expect.
|
||||
"PublicationDate": book.pubdate,
|
||||
"PublicationDate": convert_to_kobo_timestamp_string(book.pubdate),
|
||||
"Publisher": {"Imprint": "", "Name": get_publisher(book),},
|
||||
"RevisionId": book_uuid,
|
||||
"Title": book.title,
|
||||
|
@ -483,21 +493,18 @@ def get_metadata(book):
|
|||
metadata.update(get_author(book))
|
||||
|
||||
if get_series(book):
|
||||
if sys.version_info < (3, 0):
|
||||
name = get_series(book).encode("utf-8")
|
||||
else:
|
||||
name = get_series(book)
|
||||
name = get_series(book)
|
||||
metadata["Series"] = {
|
||||
"Name": get_series(book),
|
||||
"Number": get_seriesindex(book), # ToDo Check int() ?
|
||||
"NumberFloat": float(get_seriesindex(book)),
|
||||
# Get a deterministic id based on the series name.
|
||||
"Id": uuid.uuid3(uuid.NAMESPACE_DNS, name),
|
||||
"Id": str(uuid.uuid3(uuid.NAMESPACE_DNS, name)),
|
||||
}
|
||||
|
||||
return metadata
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/tags", methods=["POST", "DELETE"])
|
||||
@requires_kobo_auth
|
||||
# Creates a Shelf with the given items, and returns the shelf's uuid.
|
||||
|
@ -532,6 +539,7 @@ def HandleTagCreate():
|
|||
return make_response(jsonify(str(shelf.uuid)), 201)
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE", "PUT"])
|
||||
@requires_kobo_auth
|
||||
def HandleTagUpdate(tag_id):
|
||||
|
@ -587,6 +595,7 @@ def add_items_to_shelf(items, shelf):
|
|||
return items_unknown_to_calibre
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/tags/<tag_id>/items", methods=["POST"])
|
||||
@requires_kobo_auth
|
||||
def HandleTagAddItem(tag_id):
|
||||
|
@ -616,6 +625,7 @@ def HandleTagAddItem(tag_id):
|
|||
return make_response('', 201)
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/tags/<tag_id>/items/delete", methods=["POST"])
|
||||
@requires_kobo_auth
|
||||
def HandleTagRemoveItem(tag_id):
|
||||
|
@ -664,11 +674,8 @@ def HandleTagRemoveItem(tag_id):
|
|||
# Note: Public shelves that aren't owned by the user aren't supported.
|
||||
def sync_shelves(sync_token, sync_results, only_kobo_shelves=False):
|
||||
new_tags_last_modified = sync_token.tags_last_modified
|
||||
|
||||
for shelf in ub.session.query(ub.ShelfArchive).filter(
|
||||
func.datetime(ub.ShelfArchive.last_modified) > sync_token.tags_last_modified,
|
||||
ub.ShelfArchive.user_id == current_user.id
|
||||
):
|
||||
# transmit all archived shelfs independent of last sync (why should this matter?)
|
||||
for shelf in ub.session.query(ub.ShelfArchive).filter(ub.ShelfArchive.user_id == current_user.id):
|
||||
new_tags_last_modified = max(shelf.last_modified, new_tags_last_modified)
|
||||
sync_results.append({
|
||||
"DeletedTag": {
|
||||
|
@ -678,6 +685,8 @@ def sync_shelves(sync_token, sync_results, only_kobo_shelves=False):
|
|||
}
|
||||
}
|
||||
})
|
||||
ub.session.delete(shelf)
|
||||
ub.session_commit()
|
||||
|
||||
extra_filters = []
|
||||
if only_kobo_shelves:
|
||||
|
@ -757,7 +766,7 @@ def create_kobo_tag(shelf):
|
|||
)
|
||||
return {"Tag": tag}
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/<book_uuid>/state", methods=["GET", "PUT"])
|
||||
@requires_kobo_auth
|
||||
def HandleStateRequest(book_uuid):
|
||||
|
@ -841,7 +850,7 @@ def get_ub_read_status(kobo_read_status):
|
|||
|
||||
def get_or_create_reading_state(book_id):
|
||||
book_read = ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id,
|
||||
ub.ReadBook.user_id == current_user.id).one_or_none()
|
||||
ub.ReadBook.user_id == int(current_user.id)).one_or_none()
|
||||
if not book_read:
|
||||
book_read = ub.ReadBook(user_id=current_user.id, book_id=book_id)
|
||||
if not book_read.kobo_reading_state:
|
||||
|
@ -932,32 +941,25 @@ def TopLevelEndpoint():
|
|||
return make_response(jsonify({}))
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/<book_uuid>", methods=["DELETE"])
|
||||
@requires_kobo_auth
|
||||
def HandleBookDeletionRequest(book_uuid):
|
||||
log.info("Kobo book deletion request received for book %s" % book_uuid)
|
||||
log.info("Kobo book delete request received for book %s" % book_uuid)
|
||||
book = calibre_db.get_book_by_uuid(book_uuid)
|
||||
if not book:
|
||||
log.info(u"Book %s not found in database", book_uuid)
|
||||
return redirect_or_proxy_request()
|
||||
|
||||
book_id = book.id
|
||||
archived_book = (
|
||||
ub.session.query(ub.ArchivedBook)
|
||||
.filter(ub.ArchivedBook.book_id == book_id)
|
||||
.first()
|
||||
)
|
||||
if not archived_book:
|
||||
archived_book = ub.ArchivedBook(user_id=current_user.id, book_id=book_id)
|
||||
archived_book.is_archived = True
|
||||
archived_book.last_modified = datetime.datetime.utcnow()
|
||||
|
||||
ub.session.merge(archived_book)
|
||||
ub.session_commit()
|
||||
return ("", 204)
|
||||
is_archived = kobo_sync_status.change_archived_books(book_id, True)
|
||||
if is_archived:
|
||||
kobo_sync_status.remove_synced_book(book_id)
|
||||
return "", 204
|
||||
|
||||
|
||||
# TODO: Implement the following routes
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/library/<dummy>", methods=["DELETE", "GET"])
|
||||
def HandleUnimplementedRequest(dummy=None):
|
||||
log.debug("Unimplemented Library Request received: %s", request.base_url)
|
||||
|
@ -965,6 +967,7 @@ def HandleUnimplementedRequest(dummy=None):
|
|||
|
||||
|
||||
# TODO: Implement the following routes
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/user/loyalty/<dummy>", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/user/profile", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/user/wishlist", methods=["GET", "POST"])
|
||||
|
@ -975,15 +978,41 @@ def HandleUserRequest(dummy=None):
|
|||
return redirect_or_proxy_request()
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/user/loyalty/benefits", methods=["GET"])
|
||||
def handle_benefits():
|
||||
if config.config_kobo_proxy:
|
||||
return redirect_or_proxy_request()
|
||||
else:
|
||||
return make_response(jsonify({"Benefits": {}}))
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/analytics/gettests", methods=["GET", "POST"])
|
||||
def handle_getests():
|
||||
if config.config_kobo_proxy:
|
||||
return redirect_or_proxy_request()
|
||||
else:
|
||||
testkey = request.headers.get("X-Kobo-userkey","")
|
||||
return make_response(jsonify({"Result": "Success", "TestKey":testkey, "Tests": {}}))
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/products/<dummy>/prices", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/<dummy>/recommendations", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/<dummy>/nextread", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/<dummy>/reviews", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/featured/<dummy>", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/featured/", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/books/external/<dummy>", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/books/series/<dummy>", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/books/<dummy>", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/books/<dummy>/", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/dailydeal", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products/deals", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/products", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/affiliate", methods=["GET", "POST"])
|
||||
@kobo.route("/v1/deals", methods=["GET", "POST"])
|
||||
def HandleProductsRequest(dummy=None):
|
||||
log.debug("Unimplemented Products Request received: %s", request.base_url)
|
||||
return redirect_or_proxy_request()
|
||||
|
@ -1008,6 +1037,7 @@ def make_calibre_web_auth_response():
|
|||
)
|
||||
|
||||
|
||||
@csrf.exempt
|
||||
@kobo.route("/v1/auth/device", methods=["POST"])
|
||||
@requires_kobo_auth
|
||||
def HandleAuthRequest():
|
||||
|
|
|
@ -62,6 +62,7 @@ particular calls to non-Kobo specific endpoints such as the CalibreWeb book down
|
|||
from binascii import hexlify
|
||||
from datetime import datetime
|
||||
from os import urandom
|
||||
from functools import wraps
|
||||
|
||||
from flask import g, Blueprint, url_for, abort, request
|
||||
from flask_login import login_user, current_user, login_required
|
||||
|
@ -70,11 +71,6 @@ from flask_babel import gettext as _
|
|||
from . import logger, config, calibre_db, db, helper, ub, lm
|
||||
from .render_template import render_title_template
|
||||
|
||||
try:
|
||||
from functools import wraps
|
||||
except ImportError:
|
||||
pass # We're not using Python 3
|
||||
|
||||
|
||||
log = logger.create()
|
||||
|
||||
|
@ -122,55 +118,49 @@ kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth")
|
|||
@kobo_auth.route("/generate_auth_token/<int:user_id>")
|
||||
@login_required
|
||||
def generate_auth_token(user_id):
|
||||
warning = False
|
||||
host_list = request.host.rsplit(':')
|
||||
if len(host_list) == 1:
|
||||
host = ':'.join(host_list)
|
||||
else:
|
||||
host = ':'.join(host_list[0:-1])
|
||||
if host.startswith('127.') or host.lower() == 'localhost' or host.startswith('[::ffff:7f'):
|
||||
warning = _('PLease access calibre-web from non localhost to get valid api_endpoint for kobo device')
|
||||
return render_title_template(
|
||||
"generate_kobo_auth_url.html",
|
||||
title=_(u"Kobo Setup"),
|
||||
warning = warning
|
||||
)
|
||||
else:
|
||||
# Invalidate any prevously generated Kobo Auth token for this user.
|
||||
auth_token = ub.session.query(ub.RemoteAuthToken).filter(
|
||||
ub.RemoteAuthToken.user_id == user_id
|
||||
).filter(ub.RemoteAuthToken.token_type==1).first()
|
||||
if host.startswith('127.') or host.lower() == 'localhost' or host.startswith('[::ffff:7f') or host == "[::1]":
|
||||
warning = _('Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device')
|
||||
|
||||
if not auth_token:
|
||||
auth_token = ub.RemoteAuthToken()
|
||||
auth_token.user_id = user_id
|
||||
auth_token.expiration = datetime.max
|
||||
auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8")
|
||||
auth_token.token_type = 1
|
||||
# Generate auth token if none is existing for this user
|
||||
auth_token = ub.session.query(ub.RemoteAuthToken).filter(
|
||||
ub.RemoteAuthToken.user_id == user_id
|
||||
).filter(ub.RemoteAuthToken.token_type==1).first()
|
||||
|
||||
ub.session.add(auth_token)
|
||||
ub.session_commit()
|
||||
if not auth_token:
|
||||
auth_token = ub.RemoteAuthToken()
|
||||
auth_token.user_id = user_id
|
||||
auth_token.expiration = datetime.max
|
||||
auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8")
|
||||
auth_token.token_type = 1
|
||||
|
||||
books = calibre_db.session.query(db.Books).join(db.Data).all()
|
||||
ub.session.add(auth_token)
|
||||
ub.session_commit()
|
||||
|
||||
for book in books:
|
||||
formats = [data.format for data in book.data]
|
||||
if not 'KEPUB' in formats and config.config_kepubifypath and 'EPUB' in formats:
|
||||
helper.convert_book_format(book.id, config.config_calibre_dir, 'EPUB', 'KEPUB', current_user.name)
|
||||
books = calibre_db.session.query(db.Books).join(db.Data).all()
|
||||
|
||||
return render_title_template(
|
||||
"generate_kobo_auth_url.html",
|
||||
title=_(u"Kobo Setup"),
|
||||
kobo_auth_url=url_for(
|
||||
"kobo.TopLevelEndpoint", auth_token=auth_token.auth_token, _external=True
|
||||
),
|
||||
warning = False
|
||||
)
|
||||
for book in books:
|
||||
formats = [data.format for data in book.data]
|
||||
if not 'KEPUB' in formats and config.config_kepubifypath and 'EPUB' in formats:
|
||||
helper.convert_book_format(book.id, config.config_calibre_dir, 'EPUB', 'KEPUB', current_user.name)
|
||||
|
||||
return render_title_template(
|
||||
"generate_kobo_auth_url.html",
|
||||
title=_(u"Kobo Setup"),
|
||||
auth_token=auth_token.auth_token,
|
||||
warning = warning
|
||||
)
|
||||
|
||||
|
||||
@kobo_auth.route("/deleteauthtoken/<int:user_id>")
|
||||
@kobo_auth.route("/deleteauthtoken/<int:user_id>", methods=["POST"])
|
||||
@login_required
|
||||
def delete_auth_token(user_id):
|
||||
# Invalidate any prevously generated Kobo Auth token for this user.
|
||||
# Invalidate any previously generated Kobo Auth token for this user
|
||||
ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == user_id)\
|
||||
.filter(ub.RemoteAuthToken.token_type==1).delete()
|
||||
|
||||
|
|
88
cps/kobo_sync_status.py
Normal file
88
cps/kobo_sync_status.py
Normal file
|
@ -0,0 +1,88 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
||||
# Copyright (C) 2021 OzzieIsaacs
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from flask_login import current_user
|
||||
from . import ub
|
||||
import datetime
|
||||
from sqlalchemy.sql.expression import or_, and_, true
|
||||
from sqlalchemy import exc
|
||||
|
||||
# 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):
|
||||
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, all=False, session=None):
|
||||
if not all:
|
||||
user = ub.KoboSyncedBooks.user_id == current_user.id
|
||||
else:
|
||||
user = true()
|
||||
if not session:
|
||||
ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).filter(user).delete()
|
||||
ub.session_commit()
|
||||
else:
|
||||
session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.book_id == book_id).filter(user).delete()
|
||||
ub.session_commit(sess=session)
|
||||
|
||||
|
||||
|
||||
def change_archived_books(book_id, state=None, message=None):
|
||||
archived_book = ub.session.query(ub.ArchivedBook).filter(and_(ub.ArchivedBook.user_id == int(current_user.id),
|
||||
ub.ArchivedBook.book_id == book_id)).first()
|
||||
if not archived_book:
|
||||
archived_book = ub.ArchivedBook(user_id=current_user.id, book_id=book_id)
|
||||
|
||||
archived_book.is_archived = state if state else not archived_book.is_archived
|
||||
archived_book.last_modified = datetime.datetime.utcnow() # toDo. Check utc timestamp
|
||||
|
||||
ub.session.merge(archived_book)
|
||||
ub.session_commit(message)
|
||||
return archived_book.is_archived
|
||||
|
||||
|
||||
# select all books which are synced by the current user and do not belong to a synced shelf and set them to archive
|
||||
# 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:
|
||||
change_archived_books(b.book_id, True)
|
||||
ub.session.query(ub.KoboSyncedBooks) \
|
||||
.filter(ub.KoboSyncedBooks.book_id == b.book_id) \
|
||||
.filter(ub.KoboSyncedBooks.user_id == user_id).delete()
|
||||
ub.session_commit()
|
||||
|
||||
# Search all shelf which are currently not synced
|
||||
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()
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import sys
|
||||
import inspect
|
||||
|
@ -43,20 +42,15 @@ logging.addLevelName(logging.CRITICAL, "CRIT")
|
|||
|
||||
class _Logger(logging.Logger):
|
||||
|
||||
def debug_or_exception(self, message, *args, **kwargs):
|
||||
def debug_or_exception(self, message, stacklevel=2, *args, **kwargs):
|
||||
if sys.version_info > (3, 7):
|
||||
if is_debug_enabled():
|
||||
self.exception(message, stacklevel=2, *args, **kwargs)
|
||||
self.exception(message, stacklevel=stacklevel, *args, **kwargs)
|
||||
else:
|
||||
self.error(message, stacklevel=2, *args, **kwargs)
|
||||
elif sys.version_info > (3, 0):
|
||||
if is_debug_enabled():
|
||||
self.exception(message, stack_info=True, *args, **kwargs)
|
||||
else:
|
||||
self.error(message, *args, **kwargs)
|
||||
self.error(message, stacklevel=stacklevel, *args, **kwargs)
|
||||
else:
|
||||
if is_debug_enabled():
|
||||
self.exception(message, *args, **kwargs)
|
||||
self.exception(message, stack_info=True, *args, **kwargs)
|
||||
else:
|
||||
self.error(message, *args, **kwargs)
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ class ComicVine(Metadata):
|
|||
__name__ = "ComicVine"
|
||||
__id__ = "comicvine"
|
||||
|
||||
def search(self, query, __):
|
||||
def search(self, query, generic_cover=""):
|
||||
val = list()
|
||||
apikey = "57558043c53943d5d1e96a9ad425b0eb85532ee6"
|
||||
if self.active:
|
||||
|
@ -36,7 +36,7 @@ class ComicVine(Metadata):
|
|||
|
||||
result = requests.get("https://comicvine.gamespot.com/api/search?api_key="
|
||||
+ apikey + "&resources=issue&query=" + query + "&sort=name:desc&format=json", headers=headers)
|
||||
for r in result.json()['results']:
|
||||
for r in result.json().get('results'):
|
||||
seriesTitle = r['volume'].get('name', "")
|
||||
if r.get('store_date'):
|
||||
dateFomers = r.get('store_date')
|
||||
|
|
|
@ -26,14 +26,14 @@ class Google(Metadata):
|
|||
__name__ = "Google"
|
||||
__id__ = "google"
|
||||
|
||||
def search(self, query, __):
|
||||
def search(self, query, generic_cover=""):
|
||||
if self.active:
|
||||
val = list()
|
||||
result = requests.get("https://www.googleapis.com/books/v1/volumes?q="+query.replace(" ","+"))
|
||||
for r in result.json()['items']:
|
||||
for r in result.json().get('items'):
|
||||
v = dict()
|
||||
v['id'] = r['id']
|
||||
v['title'] = r['volumeInfo']['title']
|
||||
v['title'] = r['volumeInfo'].get('title',"")
|
||||
v['authors'] = r['volumeInfo'].get('authors', [])
|
||||
v['description'] = r['volumeInfo'].get('description', "")
|
||||
v['publisher'] = r['volumeInfo'].get('publisher', "")
|
||||
|
|
|
@ -20,7 +20,6 @@ from scholarly import scholarly
|
|||
|
||||
from cps.services.Metadata import Metadata
|
||||
|
||||
|
||||
class scholar(Metadata):
|
||||
__name__ = "Google Scholar"
|
||||
__id__ = "googlescholar"
|
||||
|
@ -32,7 +31,7 @@ class scholar(Metadata):
|
|||
i = 0
|
||||
for publication in scholar_gen:
|
||||
v = dict()
|
||||
v['id'] = "1234" # publication['bib'].get('title')
|
||||
v['id'] = publication['url_scholarbib'].split(':')[1]
|
||||
v['title'] = publication['bib'].get('title')
|
||||
v['authors'] = publication['bib'].get('author', [])
|
||||
v['description'] = publication['bib'].get('abstract', "")
|
||||
|
@ -41,10 +40,10 @@ class scholar(Metadata):
|
|||
v['publishedDate'] = publication['bib'].get('pub_year')+"-01-01"
|
||||
else:
|
||||
v['publishedDate'] = ""
|
||||
v['tags'] = ""
|
||||
v['ratings'] = 0
|
||||
v['tags'] = []
|
||||
v['rating'] = 0
|
||||
v['series'] = ""
|
||||
v['cover'] = generic_cover
|
||||
v['cover'] = ""
|
||||
v['url'] = publication.get('pub_url') or publication.get('eprint_url') or "",
|
||||
v['source'] = {
|
||||
"id": self.__id__,
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
from flask import session
|
||||
|
||||
try:
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import json
|
||||
from functools import wraps
|
||||
|
||||
|
|
45
cps/opds.py
45
cps/opds.py
|
@ -20,24 +20,21 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
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__)
|
||||
|
||||
|
@ -85,10 +82,12 @@ def feed_osd():
|
|||
|
||||
|
||||
@opds.route("/opds/search", defaults={'query': ""})
|
||||
@opds.route("/opds/search/<query>")
|
||||
@opds.route("/opds/search/<path:query>")
|
||||
@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"])
|
||||
|
@ -433,16 +432,17 @@ def feed_languagesindex():
|
|||
if current_user.filter_language() == u"all":
|
||||
languages = calibre_db.speaking_language()
|
||||
else:
|
||||
try:
|
||||
cur_l = LC.parse(current_user.filter_language())
|
||||
except UnknownLocaleError:
|
||||
cur_l = None
|
||||
#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()
|
||||
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)
|
||||
languages[0].name = isoLanguages.get_language_name(get_locale(), languages[0].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)
|
||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||
len(languages))
|
||||
return render_xml_template('feed.xml', listelements=languages, folder='opds.feed_languages', pagination=pagination)
|
||||
|
@ -527,20 +527,19 @@ def get_metadata_calibre_companion(uuid, library):
|
|||
|
||||
def feed_search(term):
|
||||
if term:
|
||||
entries, __, ___ = calibre_db.get_search_results(term)
|
||||
entriescount = len(entries) if len(entries) > 0 else 1
|
||||
pagination = Pagination(1, entriescount, entriescount)
|
||||
entries, __, ___ = calibre_db.get_search_results(term, config_read_column=config.config_read_column)
|
||||
entries_count = len(entries) if len(entries) > 0 else 1
|
||||
pagination = Pagination(1, entries_count, entries_count)
|
||||
return render_xml_template('feed.xml', searchterm=term, entries=entries, pagination=pagination)
|
||||
else:
|
||||
return render_xml_template('feed.xml', searchterm="")
|
||||
|
||||
|
||||
def check_auth(username, password):
|
||||
if sys.version_info.major == 3:
|
||||
try:
|
||||
username = username.encode('windows-1252')
|
||||
except UnicodeEncodeError:
|
||||
username = username.encode('utf-8')
|
||||
try:
|
||||
username = username.encode('windows-1252')
|
||||
except UnicodeEncodeError:
|
||||
username = username.encode('utf-8')
|
||||
user = ub.session.query(ub.User).filter(func.lower(ub.User.name) ==
|
||||
username.decode('utf-8').lower()).first()
|
||||
if bool(user and check_password_hash(str(user.password), password)):
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
from math import ceil
|
||||
|
||||
|
||||
|
|
|
@ -27,11 +27,8 @@
|
|||
|
||||
# http://flask.pocoo.org/snippets/62/
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
try:
|
||||
from urllib.parse import urlparse, urljoin
|
||||
except ImportError:
|
||||
from urlparse import urlparse, urljoin
|
||||
from urllib.parse import urlparse, urljoin
|
||||
|
||||
|
||||
from flask import request, url_for, redirect
|
||||
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
#
|
||||
# Inspired by http://flask.pocoo.org/snippets/35/
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
|
||||
|
||||
class ReverseProxied(object):
|
||||
"""Wrap the application in this middleware and configure the
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import os
|
||||
import json
|
||||
import importlib
|
||||
|
@ -104,9 +103,9 @@ def metadata_search():
|
|||
data = list()
|
||||
active = current_user.view_settings.get('metadata', {})
|
||||
if query:
|
||||
static_cover = url_for('static', filename='generic_cover.jpg')
|
||||
generic_cover = ""
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
|
||||
meta = {executor.submit(c.search, query, static_cover): c for c in cl if active.get(c.__id__, True)}
|
||||
meta = {executor.submit(c.search, query, generic_cover): c for c in cl if active.get(c.__id__, True)}
|
||||
for future in concurrent.futures.as_completed(meta):
|
||||
data.extend(future.result())
|
||||
return Response(json.dumps(data), mimetype='application/json')
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import sys
|
||||
import os
|
||||
import errno
|
||||
|
|
|
@ -21,11 +21,8 @@ import sys
|
|||
from base64 import b64decode, b64encode
|
||||
from jsonschema import validate, exceptions, __version__
|
||||
from datetime import datetime
|
||||
try:
|
||||
# pylint: disable=unused-import
|
||||
from urllib import unquote
|
||||
except ImportError:
|
||||
from urllib.parse import unquote
|
||||
|
||||
from urllib.parse import unquote
|
||||
|
||||
from flask import json
|
||||
from .. import logger
|
||||
|
@ -35,10 +32,7 @@ log = logger.create()
|
|||
|
||||
|
||||
def b64encode_json(json_data):
|
||||
if sys.version_info < (3, 0):
|
||||
return b64encode(json.dumps(json_data))
|
||||
else:
|
||||
return b64encode(json.dumps(json_data).encode())
|
||||
return b64encode(json.dumps(json_data).encode())
|
||||
|
||||
|
||||
# Python3 has a timestamp() method we could be calling, however it's not avaiable in python2.
|
||||
|
@ -85,8 +79,8 @@ class SyncToken:
|
|||
"books_last_created": {"type": "string"},
|
||||
"archive_last_modified": {"type": "string"},
|
||||
"reading_state_last_modified": {"type": "string"},
|
||||
"tags_last_modified": {"type": "string"},
|
||||
"books_last_id": {"type": "integer", "optional": True}
|
||||
"tags_last_modified": {"type": "string"}
|
||||
# "books_last_id": {"type": "integer", "optional": True}
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -97,8 +91,8 @@ class SyncToken:
|
|||
books_last_modified=datetime.min,
|
||||
archive_last_modified=datetime.min,
|
||||
reading_state_last_modified=datetime.min,
|
||||
tags_last_modified=datetime.min,
|
||||
books_last_id=-1
|
||||
tags_last_modified=datetime.min
|
||||
# books_last_id=-1
|
||||
): # nosec
|
||||
self.raw_kobo_store_token = raw_kobo_store_token
|
||||
self.books_last_created = books_last_created
|
||||
|
@ -106,7 +100,7 @@ class SyncToken:
|
|||
self.archive_last_modified = archive_last_modified
|
||||
self.reading_state_last_modified = reading_state_last_modified
|
||||
self.tags_last_modified = tags_last_modified
|
||||
self.books_last_id = books_last_id
|
||||
# self.books_last_id = books_last_id
|
||||
|
||||
@staticmethod
|
||||
def from_headers(headers):
|
||||
|
@ -141,12 +135,9 @@ class SyncToken:
|
|||
archive_last_modified = get_datetime_from_json(data_json, "archive_last_modified")
|
||||
reading_state_last_modified = get_datetime_from_json(data_json, "reading_state_last_modified")
|
||||
tags_last_modified = get_datetime_from_json(data_json, "tags_last_modified")
|
||||
books_last_id = data_json["books_last_id"]
|
||||
except TypeError:
|
||||
log.error("SyncToken timestamps don't parse to a datetime.")
|
||||
return SyncToken(raw_kobo_store_token=raw_kobo_store_token)
|
||||
except KeyError:
|
||||
books_last_id = -1
|
||||
|
||||
return SyncToken(
|
||||
raw_kobo_store_token=raw_kobo_store_token,
|
||||
|
@ -155,7 +146,6 @@ class SyncToken:
|
|||
archive_last_modified=archive_last_modified,
|
||||
reading_state_last_modified=reading_state_last_modified,
|
||||
tags_last_modified=tags_last_modified,
|
||||
books_last_id=books_last_id
|
||||
)
|
||||
|
||||
def set_kobo_store_header(self, store_headers):
|
||||
|
@ -179,16 +169,14 @@ class SyncToken:
|
|||
"archive_last_modified": to_epoch_timestamp(self.archive_last_modified),
|
||||
"reading_state_last_modified": to_epoch_timestamp(self.reading_state_last_modified),
|
||||
"tags_last_modified": to_epoch_timestamp(self.tags_last_modified),
|
||||
"books_last_id":self.books_last_id
|
||||
},
|
||||
}
|
||||
return b64encode_json(token)
|
||||
|
||||
def __str__(self):
|
||||
return "{},{},{},{},{},{},{}".format(self.raw_kobo_store_token,
|
||||
self.books_last_created,
|
||||
return "{},{},{},{},{},{}".format(self.books_last_created,
|
||||
self.books_last_modified,
|
||||
self.archive_last_modified,
|
||||
self.reading_state_last_modified,
|
||||
self.tags_last_modified,
|
||||
self.books_last_id)
|
||||
self.raw_kobo_store_token)
|
||||
|
|
|
@ -16,8 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
|
||||
from .. import logger
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,21 @@
|
|||
from __future__ import print_function
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
||||
# Copyright (C) 2021 OzzieIsaacs
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os.path
|
||||
from google_auth_oauthlib.flow import InstalledAppFlow
|
||||
from google.auth.transport.requests import Request
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import time
|
||||
from functools import reduce
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import base64
|
||||
|
||||
from flask_simpleldap import LDAP, LDAPException
|
||||
|
|
|
@ -1,5 +1,21 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
||||
# Copyright (C) 2020 pwr
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
import threading
|
||||
import abc
|
||||
import uuid
|
||||
|
@ -72,7 +88,7 @@ class WorkerThread(threading.Thread):
|
|||
ins = cls.get_instance()
|
||||
ins.num += 1
|
||||
username = user if user is not None else 'System'
|
||||
log.debug("Add Task for user: {}: {}".format(username, task))
|
||||
log.debug("Add Task for user: {} - {}".format(username, task))
|
||||
ins.queue.put(QueuedTask(
|
||||
num=ins.num,
|
||||
user=username,
|
||||
|
|
37
cps/shelf.py
37
cps/shelf.py
|
@ -20,8 +20,6 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
|
@ -58,7 +56,7 @@ def check_shelf_view_permissions(cur_shelf):
|
|||
return True
|
||||
|
||||
|
||||
@shelf.route("/shelf/add/<int:shelf_id>/<int:book_id>")
|
||||
@shelf.route("/shelf/add/<int:shelf_id>/<int:book_id>", methods=["POST"])
|
||||
@login_required
|
||||
def add_to_shelf(shelf_id, book_id):
|
||||
xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest'
|
||||
|
@ -114,7 +112,7 @@ def add_to_shelf(shelf_id, book_id):
|
|||
return "", 204
|
||||
|
||||
|
||||
@shelf.route("/shelf/massadd/<int:shelf_id>")
|
||||
@shelf.route("/shelf/massadd/<int:shelf_id>", methods=["POST"])
|
||||
@login_required
|
||||
def search_to_shelf(shelf_id):
|
||||
shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
||||
|
@ -124,8 +122,8 @@ def search_to_shelf(shelf_id):
|
|||
return redirect(url_for('web.index'))
|
||||
|
||||
if not check_shelf_edit_permissions(shelf):
|
||||
log.warning("You are not allowed to add a book to the the shelf: {}".format(shelf.name))
|
||||
flash(_(u"You are not allowed to add a book to the the shelf: %(name)s", name=shelf.name), category="error")
|
||||
log.warning("You are not allowed to add a book to the shelf".format(shelf.name))
|
||||
flash(_(u"You are not allowed to add a book to the shelf"), category="error")
|
||||
return redirect(url_for('web.index'))
|
||||
|
||||
if current_user.id in ub.searched_ids and ub.searched_ids[current_user.id]:
|
||||
|
@ -166,7 +164,7 @@ def search_to_shelf(shelf_id):
|
|||
return redirect(url_for('web.index'))
|
||||
|
||||
|
||||
@shelf.route("/shelf/remove/<int:shelf_id>/<int:book_id>")
|
||||
@shelf.route("/shelf/remove/<int:shelf_id>/<int:book_id>", methods=["POST"])
|
||||
@login_required
|
||||
def remove_from_shelf(shelf_id, book_id):
|
||||
xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest'
|
||||
|
@ -217,10 +215,10 @@ def remove_from_shelf(shelf_id, book_id):
|
|||
else:
|
||||
if not xhr:
|
||||
log.warning("You are not allowed to remove a book from shelf: {}".format(shelf.name))
|
||||
flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name),
|
||||
flash(_(u"Sorry you are not allowed to remove a book from this shelf"),
|
||||
category="error")
|
||||
return redirect(url_for('web.index'))
|
||||
return "Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name, 403
|
||||
return "Sorry you are not allowed to remove a book from this shelf", 403
|
||||
|
||||
|
||||
@shelf.route("/shelf/create", methods=["GET", "POST"])
|
||||
|
@ -230,6 +228,7 @@ def create_shelf():
|
|||
return create_edit_shelf(shelf, page_title=_(u"Create a Shelf"), page="shelfcreate")
|
||||
|
||||
|
||||
|
||||
@shelf.route("/shelf/edit/<int:shelf_id>", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def edit_shelf(shelf_id):
|
||||
|
@ -246,12 +245,20 @@ 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()
|
||||
shelf.is_public = 1 if to_save.get("is_public") else 0
|
||||
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'))
|
||||
is_public = 1 if to_save.get("is_public") == "on" else 0
|
||||
if config.config_kobo_sync:
|
||||
shelf.kobo_sync = True if to_save.get("kobo_sync") else False
|
||||
if shelf.kobo_sync:
|
||||
ub.session.query(ub.ShelfArchive).filter(ub.ShelfArchive.user_id == current_user.id).filter(
|
||||
ub.ShelfArchive.uuid == shelf.uuid).delete()
|
||||
ub.session_commit()
|
||||
shelf_title = to_save.get("title", "")
|
||||
if check_shelf_is_unique(shelf, shelf_title, shelf_id):
|
||||
if check_shelf_is_unique(shelf, shelf_title, is_public, shelf_id):
|
||||
shelf.name = shelf_title
|
||||
shelf.is_public = is_public
|
||||
if not shelf_id:
|
||||
shelf.user_id = int(current_user.id)
|
||||
ub.session.add(shelf)
|
||||
|
@ -282,12 +289,12 @@ def create_edit_shelf(shelf, page_title, page, shelf_id=False):
|
|||
sync_only_selected_shelves=sync_only_selected_shelves)
|
||||
|
||||
|
||||
def check_shelf_is_unique(shelf, title, shelf_id=False):
|
||||
def check_shelf_is_unique(shelf, title, is_public, shelf_id=False):
|
||||
if shelf_id:
|
||||
ident = ub.Shelf.id != shelf_id
|
||||
else:
|
||||
ident = true()
|
||||
if shelf.is_public == 1:
|
||||
if is_public == 1:
|
||||
is_shelf_name_unique = ub.session.query(ub.Shelf) \
|
||||
.filter((ub.Shelf.name == title) & (ub.Shelf.is_public == 1)) \
|
||||
.filter(ident) \
|
||||
|
@ -321,12 +328,13 @@ def delete_shelf_helper(cur_shelf):
|
|||
ub.session_commit("successfully deleted Shelf {}".format(cur_shelf.name))
|
||||
|
||||
|
||||
@shelf.route("/shelf/delete/<int:shelf_id>")
|
||||
@shelf.route("/shelf/delete/<int:shelf_id>", methods=["POST"])
|
||||
@login_required
|
||||
def delete_shelf(shelf_id):
|
||||
cur_shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first()
|
||||
try:
|
||||
delete_shelf_helper(cur_shelf)
|
||||
flash(_("Shelf successfully deleted"), category="success")
|
||||
except InvalidRequestError:
|
||||
ub.session.rollback()
|
||||
log.error("Settings DB is not Writeable")
|
||||
|
@ -427,6 +435,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) \
|
||||
|
|
|
@ -35,7 +35,7 @@ body {
|
|||
float: left;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-image: url("img/toolbar-buttons.png");
|
||||
background-image: url("../../js/libs/djvu_html5/img/toolbar-buttons.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 500% 300%;
|
||||
}
|
||||
|
@ -185,10 +185,10 @@ _:-ms-lang(x), .textLayer {
|
|||
width: 128px;
|
||||
height: 128px;
|
||||
margin: -72px 0 0 -64px;
|
||||
background-image: url("img/status.png");
|
||||
background-image: url("../../js/libs/djvu_html5/img/status.png");
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.blankImage {
|
||||
background-image: url("img/blank.jpg");
|
||||
background-image: url("../../js/libs/djvu_html5/img/blank.jpg");
|
||||
}
|
103
cps/static/css/libs/bootstrap-wysihtml5-0.0.3.css
vendored
Normal file
103
cps/static/css/libs/bootstrap-wysihtml5-0.0.3.css
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
ul.wysihtml5-toolbar {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar::after {
|
||||
clear: both;
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar > li {
|
||||
float: left;
|
||||
display: list-item;
|
||||
list-style: none;
|
||||
margin: 0 5px 10px 0;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a.btn.wysihtml5-command-active {
|
||||
background-image: none;
|
||||
-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
-moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
background-color: #E6E6E6;
|
||||
background-color: #D9D9D9;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
ul.wysihtml5-commands-disabled .dropdown-menu {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div.wysihtml5-colors {
|
||||
display:block;
|
||||
width: 50px;
|
||||
height: 20px;
|
||||
margin-top: 2px;
|
||||
margin-left: 5px;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a.wysihtml5-colors-title {
|
||||
padding-left: 70px;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] {
|
||||
background: black !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] {
|
||||
background: silver !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] {
|
||||
background: gray !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] {
|
||||
background: maroon !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] {
|
||||
background: red !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] {
|
||||
background: purple !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] {
|
||||
background: green !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] {
|
||||
background: olive !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] {
|
||||
background: navy !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] {
|
||||
background: blue !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] {
|
||||
background: orange !important;
|
||||
}
|
||||
|
10
cps/static/css/libs/typeahead.css
vendored
10
cps/static/css/libs/typeahead.css
vendored
|
@ -145,7 +145,7 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
|||
cursor: not-allowed;
|
||||
background-color: #eeeeee !important;
|
||||
}
|
||||
.tt-dropdown-menu {
|
||||
.tt-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
|
@ -166,7 +166,7 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
|||
*border-right-width: 2px;
|
||||
*border-bottom-width: 2px;
|
||||
}
|
||||
.tt-dropdown-menu .tt-suggestion {
|
||||
.tt-menu .tt-suggestion {
|
||||
display: block;
|
||||
padding: 3px 20px;
|
||||
clear: both;
|
||||
|
@ -175,15 +175,15 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
|||
color: #333333;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.tt-dropdown-menu .tt-suggestion.tt-cursor {
|
||||
.tt-menu .tt-suggestion.tt-cursor {
|
||||
text-decoration: none;
|
||||
outline: 0;
|
||||
background-color: #f5f5f5;
|
||||
color: #262626;
|
||||
}
|
||||
.tt-dropdown-menu .tt-suggestion.tt-cursor a {
|
||||
.tt-menu .tt-suggestion.tt-cursor a {
|
||||
color: #262626;
|
||||
}
|
||||
.tt-dropdown-menu .tt-suggestion p {
|
||||
.tt-menu .tt-suggestion p {
|
||||
margin: 0;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
@ -174,12 +169,17 @@ table .bg-dark-danger a { color: #fff; }
|
|||
position: static;
|
||||
}
|
||||
|
||||
.container-fluid .book .cover span img {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
.container-fluid .book .cover span .img {
|
||||
bottom: 0;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.container-fluid .book .cover span img {
|
||||
border: 1px solid #fff;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
|
||||
box-sizing: border-box;
|
||||
-webkit-box-shadow: 0 5px 8px -6px #777;
|
||||
-moz-box-shadow: 0 5px 8px -6px #777;
|
||||
|
@ -251,8 +251,10 @@ span.glyphicon.glyphicon-tags {
|
|||
}
|
||||
|
||||
.cover .read {
|
||||
left: auto;
|
||||
right: 2px;
|
||||
position: relative;
|
||||
top: -20px;
|
||||
/*left: auto;
|
||||
right: 2px;*/
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
display: inline-block;
|
||||
|
@ -427,7 +429,7 @@ div.log {
|
|||
}
|
||||
|
||||
#detailcover { cursor:zoom-in; }
|
||||
#detailcover:-webkit-full-screen { cursor:zoom-out; }
|
||||
#detailcover:-moz-full-screen { cursor:zoom-out; }
|
||||
#detailcover:-ms-fullscreen { cursor:zoom-out; }
|
||||
#detailcover:fullscreen { cursor:zoom-out; }
|
||||
#detailcover:-webkit-full-screen { cursor:zoom-out; border: 0; }
|
||||
#detailcover:-moz-full-screen { cursor:zoom-out; border: 0; }
|
||||
#detailcover:-ms-fullscreen { cursor:zoom-out; border: 0; }
|
||||
#detailcover:fullscreen { cursor:zoom-out; border: 0; }
|
||||
|
|
44
cps/static/css/text.css
Normal file
44
cps/static/css/text.css
Normal file
|
@ -0,0 +1,44 @@
|
|||
body {
|
||||
background: white;
|
||||
}
|
||||
|
||||
#readmain {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#area {
|
||||
width: 80%;
|
||||
height: 80%;
|
||||
margin: 5% auto;
|
||||
max-width: 1250px;
|
||||
}
|
||||
|
||||
#area iframe {
|
||||
border: none;
|
||||
}
|
||||
|
||||
xmp, pre, plaintext {
|
||||
display: block;
|
||||
font-family: -moz-fixed;
|
||||
white-space: pre;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
#area{
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
font-family: -moz-fixed;
|
||||
column-count:2;
|
||||
-webkit-columns:2;
|
||||
-moz-columns:2;
|
||||
column-gap:20px;
|
||||
-moz-column-gap:20px;
|
||||
-webkit-column-gap:20px;
|
||||
position:relative;
|
||||
}
|
|
@ -150,11 +150,16 @@ if ($("body.book").length > 0) {
|
|||
var splitText = $(this).text().split(':');
|
||||
var label = splitText.shift().trim();
|
||||
var value = splitText.join(':').trim();
|
||||
var class_value = ""
|
||||
// Preserve Links
|
||||
if ($(this).find('a').length) {
|
||||
value = $(this).find('a').first().removeClass();
|
||||
}
|
||||
$(this).html('<span>' + label + '</span><span></span>').find('span').last().append(value);
|
||||
// Preserve glyphicons
|
||||
if ($(this).find('span').length) {
|
||||
class_value = $(this).find('span').first().attr('class');
|
||||
}
|
||||
$(this).html('<span>' + label + '</span><span class="' + class_value + '"></span>').find('span').last().append(value);
|
||||
});
|
||||
|
||||
$(".book-meta h2:first").clone()
|
||||
|
@ -265,7 +270,7 @@ if ($("body.book").length > 0) {
|
|||
|
||||
if (position + $("#add-to-shelves").width() > $(window).width()) {
|
||||
positionOff = position + $("#add-to-shelves").width() - $(window).width();
|
||||
adsPosition = position - positionOff - 5
|
||||
adsPosition = position - positionOff - 5;
|
||||
$("#add-to-shelves").attr("style", "left: " + adsPosition + "px !important; right: auto; top: " + topPos + "px");
|
||||
} else {
|
||||
$("#add-to-shelves").attr("style", "left: " + position + "px !important; right: auto; top: " + topPos + "px");
|
||||
|
@ -424,7 +429,7 @@ if($("body.advsearch").length > 0) {
|
|||
|
||||
if (position + $("#add-to-shelves").width() > $(window).width()) {
|
||||
positionOff = position + $("#add-to-shelves").width() - $(window).width();
|
||||
adsPosition = position - positionOff - 5
|
||||
adsPosition = position - positionOff - 5;
|
||||
$("#add-to-shelves").attr("style", "left: " + adsPosition + "px !important; right: auto; top: " + topPos + "px");
|
||||
} else {
|
||||
$("#add-to-shelves").attr("style", "left: " + position + "px !important; right: auto; top: " + topPos + "px");
|
||||
|
@ -474,12 +479,12 @@ if ($.trim($("#add-to-shelves").html()).length === 0) {
|
|||
$("#add-to-shelf").addClass("empty-ul");
|
||||
}
|
||||
|
||||
shelfLength = $("#add-to-shelves li").length
|
||||
emptyLength = 0
|
||||
shelfLength = $("#add-to-shelves li").length;
|
||||
emptyLength = 0;
|
||||
|
||||
$("#add-to-shelves").on("click", "li a", function () {
|
||||
console.log("#remove-from-shelves change registered");
|
||||
emptyLength++
|
||||
emptyLength++;
|
||||
|
||||
setTimeout(function () {
|
||||
if (emptyLength >= shelfLength) {
|
||||
|
|
|
@ -22,8 +22,10 @@ $(function() {
|
|||
});
|
||||
|
||||
$("#have_read_cb").on("change", function() {
|
||||
$.post({
|
||||
$.ajax({
|
||||
url: this.closest("form").action,
|
||||
method:"post",
|
||||
data: $(this).closest("form").serialize(),
|
||||
error: function(response) {
|
||||
var data = [{type:"danger", message:response.responseText}]
|
||||
$("#flash_success").remove();
|
||||
|
@ -57,17 +59,20 @@ $("#archived_cb").on("change", function() {
|
|||
)
|
||||
};
|
||||
|
||||
$("#shelf-actions").on("click", "[data-shelf-action]", function (e) {
|
||||
$("#add-to-shelves, #remove-from-shelves").on("click", "[data-shelf-action]", function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
$.get(this.href)
|
||||
$.ajax({
|
||||
url: $(this).data('href'),
|
||||
method:"post",
|
||||
data: {csrf_token:$("input[name='csrf_token']").val()},
|
||||
})
|
||||
.done(function() {
|
||||
var $this = $(this);
|
||||
switch ($this.data("shelf-action")) {
|
||||
case "add":
|
||||
$("#remove-from-shelves").append(
|
||||
templates.remove({
|
||||
add: this.href,
|
||||
add: $this.data('href'),
|
||||
remove: $this.data("remove-href"),
|
||||
content: $("<div>").text(this.textContent).html()
|
||||
})
|
||||
|
@ -77,7 +82,7 @@ $("#archived_cb").on("change", function() {
|
|||
$("#add-to-shelves").append(
|
||||
templates.add({
|
||||
add: $this.data("add-href"),
|
||||
remove: this.href,
|
||||
remove: $this.data('href'),
|
||||
content: $("<div>").text(this.textContent).html(),
|
||||
})
|
||||
);
|
||||
|
|
|
@ -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
|
||||
|
@ -47,90 +49,20 @@ $(".datepicker_delete").click(function() {
|
|||
Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
|
||||
and returns the completions it gets from the bloodhound engine prefixed.
|
||||
*/
|
||||
function prefixedSource(prefix, query, cb, bhAdapter) {
|
||||
bhAdapter(query, function(retArray) {
|
||||
function prefixedSource(prefix, query, cb, source) {
|
||||
function async(retArray) {
|
||||
retArray = retArray || [];
|
||||
var matches = [];
|
||||
for (var i = 0; i < retArray.length; i++) {
|
||||
var obj = {name : prefix + retArray[i].name};
|
||||
matches.push(obj);
|
||||
}
|
||||
cb(matches);
|
||||
});
|
||||
}
|
||||
source.search(query, cb, async);
|
||||
}
|
||||
|
||||
var authors = new Bloodhound({
|
||||
name: "authors",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
remote: {
|
||||
url: getPath() + "/get_authors_json?q=%QUERY"
|
||||
}
|
||||
});
|
||||
|
||||
var series = new Bloodhound({
|
||||
name: "series",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
return [query];
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_series_json?q=",
|
||||
replace: function replace(url, query) {
|
||||
return url + encodeURIComponent(query);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var tags = new Bloodhound({
|
||||
name: "tags",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
var tokens = query.split(",");
|
||||
tokens = [tokens[tokens.length - 1].trim()];
|
||||
return tokens;
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_tags_json?q=%QUERY"
|
||||
}
|
||||
});
|
||||
|
||||
var languages = new Bloodhound({
|
||||
name: "languages",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
return [query];
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_languages_json?q=",
|
||||
replace: function replace(url, query) {
|
||||
return url + encodeURIComponent(query);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var publishers = new Bloodhound({
|
||||
name: "publisher",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
remote: {
|
||||
url: getPath() + "/get_publishers_json?q=%QUERY"
|
||||
}
|
||||
});
|
||||
|
||||
function sourceSplit(query, cb, split, source) {
|
||||
var bhAdapter = source.ttAdapter();
|
||||
|
||||
var tokens = query.split(split);
|
||||
var currentSource = tokens[tokens.length - 1].trim();
|
||||
|
||||
|
@ -145,84 +77,148 @@ function sourceSplit(query, cb, split, source) {
|
|||
for (var i = 0; i < tokens.length; i++) {
|
||||
prefix += tokens[i].trim() + newSplit;
|
||||
}
|
||||
prefixedSource(prefix, currentSource, cb, bhAdapter);
|
||||
prefixedSource(prefix, currentSource, cb, source);
|
||||
}
|
||||
|
||||
var promiseAuthors = authors.initialize();
|
||||
promiseAuthors.done(function() {
|
||||
$("#bookAuthor").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 1,
|
||||
hint: true
|
||||
}, {
|
||||
name: "authors",
|
||||
displayKey: "name",
|
||||
source: function source(query, cb) {
|
||||
return sourceSplit(query, cb, "&", authors); //sourceSplit //("&")
|
||||
}
|
||||
}
|
||||
);
|
||||
var authors = new Bloodhound({
|
||||
name: "authors",
|
||||
identify: function(obj) { return obj.name; },
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
remote: {
|
||||
url: getPath() + "/get_authors_json?q=%QUERY",
|
||||
wildcard: '%QUERY',
|
||||
},
|
||||
});
|
||||
|
||||
var promiseSeries = series.initialize();
|
||||
promiseSeries.done(function() {
|
||||
$("#series").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "series",
|
||||
displayKey: "name",
|
||||
source: series.ttAdapter()
|
||||
$(".form-group #bookAuthor").typeahead(
|
||||
{
|
||||
highlight: true,
|
||||
minLength: 1,
|
||||
hint: true
|
||||
}, {
|
||||
name: "authors",
|
||||
display: 'name',
|
||||
source: function source(query, cb, asyncResults) {
|
||||
return sourceSplit(query, cb, "&", authors);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
var series = new Bloodhound({
|
||||
name: "series",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
// queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
return [query];
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_series_json?q=%QUERY",
|
||||
wildcard: '%QUERY',
|
||||
/*replace: function replace(url, query) {
|
||||
return url + encodeURIComponent(query);
|
||||
}*/
|
||||
}
|
||||
});
|
||||
$(".form-group #series").typeahead(
|
||||
{
|
||||
highlight: true,
|
||||
minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "series",
|
||||
displayKey: "name",
|
||||
source: series
|
||||
}
|
||||
);
|
||||
|
||||
var tags = new Bloodhound({
|
||||
name: "tags",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
var tokens = query.split(",");
|
||||
tokens = [tokens[tokens.length - 1].trim()];
|
||||
return tokens;
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_tags_json?q=%QUERY",
|
||||
wildcard: '%QUERY'
|
||||
}
|
||||
});
|
||||
|
||||
var promiseTags = tags.initialize();
|
||||
promiseTags.done(function() {
|
||||
$("#tags").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "tags",
|
||||
displayKey: "name",
|
||||
source: function source(query, cb) {
|
||||
return sourceSplit(query, cb, ",", tags);
|
||||
}
|
||||
$(".form-group #tags").typeahead(
|
||||
{
|
||||
highlight: true,
|
||||
minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "tags",
|
||||
display: "name",
|
||||
source: function source(query, cb, asyncResults) {
|
||||
return sourceSplit(query, cb, ",", tags);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
var languages = new Bloodhound({
|
||||
name: "languages",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: function queryTokenizer(query) {
|
||||
return [query];
|
||||
},
|
||||
remote: {
|
||||
url: getPath() + "/get_languages_json?q=%QUERY",
|
||||
wildcard: '%QUERY'
|
||||
/*replace: function replace(url, query) {
|
||||
return url + encodeURIComponent(query);
|
||||
}*/
|
||||
}
|
||||
});
|
||||
|
||||
var promiseLanguages = languages.initialize();
|
||||
promiseLanguages.done(function() {
|
||||
$("#languages").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "languages",
|
||||
displayKey: "name",
|
||||
source: function source(query, cb) {
|
||||
return sourceSplit(query, cb, ",", languages); //(",")
|
||||
}
|
||||
$(".form-group #languages").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "languages",
|
||||
display: "name",
|
||||
source: function source(query, cb, asyncResults) {
|
||||
return sourceSplit(query, cb, ",", languages);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
var publishers = new Bloodhound({
|
||||
name: "publisher",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
return [datum.name];
|
||||
},
|
||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
remote: {
|
||||
url: getPath() + "/get_publishers_json?q=%QUERY",
|
||||
wildcard: '%QUERY'
|
||||
}
|
||||
});
|
||||
|
||||
var promisePublishers = publishers.initialize();
|
||||
promisePublishers.done(function() {
|
||||
$("#publisher").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "publishers",
|
||||
displayKey: "name",
|
||||
source: publishers.ttAdapter()
|
||||
}
|
||||
);
|
||||
});
|
||||
$(".form-group #publisher").typeahead(
|
||||
{
|
||||
highlight: true, minLength: 0,
|
||||
hint: true
|
||||
}, {
|
||||
name: "publishers",
|
||||
displayKey: "name",
|
||||
source: publishers
|
||||
}
|
||||
);
|
||||
|
||||
$("#search").on("change input.typeahead:selected", function(event) {
|
||||
if (event.target.type === "search" && event.target.tagName === "INPUT") {
|
||||
|
@ -252,7 +248,7 @@ $("#btn-upload-format").on("change", function () {
|
|||
if (filename.substring(3, 11) === "fakepath") {
|
||||
filename = filename.substring(12);
|
||||
} // Remove c:\fake at beginning from localhost chrome
|
||||
$("#upload-format").html(filename);
|
||||
$("#upload-format").text(filename);
|
||||
});
|
||||
|
||||
$("#btn-upload-cover").on("change", function () {
|
||||
|
@ -260,7 +256,7 @@ $("#btn-upload-cover").on("change", function () {
|
|||
if (filename.substring(3, 11) === "fakepath") {
|
||||
filename = filename.substring(12);
|
||||
} // Remove c:\fake at beginning from localhost chrome
|
||||
$("#upload-cover").html(filename);
|
||||
$("#upload-cover").text(filename);
|
||||
});
|
||||
|
||||
$("#xchange").click(function () {
|
||||
|
|
|
@ -21,47 +21,59 @@ var $list = $("#list").isotope({
|
|||
itemSelector: ".book",
|
||||
layoutMode: "fitRows",
|
||||
getSortData: {
|
||||
title: ".title",
|
||||
}
|
||||
title: ".title"
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
$("#desc").click(function() {
|
||||
if (direction === 0) {
|
||||
return;
|
||||
}
|
||||
$("#asc").removeClass("active");
|
||||
$("#desc").addClass("active");
|
||||
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
url: window.location.pathname + "/../../ajax/view",
|
||||
url: getPath() + "/ajax/view",
|
||||
data: "{\"" + page + "\": {\"dir\": \"desc\"}}",
|
||||
});
|
||||
// invert sorting order to make already inverted start order working
|
||||
$list.isotope({
|
||||
sortBy: "name",
|
||||
sortAscending: true
|
||||
sortAscending: !$list.data('isotope').options.sortAscending
|
||||
});
|
||||
direction = 0;
|
||||
});
|
||||
|
||||
$("#asc").click(function() {
|
||||
if (direction === 1) {
|
||||
return;
|
||||
}
|
||||
$("#desc").removeClass("active");
|
||||
$("#asc").addClass("active");
|
||||
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
url: window.location.pathname + "/../../ajax/view",
|
||||
url: getPath() + "/ajax/view",
|
||||
data: "{\"" + page + "\": {\"dir\": \"asc\"}}",
|
||||
});
|
||||
$list.isotope({
|
||||
sortBy: "name",
|
||||
sortAscending: false
|
||||
sortAscending: !$list.data('isotope').options.sortAscending
|
||||
});
|
||||
direction = 1;
|
||||
});
|
||||
|
||||
$("#all").click(function() {
|
||||
$(".char").removeClass("active");
|
||||
$("#all").addClass("active");
|
||||
// go through all elements and make them visible
|
||||
$list.isotope({ filter: function() {
|
||||
return true;
|
||||
|
@ -70,6 +82,9 @@ $("#all").click(function() {
|
|||
});
|
||||
|
||||
$(".char").click(function() {
|
||||
$(".char").removeClass("active");
|
||||
$(this).addClass("active");
|
||||
$("#all").removeClass("active");
|
||||
var character = this.innerText;
|
||||
$list.isotope({ filter: function() {
|
||||
return this.attributes["data-id"].value.charAt(0).toUpperCase() === character;
|
||||
|
|
|
@ -19,6 +19,7 @@ var direction = $("#asc").data('order'); // 0=Descending order; 1= ascending or
|
|||
var sort = 0; // Show sorted entries
|
||||
|
||||
$("#sort_name").click(function() {
|
||||
$("#sort_name").toggleClass("active");
|
||||
var className = $("h1").attr("Class") + "_sort_name";
|
||||
var obj = {};
|
||||
obj[className] = sort;
|
||||
|
@ -68,12 +69,15 @@ $("#desc").click(function() {
|
|||
if (direction === 0) {
|
||||
return;
|
||||
}
|
||||
$("#asc").removeClass("active");
|
||||
$("#desc").addClass("active");
|
||||
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
url: window.location.pathname + "/../../ajax/view",
|
||||
url: getPath() + "/ajax/view",
|
||||
data: "{\"" + page + "\": {\"dir\": \"desc\"}}",
|
||||
});
|
||||
var index = 0;
|
||||
|
@ -112,16 +116,18 @@ $("#desc").click(function() {
|
|||
|
||||
|
||||
$("#asc").click(function() {
|
||||
|
||||
if (direction === 1) {
|
||||
return;
|
||||
}
|
||||
$("#desc").removeClass("active");
|
||||
$("#asc").addClass("active");
|
||||
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
url: window.location.pathname + "/../../ajax/view",
|
||||
url: getPath() + "/ajax/view",
|
||||
data: "{\"" + page + "\": {\"dir\": \"asc\"}}",
|
||||
});
|
||||
var index = 0;
|
||||
|
@ -159,6 +165,8 @@ $("#asc").click(function() {
|
|||
});
|
||||
|
||||
$("#all").click(function() {
|
||||
$("#all").addClass("active");
|
||||
$(".char").removeClass("active");
|
||||
var cnt = $("#second").contents();
|
||||
$("#list").append(cnt);
|
||||
// Find count of middle element
|
||||
|
@ -176,6 +184,9 @@ $("#all").click(function() {
|
|||
});
|
||||
|
||||
$(".char").click(function() {
|
||||
$(".char").removeClass("active");
|
||||
$(this).addClass("active");
|
||||
$("#all").removeClass("active");
|
||||
var character = this.innerText;
|
||||
var count = 0;
|
||||
var index = 0;
|
||||
|
|
|
@ -28,16 +28,19 @@ $(function () {
|
|||
|
||||
function populateForm (book) {
|
||||
tinymce.get("description").setContent(book.description);
|
||||
var uniqueTags = [];
|
||||
var uniqueTags = $.map($("#tags").val().split(","), $.trim);
|
||||
if ( uniqueTags.length == 1 && uniqueTags[0] == "") {
|
||||
uniqueTags = [];
|
||||
}
|
||||
$.each(book.tags, function(i, el) {
|
||||
if ($.inArray(el, uniqueTags) === -1) uniqueTags.push(el);
|
||||
});
|
||||
var ampSeparatedAuthors = (book.authors || []).join(" & ");
|
||||
$("#bookAuthor").val(ampSeparatedAuthors);
|
||||
$("#book_title").val(book.title);
|
||||
$("#tags").val(uniqueTags.join(","));
|
||||
$("#tags").val(uniqueTags.join(", "));
|
||||
$("#rating").data("rating").setValue(Math.round(book.rating));
|
||||
if(book.cover !== null){
|
||||
if(book.cover && $("#cover_url").length){
|
||||
$(".cover img").attr("src", book.cover);
|
||||
$("#cover_url").val(book.cover);
|
||||
}
|
||||
|
@ -125,9 +128,7 @@ $(function () {
|
|||
e.preventDefault();
|
||||
keyword = $("#keyword").val();
|
||||
$('.pill').each(function(){
|
||||
// console.log($(this).data('control'));
|
||||
$(this).data("initial", $(this).prop('checked'));
|
||||
// console.log($(this).data('initial'));
|
||||
});
|
||||
doSearch(keyword);
|
||||
});
|
||||
|
|
|
@ -180,13 +180,15 @@ function initProgressClick() {
|
|||
|
||||
function loadFromArrayBuffer(ab) {
|
||||
var lastCompletion = 0;
|
||||
const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' });
|
||||
loadArchiveFormats(['rar', 'zip', 'tar'], function() {
|
||||
// Open the file as an archive
|
||||
archiveOpenFile(ab, function (archive) {
|
||||
if (archive) {
|
||||
totalImages = archive.entries.length
|
||||
console.info('Uncompressing ' + archive.archive_type + ' ...');
|
||||
archive.entries.forEach(function(e, i) {
|
||||
entries = archive.entries.sort((a,b) => collator.compare(a.name, b.name));
|
||||
entries.forEach(function(e, i) {
|
||||
updateProgress( (i + 1)/ totalImages * 100);
|
||||
if (e.is_file) {
|
||||
e.readData(function(d) {
|
||||
|
|
1
cps/static/js/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js
vendored
Normal file
1
cps/static/js/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
!function(a){a.fn.datepicker.dates.ko={days:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],daysShort:["일","월","화","수","목","금","토"],daysMin:["일","월","화","수","목","금","토"],months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthsShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],today:"오늘",clear:"삭제",format:"yyyy-mm-dd",titleFormat:"yyyy년mm월",weekStart:0}}(jQuery);
|
3
cps/static/js/libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh_Hant_TW.min.js
vendored
Normal file
3
cps/static/js/libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh_Hant_TW.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
!function(a){a.fn.datepicker.dates["zh-TW"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["週日","週一","週二","週三","週四","週五","週六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今天",format:"yyyy年mm月dd日",weekStart:1,clear:"清除"}}(jQuery);
|
||||
|
||||
|
10
cps/static/js/libs/bootstrap-table/bootstrap-table-locale-all.min.js
vendored
Normal file
10
cps/static/js/libs/bootstrap-table/bootstrap-table-locale-all.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
cps/static/js/libs/bootstrap-wysihtml5-0.0.3.min.js
vendored
Normal file
1
cps/static/js/libs/bootstrap-wysihtml5-0.0.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
cps/static/js/libs/context.min.js
vendored
11
cps/static/js/libs/context.min.js
vendored
|
@ -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);
|
||||
* 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);
|
||||
|
|
11
cps/static/js/libs/intention.min.js
vendored
11
cps/static/js/libs/intention.min.js
vendored
File diff suppressed because one or more lines are too long
14
cps/static/js/libs/plugins.js
vendored
14
cps/static/js/libs/plugins.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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 "
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
|
@ -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"
|
||||
});
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user