Skip to content
Snippets Groups Projects
Commit 808ac694 authored by Shizzz's avatar Shizzz
Browse files

Читалка

Добавил возможность чтения книг в веб. Пока это является простым
преобразованием FB2, отображается сразу вся страница и книга не
сохраняется в кеш.
parent 9f3f3ae8
No related branches found
No related tags found
No related merge requests found
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:key name="note-link" match="fb:section" use="@id"/>
<xsl:template match="/*">
<html>
<head>
<xsl:if test="fb:description/fb:title-info/fb:lang = 'ru'">
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"/>
</xsl:if>
<title>
<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
</title>
<style type="text/x-oeb1-css">
A { color : #0002CC }
A:HOVER { color : #BF0000 }
BODY { background-color : #FEFEFE; color : #000000; font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify }
H1{ font-size : 160%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Black; background-color : #E7E7E7; margin-left : 0px; page-break-before : always; }
H2{ font-size : 130%; font-style : normal; font-weight : bold; text-align : left; background-color : #EEEEEE; border : 1px solid Gray; page-break-before : always; }
H3{ font-size : 110%; font-style : normal; font-weight : bold; text-align : left; background-color : #F1F1F1; border : 1px solid Silver;}
H4{ font-size : 100%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
H5{ font-size : 100%; font-style : italic; font-weight : bold; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
H6{ font-size : 100%; font-style : italic; font-weight : normal; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
SMALL{ font-size : 80% }
BLOCKQUOTE{ margin-left :4em; margin-top:1em; margin-right:0.2em;}
HR{ color : Black }
UL{margin-left: 0}
.epigraph{width:50%; margin-left : 35%;}
</style>
</head>
<body>
<h4 align="center">
<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
</h4>
<xsl:for-each select="fb:description/fb:title-info/fb:coverpage/fb:image">
<xsl:call-template name="image"/>
</xsl:for-each>
<xsl:for-each select="fb:description/fb:title-info/fb:annotation">
<div>
<xsl:call-template name="annotation"/>
</div>
<hr/>
</xsl:for-each>
<!-- BUILD TOC -->
<ul>
<xsl:apply-templates select="fb:body" mode="toc"/>
</ul>
<hr/>
<!-- BUILD BOOK -->
<xsl:for-each select="fb:body">
<xsl:if test="position()!=1">
<hr/>
</xsl:if>
<xsl:if test="@name">
<h4 align="center">
<xsl:value-of select="@name"/>
</h4>
</xsl:if>
<!-- <xsl:apply-templates /> -->
<xsl:apply-templates/>
</xsl:for-each>
</body>
</html>
</xsl:template>
<!-- author template -->
<xsl:template name="author">
<xsl:value-of select="fb:first-name"/>
<xsl:text disable-output-escaping="no">&#032;</xsl:text>
<xsl:value-of select="fb:middle-name"/>&#032;
<xsl:text disable-output-escaping="no">&#032;</xsl:text>
<xsl:value-of select="fb:last-name"/>
<br/>
</xsl:template>
<!-- secuence template -->
<xsl:template name="sequence">
<LI/>
<xsl:value-of select="@name"/>
<xsl:if test="@number">
<xsl:text disable-output-escaping="no">,&#032;#</xsl:text>
<xsl:value-of select="@number"/>
</xsl:if>
<xsl:if test="fb:sequence">
<ul>
<xsl:for-each select="fb:sequence">
<xsl:call-template name="sequence"/>
</xsl:for-each>
</ul>
</xsl:if>
<!-- <br/> -->
</xsl:template>
<!-- toc template -->
<xsl:template match="fb:section|fb:body" mode="toc">
<xsl:choose>
<xsl:when test="name()='body' and position()=1 and not(fb:title)">
<xsl:apply-templates select="fb:section" mode="toc"/>
</xsl:when>
<xsl:otherwise>
<li>
<a href="#TOC_{generate-id()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a>
<xsl:if test="fb:section">
<ul><xsl:apply-templates select="fb:section" mode="toc"/></ul>
</xsl:if>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- description -->
<xsl:template match="fb:description">
<xsl:apply-templates/>
</xsl:template>
<!-- body -->
<xsl:template match="fb:body">
<div><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="fb:section">
<a name="TOC_{generate-id()}"></a>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:template>
<!-- section/title -->
<xsl:template match="fb:section/fb:title|fb:poem/fb:title">
<xsl:choose>
<xsl:when test="count(ancestor::node()) &lt; 9">
<xsl:element name="{concat('h',count(ancestor::node())-3)}">
<a name="TOC_{generate-id()}"></a>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="h6">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- section/title -->
<xsl:template match="fb:body/fb:title">
<h1><xsl:apply-templates mode="title"/></h1>
</xsl:template>
<xsl:template match="fb:title/fb:p">
<xsl:apply-templates/><xsl:text disable-output-escaping="no">&#032;</xsl:text><br/>
</xsl:template>
<!-- subtitle -->
<xsl:template match="fb:subtitle">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<h5>
<xsl:apply-templates/>
</h5>
</xsl:template>
<!-- p -->
<xsl:template match="fb:p">
<div align="justify"><xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if> &#160;&#160;&#160;<xsl:apply-templates/></div>
</xsl:template>
<!-- strong -->
<xsl:template match="fb:strong">
<b><xsl:apply-templates/></b>
</xsl:template>
<!-- emphasis -->
<xsl:template match="fb:emphasis">
<i> <xsl:apply-templates/></i>
</xsl:template>
<!-- style -->
<xsl:template match="fb:style">
<span class="{@name}"><xsl:apply-templates/></span>
</xsl:template>
<!-- empty-line -->
<xsl:template match="fb:empty-line">
<br/>
</xsl:template>
<!-- link -->
<xsl:template match="fb:a">
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
<xsl:attribute name="title">
<xsl:choose>
<xsl:when test="starts-with(@xlink:href,'#')"><xsl:value-of select="key('note-link',substring-after(@xlink:href,'#'))/fb:p"/></xsl:when>
<xsl:otherwise><xsl:value-of select="key('note-link',@xlink:href)/fb:p"/></xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:choose>
<xsl:when test="(@type) = 'note'">
<sup>
<xsl:apply-templates/>
</sup>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- annotation -->
<xsl:template name="annotation">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<h3>Annotation</h3>
<xsl:apply-templates/>
</xsl:template>
<!-- epigraph -->
<xsl:template match="fb:epigraph">
<blockquote class="epigraph">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</blockquote>
</xsl:template>
<!-- epigraph/text-author -->
<xsl:template match="fb:epigraph/fb:text-author">
<blockquote>
<i><xsl:apply-templates/></i>
</blockquote>
</xsl:template>
<!-- cite -->
<xsl:template match="fb:cite">
<blockquote>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</blockquote>
</xsl:template>
<!-- cite/text-author -->
<xsl:template match="fb:text-author">
<blockquote>
<i> <xsl:apply-templates/></i></blockquote>
</xsl:template>
<!-- date -->
<xsl:template match="fb:date">
<xsl:choose>
<xsl:when test="not(@value)">
&#160;&#160;&#160;<xsl:apply-templates/>
<br/>
</xsl:when>
<xsl:otherwise>
&#160;&#160;&#160;<xsl:value-of select="@value"/>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- poem -->
<xsl:template match="fb:poem">
<blockquote>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</blockquote>
</xsl:template>
<!-- stanza -->
<xsl:template match="fb:stanza">
<xsl:apply-templates/>
<br/>
</xsl:template>
<!-- v -->
<xsl:template match="fb:v">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/><br/>
</xsl:template>
<!-- image -->
<xsl:template match="fb:image" name="image">
<div align="center">
<img border="1">
<xsl:choose>
<xsl:when test="starts-with(@xlink:href,'#')">
<xsl:attribute name="src"><xsl:text>data:</xsl:text><xsl:variable name="href" select="substring-after(@xlink:href,'#')" /><set variable="href" expression="substring-after(@xlink:href,'#')"/><xsl:value-of select="//fb:binary[@id=$href]/@content-type" disable-output-escaping="yes" /><xsl:text>;base64,</xsl:text><!--<xsl:value-of select="substring-after(@xlink:href,'#')"/>--><xsl:value-of select="//fb:binary[@id=$href]" disable-output-escaping="yes"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</img>
</div>
</xsl:template>
</xsl:stylesheet>
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import codecs import codecs
import base64 import base64
import io import io
import subprocess import subprocess
import lxml.etree as ET
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
...@@ -286,3 +286,66 @@ def ConvertFB2(request, book_id, convert_type): ...@@ -286,3 +286,66 @@ def ConvertFB2(request, book_id, convert_type):
pass pass
return response return response
def ReadFB2(request, book_id):
""" Загрузка книги """
book = Book.objects.get(id=book_id)
if config.SOPDS_AUTH and request.user.is_authenticated():
bookshelf.objects.get_or_create(user=request.user, book=book)
full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path)
if book.cat_type==opdsdb.CAT_INP:
# Убираем из пути INPX файл
inpx_path, zip_name = os.path.split(full_path)
path, inpx_file = os.path.split(inpx_path)
full_path = os.path.join(path,zip_name)
if config.SOPDS_TITLE_AS_FILENAME:
transname=utils.translit(book.title+'.'+book.format)
else:
transname=utils.translit(book.filename)
transname = utils.to_ascii(transname)
dlfilename=transname
content_type = mime_detector.fmt(book.format)
response = HttpResponse()
response["Content-Type"]='text/html; charset=utf-8'
z = None
fz = None
s = None
book_size = book.filesize
if book.cat_type==opdsdb.CAT_NORMAL:
file_path=os.path.join(full_path, book.filename)
book_size=os.path.getsize(file_path)
try:
fo=codecs.open(file_path, "rb")
except FileNotFoundError:
raise Http404
s=fo.read()
elif book.cat_type in [opdsdb.CAT_ZIP, opdsdb.CAT_INP]:
try:
fz=codecs.open(full_path, "rb")
except FileNotFoundError:
raise Http404
z = zipfile.ZipFile(fz, 'r', allowZip64=True)
book_size=z.getinfo(book.filename).file_size
fo= z.open(book.filename)
dom = ET.parse(fo)
xslt = ET.parse('%s/FB2_22_xhtml.xsl' % os.path.dirname(os.path.realpath(__file__)))
transform = ET.XSLT(xslt)
newdom = transform(dom)
book_content = ET.tostring(newdom, pretty_print=True)
response.write(book_content)
fo.close()
if z: z.close()
if fz: fz.close()
return response
\ No newline at end of file
No preview for this file type
...@@ -8,99 +8,99 @@ msgid "" ...@@ -8,99 +8,99 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-28 21:12+0300\n" "POT-Creation-Date: 2017-03-23 22:58+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%" "%100>=11 && n%100<=14)? 2 : 3);\n"
"100>=11 && n%100<=14)? 2 : 3);\n"
#: .\opds_catalog\feeds.py:129 #: opds_catalog/feeds.py:131
#, python-format #, python-format
msgid "All books by %(author)s" msgid "All books by %(author)s"
msgstr "Все книги автора %(author)s" msgstr "Все книги автора %(author)s"
#: .\opds_catalog\feeds.py:141 #: opds_catalog/feeds.py:143
msgid "Book doublicates" msgid "Book doublicates"
msgstr "Дубликаты книги" msgstr "Дубликаты книги"
#: .\opds_catalog\feeds.py:162 .\opds_catalog\feeds.py:247 #: opds_catalog/feeds.py:164 opds_catalog/feeds.py:249
#: .\opds_catalog\feeds.py:249 .\opds_catalog\tests\test_feeds.py:24 #: opds_catalog/feeds.py:251 opds_catalog/tests/test_feeds.py:24
msgid "By catalogs" msgid "By catalogs"
msgstr "По каталогам" msgstr "По каталогам"
#: .\opds_catalog\feeds.py:163 .\opds_catalog\tests\test_feeds.py:25 #: opds_catalog/feeds.py:165 opds_catalog/tests/test_feeds.py:25
#, python-format #, python-format
msgid "Catalogs: %(catalogs)s, books: %(books)s." msgid "Catalogs: %(catalogs)s, books: %(books)s."
msgstr "Каталогов: %(catalogs)s, книг: %(books)s." msgstr "Каталогов: %(catalogs)s, книг: %(books)s."
#: .\opds_catalog\feeds.py:164 #: opds_catalog/feeds.py:166
msgid "By authors" msgid "By authors"
msgstr "По авторам" msgstr "По авторам"
#: .\opds_catalog\feeds.py:165 .\opds_catalog\tests\test_feeds.py:26 #: opds_catalog/feeds.py:167 opds_catalog/tests/test_feeds.py:26
#, python-format #, python-format
msgid "Authors: %(authors)s." msgid "Authors: %(authors)s."
msgstr "Авторов: %(authors)s." msgstr "Авторов: %(authors)s."
#: .\opds_catalog\feeds.py:166 #: opds_catalog/feeds.py:168
msgid "By titles" msgid "By titles"
msgstr "По наименованиям" msgstr "По наименованиям"
#: .\opds_catalog\feeds.py:167 #: opds_catalog/feeds.py:169
#, python-format #, python-format
msgid "Books: %(books)s." msgid "Books: %(books)s."
msgstr "Книг: %(books)s." msgstr "Книг: %(books)s."
#: .\opds_catalog\feeds.py:168 #: opds_catalog/feeds.py:170
msgid "By genres" msgid "By genres"
msgstr "По жанрам" msgstr "По жанрам"
#: .\opds_catalog\feeds.py:169 .\opds_catalog\tests\test_feeds.py:27 #: opds_catalog/feeds.py:171 opds_catalog/tests/test_feeds.py:27
#, python-format #, python-format
msgid "Genres: %(genres)s." msgid "Genres: %(genres)s."
msgstr "Жанров: %(genres)s." msgstr "Жанров: %(genres)s."
#: .\opds_catalog\feeds.py:170 #: opds_catalog/feeds.py:172
msgid "By series" msgid "By series"
msgstr "По сериям" msgstr "По сериям"
#: .\opds_catalog\feeds.py:171 #: opds_catalog/feeds.py:173
#, python-format #, python-format
msgid "Series: %(series)s." msgid "Series: %(series)s."
msgstr "Серий: %(series)s." msgstr "Серий: %(series)s."
#: .\opds_catalog\feeds.py:175 #: opds_catalog/feeds.py:177
#, python-format #, python-format
msgid "%(username)s Book shelf" msgid "%(username)s Book shelf"
msgstr "Книжная полка (%(username)s)" msgstr "Книжная полка (%(username)s)"
#: .\opds_catalog\feeds.py:176 #: opds_catalog/feeds.py:178
#, python-format #, python-format
msgid "%(username)s books readed: %(bookshelf)s." msgid "%(username)s books readed: %(bookshelf)s."
msgstr "Книг прочитано (%(username)s): %(bookshelf)s." msgstr "Книг прочитано (%(username)s): %(bookshelf)s."
#: .\opds_catalog\feeds.py:308 .\opds_catalog\feeds.py:554 #: opds_catalog/feeds.py:318 opds_catalog/feeds.py:568
#, python-format #, python-format
msgid "<b>Authors: </b>%(authors)s<br/>" msgid "<b>Authors: </b>%(authors)s<br/>"
msgstr "<b>Авторов: </b>%(authors)s<br/>" msgstr "<b>Авторов: </b>%(authors)s<br/>"
#: .\opds_catalog\feeds.py:309 .\opds_catalog\feeds.py:555 #: opds_catalog/feeds.py:319 opds_catalog/feeds.py:569
#, python-format #, python-format
msgid "<b>Genres: </b>%(genres)s<br/>" msgid "<b>Genres: </b>%(genres)s<br/>"
msgstr "<b>Жанров: </b>%(genres)s<br/>" msgstr "<b>Жанров: </b>%(genres)s<br/>"
#: .\opds_catalog\feeds.py:310 .\opds_catalog\feeds.py:556 #: opds_catalog/feeds.py:320 opds_catalog/feeds.py:570
#, python-format #, python-format
msgid "<b>Series: </b>%(series)s<br/>" msgid "<b>Series: </b>%(series)s<br/>"
msgstr "<b>Серий: </b>%(series)s<br/>" msgstr "<b>Серий: </b>%(series)s<br/>"
#: .\opds_catalog\feeds.py:311 .\opds_catalog\feeds.py:557 #: opds_catalog/feeds.py:321 opds_catalog/feeds.py:571
#, python-format #, python-format
msgid "" msgid ""
"<b>File: </b>%(filename)s<br/><b>File size: </b>%(filesize)s<br/><b>Changes " "<b>File: </b>%(filename)s<br/><b>File size: </b>%(filesize)s<br/><b>Changes "
...@@ -109,155 +109,154 @@ msgstr "" ...@@ -109,155 +109,154 @@ msgstr ""
"<b>Файл: </b>%(filename)s<br/><b>Размер файла: </b>%(filesize)s<br/><b>Дата " "<b>Файл: </b>%(filename)s<br/><b>Размер файла: </b>%(filesize)s<br/><b>Дата "
"изменения: </b>%(docdate)s<br/>" "изменения: </b>%(docdate)s<br/>"
#: .\opds_catalog\feeds.py:344 .\opds_catalog\tests\test_feeds.py:60 #: opds_catalog/feeds.py:354 opds_catalog/tests/test_feeds.py:60
msgid "Search by titles" msgid "Search by titles"
msgstr "Поиск по наименованиям" msgstr "Поиск по наименованиям"
#: .\opds_catalog\feeds.py:344 #: opds_catalog/feeds.py:354
msgid "Search books by title" msgid "Search books by title"
msgstr "Поиск книг по наименованию" msgstr "Поиск книг по наименованию"
#: .\opds_catalog\feeds.py:345 #: opds_catalog/feeds.py:355
msgid "Search by authors" msgid "Search by authors"
msgstr "Поиск авторов" msgstr "Поиск авторов"
#: .\opds_catalog\feeds.py:345 #: opds_catalog/feeds.py:355
msgid "Search authors by name" msgid "Search authors by name"
msgstr "Поиск авторов по имени" msgstr "Поиск авторов по имени"
#: .\opds_catalog\feeds.py:346 #: opds_catalog/feeds.py:356
msgid "Search series" msgid "Search series"
msgstr "Поиск серий" msgstr "Поиск серий"
#: .\opds_catalog\feeds.py:378 #: opds_catalog/feeds.py:388
msgid "Books found" msgid "Books found"
msgstr "Найдены книги" msgstr "Найдены книги"
#: .\opds_catalog\feeds.py:378 #: opds_catalog/feeds.py:388
msgid "doubles hide" msgid "doubles hide"
msgstr "дубликаты скрыты" msgstr "дубликаты скрыты"
#: .\opds_catalog\feeds.py:378 #: opds_catalog/feeds.py:388
msgid "doubles show" msgid "doubles show"
msgstr "дубликаты показаны" msgstr "дубликаты показаны"
#: .\opds_catalog\feeds.py:558 #: opds_catalog/feeds.py:572
#, python-format #, python-format
msgid "<b>Doubles count: </b>%(doubles)s<br/>" msgid "<b>Doubles count: </b>%(doubles)s<br/>"
msgstr "<b>Число дубликатов: </b>%(doubles)s<br/>" msgstr "<b>Число дубликатов: </b>%(doubles)s<br/>"
#: .\opds_catalog\feeds.py:572 #: opds_catalog/feeds.py:586
msgid "Series by authors select" msgid "Series by authors select"
msgstr "Выбор серий у автора" msgstr "Выбор серий у автора"
#: .\opds_catalog\feeds.py:593 #: opds_catalog/feeds.py:607
msgid "Books by series" msgid "Books by series"
msgstr "Книги по сериям" msgstr "Книги по сериям"
#: .\opds_catalog\feeds.py:593 #: opds_catalog/feeds.py:607
msgid "Books by author and series" msgid "Books by author and series"
msgstr "Книги по авторам и сериям" msgstr "Книги по авторам и сериям"
#: .\opds_catalog\feeds.py:594 #: opds_catalog/feeds.py:608
msgid "Books outside series" msgid "Books outside series"
msgstr "Книги вне серий" msgstr "Книги вне серий"
#: .\opds_catalog\feeds.py:594 #: opds_catalog/feeds.py:608
msgid "Books by author outside series" msgid "Books by author outside series"
msgstr "Книги автора вне серий" msgstr "Книги автора вне серий"
#: .\opds_catalog\feeds.py:595 #: opds_catalog/feeds.py:609
msgid "Books by alphabet" msgid "Books by alphabet"
msgstr "Книги по алфавиту" msgstr "Книги по алфавиту"
#: .\opds_catalog\feeds.py:595 #: opds_catalog/feeds.py:609
msgid "Books by author alphabetical order" msgid "Books by author alphabetical order"
msgstr "Книги автора в алфавитном порядке" msgstr "Книги автора в алфавитном порядке"
#: .\opds_catalog\feeds.py:626 #: opds_catalog/feeds.py:640
msgid "Authors found" msgid "Authors found"
msgstr "Найдены авторы" msgstr "Найдены авторы"
#: .\opds_catalog\feeds.py:679 .\opds_catalog\feeds.py:757 #: opds_catalog/feeds.py:693 opds_catalog/feeds.py:771
#, python-format #, python-format
msgid "Books count: %s" msgid "Books count: %s"
msgstr "Всего: %s книг" msgstr "Всего: %s книг"
#: .\opds_catalog\feeds.py:695 #: opds_catalog/feeds.py:709
msgid "Series found" msgid "Series found"
msgstr "Найдены серии" msgstr "Найдены серии"
#: .\opds_catalog\feeds.py:781 #: opds_catalog/feeds.py:795
msgid "Select language" msgid "Select language"
msgstr "Выбор алфавита" msgstr "Выбор алфавита"
#: .\opds_catalog\feeds.py:793 .\opds_catalog\tests\test_feeds.py:106 #: opds_catalog/feeds.py:807 opds_catalog/tests/test_feeds.py:106
#: .\opds_catalog\tests\test_feeds.py:119 #: opds_catalog/tests/test_feeds.py:119 opds_catalog/tests/test_feeds.py:130
#: .\opds_catalog\tests\test_feeds.py:130
msgid "Cyrillic" msgid "Cyrillic"
msgstr "Кириллица (РУС)" msgstr "Кириллица (РУС)"
#: .\opds_catalog\feeds.py:794 .\opds_catalog\tests\test_feeds.py:107 #: opds_catalog/feeds.py:808 opds_catalog/tests/test_feeds.py:107
msgid "Latin" msgid "Latin"
msgstr "Латинница (LAT)" msgstr "Латинница (LAT)"
#: .\opds_catalog\feeds.py:795 .\opds_catalog\tests\test_feeds.py:108 #: opds_catalog/feeds.py:809 opds_catalog/tests/test_feeds.py:108
msgid "Digits" msgid "Digits"
msgstr "Цифры (0..9)" msgstr "Цифры (0..9)"
#: .\opds_catalog\feeds.py:796 .\opds_catalog\tests\test_feeds.py:109 #: opds_catalog/feeds.py:810 opds_catalog/tests/test_feeds.py:109
msgid "Other symbols" msgid "Other symbols"
msgstr "Другие символы" msgstr "Другие символы"
#: .\opds_catalog\feeds.py:797 .\opds_catalog\tests\test_feeds.py:110 #: opds_catalog/feeds.py:811 opds_catalog/tests/test_feeds.py:110
msgid "Show all" msgid "Show all"
msgstr "Показать все" msgstr "Показать все"
#: .\opds_catalog\feeds.py:827 #: opds_catalog/feeds.py:841
msgid "Select books by substring" msgid "Select books by substring"
msgstr "Поиск книг по подстроке" msgstr "Поиск книг по подстроке"
#: .\opds_catalog\feeds.py:864 .\opds_catalog\feeds.py:1030 #: opds_catalog/feeds.py:878 opds_catalog/feeds.py:1044
#, python-format #, python-format
msgid "Found: %s books" msgid "Found: %s books"
msgstr "Найдено %s книг" msgstr "Найдено %s книг"
#: .\opds_catalog\feeds.py:885 #: opds_catalog/feeds.py:899
msgid "Select authors by substring" msgid "Select authors by substring"
msgstr "Поиск авторов по подстроке" msgstr "Поиск авторов по подстроке"
#: .\opds_catalog\feeds.py:922 #: opds_catalog/feeds.py:936
#, python-format #, python-format
msgid "Found: %s authors" msgid "Found: %s authors"
msgstr "Найдено %s авторов" msgstr "Найдено %s авторов"
#: .\opds_catalog\feeds.py:943 #: opds_catalog/feeds.py:957
msgid "Select series by substring" msgid "Select series by substring"
msgstr "Поиск серий по подстроке" msgstr "Поиск серий по подстроке"
#: .\opds_catalog\feeds.py:980 #: opds_catalog/feeds.py:994
#, python-format #, python-format
msgid "Found: %s series" msgid "Found: %s series"
msgstr "Найдено %s серий" msgstr "Найдено %s серий"
#: .\opds_catalog\feeds.py:1001 #: opds_catalog/feeds.py:1015
#, python-format #, python-format
msgid "Select genres (%s)" msgid "Select genres (%s)"
msgstr "Выбор жанра (%s)" msgstr "Выбор жанра (%s)"
#: .\opds_catalog\feeds.py:1001 #: opds_catalog/feeds.py:1015
msgid "section" msgid "section"
msgstr "секция" msgstr "секция"
#: .\opds_catalog\feeds.py:1001 #: opds_catalog/feeds.py:1015
msgid "subsection" msgid "subsection"
msgstr "подсекция" msgstr "подсекция"
#: .\opds_catalog\sopdscan.py:232 #: opds_catalog/sopdscan.py:232
msgid "Unknown author" msgid "Unknown author"
msgstr "Неизвестный автор" msgstr "Неизвестный автор"
#: .\opds_catalog\tests\test_feeds.py:78 #: opds_catalog/tests/test_feeds.py:78
#, python-format #, python-format
msgid "All books by %(full_name)s" msgid "All books by %(full_name)s"
msgstr "Все книги автора %(full_name)s" msgstr "Все книги автора %(full_name)s"
......
...@@ -6,7 +6,6 @@ urlpatterns = [ ...@@ -6,7 +6,6 @@ urlpatterns = [
url(r'^catalogs/$',feeds.CatalogsFeed(), name='catalogs'), url(r'^catalogs/$',feeds.CatalogsFeed(), name='catalogs'),
url(r'^catalogs/(?P<cat_id>[0-9]+)/$',feeds.CatalogsFeed(), name='cat_tree'), url(r'^catalogs/(?P<cat_id>[0-9]+)/$',feeds.CatalogsFeed(), name='cat_tree'),
url(r'^catalogs/(?P<cat_id>[0-9]+)/(?P<page>[0-9]+)/$',feeds.CatalogsFeed(), name='cat_page'), url(r'^catalogs/(?P<cat_id>[0-9]+)/(?P<page>[0-9]+)/$',feeds.CatalogsFeed(), name='cat_page'),
url(r'^books/$',feeds.LangFeed(), name='lang_books'), url(r'^books/$',feeds.LangFeed(), name='lang_books'),
url(r'^books/0/$',feeds.BooksFeed(), name='nolang_books'), url(r'^books/0/$',feeds.BooksFeed(), name='nolang_books'),
url(r'^books/(?P<lang_code>[0-9])/$',feeds.BooksFeed(), name='char_books'), url(r'^books/(?P<lang_code>[0-9])/$',feeds.BooksFeed(), name='char_books'),
...@@ -47,6 +46,7 @@ urlpatterns = [ ...@@ -47,6 +46,7 @@ urlpatterns = [
url(r'^download/(?P<book_id>[0-9]+)/(?P<zip_flag>[0-1])/$',dl.Download, name='download'), url(r'^download/(?P<book_id>[0-9]+)/(?P<zip_flag>[0-1])/$',dl.Download, name='download'),
url(r'^cover/(?P<book_id>[0-9]+)/$',dl.Cover, name='cover'), url(r'^cover/(?P<book_id>[0-9]+)/$',dl.Cover, name='cover'),
url(r'^thumb/(?P<book_id>[0-9]+)/$',dl.Thumbnail, name='thumb'), url(r'^thumb/(?P<book_id>[0-9]+)/$',dl.Thumbnail, name='thumb'),
url(r'^read/(?P<book_id>[0-9]+)/$',dl.ReadFB2, name='read'),
url(r'^thumb/$',dl.Cover, name='covertmpl'), url(r'^thumb/$',dl.Cover, name='covertmpl'),
url(r'^$',feeds.MainFeed(), name='main'), url(r'^$',feeds.MainFeed(), name='main'),
......
No preview for this file type
...@@ -8,81 +8,82 @@ msgid "" ...@@ -8,81 +8,82 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-28 21:12+0300\n" "POT-Creation-Date: 2017-03-23 22:58+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"100>=11 && n%100<=14)? 2 : 3);\n" "%100>=11 && n%100<=14)? 2 : 3);\n"
#: .\sopds\settings.py:165 #: sopds/settings.py:165
msgid "Select language" msgid "Select language"
msgstr "Выбор языка" msgstr "Выбор языка"
#: .\sopds\settings.py:166 #: sopds/settings.py:166
msgid "Absolute path to books collection directory" msgid "Absolute path to books collection directory"
msgstr "Абсолютный путь к каталогу с файлами книг" msgstr "Абсолютный путь к каталогу с файлами книг"
#: .\sopds\settings.py:167 #: sopds/settings.py:167
msgid "List of managed book files extensions" msgid "List of managed book files extensions"
msgstr "Список расширений файлов, для включения в коллекцию книг" msgstr "Список расширений файлов, для включения в коллекцию книг"
#: .\sopds\settings.py:168 #: sopds/settings.py:168
msgid "Turn once scanning directly" msgid "Turn once scanning directly"
msgstr "Запустить внеочередное однократное сканирование коллекции книг" msgstr "Запустить внеочередное однократное сканирование коллекции книг"
#: .\sopds\settings.py:170 #: sopds/settings.py:170
msgid "Enable authentication" msgid "Enable authentication"
msgstr "Включить аутентификацию" msgstr "Включить аутентификацию"
#: .\sopds\settings.py:171 #: sopds/settings.py:171
msgid "Enable alphabet submenu" msgid "Enable alphabet submenu"
msgstr "Включить субменю выбора алфавита" msgstr "Включить субменю выбора алфавита"
#: .\sopds\settings.py:172 #: sopds/settings.py:172
msgid "This flag hides found doublicates" msgid "This flag hides found doublicates"
msgstr "Флаг прячет найденные дубликаты книг" msgstr "Флаг прячет найденные дубликаты книг"
#: .\sopds\settings.py:173 #: sopds/settings.py:173
msgid "This flag activate showing cover of books" msgid "This flag activate showing cover of books"
msgstr "Флаг активирует показ обложек книг" msgstr "Флаг активирует показ обложек книг"
#: .\sopds\settings.py:174 #: sopds/settings.py:174
msgid "Max subitems count in alphabet menuitem" msgid "Max subitems count in alphabet menuitem"
msgstr "Максимальное число подэлементов в элементах алфавитных меню" msgstr "Максимальное число подэлементов в элементах алфавитных меню"
#: .\sopds\settings.py:175 #: sopds/settings.py:175
msgid "Max items on page" msgid "Max items on page"
msgstr "Максимальное число элементов на странице" msgstr "Максимальное число элементов на странице"
#: .\sopds\settings.py:176 #: sopds/settings.py:176
msgid "Create downloaded filename from book title" msgid "Create downloaded filename from book title"
msgstr "Имя загружаемого файла формировать из названия книги" msgstr "Имя загружаемого файла формировать из названия книги"
#: .\sopds\settings.py:177 #: sopds/settings.py:177
msgid "Path to image file showing for book without embedded cover" msgid "Path to image file showing for book without embedded cover"
msgstr "Путь к изображению, для показа в качестве обложки для книг без обложек" msgstr "Путь к изображению, для показа в качестве обложки для книг без обложек"
#: .\sopds\settings.py:180 #: sopds/settings.py:180
msgid "This flag activate SAX Parser for FB2 instead of lxml.xpath" msgid "This flag activate SAX Parser for FB2 instead of lxml.xpath"
msgstr "" msgstr ""
"Флаг активирует стандартный FB2sax парсер (быстрее, парсит даже невалидные " "Флаг активирует стандартный FB2sax парсер (быстрее, парсит даже невалидные "
"fb2). При отключенной опции будет использован FB2xpath парсер (немного " "fb2). При отключенной опции будет использован FB2xpath парсер (немного "
"медленне, требователен к валидности fb2, появился в версии 0.42)" "медленне, требователен к валидности fb2, появился в версии 0.42)"
#: .\sopds\settings.py:181 #: sopds/settings.py:181
msgid "This flag activate zip files scanning" msgid "This flag activate zip files scanning"
msgstr "Флаг разрешает сканированеи содержимого ZIP файлов" msgstr "Флаг разрешает сканированеи содержимого ZIP файлов"
#: .\sopds\settings.py:182 #: sopds/settings.py:182
msgid "Set codepage for filenames inside zipfile" msgid "Set codepage for filenames inside zipfile"
msgstr "Codepage для имен файлов внутри ZIP" msgstr "Codepage для имен файлов внутри ZIP"
#: .\sopds\settings.py:183 #: sopds/settings.py:183
msgid "" msgid ""
"Enables read metadata from inpx-file (and stop scanning deeper from ipx-file " "Enables read metadata from inpx-file (and stop scanning deeper from ipx-file "
"place)" "place)"
...@@ -90,68 +91,68 @@ msgstr "" ...@@ -90,68 +91,68 @@ msgstr ""
"Считываем метаданные книг з INPX-файлов (при этом не сканируем файлы и " "Считываем метаданные книг з INPX-файлов (при этом не сканируем файлы и "
"каталоги, расположенные на уровне или ниже найденого INPX)" "каталоги, расположенные на уровне или ниже найденого INPX)"
#: .\sopds\settings.py:184 #: sopds/settings.py:184
msgid "Skip scanning INPX with unchanged size after previous scan" msgid "Skip scanning INPX with unchanged size after previous scan"
msgstr "" msgstr ""
"Не сканируем INPX, если его размер не изменился с предидущего сканирования" "Не сканируем INPX, если его размер не изменился с предидущего сканирования"
#: .\sopds\settings.py:185 #: sopds/settings.py:185
msgid "Test avialability zip files listed in INPX before add in collection" msgid "Test avialability zip files listed in INPX before add in collection"
msgstr "" msgstr ""
"Проверяем наличие zip файлов, перечисленных в INPX перед добавлением их " "Проверяем наличие zip файлов, перечисленных в INPX перед добавлением их "
"содержимого в коллекцию" "содержимого в коллекцию"
#: .\sopds\settings.py:186 #: sopds/settings.py:186
msgid "Test avialability book files listed in INPX before add in collection" msgid "Test avialability book files listed in INPX before add in collection"
msgstr "" msgstr ""
"Тестируем наличие книг, перечисленных в INPX перед добавлением их " "Тестируем наличие книг, перечисленных в INPX перед добавлением их "
"содержимого в коллекцию" "содержимого в коллекцию"
#: .\sopds\settings.py:187 #: sopds/settings.py:187
msgid "Logical deleting unavialable files" msgid "Logical deleting unavialable files"
msgstr "Логическое удаление отсутствующих файлов" msgstr "Логическое удаление отсутствующих файлов"
#: .\sopds\settings.py:189 #: sopds/settings.py:189
msgid "sheduled minutes for sopds_scanner (cron syntax)" msgid "sheduled minutes for sopds_scanner (cron syntax)"
msgstr "минуты для планировщика sopds_Scanner (как в cron)" msgstr "минуты для планировщика sopds_Scanner (как в cron)"
#: .\sopds\settings.py:190 #: sopds/settings.py:190
msgid "sheduled hours for sopds_scanner (cron syntax)" msgid "sheduled hours for sopds_scanner (cron syntax)"
msgstr "часы для планировщика sopds_Scanner (как в cron)" msgstr "часы для планировщика sopds_Scanner (как в cron)"
#: .\sopds\settings.py:191 #: sopds/settings.py:191
msgid "sheduled day for sopds_scanner (cron syntax)" msgid "sheduled day for sopds_scanner (cron syntax)"
msgstr "дни для планировщика sopds_Scanner (как в cron)" msgstr "дни для планировщика sopds_Scanner (как в cron)"
#: .\sopds\settings.py:192 #: sopds/settings.py:192
msgid "sheduled day of weeks for sopds_scanner (cron syntax)" msgid "sheduled day of weeks for sopds_scanner (cron syntax)"
msgstr "дни недели для планировщика sopds_Scanner (как в cron)" msgstr "дни недели для планировщика sopds_Scanner (как в cron)"
#: .\sopds\settings.py:194 #: sopds/settings.py:194
msgid "Path to FB2-EPUB converter program" msgid "Path to FB2-EPUB converter program"
msgstr "Путь к конвертеру FB2-EPUB" msgstr "Путь к конвертеру FB2-EPUB"
#: .\sopds\settings.py:195 #: sopds/settings.py:195
msgid "Path to FB2-MOBI converter program" msgid "Path to FB2-MOBI converter program"
msgstr "Путь к конвертеру FB2-MOBI" msgstr "Путь к конвертеру FB2-MOBI"
#: .\sopds\settings.py:196 #: sopds/settings.py:196
msgid "Path to temporary files directory" msgid "Path to temporary files directory"
msgstr "Путь к временному каталогу" msgstr "Путь к временному каталогу"
#: .\sopds\settings.py:198 #: sopds/settings.py:198
msgid "Path to logfile for sopds_server process" msgid "Path to logfile for sopds_server process"
msgstr "Путь к логфайлу для процесса sopds_server" msgstr "Путь к логфайлу для процесса sopds_server"
#: .\sopds\settings.py:199 #: sopds/settings.py:199
msgid "Path to logfile for sopds_scanner process" msgid "Path to logfile for sopds_scanner process"
msgstr "Путь к логфайлу для процесса sopds_scanner" msgstr "Путь к логфайлу для процесса sopds_scanner"
#: .\sopds\settings.py:200 #: sopds/settings.py:200
msgid "Path to pidfile for sopds_server process" msgid "Path to pidfile for sopds_server process"
msgstr "Путь к pid-файлу для процесса sopds_server" msgstr "Путь к pid-файлу для процесса sopds_server"
#: .\sopds\settings.py:201 #: sopds/settings.py:201
msgid "Path to pidfile for sopds_scanner process" msgid "Path to pidfile for sopds_scanner process"
msgstr "Путь к pid-файлу для процесса sopds_scanner" msgstr "Путь к pid-файлу для процесса sopds_scanner"
......
No preview for this file type
...@@ -8,147 +8,152 @@ msgid "" ...@@ -8,147 +8,152 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-28 21:12+0300\n" "POT-Creation-Date: 2017-03-23 22:58+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"100>=11 && n%100<=14)? 2 : 3);\n" "%100>=11 && n%100<=14)? 2 : 3);\n"
#: .\sopds_web_backend\templates\admin\base.html:30 #: sopds_web_backend/templates/admin/base.html:30
msgid "Welcome," msgid "Welcome,"
msgstr "" msgstr ""
#: .\sopds_web_backend\templates\admin\base.html:35 #: sopds_web_backend/templates/admin/base.html:35
#, fuzzy #, fuzzy
#| msgid "File size:" #| msgid "File size:"
msgid "View site" msgid "View site"
msgstr "Размер файла:" msgstr "Размер файла:"
#: .\sopds_web_backend\templates\admin\base.html:40 #: sopds_web_backend/templates/admin/base.html:40
msgid "Documentation" msgid "Documentation"
msgstr "" msgstr ""
#: .\sopds_web_backend\templates\admin\base.html:44 #: sopds_web_backend/templates/admin/base.html:44
#, fuzzy #, fuzzy
#| msgid "Enter Password" #| msgid "Enter Password"
msgid "Change password" msgid "Change password"
msgstr "Введите пароль" msgstr "Введите пароль"
#: .\sopds_web_backend\templates\admin\base.html:46 #: sopds_web_backend/templates/admin/base.html:46
#, fuzzy #, fuzzy
#| msgid "Logout" #| msgid "Logout"
msgid "Log out" msgid "Log out"
msgstr "Выход" msgstr "Выход"
#: .\sopds_web_backend\templates\admin\base.html:56 #: sopds_web_backend/templates/admin/base.html:56
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: .\sopds_web_backend\templates\sopds_authors.html:8 #: sopds_web_backend/templates/sopds_authors.html:8
#, python-format #, python-format
msgid "Total: %(a_book_count)s books." msgid "Total: %(a_book_count)s books."
msgstr "Всего: %(a_book_count)s книг." msgstr "Всего: %(a_book_count)s книг."
#: .\sopds_web_backend\templates\sopds_authors.html:17 #: sopds_web_backend/templates/sopds_authors.html:17
#: .\sopds_web_backend\templates\sopds_books.html:99 #: sopds_web_backend/templates/sopds_books.html:102
#: .\sopds_web_backend\templates\sopds_catalogs.html:42 #: sopds_web_backend/templates/sopds_catalogs.html:42
#: .\sopds_web_backend\templates\sopds_series.html:17 #: sopds_web_backend/templates/sopds_series.html:17
msgid "Previous page" msgid "Previous page"
msgstr "Назад" msgstr "Назад"
#: .\sopds_web_backend\templates\sopds_authors.html:32 #: sopds_web_backend/templates/sopds_authors.html:32
#: .\sopds_web_backend\templates\sopds_books.html:114 #: sopds_web_backend/templates/sopds_books.html:117
#: .\sopds_web_backend\templates\sopds_catalogs.html:57 #: sopds_web_backend/templates/sopds_catalogs.html:57
#: .\sopds_web_backend\templates\sopds_series.html:32 #: sopds_web_backend/templates/sopds_series.html:32
msgid "Next page" msgid "Next page"
msgstr "Вперед" msgstr "Вперед"
#: .\sopds_web_backend\templates\sopds_books.html:15 #: sopds_web_backend/templates/sopds_books.html:15
msgid "Confirm the deletion of the book to your bookshelf." msgid "Confirm the deletion of the book to your bookshelf."
msgstr "Подтвердите удаление книги с Вашей книжной полки." msgstr "Подтвердите удаление книги с Вашей книжной полки."
#: .\sopds_web_backend\templates\sopds_books.html:25 #: sopds_web_backend/templates/sopds_books.html:25
msgid "Delete" msgid "Delete"
msgstr "Удалить" msgstr "Удалить"
#: .\sopds_web_backend\templates\sopds_books.html:26 #: sopds_web_backend/templates/sopds_books.html:26
#: .\sopds_web_backend\templates\sopds_books.html:37 #: sopds_web_backend/templates/sopds_books.html:37
msgid "Cancel" msgid "Cancel"
msgstr "Отмена" msgstr "Отмена"
#: .\sopds_web_backend\templates\sopds_books.html:34 #: sopds_web_backend/templates/sopds_books.html:34
msgid "Confirm to clear your bookshelf." msgid "Confirm to clear your bookshelf."
msgstr "Подтвердите очистку Вашей книжной полки." msgstr "Подтвердите очистку Вашей книжной полки."
#: .\sopds_web_backend\templates\sopds_books.html:36 #: sopds_web_backend/templates/sopds_books.html:36
msgid "Clear" msgid "Clear"
msgstr "Очистить" msgstr "Очистить"
#: .\sopds_web_backend\templates\sopds_books.html:43 #: sopds_web_backend/templates/sopds_books.html:43
msgid "Clear bookshelf" msgid "Clear bookshelf"
msgstr "Очистить книжную полку" msgstr "Очистить книжную полку"
#: .\sopds_web_backend\templates\sopds_books.html:49 #: sopds_web_backend/templates/sopds_books.html:49
msgid "Download:" msgid "Download:"
msgstr "Скачать:" msgstr "Скачать:"
#: .\sopds_web_backend\templates\sopds_books.html:59 #: sopds_web_backend/templates/sopds_books.html:60
msgid "Read"
msgstr "Читать"
#: sopds_web_backend/templates/sopds_books.html:62
msgid "Delete from bookshelf" msgid "Delete from bookshelf"
msgstr "Удалить с книжной полки" msgstr "Удалить с книжной полки"
#: .\sopds_web_backend\templates\sopds_books.html:69 #: sopds_web_backend/templates/sopds_books.html:72
msgid "Book title:" msgid "Book title:"
msgstr "Название книги:" msgstr "Название книги:"
#: .\sopds_web_backend\templates\sopds_books.html:71 #: sopds_web_backend/templates/sopds_books.html:74
msgid "Authors:" msgid "Authors:"
msgstr "Авторы:" msgstr "Авторы:"
#: .\sopds_web_backend\templates\sopds_books.html:74 #: sopds_web_backend/templates/sopds_books.html:77
#: .\sopds_web_backend\templates\sopds_menu.html:9 #: sopds_web_backend/templates/sopds_menu.html:9
#: .\sopds_web_backend\templates\sopds_menu.html:31 #: sopds_web_backend/templates/sopds_menu.html:31
#: .\sopds_web_backend\views.py:481 .\sopds_web_backend\views.py:485 #: sopds_web_backend/views.py:484 sopds_web_backend/views.py:488
msgid "Genres" msgid "Genres"
msgstr "Жанры" msgstr "Жанры"
#: .\sopds_web_backend\templates\sopds_books.html:77 #: sopds_web_backend/templates/sopds_books.html:80
#: .\sopds_web_backend\templates\sopds_logo.html:29 #: sopds_web_backend/templates/sopds_logo.html:29
#: .\sopds_web_backend\templates\sopds_menu.html:10 #: sopds_web_backend/templates/sopds_menu.html:10
#: .\sopds_web_backend\templates\sopds_menu.html:33 #: sopds_web_backend/templates/sopds_menu.html:33
#: .\sopds_web_backend\views.py:267 .\sopds_web_backend\views.py:466 #: sopds_web_backend/views.py:270 sopds_web_backend/views.py:469
msgid "Series" msgid "Series"
msgstr "Серии" msgstr "Серии"
#: .\sopds_web_backend\templates\sopds_books.html:79 #: sopds_web_backend/templates/sopds_books.html:82
msgid "File:" msgid "File:"
msgstr "Файл:" msgstr "Файл:"
#: .\sopds_web_backend\templates\sopds_books.html:80 #: sopds_web_backend/templates/sopds_books.html:83
msgid "File size:" msgid "File size:"
msgstr "Размер файла:" msgstr "Размер файла:"
#: .\sopds_web_backend\templates\sopds_books.html:81 #: sopds_web_backend/templates/sopds_books.html:84
msgid "Changes date:" msgid "Changes date:"
msgstr "Дата правки:" msgstr "Дата правки:"
#: .\sopds_web_backend\templates\sopds_books.html:83 #: sopds_web_backend/templates/sopds_books.html:86
msgid "Doubles for book:" msgid "Doubles for book:"
msgstr "Дубликаты книги:" msgstr "Дубликаты книги:"
#: .\sopds_web_backend\templates\sopds_breadcrumbs.html:3 #: sopds_web_backend/templates/sopds_breadcrumbs.html:3
msgid "You are here:" msgid "You are here:"
msgstr "Вы здесь:" msgstr "Вы здесь:"
#: .\sopds_web_backend\templates\sopds_footer.html:6 #: sopds_web_backend/templates/sopds_footer.html:6
msgid "BOOKSHELF" msgid "BOOKSHELF"
msgstr "КНИЖНАЯ ПОЛКА" msgstr "КНИЖНАЯ ПОЛКА"
#: .\sopds_web_backend\templates\sopds_footer.html:19 #: sopds_web_backend/templates/sopds_footer.html:19
msgid "" msgid ""
"Bookshelf is available only SimpleOPDS Catalog mode with activated user " "Bookshelf is available only SimpleOPDS Catalog mode with activated user "
"authorization." "authorization."
...@@ -156,51 +161,51 @@ msgstr "" ...@@ -156,51 +161,51 @@ msgstr ""
"Книжная полка доступна только в режиме работы SimpleOPDS Catalog со " "Книжная полка доступна только в режиме работы SimpleOPDS Catalog со "
"включенной авторизацией пользователей." "включенной авторизацией пользователей."
#: .\sopds_web_backend\templates\sopds_footer.html:23 #: sopds_web_backend/templates/sopds_footer.html:23
msgid "STATISTICS" msgid "STATISTICS"
msgstr "СТАТИСТИКА" msgstr "СТАТИСТИКА"
#: .\sopds_web_backend\templates\sopds_footer.html:25 #: sopds_web_backend/templates/sopds_footer.html:25
msgid "This сatalog contains:" msgid "This сatalog contains:"
msgstr "Этот каталог содержит:" msgstr "Этот каталог содержит:"
#: .\sopds_web_backend\templates\sopds_footer.html:26 #: sopds_web_backend/templates/sopds_footer.html:26
msgid "books," msgid "books,"
msgstr "книг," msgstr "книг,"
#: .\sopds_web_backend\templates\sopds_footer.html:27 #: sopds_web_backend/templates/sopds_footer.html:27
msgid "authors," msgid "authors,"
msgstr "авторов," msgstr "авторов,"
#: .\sopds_web_backend\templates\sopds_footer.html:28 #: sopds_web_backend/templates/sopds_footer.html:28
msgid "genres and" msgid "genres and"
msgstr "жанров и" msgstr "жанров и"
#: .\sopds_web_backend\templates\sopds_footer.html:29 #: sopds_web_backend/templates/sopds_footer.html:29
msgid "series." msgid "series."
msgstr "серий." msgstr "серий."
#: .\sopds_web_backend\templates\sopds_footer.html:32 #: sopds_web_backend/templates/sopds_footer.html:32
msgid "Last collection scan date:" msgid "Last collection scan date:"
msgstr "Дата последнего сканирования:" msgstr "Дата последнего сканирования:"
#: .\sopds_web_backend\templates\sopds_footer.html:33 #: sopds_web_backend/templates/sopds_footer.html:33
msgid "Never" msgid "Never"
msgstr "Никогда" msgstr "Никогда"
#: .\sopds_web_backend\templates\sopds_footer.html:38 #: sopds_web_backend/templates/sopds_footer.html:38
msgid "RANDOM BOOK" msgid "RANDOM BOOK"
msgstr "СЛУЧАЙНАЯ КНИГА" msgstr "СЛУЧАЙНАЯ КНИГА"
#: .\sopds_web_backend\templates\sopds_hello.html:7 #: sopds_web_backend/templates/sopds_hello.html:7
msgid "Hello" msgid "Hello"
msgstr "Здравствуйте" msgstr "Здравствуйте"
#: .\sopds_web_backend\templates\sopds_hello.html:7 #: sopds_web_backend/templates/sopds_hello.html:7
msgid "Guest" msgid "Guest"
msgstr "Гость" msgstr "Гость"
#: .\sopds_web_backend\templates\sopds_hello.html:9 #: sopds_web_backend/templates/sopds_hello.html:9
msgid "" msgid ""
"Simple OPDS Catalog - is a free program for Linux and Windows, which allows " "Simple OPDS Catalog - is a free program for Linux and Windows, which allows "
"for the rapid creation of electronic OPDS-catalog books. OPDS (Open " "for the rapid creation of electronic OPDS-catalog books. OPDS (Open "
...@@ -216,147 +221,147 @@ msgstr "" ...@@ -216,147 +221,147 @@ msgstr ""
"электронных книг, планшетов, смартфонов и т.д. Дополнительную информацию о " "электронных книг, планшетов, смартфонов и т.д. Дополнительную информацию о "
"программе Вы сможете найти на Web-сайте проекта:" "программе Вы сможете найти на Web-сайте проекта:"
#: .\sopds_web_backend\templates\sopds_login.html:9 #: sopds_web_backend/templates/sopds_login.html:9
msgid "Username" msgid "Username"
msgstr "Имя пользователя" msgstr "Имя пользователя"
#: .\sopds_web_backend\templates\sopds_login.html:10 #: sopds_web_backend/templates/sopds_login.html:10
msgid "Enter Username" msgid "Enter Username"
msgstr "Введите имя" msgstr "Введите имя"
#: .\sopds_web_backend\templates\sopds_login.html:12 #: sopds_web_backend/templates/sopds_login.html:12
msgid "Password" msgid "Password"
msgstr "Пароль" msgstr "Пароль"
#: .\sopds_web_backend\templates\sopds_login.html:13 #: sopds_web_backend/templates/sopds_login.html:13
msgid "Enter Password" msgid "Enter Password"
msgstr "Введите пароль" msgstr "Введите пароль"
#: .\sopds_web_backend\templates\sopds_login.html:15 #: sopds_web_backend/templates/sopds_login.html:15
msgid "Log in" msgid "Log in"
msgstr "Вход" msgstr "Вход"
#: .\sopds_web_backend\templates\sopds_logo.html:14 #: sopds_web_backend/templates/sopds_logo.html:14
#: .\sopds_web_backend\views.py:267 .\sopds_web_backend\views.py:306 #: sopds_web_backend/views.py:270 sopds_web_backend/views.py:309
msgid "Search" msgid "Search"
msgstr "Найти" msgstr "Найти"
#: .\sopds_web_backend\templates\sopds_logo.html:26 #: sopds_web_backend/templates/sopds_logo.html:26
msgid "Choose Search Type:" msgid "Choose Search Type:"
msgstr "Выберите тип поиска:" msgstr "Выберите тип поиска:"
#: .\sopds_web_backend\templates\sopds_logo.html:27 #: sopds_web_backend/templates/sopds_logo.html:27
msgid "Title" msgid "Title"
msgstr "Название" msgstr "Название"
#: .\sopds_web_backend\templates\sopds_logo.html:28 #: sopds_web_backend/templates/sopds_logo.html:28
msgid "Author" msgid "Author"
msgstr "Автор" msgstr "Автор"
#: .\sopds_web_backend\templates\sopds_menu.html:6 #: sopds_web_backend/templates/sopds_menu.html:6
#: .\sopds_web_backend\templates\sopds_menu.html:16 #: sopds_web_backend/templates/sopds_menu.html:16
#: .\sopds_web_backend\views.py:364 #: sopds_web_backend/views.py:367
msgid "Catalogs" msgid "Catalogs"
msgstr "Каталоги" msgstr "Каталоги"
#: .\sopds_web_backend\templates\sopds_menu.html:7 #: sopds_web_backend/templates/sopds_menu.html:7
#: .\sopds_web_backend\templates\sopds_menu.html:17 #: sopds_web_backend/templates/sopds_menu.html:17
#: .\sopds_web_backend\views.py:89 .\sopds_web_backend\views.py:95 #: sopds_web_backend/views.py:92 sopds_web_backend/views.py:98
#: .\sopds_web_backend\views.py:108 .\sopds_web_backend\views.py:120 #: sopds_web_backend/views.py:111 sopds_web_backend/views.py:123
#: .\sopds_web_backend\views.py:129 .\sopds_web_backend\views.py:132 #: sopds_web_backend/views.py:132 sopds_web_backend/views.py:135
#: .\sopds_web_backend\views.py:141 .\sopds_web_backend\views.py:145 #: sopds_web_backend/views.py:144 sopds_web_backend/views.py:148
#: .\sopds_web_backend\views.py:155 .\sopds_web_backend\views.py:167 #: sopds_web_backend/views.py:158 sopds_web_backend/views.py:170
#: .\sopds_web_backend\views.py:398 #: sopds_web_backend/views.py:401
msgid "Books" msgid "Books"
msgstr "Книги" msgstr "Книги"
#: .\sopds_web_backend\templates\sopds_menu.html:8 #: sopds_web_backend/templates/sopds_menu.html:8
#: .\sopds_web_backend\templates\sopds_menu.html:24 #: sopds_web_backend/templates/sopds_menu.html:24
#: .\sopds_web_backend\views.py:306 .\sopds_web_backend\views.py:432 #: sopds_web_backend/views.py:309 sopds_web_backend/views.py:435
msgid "Authors" msgid "Authors"
msgstr "Авторы" msgstr "Авторы"
#: .\sopds_web_backend\templates\sopds_selectauthor.html:16 #: sopds_web_backend/templates/sopds_selectauthor.html:16
#, python-format #, python-format
msgid "Total: %(chars_cnt)s authors." msgid "Total: %(chars_cnt)s authors."
msgstr "Всего: %(chars_cnt)s авторов." msgstr "Всего: %(chars_cnt)s авторов."
#: .\sopds_web_backend\templates\sopds_selectbook.html:16 #: sopds_web_backend/templates/sopds_selectbook.html:16
#, python-format #, python-format
msgid "Total: %(chars_cnt)s books." msgid "Total: %(chars_cnt)s books."
msgstr "Всего: %(chars_cnt)s книг." msgstr "Всего: %(chars_cnt)s книг."
#: .\sopds_web_backend\templates\sopds_selectgenres.html:16 #: sopds_web_backend/templates/sopds_selectgenres.html:16
#, python-format #, python-format
msgid "Total: %(g_num_book)s books." msgid "Total: %(g_num_book)s books."
msgstr "Всего: %(g_num_book)s книг." msgstr "Всего: %(g_num_book)s книг."
#: .\sopds_web_backend\templates\sopds_selectseries.html:16 #: sopds_web_backend/templates/sopds_selectseries.html:16
#, python-format #, python-format
msgid "Total: %(chars_cnt)s series." msgid "Total: %(chars_cnt)s series."
msgstr "Всего: %(chars_cnt)s серий." msgstr "Всего: %(chars_cnt)s серий."
#: .\sopds_web_backend\templates\sopds_series.html:8 #: sopds_web_backend/templates/sopds_series.html:8
#, python-format #, python-format
msgid "Total: %(s_book_count)s books." msgid "Total: %(s_book_count)s books."
msgstr "Всего: %(s_book_count)s книг." msgstr "Всего: %(s_book_count)s книг."
#: .\sopds_web_backend\templates\sopds_top.html:19 #: sopds_web_backend/templates/sopds_top.html:19
#: .\sopds_web_backend\views.py:546 #: sopds_web_backend/views.py:549
msgid "Logout" msgid "Logout"
msgstr "Выход" msgstr "Выход"
#: .\sopds_web_backend\templates\sopds_top.html:21 #: sopds_web_backend/templates/sopds_top.html:21
msgid "Settings" msgid "Settings"
msgstr "Настройки" msgstr "Настройки"
#: .\sopds_web_backend\templates\sopds_top.html:24 #: sopds_web_backend/templates/sopds_top.html:24
#: .\sopds_web_backend\views.py:518 #: sopds_web_backend/views.py:521
msgid "Login" msgid "Login"
msgstr "Вход" msgstr "Вход"
#: .\sopds_web_backend\views.py:89 .\sopds_web_backend\views.py:95 #: sopds_web_backend/views.py:92 sopds_web_backend/views.py:98
msgid "Search by title" msgid "Search by title"
msgstr "Поиск по наименованию" msgstr "Поиск по наименованию"
#: .\sopds_web_backend\views.py:108 #: sopds_web_backend/views.py:111
msgid "Search by author" msgid "Search by author"
msgstr "Поиск по автору" msgstr "Поиск по автору"
#: .\sopds_web_backend\views.py:120 #: sopds_web_backend/views.py:123
msgid "Search by series" msgid "Search by series"
msgstr "Поиск по серии" msgstr "Поиск по серии"
#: .\sopds_web_backend\views.py:129 .\sopds_web_backend\views.py:132 #: sopds_web_backend/views.py:132 sopds_web_backend/views.py:135
msgid "Search by genre" msgid "Search by genre"
msgstr "Поиск по жанру" msgstr "Поиск по жанру"
#: .\sopds_web_backend\views.py:141 .\sopds_web_backend\views.py:145 #: sopds_web_backend/views.py:144 sopds_web_backend/views.py:148
msgid "Bookshelf" msgid "Bookshelf"
msgstr "Книжная полка" msgstr "Книжная полка"
#: .\sopds_web_backend\views.py:155 #: sopds_web_backend/views.py:158
msgid "Doubles for book" msgid "Doubles for book"
msgstr "Дубликаты книги" msgstr "Дубликаты книги"
#: .\sopds_web_backend\views.py:361 #: sopds_web_backend/views.py:364
msgid "ROOT" msgid "ROOT"
msgstr "НАЧАЛО" msgstr "НАЧАЛО"
#: .\sopds_web_backend\views.py:398 .\sopds_web_backend\views.py:432 #: sopds_web_backend/views.py:401 sopds_web_backend/views.py:435
#: .\sopds_web_backend\views.py:466 .\sopds_web_backend\views.py:481 #: sopds_web_backend/views.py:469 sopds_web_backend/views.py:484
#: .\sopds_web_backend\views.py:485 #: sopds_web_backend/views.py:488
msgid "Select" msgid "Select"
msgstr "Выбор" msgstr "Выбор"
#: .\sopds_web_backend\views.py:513 #: sopds_web_backend/views.py:516
msgid "HOME" msgid "HOME"
msgstr "ГЛАВНАЯ" msgstr "ГЛАВНАЯ"
#: .\sopds_web_backend\views.py:534 #: sopds_web_backend/views.py:537
msgid "This account is not active!" msgid "This account is not active!"
msgstr "Учетная запись не активна!" msgstr "Учетная запись не активна!"
#: .\sopds_web_backend\views.py:537 #: sopds_web_backend/views.py:540
msgid "User does not exist or the password is incorrect!" msgid "User does not exist or the password is incorrect!"
msgstr "Пользователь не существует или введен неправильный пароль!" msgstr "Пользователь не существует или введен неправильный пароль!"
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
{% if b.format == 'fb2' and fb2tomobi %} {% if b.format == 'fb2' and fb2tomobi %}
<i><a href="{% url 'opds_catalog:convert' b.id 'mobi' %}"><span class="label small">mobi</span></a></i>&nbsp; <i><a href="{% url 'opds_catalog:convert' b.id 'mobi' %}"><span class="label small">mobi</span></a></i>&nbsp;
{% endif %} {% endif %}
<i><a href="{% url 'opds_catalog:read' b.id %}"><span class="label small">{% trans "Read" %}</span></a></i>&nbsp;
{% if isbookshelf %} {% if isbookshelf %}
&nbsp;&nbsp;<i><a href="#" onclick="del_bsbook({{ b.id }},'{{b.title}}');"><span class="secondary label small">&nbsp;{% trans "Delete from bookshelf" %}&nbsp;</span></a></i> &nbsp;&nbsp;<i><a href="#" onclick="del_bsbook({{ b.id }},'{{b.title}}');"><span class="secondary label small">&nbsp;{% trans "Delete from bookshelf" %}&nbsp;</span></a></i>
{% endif %} {% endif %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment