Merge pull request #1 from janeczku/master

update from base fork
pull/649/head
Virgil Grigoras 6 years ago committed by GitHub
commit 2b9ab96f28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

2
.gitattributes vendored

@ -1,3 +1,3 @@
web.py ident export-subst
helper.py ident export-subst
cps/static/css/libs/* linguist-vendored
cps/static/js/libs/* linguist-vendored

@ -44,5 +44,9 @@ if args.k:
print("Keyfilepath is invalid. Exiting...")
sys.exit(1)
if (args.k and not args.c) or (not args.k and args.c):
print("Certfile and Keyfile have to be used together. Exiting...")
sys.exit(1)
if args.k is "":
keyfilepath = ""

@ -559,16 +559,11 @@ def is_sha1(sha1):
def get_current_version_info():
try:
with open('version', 'r') as f:
content = f.readlines()
content = [x.strip() for x in content]
if len(content) != 2:
return False
if is_sha1(content[0]) and len(content[1]) > 0:
return {'hash': content[0], 'datetime': content[1]}
except FileNotFoundError:
return False
content = {}
content[0] = '$Format:%H$'
content[1] = '$Format:%cI$'
# content[0] = 'bb7d2c6273ae4560e83950d36d64533343623a57'
# content[1] = '2018-09-09T10:13:08+02:00'
if is_sha1(content[0]) and len(content[1]) > 0:
return {'hash': content[0], 'datetime': content[1]}
return False

@ -5,6 +5,8 @@
from socket import error as SocketError
import sys
import os
import signal
try:
from gevent.pywsgi import WSGIServer
from gevent.pool import Pool
@ -26,7 +28,8 @@ class server:
restart= False
def __init__(self):
pass
signal.signal(signal.SIGINT, self.killServer)
signal.signal(signal.SIGTERM, self.killServer)
def start_gevent(self):
try:
@ -86,6 +89,9 @@ class server:
def setRestartTyp(self,starttyp):
self.restart=starttyp
def killServer(self, signum, frame):
self.stopServer()
def stopServer(self):
if gevent_present:
self.wsgiserver.close()

@ -96,8 +96,8 @@
<div class="col-xs-6 col-sm-5">{% if config.config_remote_login %}<span class="glyphicon glyphicon-ok"></span>{% else %}<span class="glyphicon glyphicon-remove"></span>{% endif %}</div>
</div>
</div>
<div class="btn btn-default"><a href="{{url_for('configuration')}}">{{_('Basic Configuration')}}</a></div>
<div class="btn btn-default"><a href="{{url_for('view_configuration')}}">{{_('UI Configuration')}}</a></div>
<div class="btn btn-default"><a id="basic_config" href="{{url_for('configuration')}}">{{_('Basic Configuration')}}</a></div>
<div class="btn btn-default"><a id="view_config" href="{{url_for('view_configuration')}}">{{_('UI Configuration')}}</a></div>
</div>
</div>
@ -105,8 +105,8 @@
<div class="col">
<h2>{{_('Administration')}}</h2>
<div class="btn btn-default" id="restart_database">{{_('Reconnect to Calibre DB')}}</div>
<div class="btn btn-default" data-toggle="modal" data-target="#RestartDialog">{{_('Restart Calibre-Web')}}</div>
<div class="btn btn-default" data-toggle="modal" data-target="#ShutdownDialog">{{_('Stop Calibre-Web')}}</div>
<div class="btn btn-default" id="admin_restart"data-toggle="modal" data-target="#RestartDialog">{{_('Restart Calibre-Web')}}</div>
<div class="btn btn-default" id="admin_stop" data-toggle="modal" data-target="#ShutdownDialog">{{_('Stop Calibre-Web')}}</div>
</div>
</div>
@ -122,8 +122,8 @@
</thead>
<tbody>
<tr id="current_version">
<td>{{commit}} <i>({{_('current version')}})</i></td>
<td>/</td>
<td>{{commit}} </td>
<td><i>{{_('Current version')}}</i></td>
</tr>
</tbody>
</table>

@ -26,7 +26,7 @@
{% endif %}
{% endif %}
{% if display_convertbtn and conversion_formats|length > 0 %}
{% if source_formats|length > 0 and conversion_formats|length > 0 %}
<div class="text-center more-stuff"><h4>{{_('Convert book format:')}}</h4>
<form class="padded-bottom" action="{{ url_for('convert_bookformat', book_id=book.id) }}" method="post" id="book_convert_frm">
<div class="form-group">
@ -34,8 +34,8 @@
<label class="control-label" for="book_format_from">{{_('Convert from:')}}</label>
<select class="form-control" name="book_format_from" id="book_format_from">
<option disabled selected value> -- {{_('select an option')}} -- </option>
{% for file in book.data %}
<option>{{file.format}} </option>
{% for format in source_formats %}
<option>{{format|upper}} </option>
{% endfor %}
</select>
<label class="control-label" for="book_format_to">{{_('Convert to:')}}</label>

@ -207,12 +207,12 @@
<div class="col-sm-12">
<button type="submit" class="btn btn-default">{{_('Submit')}}</button>
<button type="submit" name="submit" class="btn btn-default">{{_('Submit')}}</button>
{% if not origin %}
<a href="{{ url_for('admin') }}" class="btn btn-default">{{_('Back')}}</a>
{% endif %}
{% if success %}
<a href="{{ url_for('login') }}" class="btn btn-default">{{_('Login')}}</a>
<a href="{{ url_for('login') }}" name="login" class="btn btn-default">{{_('Login')}}</a>
{% endif %}
</div>
</form>

@ -160,7 +160,7 @@
</div>
</div>
<div class="col-sm-12">
<button type="submit" class="btn btn-default">{{_('Submit')}}</button>
<button type="submit" name="submit" class="btn btn-default">{{_('Submit')}}</button>
<a href="{{ url_for('admin') }}" class="btn btn-default">{{_('Back')}}</a>
</div>
</form>

@ -174,8 +174,10 @@
{% if entry.comments|length > 0 and entry.comments[0].text|length > 0%}
<h3>{{_('Description:')}}</h3>
{{entry.comments[0].text|safe}}
<div class="comments">
<h3>{{_('Description:')}}</h3>
{{entry.comments[0].text|safe}}
</div>
{% endif %}

@ -122,16 +122,16 @@
<li id="nav_new" {% if page == 'root' %}class="active"{% endif %}><a href="{{url_for('index')}}"><span class="glyphicon glyphicon-book"></span> {{_('Recently Added')}}</a></li>
{%endif%}
{% if g.user.show_sorted() %}
<li class="dropdown">
<li id="nav_sort" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-sort-by-attributes"></span>{{_('Sorted Books')}}
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li {% if page == 'newest' %}class="active"{% endif %}><a href="{{url_for('newest_books')}}">{{_('Sort By')}} {{_('Newest')}}</a></li>
<li {% if page == 'oldest' %}class="active"{% endif %}><a href="{{url_for('oldest_books')}}">{{_('Sort By')}} {{_('Oldest')}}</a></li>
<li {% if page == 'a-z' %}class="active"{% endif %}><a href="{{url_for('titles_ascending')}}">{{_('Sort By')}} {{_('Title')}} ({{_('Ascending')}})</a></li>
<li {% if page == 'z-a' %}class="active"{% endif %}><a href="{{url_for('titles_descending')}}">{{_('Sort By')}} {{_('Title')}} ({{_('Descending')}})</a></li>
<li id="nav_sort_old" {% if page == 'newest' %}class="active"{% endif %}><a href="{{url_for('newest_books')}}">{{_('Sort By')}} {{_('Newest')}}</a></li>
<li id="nav_sort_new" {% if page == 'oldest' %}class="active"{% endif %}><a href="{{url_for('oldest_books')}}">{{_('Sort By')}} {{_('Oldest')}}</a></li>
<li id="nav_sort_asc" {% if page == 'a-z' %}class="active"{% endif %}><a href="{{url_for('titles_ascending')}}">{{_('Sort By')}} {{_('Title')}} ({{_('Ascending')}})</a></li>
<li id="nav_sort_desc" {% if page == 'z-a' %}class="active"{% endif %}><a href="{{url_for('titles_descending')}}">{{_('Sort By')}} {{_('Title')}} ({{_('Descending')}})</a></li>
</ul>
</li>
{%endif%}
@ -139,13 +139,13 @@
<li id="nav_hot" {% if page == 'hot' %}class="active"{% endif %}><a href="{{url_for('hot_books')}}"><span class="glyphicon glyphicon-fire"></span>{{_('Hot Books')}}</a></li>
{%endif%}
{% if g.user.show_best_rated_books() %}
<li {% if page == 'rated' %}class="active"{% endif %}><a href="{{url_for('best_rated_books')}}"><span class="glyphicon glyphicon-star"></span>{{_('Best rated Books')}}</a></li>
<li id="nav_rated" {% if page == 'rated' %}class="active"{% endif %}><a href="{{url_for('best_rated_books')}}"><span class="glyphicon glyphicon-star"></span>{{_('Best rated Books')}}</a></li>
{%endif%}
{% if g.user.show_read_and_unread() %}
{% if not g.user.is_anonymous %}
<li {% if page == 'read' %}class="active"{% endif %}><a href="{{url_for('read_books')}}"><span class="glyphicon glyphicon-eye-open"></span>{{_('Read Books')}}</a></li>
<li id="nav_read" {% if page == 'read' %}class="active"{% endif %}><a href="{{url_for('read_books')}}"><span class="glyphicon glyphicon-eye-open"></span>{{_('Read Books')}}</a></li>
{%endif%}
<li {% if page == 'read' %}class="active"{% endif %}><a href="{{url_for('unread_books')}}"><span class="glyphicon glyphicon-eye-close"></span>{{_('Unread Books')}}</a></li>
<li id="nav_unread" {% if page == 'read' %}class="active"{% endif %}><a href="{{url_for('unread_books')}}"><span class="glyphicon glyphicon-eye-close"></span>{{_('Unread Books')}}</a></li>
{%endif%}
{% if g.user.show_random_books() %}
<li id="nav_rand" {% if page == 'discover' %}class="active"{% endif %}><a href="{{url_for('discover')}}"><span class="glyphicon glyphicon-random"></span>{{_('Discover')}}</a></li>
@ -165,11 +165,11 @@
{% if g.user.is_authenticated or g.user.is_anonymous %}
<li class="nav-head hidden-xs">{{_('Public Shelves')}}</li>
{% for shelf in g.public_shelfes %}
<li><a href="{{url_for('show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list"></span>{{shelf.name}}</a></li>
<li><a href="{{url_for('show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list public_shelf"></span>{{shelf.name|shortentitle(40)}}</a></li>
{% endfor %}
<li class="nav-head hidden-xs">{{_('Your Shelves')}}</li>
{% for shelf in g.user.shelf %}
<li><a href="{{url_for('show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list"></span>{{shelf.name}}</a></li>
<li><a href="{{url_for('show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list private_shelf"></span>{{shelf.name|shortentitle(40)}}</a></li>
{% endfor %}
{% if not g.user.is_anonymous %}
<li id="nav_createshelf" class="create-shelf"><a href="{{url_for('create_shelf')}}">{{_('Create a Shelf')}}</a></li>

@ -7,15 +7,11 @@
<label for="nickname">{{_('Username')}}</label>
<input type="text" class="form-control" id="nickname" name="nickname" placeholder="{{_('Choose a username')}}" required>
</div>
<!--div class="form-group required">
<label for="password">{{_('Password')}}</label>
<input type="password" class="form-control" id="password" name="password" placeholder="{{_('Choose a password')}}" required>
</div-->
<div class="form-group required">
<label for="email">{{_('E-mail address')}}</label>
<input type="email" class="form-control" id="email" name="email" placeholder="{{_('Your email address')}}" required>
</div>
<button type="submit" class="btn btn-primary">{{_('Register')}}</button>
<button type="submit" id="submit" class="btn btn-primary">{{_('Register')}}</button>
</form>
</div>
{% if error %}

@ -4,9 +4,9 @@
<h2>{{title}}</h2>
{% if g.user.is_authenticated %}
{% if (g.user.role_edit_shelfs() and shelf.is_public ) or not shelf.is_public %}
<div data-toggle="modal" data-target="#DeleteShelfDialog" class="btn btn-danger">{{ _('Delete this Shelf') }} </div>
<a href="{{ url_for('edit_shelf', shelf_id=shelf.id) }}" class="btn btn-primary">{{ _('Edit Shelf') }} </a>
<a href="{{ url_for('order_shelf', shelf_id=shelf.id) }}" class="btn btn-primary">{{ _('Change order') }} </a>
<div id="delete_shelf" data-toggle="modal" data-target="#DeleteShelfDialog" class="btn btn-danger">{{ _('Delete this Shelf') }} </div>
<a id="edit_shelf" href="{{ url_for('edit_shelf', shelf_id=shelf.id) }}" class="btn btn-primary">{{ _('Edit Shelf') }} </a>
<a id="order_shelf" href="{{ url_for('order_shelf', shelf_id=shelf.id) }}" class="btn btn-primary">{{ _('Change order') }} </a>
{% endif %}
{% endif %}
<div class="row">
@ -14,11 +14,13 @@
{% for entry in entries %}
<div class="col-sm-3 col-lg-2 col-xs-6 book">
<div class="cover">
{% if entry.has_cover is defined %}
<a href="{{ url_for('show_book', book_id=entry.id) }}" data-toggle="modal" data-target="#bookDetailsModal" data-remote="false">
<img src="{{ url_for('get_cover', cover_path=entry.path.replace('\\','/')) }}" />
</a>
{% endif %}
<a href="{{ url_for('show_book', book_id=entry.id) }}" data-toggle="modal" data-target="#bookDetailsModal" data-remote="false">
{% if entry.has_cover %}
<img src="{{ url_for('get_cover', cover_path=entry.path.replace('\\','/')) }}" alt="{{ entry.title }}" />
{% else %}
<img src="{{ url_for('static', filename='generic_cover.jpg') }}" alt="{{ entry.title }}" />
{% endif %}
</a>
</div>
<div class="meta">
<p class="title">{{entry.title|shortentitle}}</p>
@ -56,7 +58,7 @@
<div class="modal-body text-center">
<span>{{_('Shelf will be lost for everybody and forever!')}}</span>
<p></p>
<a href="{{ url_for('delete_shelf', shelf_id=shelf.id) }}" class="btn btn-danger">{{_('Ok')}}</a>
<a id="confirm" href="{{ url_for('delete_shelf', shelf_id=shelf.id) }}" class="btn btn-danger">{{_('Ok')}}</a>
<button type="button" class="btn btn-default" data-dismiss="modal">{{_('Back')}}</button>
</div>
</div>

@ -14,7 +14,7 @@
</label>
</div>
{% endif %}
<button type="submit" class="btn btn-default">{{_('Submit')}}</button>
<button type="submit" class="btn btn-default" id="submit">{{_('Submit')}}</button>
{% if shelf.id != None %}
<a href="{{ url_for('show_shelf', shelf_id=shelf.id) }}" class="btn btn-default">{{_('Back')}}</a>
{% endif %}

@ -22,8 +22,6 @@
<input type="password" class="form-control" name="password" id="password" value="" autocomplete="off">
</div>
{% endif %}
{% endif %}
<div class="form-group">
<label for="kindle_mail">{{_('Kindle E-Mail')}}</label>
@ -142,7 +140,7 @@
{% if g.user and g.user.role_admin() and not profile and not new_user and not content.role_anonymous() %}
<div class="checkbox">
<label>
<input type="checkbox" name="delete"> {{_('Delete this user')}}
<input type="checkbox" id="delete" name="delete"> {{_('Delete this user')}}
</label>
</div>
{% endif %}
@ -151,8 +149,8 @@
<button type="submit" id="submit" class="btn btn-default">{{_('Submit')}}</button>
{% if not profile %}
<a href="{{ url_for('admin') }}" id="back" class="btn btn-default">{{_('Back')}}</a>
</div>
{% endif %}
</div>
</form>
{% if downloads %}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -3,13 +3,11 @@
# This file is distributed under the same license as the Calibre-Web
# project.
# FIRST AUTHOR white<space_white@yahoo.com>, 2017.
# # Translation template file..
# Copyright (C) 2011 Kovid Goyal
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2018-09-08 14:49+0200\n"
"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: 2018-02-07 02:20-0500\n"
"Last-Translator: white <space_white@yahoo.com>\n"
"Language: ja\n"
@ -116,707 +114,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
#: cps/web.py:1114
#: cps/web.py:1112 cps/web.py:2778
msgid "Unknown"
msgstr ""
#: cps/web.py:1121 cps/web.py:1152
msgid "HTTP Error"
msgstr ""
#: cps/web.py:1123 cps/web.py:1154
msgid "Connection error"
msgstr ""
#: cps/web.py:1125 cps/web.py:1156
msgid "Timeout while establishing connection"
msgstr ""
#: cps/web.py:1127 cps/web.py:1158
msgid "General error"
msgstr ""
#: cps/web.py:1133
msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1140
msgid "No update available. You already have the latest version installed"
msgstr ""
#: cps/web.py:1165
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr ""
#: cps/web.py:1215
msgid "Could not fetch update information"
msgstr ""
#: cps/web.py:1230
msgid "Requesting update package"
msgstr "更新パッケージを要求します"
#: cps/web.py:1115
#: cps/web.py:1231
msgid "Downloading update package"
msgstr "更新パッケージをダウンロードします"
#: cps/web.py:1116
#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "更新パッケージをZIP解凍します"
#: cps/web.py:1117
#: cps/web.py:1233
msgid "Files are replaced"
msgstr "ファイルを書き換えました"
#: cps/web.py:1118
#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "データベースの接続が閉じられました"
#: cps/web.py:1119
#: cps/web.py:1235
msgid "Server is stopped"
msgstr "サーバがシャットダウンされました"
#: cps/web.py:1120
#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "更新完了、Okayまたは再読み込みボタンを押してください"
#: cps/web.py:1140
#: cps/web.py:1256
msgid "Recently Added Books"
msgstr "最近追加された本"
#: cps/web.py:1150
#: cps/web.py:1266
msgid "Newest Books"
msgstr "最新の本"
#: cps/web.py:1162
#: cps/web.py:1278
msgid "Oldest Books"
msgstr "最古の本"
#: cps/web.py:1174
#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr "本(A-Z)"
#: cps/web.py:1185
#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr "本 (Z-A)"
#: cps/web.py:1214
#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "有名な本(ダウンロード数)"
#: cps/web.py:1227
#: cps/web.py:1343
msgid "Best rated books"
msgstr "最高評判の本"
#: cps/templates/index.xml:36 cps/web.py:1239
#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "任意の本"
#: cps/web.py:1254
#: cps/web.py:1370
msgid "Author list"
msgstr "著者リスト"
#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません"
#: cps/templates/index.xml:73 cps/web.py:1313
#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "叢書リスト"
#: cps/web.py:1327
#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "叢書: %(serie)s"
#: cps/web.py:1354
#: cps/web.py:1470
msgid "Available languages"
msgstr "利用可能な言語"
#: cps/web.py:1371
#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "言語: %(name)s"
#: cps/templates/index.xml:66 cps/web.py:1382
#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "カテゴリーリスト"
#: cps/web.py:1396
#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "カテゴリー: %(name)s"
#: cps/templates/layout.html:71 cps/web.py:1535
#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr ""
#: cps/web.py:1565
#: cps/web.py:1681
msgid "Statistics"
msgstr "統計"
#: cps/web.py:1670
msgid ""
"Callback domain is not verified, please follow steps to verify domain in "
"google developer console"
#: cps/web.py:1786
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
#: cps/web.py:1746
#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "サーバを再起動しました、ページを再読み込みしてください"
#: cps/web.py:1749
#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "サーバをシャットダウンします、ページを閉じてください"
#: cps/web.py:1767
#: cps/web.py:1883
msgid "Update done"
msgstr "更新完了"
#: cps/web.py:1837
#: cps/web.py:1953
msgid "Published after "
msgstr ""
#: cps/web.py:1844
#: cps/web.py:1960
msgid "Published before "
msgstr ""
#: cps/web.py:1858
#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
#: cps/web.py:1860
#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
#: cps/web.py:1919 cps/web.py:1928
#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "検索"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:1995
#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "既読の本"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:1998
#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "未読の本"
#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "本を読む"
#: cps/web.py:2128 cps/web.py:3006
#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "全ての項目を入力してください"
#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
#: cps/web.py:2161
#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
#: cps/web.py:2277
msgid "register"
msgstr "登録"
#: cps/web.py:2149 cps/web.py:3222
#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/web.py:2152
#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:2155
#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:2158
#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:2175 cps/web.py:2271
#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "%(nickname)s としてログインします"
#: cps/web.py:2180
#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "ユーザ名またはパスワードは間違いました"
#: cps/web.py:2186 cps/web.py:2207
#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "ログイン"
#: cps/web.py:2219 cps/web.py:2250
#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr "トークンは見つかりません"
#: cps/web.py:2227 cps/web.py:2258
#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr "トークンは失効されました"
#: cps/web.py:2235
#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr "成功しまた!端末に戻ってください"
#: cps/web.py:2285
#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "SMTPメールをまず設定してください"
#: cps/web.py:2289
#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
#: cps/web.py:2293
#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "%(res)s を送信する際にエーラが発生しました"
#: cps/web.py:2295 cps/web.py:3060
#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:2339
#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "本 %(sname)s を書架に追加されました"
#: cps/web.py:2350
#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
#: cps/web.py:2355
#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
#: cps/web.py:2360
#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2378
#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
#: cps/web.py:2392
#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2394
#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2431
#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "本 %(sname)s を書架から除去されました"
#: cps/web.py:2437
#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
#: cps/web.py:2457 cps/web.py:2481
#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "名前を使った書架 '%(title)s' は既に存在しました"
#: cps/web.py:2462
#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "書架%(title)s は作成されました"
#: cps/web.py:2464 cps/web.py:2492
#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "エーラが発生しました"
#: cps/web.py:2465 cps/web.py:2467
#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "書架を作成する"
#: cps/web.py:2490
#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "書架 %(title)s 変わりました"
#: cps/web.py:2493 cps/web.py:2495
#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "書架を編集する"
#: cps/web.py:2516
#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "%(name)s の書架を削除されました"
#: cps/web.py:2538
#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "書架: '%(name)s'"
#: cps/web.py:2541
#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "書架を開けません。書架は存在しないまたはアクセスできません"
#: cps/web.py:2572
#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "'%(name)s' の書架の順番を入れ替える"
#: cps/web.py:2601 cps/web.py:3012
#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr ""
#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)sのプロファイル"
#: cps/web.py:2642
#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/web.py:2645
#: cps/web.py:2766
msgid "Profile updated"
msgstr "プロファイルが更新されました"
#: cps/web.py:2657
msgid "Unknown"
msgstr ""
#: cps/web.py:2671
#: cps/web.py:2794
msgid "Admin page"
msgstr "管理者ページ"
#: cps/web.py:2749 cps/web.py:2922
#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr "Calibre-Web 設定を更新されました"
#: cps/templates/admin.html:91 cps/web.py:2762
#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr ""
#: cps/web.py:2780
#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr ""
#: cps/web.py:2783
#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr ""
#: cps/web.py:2788 cps/web.py:2815
#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr ""
#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
#: cps/web.py:2954
#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "基本設定"
#: cps/web.py:2841
#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2853
#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2895
#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr "ログファイルの場所は不適切です。正しい場所を入力してください"
#: cps/web.py:2934
#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr "データベースの場所は不適切です。正しい場所を入力してください"
#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "新規ユーザ追加"
#: cps/web.py:3020
#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "ユーザ '%(user)s' が作成されました"
#: cps/web.py:3024
#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
#: cps/web.py:3048 cps/web.py:3062
#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr ""
#: cps/web.py:3055
#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:3058
#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
#: cps/web.py:3063
#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr ""
#: cps/web.py:3088
#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "ユーザ '%(nick)s' 削除されました"
#: cps/web.py:3197
#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "ユーザ '%(nick)s' 更新されました"
#: cps/web.py:3200
#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "不明のエーラが発生しました"
#: cps/web.py:3202
#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "ユーザ編集 %(nick)s"
#: cps/web.py:3219
#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/web.py:3239
#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません"
#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "メタデータを編集します"
#: cps/web.py:3284 cps/web.py:3576
#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "ファイル拡張子 '%(ext)s' をこのサーバにアップロードする許可はありません"
#: cps/web.py:3288 cps/web.py:3580
#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "ファイルをアップロードするために拡張子が必要です"
#: cps/web.py:3300 cps/web.py:3600
#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "場所 %(path)s の作成を失敗しました (許可拒否)"
#: cps/web.py:3305
#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr "フアイル %(file)s の保存を失敗しました"
#: cps/web.py:3321
#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
#: cps/web.py:3339
#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3346
#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
#: cps/web.py:3349
#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr ""
#: cps/web.py:3362 cps/web.py:3366
#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr "不明"
#: cps/web.py:3388
#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr ""
#: cps/web.py:3555
#: cps/web.py:3554
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr ""
#: cps/web.py:3605
#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "ファイル %(file)s の保存を失敗しました (許可拒否)"
#: cps/web.py:3610
#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "ファイル %(file)s の削除を失敗しました (許可拒否)"
#: cps/web.py:3692
#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
#: cps/web.py:3722
#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
#: cps/web.py:3732
#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
#: cps/web.py:3736
#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
#: cps/worker.py:215 cps/worker.py:387
#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr ""
#: cps/worker.py:237
#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr ""
#: cps/worker.py:272
#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr ""
#: cps/worker.py:283
#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr "Kindlegen 失敗しました、エーラ %(error)s. メッセージ: %(message)s"
#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
msgid "Finished"
msgstr ""
#: cps/worker.py:344 cps/worker.py:363
#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr ""
#: cps/worker.py:351
#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
#: cps/worker.py:472
#: cps/worker.py:388 cps/worker.py:484
msgid "Finished"
msgstr ""
#: cps/worker.py:476
msgid "Failed"
msgstr ""
#: cps/templates/admin.html:4
#: cps/templates/admin.html:6
msgid "User list"
msgstr "ユーザリスト"
#: cps/templates/admin.html:7
#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "通称"
#: cps/templates/admin.html:8
#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
#: cps/templates/admin.html:9
#: cps/templates/admin.html:11
msgid "Kindle"
msgstr "Kindle"
#: cps/templates/admin.html:10
#: cps/templates/admin.html:12
msgid "DLS"
msgstr "DLS"
#: cps/templates/admin.html:11 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "管理者"
#: cps/templates/admin.html:12 cps/templates/detail.html:22
#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "ダウンロード"
#: cps/templates/admin.html:13 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "アップロード"
#: cps/templates/admin.html:14
#: cps/templates/admin.html:16
msgid "Edit"
msgstr "編集"
#: cps/templates/admin.html:32
#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr ""
#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "SMTPホスト名"
#: cps/templates/admin.html:36
#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "SMTPポート"
#: cps/templates/admin.html:37
#: cps/templates/admin.html:44
msgid "SSL"
msgstr "SSL"
#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr "SMTP ログイン"
#: cps/templates/admin.html:39
#: cps/templates/admin.html:46
msgid "From mail"
msgstr "メールから"
#: cps/templates/admin.html:48
#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "SMTP設定を変更する"
#: cps/templates/admin.html:50
#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "設定"
#: cps/templates/admin.html:53
#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "Calibre データベースの場所"
#: cps/templates/admin.html:57
#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
#: cps/templates/admin.html:61
#: cps/templates/admin.html:73
msgid "Port"
msgstr "ポート"
#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "本数毎ページ"
#: cps/templates/admin.html:71
#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "アップロード中"
#: cps/templates/admin.html:75
#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
#: cps/templates/admin.html:79
#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "公的登録"
#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr "遠距離ログイン"
#: cps/templates/admin.html:93
#: cps/templates/admin.html:106
msgid "Administration"
msgstr "管理"
#: cps/templates/admin.html:94
msgid "Current commit timestamp"
msgstr "現在コミットのタイムスタンプ"
#: cps/templates/admin.html:95
msgid "Newest commit timestamp"
msgstr "最新コミットのタイムスタンプ"
#: cps/templates/admin.html:97
#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "Calibreデータベースに再接続します"
#: cps/templates/admin.html:98
#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr "Calibre-Webを再起動します"
#: cps/templates/admin.html:99
#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr "Calibre-Webを停止します"
#: cps/templates/admin.html:100
#: cps/templates/admin.html:115
msgid "Update"
msgstr ""
#: cps/templates/admin.html:119
msgid "Version"
msgstr ""
#: cps/templates/admin.html:120
msgid "Details"
msgstr ""
#: cps/templates/admin.html:126
msgid "Current version"
msgstr ""
#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "更新を確認します"
#: cps/templates/admin.html:101
#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "更新を実行します"
#: cps/templates/admin.html:110
#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr "Calibre-Webを再起動します。宜しいですか?"
#: cps/templates/admin.html:115 cps/templates/admin.html:129
#: cps/templates/admin.html:150 cps/templates/shelf.html:59
#: cps/templates/admin.html:150 cps/templates/admin.html:164
#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "はい"
#: cps/templates/admin.html:116 cps/templates/admin.html:130
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@ -825,11 +866,11 @@ msgstr "はい"
msgid "Back"
msgstr "戻る"
#: cps/templates/admin.html:128
#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr "Calibre-Webを停止します。宜しいですか?"
#: cps/templates/admin.html:141
#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "更新中、ページ再読み込みしないでください"
@ -910,9 +951,7 @@ msgid "Rating"
msgstr "評価"
#: cps/templates/book_edit.html:87
msgid ""
"Cover URL (jpg, cover is downloaded and stored in database, field is "
"afterwards empty again)"
msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr ""
#: cps/templates/book_edit.html:91
@ -1840,9 +1879,7 @@ msgstr "最近ダウンロード"
#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "タイトルを'%(src)s'から'%(dest)s'の改名は失敗しました。エーラ: %(error)s"
#~ msgid ""
#~ "Rename author from: '%(src)s' to "
#~ "'%(dest)s' failed with error: %(error)s"
#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "著者を'%(src)s'から'%(dest)s'の改名は失敗しました。エーラ:%(error)s"
#~ msgid "Password for user %(user)s reset"
@ -1866,3 +1903,9 @@ msgstr "最近ダウンロード"
#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
#~ msgstr "ファイル拡張子 \"%(ext)s\" をこのサーバにアップロードする許可はありません"
#~ msgid "Current commit timestamp"
#~ msgstr "現在コミットのタイムスタンプ"
#~ msgid "Newest commit timestamp"
#~ msgstr "最新コミットのタイムスタンプ"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2018-09-08 14:49+0200\n"
"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: 2018-08-27 17:06+0700\n"
"Last-Translator: \n"
"Language: km_KH\n"
@ -115,709 +115,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
#: cps/web.py:1114
#: cps/web.py:1112 cps/web.py:2778
msgid "Unknown"
msgstr "មិនដឹង"
#: cps/web.py:1121 cps/web.py:1152
msgid "HTTP Error"
msgstr ""
#: cps/web.py:1123 cps/web.py:1154
msgid "Connection error"
msgstr ""
#: cps/web.py:1125 cps/web.py:1156
msgid "Timeout while establishing connection"
msgstr ""
#: cps/web.py:1127 cps/web.py:1158
msgid "General error"
msgstr ""
#: cps/web.py:1133
msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1140
msgid "No update available. You already have the latest version installed"
msgstr ""
#: cps/web.py:1165
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr ""
#: cps/web.py:1215
msgid "Could not fetch update information"
msgstr ""
#: cps/web.py:1230
msgid "Requesting update package"
msgstr "កំពុងស្នើសុំឯកសារបច្ចុប្បន្នភាព"
#: cps/web.py:1115
#: cps/web.py:1231
msgid "Downloading update package"
msgstr "កំពុងទាញយកឯកសារបច្ចុប្បន្នភាព"
#: cps/web.py:1116
#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "កំពុងពន្លាឯកសារបច្ចុប្បន្នភាព"
#: cps/web.py:1117
#: cps/web.py:1233
msgid "Files are replaced"
msgstr "ឯកសារត្រូវបានផ្លាស់ប្តូរ"
#: cps/web.py:1118
#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្នន័យត្រូវបានផ្តាច់"
#: cps/web.py:1119
#: cps/web.py:1235
msgid "Server is stopped"
msgstr "ម៉ាស៊ីន server ត្រូវបានបញ្ឈប់"
#: cps/web.py:1120
#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "ការធ្វើបច្ចុប្បន្នភាពបានបញ្ចប់ សូមចុច okay រួចបើកទំព័រជាថ្មី"
#: cps/web.py:1140
#: cps/web.py:1256
msgid "Recently Added Books"
msgstr "សៀវភៅដែលទើបបានបន្ថែម"
#: cps/web.py:1150
#: cps/web.py:1266
msgid "Newest Books"
msgstr "សៀវភៅថ្មីៗជាងគេ"
#: cps/web.py:1162
#: cps/web.py:1278
msgid "Oldest Books"
msgstr "សៀវភៅចាស់ជាងគេ"
#: cps/web.py:1174
#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr "សៀវភៅពី A ទៅ Z"
#: cps/web.py:1185
#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr "សៀវភៅពី Z ទៅ A"
#: cps/web.py:1214
#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "សៀវភៅដែលត្រូវបានទាញយកច្រើនជាងគេ"
#: cps/web.py:1227
#: cps/web.py:1343
msgid "Best rated books"
msgstr "សៀវភៅដែលត្រូវបានវាយតម្លៃល្អជាងគេ"
#: cps/templates/index.xml:36 cps/web.py:1239
#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "សៀវភៅចៃដន្យ"
#: cps/web.py:1254
#: cps/web.py:1370
msgid "Author list"
msgstr "បញ្ជីអ្នកនិពន្ធ"
#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ មិនមានឯកសារនេះ ឬមិនអាចបើកបាន៖"
#: cps/templates/index.xml:73 cps/web.py:1313
#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "បញ្ជីស៊េរី"
#: cps/web.py:1327
#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "ស៊េរី៖ %(serie)s"
#: cps/web.py:1354
#: cps/web.py:1470
msgid "Available languages"
msgstr "ភាសាដែលមាន"
#: cps/web.py:1371
#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "ភាសា៖ %(name)s"
#: cps/templates/index.xml:66 cps/web.py:1382
#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "បញ្ជីប្រភេទ"
#: cps/web.py:1396
#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "ប្រភេទ៖ %(name)s"
#: cps/templates/layout.html:71 cps/web.py:1535
#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr "កិច្ចការនានា"
#: cps/web.py:1565
#: cps/web.py:1681
msgid "Statistics"
msgstr "ស្ថិតិ"
#: cps/web.py:1670
msgid ""
"Callback domain is not verified, please follow steps to verify domain in "
"google developer console"
msgstr ""
"Callback domain មិនទាន់បានផ្ទៀងផ្ទាត់ឲប្រើទេ "
"សូមធ្វើតាមជំហានដើម្បីផ្ទៀងផ្ទាត់ domain នៅក្នុង Google Developer Console"
#: cps/web.py:1786
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "Callback domain មិនទាន់បានផ្ទៀងផ្ទាត់ឲប្រើទេ សូមធ្វើតាមជំហានដើម្បីផ្ទៀងផ្ទាត់ domain នៅក្នុង Google Developer Console"
#: cps/web.py:1746
#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "ម៉ាស៊ីន server បានដំណើរការម្តងទៀត សូមបើកទំព័រជាថ្មី"
#: cps/web.py:1749
#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "កំពុងបិទម៉ាស៊ីន server សូមបិទផ្ទាំងនេះ"
#: cps/web.py:1767
#: cps/web.py:1883
msgid "Update done"
msgstr "ការធ្វើបច្ចុប្បន្នភាពរួចរាល់"
#: cps/web.py:1837
#: cps/web.py:1953
msgid "Published after "
msgstr "បានបោះពុម្ភក្រោយ "
#: cps/web.py:1844
#: cps/web.py:1960
msgid "Published before "
msgstr "បានបោះពុម្ភមុន "
#: cps/web.py:1858
#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr "ការវាយតម្លៃ <= %(rating)s"
#: cps/web.py:1860
#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr "ការវាយតម្លៃ >= %(rating)s"
#: cps/web.py:1919 cps/web.py:1928
#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "ស្វែងរក"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:1995
#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "សៀវភៅដែលបានអានរួច"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:1998
#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "សៀវភៅដែលមិនទាន់បានអាន"
#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "អានសៀវភៅ"
#: cps/web.py:2128 cps/web.py:3006
#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "សូមបំពេញចន្លោះទាំងអស់!"
#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
#: cps/web.py:2161
#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
#: cps/web.py:2277
msgid "register"
msgstr "ចុះឈ្មោះ"
#: cps/web.py:2149 cps/web.py:3222
#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/web.py:2152
#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:2155
#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:2158
#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:2175 cps/web.py:2271
#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ %(nickname)s"
#: cps/web.py:2180
#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់"
#: cps/web.py:2186 cps/web.py:2207
#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "ចូលប្រើ"
#: cps/web.py:2219 cps/web.py:2250
#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr "រកមិនឃើញវត្ថុតាង"
#: cps/web.py:2227 cps/web.py:2258
#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr "វត្ថុតាងហួសពេលកំណត់"
#: cps/web.py:2235
#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ"
#: cps/web.py:2285
#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន"
#: cps/web.py:2289
#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ"
#: cps/web.py:2293
#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s"
#: cps/web.py:2295 cps/web.py:3060
#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:2339
#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "សៀវភៅត្រូវបានបន្ថែមទៅធ្នើ៖ %(sname)s"
#: cps/web.py:2350
#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
#: cps/web.py:2355
#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
#: cps/web.py:2360
#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2378
#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
#: cps/web.py:2392
#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2394
#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2431
#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "សៀវភៅត្រូវបានដកចេញពីធ្នើ៖ %(sname)s"
#: cps/web.py:2437
#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "សូមអភ័យទោស អ្នកមិនមានសិទ្ធិដកសៀវភៅចេញពីធ្នើនេះទេ៖ %(sname)s"
#: cps/web.py:2457 cps/web.py:2481
#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "មានធ្នើដែលមានឈ្មោះ %(title)s រួចហើយ។"
#: cps/web.py:2462
#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានបង្កើត"
#: cps/web.py:2464 cps/web.py:2492
#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "មានបញ្ហា"
#: cps/web.py:2465 cps/web.py:2467
#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "បង្កើតធ្នើ"
#: cps/web.py:2490
#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានប្តូរ"
#: cps/web.py:2493 cps/web.py:2495
#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "កែប្រែធ្នើ"
#: cps/web.py:2516
#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "បានបង្កើតធ្នើឈ្មោះ %(name)s ដោយជោគជ័យ"
#: cps/web.py:2538
#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "ធ្នើ៖ %(name)s"
#: cps/web.py:2541
#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន"
#: cps/web.py:2572
#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "ប្តូរលំដាប់ធ្នើ៖ %(name)s"
#: cps/web.py:2601 cps/web.py:3012
#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr ""
#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s"
#: cps/web.py:2642
#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/web.py:2645
#: cps/web.py:2766
msgid "Profile updated"
msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ"
#: cps/web.py:2657
msgid "Unknown"
msgstr "មិនដឹង"
#: cps/web.py:2671
#: cps/web.py:2794
msgid "Admin page"
msgstr "ទំព័ររដ្ឋបាល"
#: cps/web.py:2749 cps/web.py:2922
#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr ""
#: cps/templates/admin.html:91 cps/web.py:2762
#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr "ការកំណត់ផ្ទាំងប្រើប្រាស់"
#: cps/web.py:2780
#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr "ខ្វះការនាំចូលតម្រូវការបន្ថែមរបស់ Google Drive"
#: cps/web.py:2783
#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr "មិនមានឯកសារ client_secrets.json ឬមិនអាចបើកបាន"
#: cps/web.py:2788 cps/web.py:2815
#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr "ឯកសារ client_secrets.json មិនទាន់បានកំណត់សម្រាប់កម្មវិធីវែប"
#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
#: cps/web.py:2954
#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "ការកំណត់សាមញ្ញ"
#: cps/web.py:2841
#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr "ទីតាំងរបស់ keyfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ"
#: cps/web.py:2853
#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr "ទីតាំងរបស់ certfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ"
#: cps/web.py:2895
#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr "ទីតាំងរបស់ logfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ"
#: cps/web.py:2934
#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr "ទីតាំងរបស់ database មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ"
#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "បន្ថែមអ្នកប្រើប្រាស់ថ្មី"
#: cps/web.py:3020
#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "បានបង្កើតអ្នកប្រើប្រាស់ %(user)s"
#: cps/web.py:3024
#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
#: cps/web.py:3048 cps/web.py:3062
#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr ""
#: cps/web.py:3055
#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:3058
#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
#: cps/web.py:3063
#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr ""
#: cps/web.py:3088
#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "អ្នកប្រើប្រាស់ %(nick)s ត្រូវបានលុប"
#: cps/web.py:3197
#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "អ្នកប្រើប្រាស់ %(nick)s ត្រូវបានកែប្រែ"
#: cps/web.py:3200
#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "បញ្ហាដែលមិនដឹងបានកើតឡើង។"
#: cps/web.py:3202
#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s"
#: cps/web.py:3219
#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/web.py:3239
#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ ពុំមានឯកសារ ឬឯកសារនេះមិនអាចបើកបាន"
#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "កែប្រែទិន្នន័យមេតា"
#: cps/web.py:3284 cps/web.py:3576
#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "ឯកសារប្រភេទ '%(ext)s' មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ"
#: cps/web.py:3288 cps/web.py:3580
#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "ឯកសារដែលត្រូវអាប់ឡូដត្រូវមានកន្ទុយឯកសារ"
#: cps/web.py:3300 cps/web.py:3600
#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "មិនអាចបង្កើតទីតាំង %(path)s (ពុំមានសិទ្ធិ)។"
#: cps/web.py:3305
#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។"
#: cps/web.py:3321
#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s"
#: cps/web.py:3339
#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3346
#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
#: cps/web.py:3349
#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr ""
#: cps/web.py:3362 cps/web.py:3366
#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr "មិនដឹង"
#: cps/web.py:3388
#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr "គម្របមិនមែនជាឯកសារ JPG មិនអាចរក្សាទុក"
#: cps/web.py:3555
#: cps/web.py:3554
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr "មានបញ្ហាពេលកែប្រែសៀវភៅ សូមពិនិត្យមើល logfile សម្រាប់ព័ត៌មានបន្ថែម"
#: cps/web.py:3605
#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s (មិនមានសិទ្ធិ)។"
#: cps/web.py:3610
#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "មិនអាចលុបឯកសារ %(file)s (មិនមានសិទ្ធិ)។"
#: cps/web.py:3692
#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr "ឯកសារ %(file)s ត្រូវបានអាប់ឡូដ"
#: cps/web.py:3722
#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
#: cps/web.py:3732
#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
#: cps/web.py:3736
#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
#: cps/worker.py:215 cps/worker.py:387
#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr "បានចាប់ផ្តើម"
#: cps/worker.py:237
#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr "មិនអាចរកឃើញកម្មវិធីបម្លែង %(converter)s"
#: cps/worker.py:272
#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s"
#: cps/worker.py:283
#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr "Kindlegen បានបរាជ័យដោយមានកំហុស %(error)s. សារ៖ %(message)s"
#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
msgid "Finished"
msgstr "បានបញ្ចប់"
#: cps/worker.py:344 cps/worker.py:363
#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr "កំពុងរង់ចាំ"
#: cps/worker.py:351
#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
#: cps/worker.py:472
#: cps/worker.py:388 cps/worker.py:484
msgid "Finished"
msgstr "បានបញ្ចប់"
#: cps/worker.py:476
msgid "Failed"
msgstr "បានបរាជ័យ"
#: cps/templates/admin.html:4
#: cps/templates/admin.html:6
msgid "User list"
msgstr "បញ្ជីអ្នកប្រើប្រាស់"
#: cps/templates/admin.html:7
#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "ឈ្មោះហៅក្រៅ"
#: cps/templates/admin.html:8
#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
#: cps/templates/admin.html:9
#: cps/templates/admin.html:11
msgid "Kindle"
msgstr "ឧបករណ៍ Kindle"
#: cps/templates/admin.html:10
#: cps/templates/admin.html:12
msgid "DLS"
msgstr "ឯកសារ DLS"
#: cps/templates/admin.html:11 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "រដ្ឋបាល"
#: cps/templates/admin.html:12 cps/templates/detail.html:22
#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "ទាញយក"
#: cps/templates/admin.html:13 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "អាប់ឡូដ"
#: cps/templates/admin.html:14
#: cps/templates/admin.html:16
msgid "Edit"
msgstr "កែប្រែ"
#: cps/templates/admin.html:32
#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr ""
#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "ឈ្មោះម៉ាស៊ីន SMTP"
#: cps/templates/admin.html:36
#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "លេខ port SMTP"
#: cps/templates/admin.html:37
#: cps/templates/admin.html:44
msgid "SSL"
msgstr "SSL"
#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr "អ្នកចូលប្រើ SMTP"
#: cps/templates/admin.html:39
#: cps/templates/admin.html:46
msgid "From mail"
msgstr "ពីអ៊ីមែល"
#: cps/templates/admin.html:48
#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "ប្តូរការកំណត់ SMTP"
#: cps/templates/admin.html:50
#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "ការកំណត់"
#: cps/templates/admin.html:53
#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "ទីតាំង database Calibre"
#: cps/templates/admin.html:57
#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
#: cps/templates/admin.html:61
#: cps/templates/admin.html:73
msgid "Port"
msgstr "លេខ port"
#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "ចំនួនសៀវភៅក្នុងមួយទំព័រ"
#: cps/templates/admin.html:71
#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "កំពុងអាប់ឡូដ"
#: cps/templates/admin.html:75
#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
#: cps/templates/admin.html:79
#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "ការចុះឈ្មាះសាធារណៈ"
#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr "ការចូលប្រើប្រាស់ពីចម្ងាយ"
#: cps/templates/admin.html:93
#: cps/templates/admin.html:106
msgid "Administration"
msgstr "កិច្ចការរដ្ឋបាល"
#: cps/templates/admin.html:94
msgid "Current commit timestamp"
msgstr "Commit timestamp បច្ចុប្បន្ន"
#: cps/templates/admin.html:95
msgid "Newest commit timestamp"
msgstr "Commit timestamp ចុងក្រោយគេ"
#: cps/templates/admin.html:97
#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "ភ្ជាប់ទៅ database Calibre ម្តងទៀត"
#: cps/templates/admin.html:98
#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr ""
#: cps/templates/admin.html:99
#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr ""
#: cps/templates/admin.html:100
#: cps/templates/admin.html:115
msgid "Update"
msgstr ""
#: cps/templates/admin.html:119
msgid "Version"
msgstr ""
#: cps/templates/admin.html:120
msgid "Details"
msgstr ""
#: cps/templates/admin.html:126
msgid "Current version"
msgstr ""
#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "រកមើលបច្ចុប្បន្នភាព"
#: cps/templates/admin.html:101
#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "ធ្វើបច្ចុប្បន្នភាព"
#: cps/templates/admin.html:110
#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr ""
#: cps/templates/admin.html:115 cps/templates/admin.html:129
#: cps/templates/admin.html:150 cps/templates/shelf.html:59
#: cps/templates/admin.html:150 cps/templates/admin.html:164
#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "បាទ/ចាស"
#: cps/templates/admin.html:116 cps/templates/admin.html:130
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@ -826,11 +867,11 @@ msgstr "បាទ/ចាស"
msgid "Back"
msgstr "មកក្រោយ"
#: cps/templates/admin.html:128
#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr ""
#: cps/templates/admin.html:141
#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "កំពុងធ្វើបច្ចុប្បន្នភាព សូមកុំបើកទំព័រជាថ្មី"
@ -911,12 +952,8 @@ msgid "Rating"
msgstr "ការវាយតម្លៃ"
#: cps/templates/book_edit.html:87
msgid ""
"Cover URL (jpg, cover is downloaded and stored in database, field is "
"afterwards empty again)"
msgstr ""
"URL របស់ក្របមុខ (ឯកសារ JPG ក្របមុខត្រូវបានទាញយក និងរក្សាទុកក្នុង database"
" ក្រោយមកចន្លោះនេះទទេម្តងទៀត)"
msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr "URL របស់ក្របមុខ (ឯកសារ JPG ក្របមុខត្រូវបានទាញយក និងរក្សាទុកក្នុង database ក្រោយមកចន្លោះនេះទទេម្តងទៀត)"
#: cps/templates/book_edit.html:91
msgid "Upload Cover from local drive"
@ -1291,9 +1328,7 @@ msgstr "កែប្រែទិន្នន័យមេតា"
#: cps/templates/email_edit.html:15
msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)"
msgstr ""
"លេខ port SMTP (ជាធម្មតាលេខ 25 សម្រាប់ SMTP ធម្មតា ឬ 465 សម្រាប់ SSL ឬ 587"
" សម្រាប់ STARTTLS)"
msgstr "លេខ port SMTP (ជាធម្មតាលេខ 25 សម្រាប់ SMTP ធម្មតា ឬ 465 សម្រាប់ SSL ឬ 587 សម្រាប់ STARTTLS)"
#: cps/templates/email_edit.html:19
msgid "Encryption"
@ -1845,9 +1880,7 @@ msgstr "ការទាញយកថ្មីៗ"
#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s"
#~ msgid ""
#~ "Rename author from: '%(src)s' to "
#~ "'%(dest)s' failed with error: %(error)s"
#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "ប្តូរអ្នកនិពន្ធពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s"
#~ msgid "Password for user %(user)s reset"
@ -1871,3 +1904,9 @@ msgstr "ការទាញយកថ្មីៗ"
#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
#~ msgstr "ឯកសារប្រភេទ “%(ext)s” មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ"
#~ msgid "Current commit timestamp"
#~ msgstr "Commit timestamp បច្ចុប្បន្ន"
#~ msgid "Newest commit timestamp"
#~ msgstr "Commit timestamp ចុងក្រោយគេ"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -3,19 +3,11 @@
# This file is distributed under the same license as the Calibre-Web
# project.
# FIRST AUTHOR dalin <dalin.lin@gmail.com>, 2017.
# # Translation template file..
# Copyright (C) 2011 Kovid Goyal
#
# Translators:
# Alastair McKinstry <mckinstry@computer.org>, 2001
# LI Daobing <lidaobing@gmail.com>, 2007-2008
# nature <wangyihaoa@gmail.com>, 2015
# Wang Vincent <susemm@163.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2018-09-08 14:49+0200\n"
"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: 2017-01-06 17:00+0000\n"
"Last-Translator: dalin <dalin.lin@gmail.com>\n"
"Language: zh_Hans_CN\n"
@ -122,707 +114,750 @@ msgstr "执行UnRar时出错"
msgid "Unrar binary file not found"
msgstr "找不到Unrar二进制文件"
#: cps/web.py:1114
#: cps/web.py:1112 cps/web.py:2778
msgid "Unknown"
msgstr "未知"
#: cps/web.py:1121 cps/web.py:1152
msgid "HTTP Error"
msgstr ""
#: cps/web.py:1123 cps/web.py:1154
msgid "Connection error"
msgstr ""
#: cps/web.py:1125 cps/web.py:1156
msgid "Timeout while establishing connection"
msgstr ""
#: cps/web.py:1127 cps/web.py:1158
msgid "General error"
msgstr ""
#: cps/web.py:1133
msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1140
msgid "No update available. You already have the latest version installed"
msgstr ""
#: cps/web.py:1165
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr ""
#: cps/web.py:1215
msgid "Could not fetch update information"
msgstr ""
#: cps/web.py:1230
msgid "Requesting update package"
msgstr "正在请求更新包"
#: cps/web.py:1115
#: cps/web.py:1231
msgid "Downloading update package"
msgstr "正在下载更新包"
#: cps/web.py:1116
#: cps/web.py:1232
msgid "Unzipping update package"
msgstr "正在解压更新包"
#: cps/web.py:1117
#: cps/web.py:1233
msgid "Files are replaced"
msgstr "文件已替换"
#: cps/web.py:1118
#: cps/web.py:1234
msgid "Database connections are closed"
msgstr "数据库连接已关闭"
#: cps/web.py:1119
#: cps/web.py:1235
msgid "Server is stopped"
msgstr "服务器已停止"
#: cps/web.py:1120
#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr "更新完成,请按确定并刷新页面"
#: cps/web.py:1140
#: cps/web.py:1256
msgid "Recently Added Books"
msgstr "最近添加的书籍"
#: cps/web.py:1150
#: cps/web.py:1266
msgid "Newest Books"
msgstr "最新书籍"
#: cps/web.py:1162
#: cps/web.py:1278
msgid "Oldest Books"
msgstr "最旧书籍"
#: cps/web.py:1174
#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr "书籍 (A-Z)"
#: cps/web.py:1185
#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr "书籍 (Z-A)"
#: cps/web.py:1214
#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr "热门书籍(最多下载)"
#: cps/web.py:1227
#: cps/web.py:1343
msgid "Best rated books"
msgstr "最高评分书籍"
#: cps/templates/index.xml:36 cps/web.py:1239
#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr "随机书籍"
#: cps/web.py:1254
#: cps/web.py:1370
msgid "Author list"
msgstr "作者列表"
#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "无法打开电子书。 文件不存在或者文件不可访问:"
#: cps/templates/index.xml:73 cps/web.py:1313
#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr "丛书列表"
#: cps/web.py:1327
#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr "丛书: %(serie)s"
#: cps/web.py:1354
#: cps/web.py:1470
msgid "Available languages"
msgstr "可用语言"
#: cps/web.py:1371
#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr "语言: %(name)s"
#: cps/templates/index.xml:66 cps/web.py:1382
#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr "分类列表"
#: cps/web.py:1396
#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr "分类: %(name)s"
#: cps/templates/layout.html:71 cps/web.py:1535
#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr "任务"
#: cps/web.py:1565
#: cps/web.py:1681
msgid "Statistics"
msgstr "统计"
#: cps/web.py:1670
msgid ""
"Callback domain is not verified, please follow steps to verify domain in "
"google developer console"
#: cps/web.py:1786
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr "回调域名尚未被校验请在google开发者控制台按步骤校验域名"
#: cps/web.py:1746
#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr "服务器已重启,请刷新页面"
#: cps/web.py:1749
#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr "正在关闭服务器,请关闭窗口"
#: cps/web.py:1767
#: cps/web.py:1883
msgid "Update done"
msgstr "更新完成"
#: cps/web.py:1837
#: cps/web.py:1953
msgid "Published after "
msgstr ""
#: cps/web.py:1844
#: cps/web.py:1960
msgid "Published before "
msgstr "出版时早于 "
#: cps/web.py:1858
#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr "评分 <= %(rating)s"
#: cps/web.py:1860
#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr "评分 >= %(rating)s"
#: cps/web.py:1919 cps/web.py:1928
#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr "搜索"
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:1995
#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr "已读书籍"
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:1998
#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr "未读书籍"
#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr "阅读一本书"
#: cps/web.py:2128 cps/web.py:3006
#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr "请填写所有字段"
#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
#: cps/web.py:2161
#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
#: cps/web.py:2277
msgid "register"
msgstr "注册"
#: cps/web.py:2149 cps/web.py:3222
#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr "发生一个未知错误,请稍后再试。"
#: cps/web.py:2152
#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr "您的邮箱不能用来注册"
#: cps/web.py:2155
#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "确认邮件已经发送到您的邮箱。"
#: cps/web.py:2158
#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr "这个用户名或者邮箱已经被使用。"
#: cps/web.py:2175 cps/web.py:2271
#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "您现在已以'%(nickname)s'身份登录"
#: cps/web.py:2180
#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr "用户名或密码错误"
#: cps/web.py:2186 cps/web.py:2207
#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr "登录"
#: cps/web.py:2219 cps/web.py:2250
#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr "找不到Token"
#: cps/web.py:2227 cps/web.py:2258
#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr "Token已过期"
#: cps/web.py:2235
#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr "成功!请返回您的设备"
#: cps/web.py:2285
#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr "请先配置SMTP邮箱..."
#: cps/web.py:2289
#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列"
#: cps/web.py:2293
#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "发送这本书的时候出现错误: %(res)s"
#: cps/web.py:2295 cps/web.py:3060
#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr "请先配置您的kindle邮箱..."
#: cps/web.py:2339
#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "此书已被添加到书架: %(sname)s"
#: cps/web.py:2350
#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr "指定的书架无效"
#: cps/web.py:2355
#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr "您没有添加书籍到书架 %(name)s 的权限"
#: cps/web.py:2360
#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr "用户没有编辑公开书架的权限"
#: cps/web.py:2378
#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr "书籍已经在书架 %(name)s 中了"
#: cps/web.py:2392
#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr "书籍已经被添加到书架 %(sname)s 中'"
#: cps/web.py:2394
#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr "无法添加书籍到书架: %(sname)s"
#: cps/web.py:2431
#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr "此书已从书架 %(sname)s 中删除"
#: cps/web.py:2437
#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限"
#: cps/web.py:2457 cps/web.py:2481
#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr "已存在书架 '%(title)s'。"
#: cps/web.py:2462
#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr "书架 %(title)s 已被创建"
#: cps/web.py:2464 cps/web.py:2492
#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr "发生错误"
#: cps/web.py:2465 cps/web.py:2467
#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr "创建书架"
#: cps/web.py:2490
#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr "书架 %(title)s 已被修改"
#: cps/web.py:2493 cps/web.py:2495
#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr "编辑书架"
#: cps/web.py:2516
#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr "成功删除书架 %(name)s"
#: cps/web.py:2538
#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr "书架: '%(name)s'"
#: cps/web.py:2541
#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr "打开书架出错。书架不存在或不可访问"
#: cps/web.py:2572
#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr "修改书架 '%(name)s' 顺序"
#: cps/web.py:2601 cps/web.py:3012
#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr "邮箱不在有效域中'"
#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s 的资料"
#: cps/web.py:2642
#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr "找到一个已有账号使用这个邮箱。"
#: cps/web.py:2645
#: cps/web.py:2766
msgid "Profile updated"
msgstr "资料已更新"
#: cps/web.py:2657
msgid "Unknown"
msgstr "未知"
#: cps/web.py:2671
#: cps/web.py:2794
msgid "Admin page"
msgstr "管理页"
#: cps/web.py:2749 cps/web.py:2922
#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr "Calibre-Web配置已更新"
#: cps/templates/admin.html:91 cps/web.py:2762
#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr "UI配置"
#: cps/web.py:2780
#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr "可选的Google Drive依赖导入缺失"
#: cps/web.py:2783
#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr "client_secrets.json文件缺失或不可读"
#: cps/web.py:2788 cps/web.py:2815
#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr "没有为web应用配置client_secrets.json"
#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
#: cps/web.py:2954
#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
#: cps/web.py:3077
msgid "Basic Configuration"
msgstr "基本配置"
#: cps/web.py:2841
#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr "key文件位置无效请输入正确路径"
#: cps/web.py:2853
#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr "证书文件位置无效,请输入正确路径"
#: cps/web.py:2895
#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr "日志文件位置无效,请输入正确路径"
#: cps/web.py:2934
#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr "DB位置无效请输入正确路径"
#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr "添加新用户"
#: cps/web.py:3020
#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr "用户 '%(user)s' 已被创建"
#: cps/web.py:3024
#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr "此邮箱或昵称的账号已经存在。"
#: cps/web.py:3048 cps/web.py:3062
#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr "已更新邮件服务器设置"
#: cps/web.py:3055
#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr "测试邮件已经被成功发到 %(kindlemail)s"
#: cps/web.py:3058
#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr "发送测试邮件出错了: %(res)s"
#: cps/web.py:3063
#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr "编辑邮箱服务器设置"
#: cps/web.py:3088
#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr "用户 '%(nick)s' 已被删除"
#: cps/web.py:3197
#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr "用户 '%(nick)s' 已被更新"
#: cps/web.py:3200
#: cps/web.py:3323
msgid "An unknown error occured."
msgstr "发生未知错误。"
#: cps/web.py:3202
#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr "编辑用户 %(nick)s"
#: cps/web.py:3219
#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr "用户 %(user)s 的密码已重置"
#: cps/web.py:3239
#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr "打开电子书出错。文件不存在或不可访问"
#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr "编辑元数据"
#: cps/web.py:3284 cps/web.py:3576
#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr "不能上传后缀为 '%(ext)s' 的文件到此服务器"
#: cps/web.py:3288 cps/web.py:3580
#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr "要上传的文件必须有一个后缀"
#: cps/web.py:3300 cps/web.py:3600
#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr "创建路径 %(path)s 失败(权限拒绝)。"
#: cps/web.py:3305
#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr "保存文件 %(file)s 失败。"
#: cps/web.py:3321
#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr "已添加 %(ext)s 格式到 %(book)s"
#: cps/web.py:3339
#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3346
#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr "保存封面文件 %(cover)s 失败。"
#: cps/web.py:3349
#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr "封面文件不是一个有效的图片文件"
#: cps/web.py:3362 cps/web.py:3366
#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr "未知"
#: cps/web.py:3388
#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr "封面不是一个jpg文件无法保存"
#: cps/web.py:3555
#: cps/web.py:3554
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr "编辑书籍出错,详情请检查日志文件"
#: cps/web.py:3605
#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr "存储文件 %(file)s 失败(权限拒绝)。"
#: cps/web.py:3610
#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr "删除文件 %(file)s 失败(权限拒绝)。"
#: cps/web.py:3692
#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr "文件 %(file)s 已上传"
#: cps/web.py:3722
#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr "转换的源或目的格式缺失"
#: cps/web.py:3732
#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr "书籍已经被成功加入 %(book_format)s 的转换队列"
#: cps/web.py:3736
#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr "转换此书时出现错误: %(res)s"
#: cps/worker.py:215 cps/worker.py:387
#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr "已开始"
#: cps/worker.py:237
#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr "找不到转换工具 $(converter)s"
#: cps/worker.py:272
#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr "电子书转换器失败: %(error)s"
#: cps/worker.py:283
#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s"
#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
msgid "Finished"
msgstr "已完成"
#: cps/worker.py:344 cps/worker.py:363
#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr "等待中"
#: cps/worker.py:351
#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr "此邮件已经通过Calibre-Web发送"
#: cps/worker.py:472
#: cps/worker.py:388 cps/worker.py:484
msgid "Finished"
msgstr "已完成"
#: cps/worker.py:476
msgid "Failed"
msgstr "失败"
#: cps/templates/admin.html:4
#: cps/templates/admin.html:6
msgid "User list"
msgstr "用户列表"
#: cps/templates/admin.html:7
#: cps/templates/admin.html:9
msgid "Nickname"
msgstr "昵称"
#: cps/templates/admin.html:8
#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
#: cps/templates/admin.html:9
#: cps/templates/admin.html:11
msgid "Kindle"
msgstr ""
#: cps/templates/admin.html:10
#: cps/templates/admin.html:12
msgid "DLS"
msgstr ""
#: cps/templates/admin.html:11 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr "管理"
#: cps/templates/admin.html:12 cps/templates/detail.html:22
#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr "下载"
#: cps/templates/admin.html:13 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr "上传"
#: cps/templates/admin.html:14
#: cps/templates/admin.html:16
msgid "Edit"
msgstr "编辑"
#: cps/templates/admin.html:32
#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr "SMTP邮件服务器设置"
#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr "SMTP地址"
#: cps/templates/admin.html:36
#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr "SMTP端口"
#: cps/templates/admin.html:37
#: cps/templates/admin.html:44
msgid "SSL"
msgstr ""
#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr "SMTP用户名"
#: cps/templates/admin.html:39
#: cps/templates/admin.html:46
msgid "From mail"
msgstr "来自邮箱"
#: cps/templates/admin.html:48
#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr "修改SMTP设置"
#: cps/templates/admin.html:50
#: cps/templates/admin.html:62
msgid "Configuration"
msgstr "配置"
#: cps/templates/admin.html:53
#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr "Calibre DB目录"
#: cps/templates/admin.html:57
#: cps/templates/admin.html:69
msgid "Log level"
msgstr "日志级别"
#: cps/templates/admin.html:61
#: cps/templates/admin.html:73
msgid "Port"
msgstr "端口"
#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr "每页书籍数"
#: cps/templates/admin.html:71
#: cps/templates/admin.html:83
msgid "Uploading"
msgstr "上传"
#: cps/templates/admin.html:75
#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr "匿名浏览"
#: cps/templates/admin.html:79
#: cps/templates/admin.html:91
msgid "Public registration"
msgstr "开放注册"
#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr "远程登录"
#: cps/templates/admin.html:93
#: cps/templates/admin.html:106
msgid "Administration"
msgstr "管理"
#: cps/templates/admin.html:94
msgid "Current commit timestamp"
msgstr "当前提交时间戳"
#: cps/templates/admin.html:95
msgid "Newest commit timestamp"
msgstr "最新提交时间戳"
#: cps/templates/admin.html:97
#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr "重新连接到Calibre数据库"
#: cps/templates/admin.html:98
#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr "重启 Calibre-Web"
#: cps/templates/admin.html:99
#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr "停止 Calibre-Web"
#: cps/templates/admin.html:100
#: cps/templates/admin.html:115
msgid "Update"
msgstr ""
#: cps/templates/admin.html:119
msgid "Version"
msgstr ""
#: cps/templates/admin.html:120
msgid "Details"
msgstr ""
#: cps/templates/admin.html:126
msgid "Current version"
msgstr ""
#: cps/templates/admin.html:132
msgid "Check for update"
msgstr "检查更新"
#: cps/templates/admin.html:101
#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr "执行更新"
#: cps/templates/admin.html:110
#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr "您确定要重启 Calibre-Web 吗?"
#: cps/templates/admin.html:115 cps/templates/admin.html:129
#: cps/templates/admin.html:150 cps/templates/shelf.html:59
#: cps/templates/admin.html:150 cps/templates/admin.html:164
#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr "确定"
#: cps/templates/admin.html:116 cps/templates/admin.html:130
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@ -831,11 +866,11 @@ msgstr "确定"
msgid "Back"
msgstr "后退"
#: cps/templates/admin.html:128
#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr "您确定要关闭 Calibre-Web 吗?"
#: cps/templates/admin.html:141
#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr "正在更新,请不要刷新页面"
@ -916,9 +951,7 @@ msgid "Rating"
msgstr "评分"
#: cps/templates/book_edit.html:87
msgid ""
"Cover URL (jpg, cover is downloaded and stored in database, field is "
"afterwards empty again)"
msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)"
msgstr "封面URL(jpg,封面会被下载被保存在数据库中,然后字段会被重新清空)"
#: cps/templates/book_edit.html:91
@ -1849,9 +1882,7 @@ msgstr "最近下载"
#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
#~ msgid ""
#~ "Rename author from: '%(src)s' to "
#~ "'%(dest)s' failed with error: %(error)s"
#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s"
#~ msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s"
#~ msgid "Password for user %(user)s reset"
@ -1875,3 +1906,9 @@ msgstr "最近下载"
#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server"
#~ msgstr "不能上传后缀为 \"%(ext)s\" 的文件到此服务器"
#~ msgid "Current commit timestamp"
#~ msgstr "当前提交时间戳"
#~ msgid "Newest commit timestamp"
#~ msgstr "最新提交时间戳"

@ -41,6 +41,8 @@ from flask import (Flask, render_template, request, Response, redirect,
url_for, send_from_directory, make_response, g, flash,
abort, Markup)
from flask import __version__ as flaskVersion
from werkzeug import __version__ as werkzeugVersion
from jinja2 import __version__ as jinja2Version
import cache_buster
import ub
from ub import config
@ -85,6 +87,10 @@ import hashlib
from redirect import redirect_back
import time
import server
try:
import cPickle
except ImportError:
import pickle as cPickle
try:
from urllib.parse import quote
@ -103,10 +109,12 @@ current_milli_time = lambda: int(round(time.time() * 1000))
# Global variables
gdrive_watch_callback_token = 'target=calibreweb-watch_files'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx',
'fb2'}
# READER_EXTENSIONS = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
# READER_EXTENSIONS = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt', 'rar', 'cbr'])
EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx',
'fb2', 'html', 'rtf', 'odt'}
EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'}
# EXTENSIONS_READER = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
def md5(fname):
hash_md5 = hashlib.md5()
@ -183,7 +191,6 @@ logging.getLogger("book_formats").addHandler(file_handler)
logging.getLogger("book_formats").setLevel(config.config_log_level)
Principal(app)
babel = Babel(app)
import uploader
@ -195,6 +202,9 @@ lm.anonymous_user = ub.Anonymous
app.secret_key = os.getenv('SECRET_KEY', 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT')
db.setup_db()
with open(os.path.join(config.get_main_dir, 'cps/translations/iso639.pickle'), 'rb') as f:
language_table = cPickle.load(f)
def is_gdrive_ready():
return os.path.exists(os.path.join(config.get_main_dir, 'settings.yaml')) and \
@ -418,7 +428,7 @@ def yesno(value, yes, no):
def canread(ext):
if isinstance(ext, db.Data):
ext = ext.format
return ext.lower() in READER_EXTENSIONS'''
return ext.lower() in EXTENSIONS_READER'''
def admin_required(f):
@ -582,7 +592,7 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session
new_element = db_object(add_element, add_element)
elif db_type == 'custom':
new_element = db_object(value=add_element)
else: # db_type should be tag, or languages
else: # db_type should be tag, language or publisher
new_element = db_object(add_element)
db_session.add(new_element)
# add element to book
@ -1036,9 +1046,14 @@ def get_tags_json():
def get_languages_json():
if request.method == "GET":
query = request.args.get('q').lower()
languages = speaking_language()
entries = [s for s in languages if query in s.name.lower()]
json_dumps = json.dumps([dict(name=r.name) for r in entries])
# languages = speaking_language()
languages = language_table[get_locale()]
entries_start = [s for key, s in languages.items() if s.lower().startswith(query.lower())]
if len(entries_start) < 5:
entries = [s for key,s in languages.items() if query in s.lower()]
entries_start.extend(entries[0:(5-len(entries_start))])
entries_start = list(set(entries_start))
json_dumps = json.dumps([dict(name=r) for r in entries_start[0:5]])
return json_dumps
@ -1149,7 +1164,7 @@ def get_update_status():
if 'committer' in update_data and 'message' in update_data:
status['success'] = True
status['message'] = _(u'A new update is available. Click on the button below update to the latest version.')
status['message'] = _(u'A new update is available. Click on the button below to update to the latest version.')
new_commit_date = datetime.datetime.strptime(
update_data['committer']['date'], '%Y-%m-%dT%H:%M:%SZ') - tz
@ -1652,8 +1667,10 @@ def stats():
categorys = db.session.query(db.Tags).count()
series = db.session.query(db.Series).count()
versions = uploader.book_formats.get_versions()
versions['Babel'] = 'v'+babelVersion
versions['Sqlalchemy'] = 'v'+sqlalchemyVersion
versions['Babel'] = 'v' + babelVersion
versions['Sqlalchemy'] = 'v' + sqlalchemyVersion
versions['Werkzeug'] = 'v' + werkzeugVersion
versions['Jinja2'] = 'v' + jinja2Version
versions['Flask'] = 'v'+flaskVersion
versions['Flask Login'] = 'v'+flask_loginVersion
versions['Flask Principal'] = 'v'+flask_principalVersion
@ -1689,7 +1706,7 @@ def delete_book(book_id, book_format):
modify_database_object([u''], book.tags, db.Tags, db.session, 'tags')
modify_database_object([u''], book.series, db.Series, db.session, 'series')
modify_database_object([u''], book.languages, db.Languages, db.session, 'languages')
modify_database_object([u''], book.publishers, db.Publishers, db.session, 'series')
modify_database_object([u''], book.publishers, db.Publishers, db.session, 'publishers')
cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
for c in cc:
@ -2406,18 +2423,22 @@ def add_to_shelf(shelf_id, book_id):
if shelf is None:
app.logger.info("Invalid shelf specified")
if not request.is_xhr:
flash(_(u"Invalid shelf specified"), category="error")
return redirect(url_for('index'))
return "Invalid shelf specified", 400
if not shelf.is_public and not shelf.user_id == int(current_user.id):
app.logger.info("Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name)
if not request.is_xhr:
flash(_(u"Sorry you are not allowed to add a book to the the shelf: %(shelfname)s", shelfname=shelf.name),
category="error")
return redirect(url_for('index'))
return "Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name, 403
if shelf.is_public and not current_user.role_edit_shelfs():
app.logger.info("User is not allowed to edit public shelves")
if not request.is_xhr:
flash(_(u"You are not allowed to edit public shelves"), category="error")
return redirect(url_for('index'))
return "User is not allowed to edit public shelves", 403
@ -2426,6 +2447,7 @@ def add_to_shelf(shelf_id, book_id):
if book_in_shelf:
app.logger.info("Book is already part of the shelf: %s" % shelf.name)
if not request.is_xhr:
flash(_(u"Book is already part of the shelf: %(shelfname)s", shelfname=shelf.name), category="error")
return redirect(url_for('index'))
return "Book is already part of the shelf: %s" % shelf.name, 400
@ -2440,7 +2462,10 @@ def add_to_shelf(shelf_id, book_id):
ub.session.commit()
if not request.is_xhr:
flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success")
return redirect(request.environ["HTTP_REFERER"])
if "HTTP_REFERER" in request.environ:
return redirect(request.environ["HTTP_REFERER"])
else:
return redirect(url_for('index'))
return "", 204
@ -2637,7 +2662,12 @@ def show_shelf(shelf_id):
ub.BookShelf.order.asc()).all()
for book in books_in_shelf:
cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first()
result.append(cur_book)
if cur_book:
result.append(cur_book)
else:
app.logger.info('Not existing book %s in shelf %s deleted' % (book.book_id, shelf.id))
ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete()
ub.session.commit()
return render_title_template('shelf.html', entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name),
shelf=shelf, page="shelf")
else:
@ -2993,7 +3023,8 @@ def configuration_helper(origin):
if content.config_logfile != to_save["config_logfile"]:
# check valid path, only path or file
if os.path.dirname(to_save["config_logfile"]):
if os.path.exists(os.path.dirname(to_save["config_logfile"])):
if os.path.exists(os.path.dirname(to_save["config_logfile"])) and \
os.path.basename(to_save["config_logfile"]) and not os.path.isdir(to_save["config_logfile"]):
content.config_logfile = to_save["config_logfile"]
else:
ub.session.commit()
@ -3041,8 +3072,6 @@ def configuration_helper(origin):
gdriveError=gdriveError, goodreads=goodreads_support, rarfile_support=rar_support,
title=_(u"Basic Configuration"), page="config")
if reboot_required:
# ub.session.close()
# ub.engine.dispose()
# stop Server
server.Server.setRestartTyp(True)
server.Server.stopServer()
@ -3092,6 +3121,11 @@ def new_user():
content.sidebar_view += ub.SIDEBAR_AUTHOR
if "show_detail_random" in to_save:
content.sidebar_view += ub.DETAIL_RANDOM
if "show_sorted" in to_save:
content.sidebar_view += ub.SIDEBAR_SORTED
if "show_recent" in to_save:
content.sidebar_view += ub.SIDEBAR_RECENT
content.role = 0
if "admin_role" in to_save:
content.role = content.role + ub.ROLE_ADMIN
@ -3345,22 +3379,19 @@ def edit_book(book_id):
return redirect(url_for("index"))
for indx in range(0, len(book.languages)):
try:
book.languages[indx].language_name = LC.parse(book.languages[indx].lang_code).get_language_name(
get_locale())
except UnknownLocaleError:
book.languages[indx].language_name = _(isoLanguages.get(part3=book.languages[indx].lang_code).name)
book.languages[indx].language_name = language_table[get_locale()][book.languages[indx].lang_code]
for authr in book.authors:
author_names.append(authr.name.replace('|', ','))
# Option for showing convertbook button
valid_source_formats=list()
if config.config_ebookconverter == 2:
display_convertbtn = True
else:
display_convertbtn = False
for file in book.data:
if file.format.lower() in EXTENSIONS_CONVERT:
valid_source_formats.append(file.format.lower())
# Determine what formats don't already exist
allowed_conversion_formats = ALLOWED_EXTENSIONS.copy()
allowed_conversion_formats = EXTENSIONS_CONVERT.copy()
for file in book.data:
try:
allowed_conversion_formats.remove(file.format.lower())
@ -3372,12 +3403,9 @@ def edit_book(book_id):
# Show form
if request.method != 'POST':
return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc,
title=_(u"edit metadata"), page="editbook", display_convertbtn=display_convertbtn,
conversion_formats=allowed_conversion_formats)
# Update book
edited_books_id = set()
title=_(u"edit metadata"), page="editbook",
conversion_formats=allowed_conversion_formats,
source_formats=valid_source_formats)
# Check and handle Uploaded file
if 'btn-upload-format' in request.files:
requested_file = request.files['btn-upload-format']
@ -3385,7 +3413,7 @@ def edit_book(book_id):
if requested_file.filename != '':
if '.' in requested_file.filename:
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
if file_ext not in ALLOWED_EXTENSIONS:
if file_ext not in EXTENSIONS_UPLOAD:
flash(_("File extension '%(ext)s' is not allowed to be uploaded to this server", ext=file_ext),
category="error")
return redirect(url_for('show_book', book_id=book.id))
@ -3432,7 +3460,6 @@ def edit_book(book_id):
# check for empty request
if requested_file.filename != '':
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
# file_name = book.path.rsplit('/', 1)[-1]
filepath = os.path.normpath(os.path.join(config.config_calibre_dir, book.path))
saved_filename = os.path.join(filepath, 'cover.' + file_ext)
@ -3456,10 +3483,14 @@ def edit_book(book_id):
to_save = request.form.to_dict()
try:
# Update book
edited_books_id = set()
#handle book title
if book.title != to_save["book_title"]:
book.title = to_save["book_title"]
edited_books_id.add(book.id)
# handle author(s)
input_authors = to_save["author_name"].split('&')
input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors))
# we have all author names now
@ -3495,22 +3526,22 @@ def edit_book(book_id):
if book.series_index != to_save["series_index"]:
book.series_index = to_save["series_index"]
# Handle book comments/description
if len(book.comments):
book.comments[0].text = to_save["description"]
else:
book.comments.append(db.Comments(text=to_save["description"], book=book.id))
# Handle book tags
input_tags = to_save["tags"].split(',')
input_tags = list(map(lambda it: it.strip(), input_tags))
modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags')
# Handle book series
input_series = [to_save["series"].strip()]
input_series = [x for x in input_series if x != '']
modify_database_object(input_series, book.series, db.Series, db.session, 'series')
input_languages = to_save["languages"].split(',')
input_languages = list(map(lambda it: it.strip().lower(), input_languages))
if to_save["pubdate"]:
try:
book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d")
@ -3518,24 +3549,25 @@ def edit_book(book_id):
book.pubdate = db.Books.DEFAULT_PUBDATE
else:
book.pubdate = db.Books.DEFAULT_PUBDATE
'''if len(book.publishers):
if to_save["publisher"] != book.publishers[0].name:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')
else:
modify_database_object(to_save["publisher"], book.publishers, db.Publishers, db.session, 'series')'''
# retranslate displayed text to language codes
languages = db.session.query(db.Languages).all()
# handle book languages
input_languages = to_save["languages"].split(',')
# input_languages = list(map(lambda it: it.strip().lower(), input_languages))
input_languages = [x.strip().lower() for x in input_languages if x != '']
input_l = []
for lang in languages:
invers_lang_table = [x.lower() for x in language_table[get_locale()].values()]
for lang in input_languages:
try:
lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower()
except UnknownLocaleError:
lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower()
for inp_lang in input_languages:
if inp_lang == lang.name:
input_l.append(lang.lang_code)
res = list(language_table[get_locale()].keys())[invers_lang_table.index(lang)]
input_l.append(res)
except ValueError:
app.logger.error('%s is not a valid language' % lang)
flash(_(u"%(langname)s is not a valid language", langname=lang), category="error")
modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages')
if to_save["rating"].strip():
@ -3676,7 +3708,7 @@ def upload():
# check if file extension is correct
if '.' in requested_file.filename:
file_ext = requested_file.filename.rsplit('.', 1)[-1].lower()
if file_ext not in ALLOWED_EXTENSIONS:
if file_ext not in EXTENSIONS_UPLOAD:
flash(
_("File extension '%(ext)s' is not allowed to be uploaded to this server",
ext=file_ext), category="error")

@ -232,10 +232,25 @@ class WorkerThread(threading.Thread):
bookid = self.queue[self.current]['bookid']
format_old_ext = u'.' + self.queue[self.current]['settings']['old_book_format'].lower()
format_new_ext = u'.' + self.queue[self.current]['settings']['new_book_format'].lower()
# check to see if destination format already exists -
# if it does - mark the conversion task as complete and return a success
# this will allow send to kindle workflow to continue to work
if os.path.isfile(file_path + format_new_ext):
web.app.logger.info("Book id %d already converted to %s", bookid, format_new_ext)
cur_book = web.db.session.query(web.db.Books).filter(web.db.Books.id == bookid).first()
self.queue[self.current]['path'] = file_path
self.queue[self.current]['title'] = cur_book.title
self._handleSuccess()
return file_path + format_new_ext
else:
web.app.logger.info("Book id %d - target format of %s does not existing. Moving forward with convert.", bookid, format_new_ext)
# check if converter-executable is existing
if not os.path.exists(web.ub.config.config_converterpath):
self._handleError(_(u"Convertertool %(converter)s not found", converter=web.ub.config.config_converterpath))
return
try:
# check which converter to use kindlegen is "1"
if format_old_ext == '.epub' and format_new_ext == '.mobi':
@ -313,11 +328,7 @@ class WorkerThread(threading.Thread):
self.queue[self.current]['title'] = cur_book.title
if web.ub.config.config_use_google_drive:
os.remove(file_path + format_old_ext)
self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
self.UIqueue[self.current]['status'] = _('Finished')
self.UIqueue[self.current]['progress'] = "100 %"
self.UIqueue[self.current]['runtime'] = self._formatRuntime(
datetime.now() - self.queue[self.current]['starttime'])
self._handleSuccess()
return file_path + format_new_ext
else:
error_message = format_new_ext.upper() + ' format not found on disk'
@ -434,12 +445,7 @@ class WorkerThread(threading.Thread):
self.asyncSMTP.login(str(obj['settings']["mail_login"]), str(obj['settings']["mail_password"]))
self.asyncSMTP.sendmail(obj['settings']["mail_from"], obj['recipent'], msg)
self.asyncSMTP.quit()
self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
self.UIqueue[self.current]['status'] = _('Finished')
self.UIqueue[self.current]['progress'] = "100 %"
self.UIqueue[self.current]['runtime'] = self._formatRuntime(
datetime.now() - self.queue[self.current]['starttime'])
self._handleSuccess()
sys.stderr = org_stderr
except (MemoryError) as e:
@ -452,8 +458,6 @@ class WorkerThread(threading.Thread):
self._handleError(u'Error sending email: ' + e.strerror)
return None
def _formatRuntime(self, runtime):
self.UIqueue[self.current]['rt'] = runtime.total_seconds()
val = re.split('\:|\.', str(runtime))[0:3]
@ -475,8 +479,15 @@ class WorkerThread(threading.Thread):
datetime.now() - self.queue[self.current]['starttime'])
self.UIqueue[self.current]['message'] = error_message
def _handleSuccess(self):
self.queue[self.current]['status'] = STAT_FINISH_SUCCESS
self.UIqueue[self.current]['status'] = _('Finished')
self.UIqueue[self.current]['progress'] = "100 %"
self.UIqueue[self.current]['runtime'] = self._formatRuntime(
datetime.now() - self.queue[self.current]['starttime'])
# Enable logging of smtp lib debug output
class StderrLogger(object):
buffer = ''

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-09-08 14:49+0200\n"
"POT-Creation-Date: 2018-09-14 21:11+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -113,705 +113,750 @@ msgstr ""
msgid "Unrar binary file not found"
msgstr ""
#: cps/web.py:1114
#: cps/web.py:1112 cps/web.py:2778
msgid "Unknown"
msgstr ""
#: cps/web.py:1121 cps/web.py:1152
msgid "HTTP Error"
msgstr ""
#: cps/web.py:1123 cps/web.py:1154
msgid "Connection error"
msgstr ""
#: cps/web.py:1125 cps/web.py:1156
msgid "Timeout while establishing connection"
msgstr ""
#: cps/web.py:1127 cps/web.py:1158
msgid "General error"
msgstr ""
#: cps/web.py:1133
msgid "Unexpected data while reading update information"
msgstr ""
#: cps/web.py:1140
msgid "No update available. You already have the latest version installed"
msgstr ""
#: cps/web.py:1165
msgid "A new update is available. Click on the button below to update to the latest version."
msgstr ""
#: cps/web.py:1215
msgid "Could not fetch update information"
msgstr ""
#: cps/web.py:1230
msgid "Requesting update package"
msgstr ""
#: cps/web.py:1115
#: cps/web.py:1231
msgid "Downloading update package"
msgstr ""
#: cps/web.py:1116
#: cps/web.py:1232
msgid "Unzipping update package"
msgstr ""
#: cps/web.py:1117
#: cps/web.py:1233
msgid "Files are replaced"
msgstr ""
#: cps/web.py:1118
#: cps/web.py:1234
msgid "Database connections are closed"
msgstr ""
#: cps/web.py:1119
#: cps/web.py:1235
msgid "Server is stopped"
msgstr ""
#: cps/web.py:1120
#: cps/web.py:1236
msgid "Update finished, please press okay and reload page"
msgstr ""
#: cps/web.py:1140
#: cps/web.py:1256
msgid "Recently Added Books"
msgstr ""
#: cps/web.py:1150
#: cps/web.py:1266
msgid "Newest Books"
msgstr ""
#: cps/web.py:1162
#: cps/web.py:1278
msgid "Oldest Books"
msgstr ""
#: cps/web.py:1174
#: cps/web.py:1290
msgid "Books (A-Z)"
msgstr ""
#: cps/web.py:1185
#: cps/web.py:1301
msgid "Books (Z-A)"
msgstr ""
#: cps/web.py:1214
#: cps/web.py:1330
msgid "Hot Books (most downloaded)"
msgstr ""
#: cps/web.py:1227
#: cps/web.py:1343
msgid "Best rated books"
msgstr ""
#: cps/templates/index.xml:36 cps/web.py:1239
#: cps/templates/index.xml:36 cps/web.py:1355
msgid "Random Books"
msgstr ""
#: cps/web.py:1254
#: cps/web.py:1370
msgid "Author list"
msgstr ""
#: cps/web.py:1266 cps/web.py:1329 cps/web.py:1484 cps/web.py:2036
#: cps/web.py:1382 cps/web.py:1445 cps/web.py:1600 cps/web.py:2152
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
#: cps/templates/index.xml:73 cps/web.py:1313
#: cps/templates/index.xml:73 cps/web.py:1429
msgid "Series list"
msgstr ""
#: cps/web.py:1327
#: cps/web.py:1443
#, python-format
msgid "Series: %(serie)s"
msgstr ""
#: cps/web.py:1354
#: cps/web.py:1470
msgid "Available languages"
msgstr ""
#: cps/web.py:1371
#: cps/web.py:1487
#, python-format
msgid "Language: %(name)s"
msgstr ""
#: cps/templates/index.xml:66 cps/web.py:1382
#: cps/templates/index.xml:66 cps/web.py:1498
msgid "Category list"
msgstr ""
#: cps/web.py:1396
#: cps/web.py:1512
#, python-format
msgid "Category: %(name)s"
msgstr ""
#: cps/templates/layout.html:71 cps/web.py:1535
#: cps/templates/layout.html:71 cps/web.py:1651
msgid "Tasks"
msgstr ""
#: cps/web.py:1565
#: cps/web.py:1681
msgid "Statistics"
msgstr ""
#: cps/web.py:1670
#: cps/web.py:1786
msgid "Callback domain is not verified, please follow steps to verify domain in google developer console"
msgstr ""
#: cps/web.py:1746
#: cps/web.py:1861
msgid "Server restarted, please reload page"
msgstr ""
#: cps/web.py:1749
#: cps/web.py:1864
msgid "Performing shutdown of server, please close window"
msgstr ""
#: cps/web.py:1767
#: cps/web.py:1883
msgid "Update done"
msgstr ""
#: cps/web.py:1837
#: cps/web.py:1953
msgid "Published after "
msgstr ""
#: cps/web.py:1844
#: cps/web.py:1960
msgid "Published before "
msgstr ""
#: cps/web.py:1858
#: cps/web.py:1974
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
#: cps/web.py:1860
#: cps/web.py:1976
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
#: cps/web.py:1919 cps/web.py:1928
#: cps/web.py:2035 cps/web.py:2044
msgid "search"
msgstr ""
#: cps/templates/index.xml:44 cps/templates/index.xml:48
#: cps/templates/layout.html:146 cps/web.py:1995
#: cps/templates/layout.html:146 cps/web.py:2111
msgid "Read Books"
msgstr ""
#: cps/templates/index.xml:52 cps/templates/index.xml:56
#: cps/templates/layout.html:148 cps/web.py:1998
#: cps/templates/layout.html:148 cps/web.py:2114
msgid "Unread Books"
msgstr ""
#: cps/web.py:2046 cps/web.py:2048 cps/web.py:2050 cps/web.py:2062
#: cps/web.py:2162 cps/web.py:2164 cps/web.py:2166 cps/web.py:2178
msgid "Read a Book"
msgstr ""
#: cps/web.py:2128 cps/web.py:3006
#: cps/web.py:2244 cps/web.py:3129
msgid "Please fill out all fields!"
msgstr ""
#: cps/web.py:2129 cps/web.py:2150 cps/web.py:2154 cps/web.py:2159
#: cps/web.py:2161
#: cps/web.py:2245 cps/web.py:2266 cps/web.py:2270 cps/web.py:2275
#: cps/web.py:2277
msgid "register"
msgstr ""
#: cps/web.py:2149 cps/web.py:3222
#: cps/web.py:2265 cps/web.py:3345
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/web.py:2152
#: cps/web.py:2268
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:2155
#: cps/web.py:2271
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:2158
#: cps/web.py:2274
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:2175 cps/web.py:2271
#: cps/web.py:2291 cps/web.py:2387
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:2180
#: cps/web.py:2296
msgid "Wrong Username or Password"
msgstr ""
#: cps/web.py:2186 cps/web.py:2207
#: cps/web.py:2302 cps/web.py:2323
msgid "login"
msgstr ""
#: cps/web.py:2219 cps/web.py:2250
#: cps/web.py:2335 cps/web.py:2366
msgid "Token not found"
msgstr ""
#: cps/web.py:2227 cps/web.py:2258
#: cps/web.py:2343 cps/web.py:2374
msgid "Token has expired"
msgstr ""
#: cps/web.py:2235
#: cps/web.py:2351
msgid "Success! Please return to your device"
msgstr ""
#: cps/web.py:2285
#: cps/web.py:2401
msgid "Please configure the SMTP mail settings first..."
msgstr ""
#: cps/web.py:2289
#: cps/web.py:2405
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
#: cps/web.py:2293
#: cps/web.py:2409
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
#: cps/web.py:2295 cps/web.py:3060
#: cps/web.py:2411 cps/web.py:3183
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:2339
#: cps/web.py:2455
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2350
#: cps/web.py:2466
msgid "Invalid shelf specified"
msgstr ""
#: cps/web.py:2355
#: cps/web.py:2471
#, python-format
msgid "You are not allowed to add a book to the the shelf: %(name)s"
msgstr ""
#: cps/web.py:2360
#: cps/web.py:2476
msgid "User is not allowed to edit public shelves"
msgstr ""
#: cps/web.py:2378
#: cps/web.py:2494
#, python-format
msgid "Books are already part of the shelf: %(name)s"
msgstr ""
#: cps/web.py:2392
#: cps/web.py:2508
#, python-format
msgid "Books have been added to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2394
#: cps/web.py:2510
#, python-format
msgid "Could not add books to shelf: %(sname)s"
msgstr ""
#: cps/web.py:2431
#: cps/web.py:2547
#, python-format
msgid "Book has been removed from shelf: %(sname)s"
msgstr ""
#: cps/web.py:2437
#: cps/web.py:2553
#, python-format
msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s"
msgstr ""
#: cps/web.py:2457 cps/web.py:2481
#: cps/web.py:2573 cps/web.py:2597
#, python-format
msgid "A shelf with the name '%(title)s' already exists."
msgstr ""
#: cps/web.py:2462
#: cps/web.py:2578
#, python-format
msgid "Shelf %(title)s created"
msgstr ""
#: cps/web.py:2464 cps/web.py:2492
#: cps/web.py:2580 cps/web.py:2608
msgid "There was an error"
msgstr ""
#: cps/web.py:2465 cps/web.py:2467
#: cps/web.py:2581 cps/web.py:2583
msgid "create a shelf"
msgstr ""
#: cps/web.py:2490
#: cps/web.py:2606
#, python-format
msgid "Shelf %(title)s changed"
msgstr ""
#: cps/web.py:2493 cps/web.py:2495
#: cps/web.py:2609 cps/web.py:2611
msgid "Edit a shelf"
msgstr ""
#: cps/web.py:2516
#: cps/web.py:2632
#, python-format
msgid "successfully deleted shelf %(name)s"
msgstr ""
#: cps/web.py:2538
#: cps/web.py:2659
#, python-format
msgid "Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2541
#: cps/web.py:2662
msgid "Error opening shelf. Shelf does not exist or is not accessible"
msgstr ""
#: cps/web.py:2572
#: cps/web.py:2693
#, python-format
msgid "Change order of Shelf: '%(name)s'"
msgstr ""
#: cps/web.py:2601 cps/web.py:3012
#: cps/web.py:2722 cps/web.py:3135
msgid "E-mail is not from valid domain"
msgstr ""
#: cps/web.py:2603 cps/web.py:2644 cps/web.py:2647
#: cps/web.py:2724 cps/web.py:2765 cps/web.py:2768
#, python-format
msgid "%(name)s's profile"
msgstr ""
#: cps/web.py:2642
#: cps/web.py:2763
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/web.py:2645
#: cps/web.py:2766
msgid "Profile updated"
msgstr ""
#: cps/web.py:2657
msgid "Unknown"
msgstr ""
#: cps/web.py:2671
#: cps/web.py:2794
msgid "Admin page"
msgstr ""
#: cps/web.py:2749 cps/web.py:2922
#: cps/web.py:2872 cps/web.py:3045
msgid "Calibre-Web configuration updated"
msgstr ""
#: cps/templates/admin.html:91 cps/web.py:2762
#: cps/templates/admin.html:100 cps/web.py:2885
msgid "UI Configuration"
msgstr ""
#: cps/web.py:2780
#: cps/web.py:2903
msgid "Import of optional Google Drive requirements missing"
msgstr ""
#: cps/web.py:2783
#: cps/web.py:2906
msgid "client_secrets.json is missing or not readable"
msgstr ""
#: cps/web.py:2788 cps/web.py:2815
#: cps/web.py:2911 cps/web.py:2938
msgid "client_secrets.json is not configured for web application"
msgstr ""
#: cps/templates/admin.html:90 cps/web.py:2818 cps/web.py:2844 cps/web.py:2856
#: cps/web.py:2898 cps/web.py:2913 cps/web.py:2930 cps/web.py:2937
#: cps/web.py:2954
#: cps/templates/admin.html:99 cps/web.py:2941 cps/web.py:2967 cps/web.py:2979
#: cps/web.py:3021 cps/web.py:3036 cps/web.py:3053 cps/web.py:3060
#: cps/web.py:3077
msgid "Basic Configuration"
msgstr ""
#: cps/web.py:2841
#: cps/web.py:2964
msgid "Keyfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2853
#: cps/web.py:2976
msgid "Certfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2895
#: cps/web.py:3018
msgid "Logfile location is not valid, please enter correct path"
msgstr ""
#: cps/web.py:2934
#: cps/web.py:3057
msgid "DB location is not valid, please enter correct path"
msgstr ""
#: cps/templates/admin.html:31 cps/web.py:3008 cps/web.py:3014 cps/web.py:3030
#: cps/templates/admin.html:33 cps/web.py:3131 cps/web.py:3137 cps/web.py:3153
msgid "Add new user"
msgstr ""
#: cps/web.py:3020
#: cps/web.py:3143
#, python-format
msgid "User '%(user)s' created"
msgstr ""
#: cps/web.py:3024
#: cps/web.py:3147
msgid "Found an existing account for this e-mail address or nickname."
msgstr ""
#: cps/web.py:3048 cps/web.py:3062
#: cps/web.py:3171 cps/web.py:3185
msgid "E-mail server settings updated"
msgstr ""
#: cps/web.py:3055
#: cps/web.py:3178
#, python-format
msgid "Test e-mail successfully send to %(kindlemail)s"
msgstr ""
#: cps/web.py:3058
#: cps/web.py:3181
#, python-format
msgid "There was an error sending the Test e-mail: %(res)s"
msgstr ""
#: cps/web.py:3063
#: cps/web.py:3186
msgid "Edit e-mail server settings"
msgstr ""
#: cps/web.py:3088
#: cps/web.py:3211
#, python-format
msgid "User '%(nick)s' deleted"
msgstr ""
#: cps/web.py:3197
#: cps/web.py:3320
#, python-format
msgid "User '%(nick)s' updated"
msgstr ""
#: cps/web.py:3200
#: cps/web.py:3323
msgid "An unknown error occured."
msgstr ""
#: cps/web.py:3202
#: cps/web.py:3325
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
#: cps/web.py:3219
#: cps/web.py:3342
#, python-format
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/web.py:3239
#: cps/web.py:3362
msgid "Error opening eBook. File does not exist or file is not accessible"
msgstr ""
#: cps/web.py:3270 cps/web.py:3546 cps/web.py:3551 cps/web.py:3706
#: cps/web.py:3390 cps/web.py:3667 cps/web.py:3672 cps/web.py:3827
msgid "edit metadata"
msgstr ""
#: cps/web.py:3284 cps/web.py:3576
#: cps/web.py:3401 cps/web.py:3697
#, python-format
msgid "File extension '%(ext)s' is not allowed to be uploaded to this server"
msgstr ""
#: cps/web.py:3288 cps/web.py:3580
#: cps/web.py:3405 cps/web.py:3701
msgid "File to be uploaded must have an extension"
msgstr ""
#: cps/web.py:3300 cps/web.py:3600
#: cps/web.py:3417 cps/web.py:3721
#, python-format
msgid "Failed to create path %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3305
#: cps/web.py:3422
#, python-format
msgid "Failed to store file %(file)s."
msgstr ""
#: cps/web.py:3321
#: cps/web.py:3438
#, python-format
msgid "File format %(ext)s added to %(book)s"
msgstr ""
#: cps/web.py:3339
#: cps/web.py:3455
#, python-format
msgid "Failed to create path for cover %(path)s (Permission denied)."
msgstr ""
#: cps/web.py:3346
#: cps/web.py:3462
#, python-format
msgid "Failed to store cover-file %(cover)s."
msgstr ""
#: cps/web.py:3349
#: cps/web.py:3465
msgid "Cover-file is not a valid image file"
msgstr ""
#: cps/web.py:3362 cps/web.py:3366
#: cps/web.py:3482 cps/web.py:3486
msgid "unknown"
msgstr ""
#: cps/web.py:3388
#: cps/web.py:3508
msgid "Cover is not a jpg file, can't save"
msgstr ""
#: cps/web.py:3555
#: cps/web.py:3554
#, python-format
msgid "%(langname)s is not a valid language"
msgstr ""
#: cps/web.py:3676
msgid "Error editing book, please check logfile for details"
msgstr ""
#: cps/web.py:3605
#: cps/web.py:3726
#, python-format
msgid "Failed to store file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3610
#: cps/web.py:3731
#, python-format
msgid "Failed to delete file %(file)s (Permission denied)."
msgstr ""
#: cps/web.py:3692
#: cps/web.py:3813
#, python-format
msgid "File %(file)s uploaded"
msgstr ""
#: cps/web.py:3722
#: cps/web.py:3843
msgid "Source or destination format for conversion missing"
msgstr ""
#: cps/web.py:3732
#: cps/web.py:3853
#, python-format
msgid "Book successfully queued for converting to %(book_format)s"
msgstr ""
#: cps/web.py:3736
#: cps/web.py:3857
#, python-format
msgid "There was an error converting this book: %(res)s"
msgstr ""
#: cps/worker.py:215 cps/worker.py:387
#: cps/worker.py:215 cps/worker.py:398
msgid "Started"
msgstr ""
#: cps/worker.py:237
#: cps/worker.py:251
#, python-format
msgid "Convertertool %(converter)s not found"
msgstr ""
#: cps/worker.py:272
#: cps/worker.py:287
#, python-format
msgid "Ebook-converter failed: %(error)s"
msgstr ""
#: cps/worker.py:283
#: cps/worker.py:298
#, python-format
msgid "Kindlegen failed with Error %(error)s. Message: %(message)s"
msgstr ""
#: cps/worker.py:317 cps/worker.py:377 cps/worker.py:438
msgid "Finished"
msgstr ""
#: cps/worker.py:344 cps/worker.py:363
#: cps/worker.py:355 cps/worker.py:374
msgid "Waiting"
msgstr ""
#: cps/worker.py:351
#: cps/worker.py:362
msgid "This e-mail has been sent via Calibre-Web."
msgstr ""
#: cps/worker.py:472
#: cps/worker.py:388 cps/worker.py:484
msgid "Finished"
msgstr ""
#: cps/worker.py:476
msgid "Failed"
msgstr ""
#: cps/templates/admin.html:4
#: cps/templates/admin.html:6
msgid "User list"
msgstr ""
#: cps/templates/admin.html:7
#: cps/templates/admin.html:9
msgid "Nickname"
msgstr ""
#: cps/templates/admin.html:8
#: cps/templates/admin.html:10
msgid "E-mail"
msgstr ""
#: cps/templates/admin.html:9
#: cps/templates/admin.html:11
msgid "Kindle"
msgstr ""
#: cps/templates/admin.html:10
#: cps/templates/admin.html:12
msgid "DLS"
msgstr ""
#: cps/templates/admin.html:11 cps/templates/layout.html:74
#: cps/templates/admin.html:13 cps/templates/layout.html:74
msgid "Admin"
msgstr ""
#: cps/templates/admin.html:12 cps/templates/detail.html:22
#: cps/templates/admin.html:14 cps/templates/detail.html:22
#: cps/templates/detail.html:31
msgid "Download"
msgstr ""
#: cps/templates/admin.html:13 cps/templates/layout.html:64
#: cps/templates/admin.html:15 cps/templates/layout.html:64
msgid "Upload"
msgstr ""
#: cps/templates/admin.html:14
#: cps/templates/admin.html:16
msgid "Edit"
msgstr ""
#: cps/templates/admin.html:32
#: cps/templates/admin.html:39
msgid "SMTP e-mail server settings"
msgstr ""
#: cps/templates/admin.html:35 cps/templates/email_edit.html:11
#: cps/templates/admin.html:42 cps/templates/email_edit.html:11
msgid "SMTP hostname"
msgstr ""
#: cps/templates/admin.html:36
#: cps/templates/admin.html:43
msgid "SMTP port"
msgstr ""
#: cps/templates/admin.html:37
#: cps/templates/admin.html:44
msgid "SSL"
msgstr ""
#: cps/templates/admin.html:38 cps/templates/email_edit.html:27
#: cps/templates/admin.html:45 cps/templates/email_edit.html:27
msgid "SMTP login"
msgstr ""
#: cps/templates/admin.html:39
#: cps/templates/admin.html:46
msgid "From mail"
msgstr ""
#: cps/templates/admin.html:48
#: cps/templates/admin.html:56
msgid "Change SMTP settings"
msgstr ""
#: cps/templates/admin.html:50
#: cps/templates/admin.html:62
msgid "Configuration"
msgstr ""
#: cps/templates/admin.html:53
#: cps/templates/admin.html:65
msgid "Calibre DB dir"
msgstr ""
#: cps/templates/admin.html:57
#: cps/templates/admin.html:69
msgid "Log level"
msgstr ""
#: cps/templates/admin.html:61
#: cps/templates/admin.html:73
msgid "Port"
msgstr ""
#: cps/templates/admin.html:67 cps/templates/config_view_edit.html:23
#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23
msgid "Books per page"
msgstr ""
#: cps/templates/admin.html:71
#: cps/templates/admin.html:83
msgid "Uploading"
msgstr ""
#: cps/templates/admin.html:75
#: cps/templates/admin.html:87
msgid "Anonymous browsing"
msgstr ""
#: cps/templates/admin.html:79
#: cps/templates/admin.html:91
msgid "Public registration"
msgstr ""
#: cps/templates/admin.html:83 cps/templates/remote_login.html:4
#: cps/templates/admin.html:95 cps/templates/remote_login.html:4
msgid "Remote login"
msgstr ""
#: cps/templates/admin.html:93
#: cps/templates/admin.html:106
msgid "Administration"
msgstr ""
#: cps/templates/admin.html:94
msgid "Current commit timestamp"
#: cps/templates/admin.html:107
msgid "Reconnect to Calibre DB"
msgstr ""
#: cps/templates/admin.html:95
msgid "Newest commit timestamp"
#: cps/templates/admin.html:108
msgid "Restart Calibre-Web"
msgstr ""
#: cps/templates/admin.html:97
msgid "Reconnect to Calibre DB"
#: cps/templates/admin.html:109
msgid "Stop Calibre-Web"
msgstr ""
#: cps/templates/admin.html:98
msgid "Restart Calibre-Web"
#: cps/templates/admin.html:115
msgid "Update"
msgstr ""
#: cps/templates/admin.html:99
msgid "Stop Calibre-Web"
#: cps/templates/admin.html:119
msgid "Version"
msgstr ""
#: cps/templates/admin.html:120
msgid "Details"
msgstr ""
#: cps/templates/admin.html:126
msgid "Current version"
msgstr ""
#: cps/templates/admin.html:100
#: cps/templates/admin.html:132
msgid "Check for update"
msgstr ""
#: cps/templates/admin.html:101
#: cps/templates/admin.html:133
msgid "Perform Update"
msgstr ""
#: cps/templates/admin.html:110
#: cps/templates/admin.html:145
msgid "Do you really want to restart Calibre-Web?"
msgstr ""
#: cps/templates/admin.html:115 cps/templates/admin.html:129
#: cps/templates/admin.html:150 cps/templates/shelf.html:59
#: cps/templates/admin.html:150 cps/templates/admin.html:164
#: cps/templates/admin.html:184 cps/templates/shelf.html:59
msgid "Ok"
msgstr ""
#: cps/templates/admin.html:116 cps/templates/admin.html:130
#: cps/templates/admin.html:151 cps/templates/admin.html:165
#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200
#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:164
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75
@ -820,11 +865,11 @@ msgstr ""
msgid "Back"
msgstr ""
#: cps/templates/admin.html:128
#: cps/templates/admin.html:163
msgid "Do you really want to stop Calibre-Web?"
msgstr ""
#: cps/templates/admin.html:141
#: cps/templates/admin.html:175
msgid "Updating, please do not reload page"
msgstr ""

@ -15,6 +15,6 @@ six==1.10.0
goodreads>=0.3.2
python-Levenshtein>=0.12.0
# other
lxml==3.7.2
lxml>=3.8.0
rarfile>=2.7
natsort>=2.2.0

@ -1,2 +0,0 @@
$Format:%H$
$Format:%cI$
Loading…
Cancel
Save