From 5a499bf50e6341283703a1b36d1c336609405941 Mon Sep 17 00:00:00 2001 From: cdhigh Date: Wed, 14 Feb 2024 22:03:35 -0300 Subject: [PATCH] porting to python3 --- app.yaml | 2 +- application/back_end/db_models.py | 12 +- application/back_end/send_mail_adpt.py | 16 +- application/lib/build_ebook.py | 3 +- .../lib/calibre/customize/conversion.py | 5 +- .../ebooks/conversion/plugins/html_input.py | 6 +- .../ebooks/conversion/plugins/recipe_input.py | 2 - .../lib/calibre/ebooks/conversion/plumber.py | 9 +- application/lib/filedownload.py | 10 +- application/lib/filesystem_dict.py | 4 +- application/static/base.js | 11 +- application/templates/admin.html | 4 +- application/templates/adv_uploadcover.html | 4 +- application/templates/base.html | 6 +- application/templates/library.html | 2 +- application/templates/my.html | 2 +- application/templates/setting.html | 8 +- .../tr_TR/LC_MESSAGES/messages.mo | Bin 17860 -> 19091 bytes .../tr_TR/LC_MESSAGES/messages.po | 1922 ++++++++--------- .../translations/zh/LC_MESSAGES/messages.mo | Bin 18200 -> 18234 bytes .../translations/zh/LC_MESSAGES/messages.po | 1885 ++++++++-------- application/view/admin.py | 2 +- application/view/adv.py | 2 +- application/view/inbound_email.py | 38 +- application/view/library.py | 10 +- application/view/share.py | 4 +- application/work/url2book.py | 6 +- application/work/worker.py | 93 +- main.py | 1 + messages.pot | 1322 ++++++------ tests/runtests.py | 11 +- tests/test_base.py | 8 + tests/test_inbound_email.py | 82 + tests/test_login.py | 2 +- tests/test_subscribe.py | 3 +- tools/pybabel_extract.bat | 2 +- 36 files changed, 2750 insertions(+), 2749 deletions(-) create mode 100644 tests/test_inbound_email.py diff --git a/app.yaml b/app.yaml index 620af95a..104c866c 100755 --- a/app.yaml +++ b/app.yaml @@ -15,7 +15,7 @@ basic_scaling: # min_idle_instances: 0 app_engine_apis: true -entrypoint: gunicorn -b :$PORT main:app +entrypoint: gunicorn -b :$PORT -w 2 main:app inbound_services: - mail diff --git a/application/back_end/db_models.py b/application/back_end/db_models.py index 93806ff9..4ffb5fa7 100644 --- a/application/back_end/db_models.py +++ b/application/back_end/db_models.py @@ -95,16 +95,10 @@ def get_cover_data(self): return data #获取用户自定义的CSS - #css为Recipe预定义的CSS - #返回两个CSS合并后的字符串 - def get_extra_css(self, css=''): + def get_extra_css(self): dbItem = UserBlob.get_or_none((UserBlob.user == self.name) & (UserBlob.name == 'css')) - if dbItem: - extra_css = dbItem.data.decode('utf-8') - return (css + '\n\n' + extra_css) if css else extra_css - else: - return css - + return dbItem.data.decode('utf-8') if dbItem else '' + #用户的一些二进制内容,比如封面之类的 class UserBlob(MyBaseModel): name = CharField() diff --git a/application/back_end/send_mail_adpt.py b/application/back_end/send_mail_adpt.py index 4fe71f86..13c3efba 100644 --- a/application/back_end/send_mail_adpt.py +++ b/application/back_end/send_mail_adpt.py @@ -29,18 +29,22 @@ #发送邮件 #title: 邮件标题 -#attachment: 附件二进制内容 +#attachment: 附件二进制内容,或元祖 (filename, content) #fileWithTime: 发送的附件文件名是否附带当前时间 def send_to_kindle(user, title, attachment, fileWithTime=True): lcTime = local_time('%Y-%m-%d_%H-%M', user.timezone) subject = f"KindleEar {lcTime}" - lcTime = "({})".format(lcTime) if fileWithTime else "" - ext = ".{}".format(user.book_type) if user.book_type else "" - fileName = f"{title}{lcTime}{ext}" - body = "Deliver from KindleEar" - attachments = [(fileName, attachment)] + + if not isinstance(attachment, tuple): + lcTime = "({})".format(lcTime) if fileWithTime else "" + fileName = f"{title}{lcTime}.{user.book_type}" + attachment = (fileName, attachment) + + if not isinstance(attachment, list): + attachments = [attachment] status = 'ok' + body = "Deliver from KindleEar" try: send_mail(user, user.kindle_email, subject, body, attachments) except Exception as e: diff --git a/application/lib/build_ebook.py b/application/lib/build_ebook.py index fdc2b163..fd02abbd 100644 --- a/application/lib/build_ebook.py +++ b/application/lib/build_ebook.py @@ -42,7 +42,8 @@ def urls_to_book(urls: list, title: str, user, options: dict=None, output_fmt: s return None #合并自定义css - ro.extra_css = user.get_extra_css(ro.extra_css) + userCss = user.get_extra_css() + ro.extra_css = f'{ro.extra_css}\n\n{userCss}' if ro.extra_css else userCss return recipes_to_ebook(ro, user, options, output_fmt) diff --git a/application/lib/calibre/customize/conversion.py b/application/lib/calibre/customize/conversion.py index 37fdb686..d3d42d09 100644 --- a/application/lib/calibre/customize/conversion.py +++ b/application/lib/calibre/customize/conversion.py @@ -173,8 +173,9 @@ class InputFormatPlugin(Plugin): 'set this option will override any encoding declared by the ' 'document itself. Particularly useful for documents that ' 'do not declare an encoding or that have erroneous ' - 'encoding declarations.') - )} + 'encoding declarations.')), + OptionRecommendation(name='user', recommended_value=None, + help='Keuser instance.'),} #: Options to customize the behavior of this plugin. Every option must be an #: instance of :class:`OptionRecommendation`. diff --git a/application/lib/calibre/ebooks/conversion/plugins/html_input.py b/application/lib/calibre/ebooks/conversion/plugins/html_input.py index 4a670448..9169d12d 100644 --- a/application/lib/calibre/ebooks/conversion/plugins/html_input.py +++ b/application/lib/calibre/ebooks/conversion/plugins/html_input.py @@ -75,10 +75,10 @@ def convert(self, input_, opts, file_ext, log, output_dir, fs): #manifest 资源列表 manifest = ['/index.html'] - for filename, content in input_.get('imgs', []): - filename = os.path.join(fs.path, filename) + for fileName, content in input_.get('imgs', []): + fileName = os.path.join(fs.path, fileName) fs.write(fileName, content) - manifest.append(filename) + manifest.append(fileName) opf.create_manifest_from_files_in(manifest) ncx_id = opf.manifest.add_item(os.path.join(fs.path, 'index.ncx'), mime_type="application/x-dtbncx+xml") opf.manifest.item(ncx_id).id = 'ncx' diff --git a/application/lib/calibre/ebooks/conversion/plugins/recipe_input.py b/application/lib/calibre/ebooks/conversion/plugins/recipe_input.py index f3432958..837ce7b9 100644 --- a/application/lib/calibre/ebooks/conversion/plugins/recipe_input.py +++ b/application/lib/calibre/ebooks/conversion/plugins/recipe_input.py @@ -57,8 +57,6 @@ class RecipeInput(InputFormatPlugin): help=_('Do not download latest version of builtin recipes from the calibre server')), OptionRecommendation(name='lrf', recommended_value=False, help='Optimize fetching for subsequent conversion to LRF.'), - OptionRecommendation(name='user', recommended_value=None, - help='Keuser instance.'), } #执行转换完成后返回生成的 opf 文件路径,只是路径,不包含文件名 diff --git a/application/lib/calibre/ebooks/conversion/plumber.py b/application/lib/calibre/ebooks/conversion/plumber.py index b91ab3dc..6069fc2e 100644 --- a/application/lib/calibre/ebooks/conversion/plumber.py +++ b/application/lib/calibre/ebooks/conversion/plumber.py @@ -384,7 +384,7 @@ def run(self): fs = FsDictStub(tdir) else: tdir = '/' - fs = FsDictStub(None) + fs = FsDictStub() #调用calibre.customize.conversion.InputFormatPlugin.__call__(),然后调用输入插件的convert()在目标目录生成一大堆文件,包含opf #__call__()返回传入的 fs 实例,其属性 opfname 保存了opf文件的路径名 @@ -551,16 +551,15 @@ def run(self): self.log.info('Processed HTML written to:{}'.format(out_dir)) self.log.info('Creating %s...'%self.output_plugin.name) - + #创建输出临时文件缓存 if system_temp_dir: prefix = self.output_plugin.commit_name or 'output_' tmpdir = PersistentTemporaryDirectory(prefix=prefix, dir=system_temp_dir) fs_out = FsDictStub(tmpdir) else: - fs_out = FsDictStub(None) - fs_out = fs - + fs_out = FsDictStub() + #这才是启动输出转换,生成电子书 with self.output_plugin: self.output_plugin.convert(self.oeb, self.output, self.input_plugin, self.opts, self.log, fs_out) diff --git a/application/lib/filedownload.py b/application/lib/filedownload.py index d8322580..8f895f6d 100644 --- a/application/lib/filedownload.py +++ b/application/lib/filedownload.py @@ -5,25 +5,25 @@ """ from collections import namedtuple from urllib.parse import urlparse -from lib.urlopener import UrlOpener +from urlopener import UrlOpener DownloadedFileTuple = namedtuple("DownloadedFileTuple", "status fileName content") #FileDownload工具函数,简化文件下载工作 #返回一个命名元祖 DownloadedFileTuple def Download(url): - fileName = lambda url: urlparse(url).path.split('/')[-1] + fileName = urlparse(url).path.split('/')[-1] opener = UrlOpener() resp = opener.open(url) content = resp.content if resp.status_code == 413: - return DownloadedFileTuple('too large', fileName, '') + return DownloadedFileTuple('too large', fileName, b'') elif resp.status_code not in (200, 206): - return DownloadedFileTuple('download failed', fileName, '') + return DownloadedFileTuple('download failed', fileName, b'') elif not content: - return DownloadedFileTuple('not resuming', fileName, '') + return DownloadedFileTuple('not resuming', fileName, b'') else: return DownloadedFileTuple('', fileName, content) diff --git a/application/lib/filesystem_dict.py b/application/lib/filesystem_dict.py index 428640aa..fbd9651f 100644 --- a/application/lib/filesystem_dict.py +++ b/application/lib/filesystem_dict.py @@ -59,7 +59,7 @@ def delete(self, path: str): #全部清除,释放内存 def clear(self): - self.dirs = None + self.dirs = set() for key in list(self.keys()): del self[key] @@ -101,7 +101,7 @@ def _update_dirs(self): #提供给OEB的文件读写桩,给外部提供一个统一的文件系统接口,内部根据情况使用模拟文件系统字典或调用系统函数 class FsDictStub(object): #path: 如果path=str,则使用操作系统文件读写,否则使用path对应的FileSystemDict读写 - def __init__(self, path, log=None, ignore_opf=False): + def __init__(self, path=None, log=None, ignore_opf=False): if path: assert(os.path.isabs(path)) self.path = path diff --git a/application/static/base.js b/application/static/base.js index 943f6bef..f67cb9ef 100644 --- a/application/static/base.js +++ b/application/static/base.js @@ -256,7 +256,6 @@ function PopulateMySubscribed() { row_str.push(title); } if (separated) { - //row_str.push('' + i18n.separated + ''); row_str.push(' Sep'); } row_str.push('
'); @@ -517,16 +516,16 @@ function ShareRssToServer(id, title, category, lang) { $.post("/library", {id: id, category: category, title: title, lang: lang, creator: window.location.hostname}, function (data) { if (data.status == "ok") { var idx = g_rss_categories.indexOf(category); - if (g_rss_categories && (category != "")) { //将刚才使用到的分类移动到开头 - if (idx > 0){ - g_rss_categories.splice(idx, 1); + if (g_rss_categories && (category != "")) { + if (idx > 0) { + g_rss_categories.splice(idx, 1); //将刚才使用到的分类移动到开头 } if (idx != 0) { - g_rss_categories.unshift(category); + g_rss_categories.unshift(category); //添加一个新的类别 } } window.localStorage.setItem('rss_category', JSON.stringify(g_rss_categories)); - window.localStorage.setItem('shared_rss', ''); //让分享库页面从服务器取新数据 + window.localStorage.setItem('shared_rss', ''); //清除本地存储,让分享库页面从服务器取新数据 ShowSimpleModalDialog('

' + i18n.thankForShare + '

'); } else if (data.status == i18n.loginRequired) { window.location.href = '/login'; diff --git a/application/templates/admin.html b/application/templates/admin.html index 2be39773..45f303da 100644 --- a/application/templates/admin.html +++ b/application/templates/admin.html @@ -11,7 +11,7 @@
-

{{_("Change Password")}}

+

{{_('Change Password')}}

{% if chpwdtips -%}
{{chpwdtips|safe}}
{% endif -%} @@ -84,7 +84,7 @@ {{_("No.")}} {{_("Username")}} - {{_("Enable")}} + {{_("AutoSend")}} {{_("Expiration")}} {{_("Operation")}} diff --git a/application/templates/adv_uploadcover.html b/application/templates/adv_uploadcover.html index 984eb7fe..3ac8e884 100644 --- a/application/templates/adv_uploadcover.html +++ b/application/templates/adv_uploadcover.html @@ -12,10 +12,10 @@
- +

diff --git a/application/templates/base.html b/application/templates/base.html index ce8fae0f..e8ccd743 100644 --- a/application/templates/base.html +++ b/application/templates/base.html @@ -18,7 +18,6 @@ {% autoescape off %} {% block javascript_inhead %} diff --git a/application/templates/library.html b/application/templates/library.html index 6fa49099..9803202a 100644 --- a/application/templates/library.html +++ b/application/templates/library.html @@ -45,7 +45,7 @@
- +

diff --git a/application/templates/my.html b/application/templates/my.html index 7088b932..d0d11c90 100644 --- a/application/templates/my.html +++ b/application/templates/my.html @@ -20,7 +20,7 @@
+ {{_("Content embedded")}}
diff --git a/application/templates/setting.html b/application/templates/setting.html index caf545ac..133df17a 100644 --- a/application/templates/setting.html +++ b/application/templates/setting.html @@ -11,7 +11,7 @@
{% if user.expires -%}
- {{_("Your account will pause after")}} {{ user.expires.strftime("%Y-%m-%d") }} {{_(", Please login before expire.")}} + {{_("Your account will pause after {0}, please log in again before it expires.").format(user.expires.strftime("%Y-%m-%d")) }}
{{_("Delete Account")}}
{% endif -%} @@ -214,8 +214,10 @@
- -

{{_("Important: Please activate your kindle firstly, and goto")}}“{{_("Personal Document Settings")}}”{{_("Page and add")}} {{ mailSender }} {{_("to 'Approved Personal Document E-mail List'.")}} +

+ {% autoescape off -%} + {{_("Important: Please activate your kindle firstly, then goto %(personal)s Page and add %(sender)s to 'Approved Personal Document E-mail List'.", personal='' + _("Personal Document Settings") + '', sender='' + mailSender + '')|safe}} + {% endautoescape -%}

diff --git a/application/translations/tr_TR/LC_MESSAGES/messages.mo b/application/translations/tr_TR/LC_MESSAGES/messages.mo index 00e9fb8a39bc22a7b7904719e649f8f636906ec1..0c452ec7515bf98f42eb5d07da63447f54418f71 100644 GIT binary patch literal 19091 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 diff --git a/application/translations/tr_TR/LC_MESSAGES/messages.po b/application/translations/tr_TR/LC_MESSAGES/messages.po index 8a9176b9..b50cc142 100644 --- a/application/translations/tr_TR/LC_MESSAGES/messages.po +++ b/application/translations/tr_TR/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-22 08:34-0300\n" -"PO-Revision-Date: 2024-01-22 08:35-0300\n" +"POT-Creation-Date: 2024-02-14 21:49-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: tr_TR\n" "Language-Team: tr_TR \n" @@ -18,757 +18,669 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.14.0\n" -#: apps/view/admin.py:46 apps/view/admin.py:72 apps/view/admin.py:126 -msgid "The password includes non-ascii chars!" -msgstr "Şifrenizde ASCII dışı karakterler olmamalı" - -#: apps/view/admin.py:49 -msgid "Old password is wrong!" -msgstr "Eski şifre yanlış!" - -#: apps/view/admin.py:51 apps/view/admin.py:64 apps/view/admin.py:120 -msgid "The two new passwords are dismatch!" -msgstr "Yeni şifre girişleri aynı değil!" - -#: apps/view/admin.py:53 apps/view/admin.py:136 -msgid "Change password success!" -msgstr "Şifre başarıyla değiştirildi!" - -#: apps/view/admin.py:62 apps/view/login.py:41 -msgid "The username includes unsafe chars!" -msgstr "Kullanıcı adı alfa-numerik olmalı!" - -#: apps/view/admin.py:66 -msgid "Already exist the username!" -msgstr "Bu isimde bir kullanıcı kaydı zaten mevcut!" - -#: apps/view/admin.py:86 -msgid "Add a account success!" -msgstr "Yeni hesap başarıyla eklendi!" - -#: apps/view/admin.py:98 apps/view/admin.py:118 apps/view/admin.py:157 -msgid "The username '{}' not exist!" -msgstr "'{}' isminde bir kullanıcı bulunmuyor!" - -#: apps/view/admin.py:100 -msgid "Please input new password to confirm!" -msgstr "Lütfen onaylamak için yeni şifreyi giriniz! " - -#: apps/view/admin.py:113 apps/view/login.py:37 -msgid "Username is empty!" -msgstr "Kullanıcı adı boş olamaz!" - -#: apps/view/admin.py:145 -msgid "Please confirm to delete the account!" -msgstr "Lütfen hesap silme işlemini onaylayınız!" - -#: apps/view/admin.py:163 -msgid "The username is empty or you dont have right to delete it!" -msgstr "Kullanıcı adı mevcut değil veya sizin silmeye yetkiniz yok!" - -#: apps/view/adv.py:62 apps/view/adv.py:63 apps/view/adv.py:64 -#: apps/view/adv.py:65 apps/view/adv.py:66 apps/view/adv.py:67 -#: apps/view/adv.py:68 apps/view/adv.py:69 apps/view/adv.py:70 -#: apps/view/adv.py:71 -#, fuzzy, python-format -msgid "Append hyperlink '{}' to article" -msgstr "'%s' linkini makaleye ekle" - -#: apps/view/adv.py:364 -#, fuzzy, python-format -msgid "Authorization Error!
{}" -msgstr "Yetkilendirme Hatası!
%s" - -#: apps/view/adv.py:387 -msgid "Success authorized by Pocket!" -msgstr "Pocket tarafından yetkilendirilen başarı!" - -#: apps/view/adv.py:393 -msgid "" -"Failed to request authorization of Pocket!


See details " -"below:

{}" -msgstr "" -"Cep yetkilendirme isteğinde bulunamadı!
Aşağıdaki ayrıntılara " -"bakın:

{}" - -#: apps/view/adv.py:403 -msgid "Request type [{}] unsupported" -msgstr "İstek türü [{}] desteklenmiyor" - -#: apps/view/adv.py:418 -msgid "The Instapaper service encountered an error. Please try again later." -msgstr "" -"Instapaper hizmeti bir hatayla karşılaştı. Lütfen daha sonra tekrar " -"deneyiniz." - -#: apps/view/deliver.py:108 -msgid "The username not exist or the email of kindle is empty." -msgstr "The username not exist or the email of kindle is empty." - -#: apps/view/deliver.py:123 -msgid "Book(s) ({}) put to queue!" -msgstr "{} kitapları işlem sırasına eklendi" - -#: apps/view/deliver.py:125 -msgid "No book to deliver!" -msgstr "Gönderilecek kitap yok!" - -#: apps/view/library.py:39 apps/view/library.py:85 apps/view/library.py:105 -msgid "Cannot fetch data from {}, status: {}" -msgstr "Cannot fetch data from {}, status: {}" - -#: apps/view/library.py:56 apps/view/library.py:148 apps/view/subscribe.py:84 -#, fuzzy -msgid "Title or Url is empty!" -msgstr "URL veya başlık hatalı" - -#: apps/view/library.py:198 apps/view/library.py:240 -msgid "Url is empty!" -msgstr "Url is empty!" - -#: apps/view/library.py:208 apps/view/library.py:254 -msgid "URL not found in database!" -msgstr "" - -#: apps/view/login.py:21 -msgid "Please input username and password." -msgstr "Lütfen kullanıcı adı ve şifresini giriniz" - -#: apps/view/login.py:23 -msgid "Please use {}/{} to login at first time." -msgstr "İlk giriş için kullanıcı adı:'{}' ve şifre: '{}'" - -#: apps/view/login.py:39 -msgid "The len of username reached the limit of 25 chars!" -msgstr "Kullanıcı adı 25 karakterden fazla olmamalı!" - -#: apps/view/login.py:68 -msgid "The username not exist or password is wrong!" -msgstr "Kullanıcı mevcut değil veya şifre hatalı!" - -#: apps/view/login.py:71 apps/view/login.py:73 -msgid "Forgot password?" -msgstr "Forgot password?" - -#: apps/view/login.py:109 -msgid "login required" -msgstr "" - -#: apps/view/logs.py:88 apps/view/logs.py:104 -#, fuzzy -msgid "The LastDelivered item ({}) not exist!" -msgstr "Besleme ({}) mevcut değil!" - -#: apps/view/logs.py:95 -#, fuzzy -msgid "The id or num is invalid!" -msgstr "Kimlik geçersiz!" - -#: apps/view/setting.py:17 -msgid "Chinese" -msgstr "Çince" - -#: apps/view/setting.py:18 -msgid "English" -msgstr "İngilizce" - -#: apps/view/setting.py:19 -msgid "French" -msgstr "Fransızca" - -#: apps/view/setting.py:20 -msgid "Spanish" -msgstr "İspanyolca" - -#: apps/view/setting.py:21 -msgid "Portuguese" -msgstr "Portekizce" - -#: apps/view/setting.py:22 -msgid "German" -msgstr "Almanca" - -#: apps/view/setting.py:23 -msgid "Italian" -msgstr "İtalyanca" - -#: apps/view/setting.py:24 -msgid "Japanese" -msgstr "Japonca" - -#: apps/view/setting.py:25 -msgid "Russian" -msgstr "Rusça" - -#: apps/view/setting.py:26 -msgid "Turkish" -msgstr "Türkçe" - -#: apps/view/setting.py:27 -msgid "Korean" -msgstr "Koreli" - -#: apps/view/setting.py:28 -msgid "Arabic" -msgstr "Arapça" - -#: apps/view/setting.py:29 -msgid "Czech" -msgstr "Çek" - -#: apps/view/setting.py:30 -msgid "Dutch" -msgstr "Flemenkçe" - -#: apps/view/setting.py:31 -msgid "Greek" -msgstr "Yunan" - -#: apps/view/setting.py:32 -msgid "Hindi" -msgstr "Hintçe" - -#: apps/view/setting.py:33 -msgid "Malaysian" -msgstr "Malezyalı" - -#: apps/view/setting.py:34 -msgid "Bengali" -msgstr "Bengal" - -#: apps/view/setting.py:35 -msgid "Persian" -msgstr "Farsça" - -#: apps/view/setting.py:36 -msgid "Urdu" -msgstr "Urduca" - -#: apps/view/setting.py:37 -msgid "Swahili" -msgstr "Svahili" - -#: apps/view/setting.py:38 -msgid "Vietnamese" -msgstr "Vietnam" - -#: apps/view/setting.py:39 -msgid "Punjabi" -msgstr "Pencap" - -#: apps/view/setting.py:40 -msgid "Javanese" -msgstr "Cava" - -#: apps/view/setting.py:41 -msgid "Tagalog" -msgstr "Tagalog" - -#: apps/view/setting.py:42 -msgid "Hausa" -msgstr "Hausa" - -#: apps/view/setting.py:58 -msgid "Kindle E-mail is requied!" -msgstr "Kindle E-mail adresi gerekli!" - -#: apps/view/setting.py:60 -msgid "Title is requied!" -msgstr "Başlık zorunlu!" - -#: apps/view/setting.py:86 -msgid "Settings Saved!" -msgstr "Ayarlar Kaydedildi!" - -#: apps/view/share.py:112 -msgid "'{title}'

Saved to {act} [{email}] success." -msgstr "'{title}'

{act} [{email}] başarısına kaydedildi." - -#: apps/view/share.py:134 -msgid "Failed save to Pocket.
" -msgstr "Pocket'e kaydetme işlemi başarısız oldu.
" - -#: apps/view/share.py:136 -msgid "'{}'

Saved to your Pocket account." -msgstr "'{}'

Pocket hesabınıza kaydedildi." - -#: apps/view/share.py:139 -msgid "See details below:

{}" -msgstr "Aşağıdaki ayrıntılara bakın:

{}" - -#: apps/view/share.py:159 -msgid "'{}'

Saved to your Instapaper account." -msgstr "'{}'

Instapaper hesabınıza kaydedildi." - -#: apps/view/share.py:163 -msgid "" -"Failed save to Instapaper
'{}'

Reason : Invalid username or " -"password." -msgstr "" - -#: apps/view/share.py:167 -msgid "Failed save to Instapaper
'{}'

Reason : Unknown({})." -msgstr "" - -#: apps/view/subscribe.py:46 -msgid "Title or url is empty!" -msgstr "URL veya başlık hatalı" - -#: apps/view/subscribe.py:53 apps/view/subscribe.py:93 -msgid "Duplicated subscription!" -msgstr "Duplicated subscription!" - -#: apps/view/subscribe.py:74 -msgid "The feed ({}) not exist!" -msgstr "Besleme ({}) mevcut değil!" - -#: apps/view/subscribe.py:133 -msgid "The book ({}) not exist!" -msgstr "Kitap ({}) mevcut değil!" - -#: books/serialize_builtin_recipes.py:27 -msgid "You" -msgstr "" - -#: books/serialize_builtin_recipes.py:27 books/serialize_builtin_recipes.py:36 -msgid "Unknown" -msgstr "" - -#: templates/admin.html:3 templates/base.html:150 templates/base.html:152 +#: application/templates/admin.html:3 application/templates/base.html:148 +#: application/templates/base.html:150 msgid "Admin" msgstr "Yönetim" -#: templates/admin.html:14 +#: application/templates/admin.html:14 msgid "Change Password" msgstr "Şifre Değiştirme" -#: templates/admin.html:19 +#: application/templates/admin.html:19 msgid "Old password" msgstr "Eski şifre" -#: templates/admin.html:23 templates/adminmgrpwd.html:19 -#: templates/adminmgrpwd.html:20 +#: application/templates/admin.html:23 +#: application/templates/adminmgrpwd.html:19 +#: application/templates/adminmgrpwd.html:20 msgid "New password" msgstr "Yeni şifre" -#: templates/admin.html:27 templates/admin.html:52 -#: templates/adminmgrpwd.html:23 templates/adminmgrpwd.html:24 +#: application/templates/admin.html:27 application/templates/admin.html:52 +#: application/templates/adminmgrpwd.html:23 +#: application/templates/adminmgrpwd.html:24 msgid "Confirm password" msgstr "Şifreyi onayla" -#: templates/admin.html:31 templates/adminmgrpwd.html:39 +#: application/templates/admin.html:31 +#: application/templates/adminmgrpwd.html:39 msgid "Confirm Change" msgstr "Değişikliği Onayla" -#: templates/admin.html:39 +#: application/templates/admin.html:39 msgid "Add Account" msgstr "Hesap Ekle" -#: templates/admin.html:44 templates/admin.html:85 -#: templates/adminmgrpwd.html:15 templates/adminmgrpwd.html:16 -#: templates/delaccount.html:16 templates/home.html:18 templates/login.html:29 -#: templates/login.html:30 templates/logs.html:85 templates/logs.html:127 +#: application/templates/admin.html:44 application/templates/admin.html:86 +#: application/templates/adminmgrpwd.html:15 +#: application/templates/adminmgrpwd.html:16 +#: application/templates/delaccount.html:16 application/templates/home.html:15 +#: application/templates/login.html:29 application/templates/login.html:30 +#: application/templates/logs.html:85 application/templates/setting.html:205 msgid "Username" msgstr "Kullanıcı adı" -#: templates/admin.html:48 templates/advarchive.html:51 templates/home.html:19 -#: templates/login.html:33 templates/login.html:34 +#: application/templates/admin.html:48 +#: application/templates/adv_archive.html:55 application/templates/base.html:47 +#: application/templates/home.html:16 application/templates/login.html:33 +#: application/templates/login.html:34 application/templates/setting.html:209 msgid "Password" msgstr "Şifre" -#: templates/admin.html:56 templates/adminmgrpwd.html:27 +#: application/templates/admin.html:56 application/templates/admin.html:88 +#: application/templates/adminmgrpwd.html:27 msgid "Expiration" msgstr "Son" -#: templates/admin.html:58 templates/adminmgrpwd.html:29 +#: application/templates/admin.html:58 application/templates/admin.html:99 +#: application/templates/adminmgrpwd.html:29 msgid "Never expire" msgstr "hiç sona ermeyen" -#: templates/admin.html:59 templates/adminmgrpwd.html:30 -#: templates/setting.html:176 +#: application/templates/admin.html:59 application/templates/admin.html:101 +#: application/templates/adminmgrpwd.html:30 +#: application/templates/setting.html:151 msgid "7 Days" msgstr "7 Günlük" -#: templates/admin.html:60 templates/adminmgrpwd.html:31 +#: application/templates/admin.html:60 application/templates/admin.html:103 +#: application/templates/adminmgrpwd.html:31 msgid "1 Month" msgstr "1 ay" -#: templates/admin.html:61 templates/adminmgrpwd.html:32 +#: application/templates/admin.html:61 application/templates/admin.html:105 +#: application/templates/adminmgrpwd.html:32 msgid "3 Months" msgstr "3 ay" -#: templates/admin.html:62 templates/adminmgrpwd.html:33 +#: application/templates/admin.html:62 application/templates/admin.html:107 +#: application/templates/adminmgrpwd.html:33 msgid "6 Months" msgstr "6 ay" -#: templates/admin.html:63 templates/adminmgrpwd.html:34 +#: application/templates/admin.html:63 application/templates/admin.html:109 +#: application/templates/adminmgrpwd.html:34 msgid "1 Year" msgstr "1 yıl" -#: templates/admin.html:64 templates/adminmgrpwd.html:35 -#, fuzzy +#: application/templates/admin.html:64 application/templates/admin.html:111 +#: application/templates/adminmgrpwd.html:35 msgid "2 Years" -msgstr "1 yıl" +msgstr "2 yıl" -#: templates/admin.html:68 templates/advurlfilter.html:32 -#: templates/advwhitelist.html:31 templates/my.html:31 +#: application/templates/admin.html:68 +#: application/templates/adv_whitelist.html:29 application/templates/my.html:32 msgid "Add" msgstr "Ekle" -#: templates/admin.html:74 +#: application/templates/admin.html:74 msgid "Accounts" msgstr "Hesaplar" -#: templates/admin.html:84 +#: application/templates/admin.html:85 msgid "No." msgstr "No:" -#: templates/admin.html:86 -msgid "Enable" +#: application/templates/admin.html:87 +msgid "AutoSend" msgstr "Aktif" -#: templates/admin.html:87 templates/logs.html:132 +#: application/templates/admin.html:89 msgid "Operation" msgstr "İşlemler" -#: templates/admin.html:97 templates/logs.html:145 +#: application/templates/admin.html:97 +msgid "Yes" +msgstr "Evet" + +#: application/templates/admin.html:97 +msgid "No" +msgstr "Hayir" + +#: application/templates/admin.html:117 application/templates/admin.html:120 msgid "Change" msgstr "Değiştir" -#: templates/admin.html:98 templates/advcoverimage.html:47 -#: templates/advuploadcss.html:31 templates/advurlfilter.html:24 -#: templates/advwhitelist.html:23 templates/delaccount.html:20 -#: templates/logs.html:148 templates/my.html:60 templates/my.html:201 -#: templates/my.html:412 +#: application/templates/admin.html:118 application/templates/admin.html:121 +#: application/templates/adv_uploadcss.html:31 +#: application/templates/adv_whitelist.html:22 +#: application/templates/base.html:22 application/templates/delaccount.html:20 msgid "Delete" msgstr "Sil" -#: templates/adminmgrpwd.html:3 -#, fuzzy +#: application/templates/adminmgrpwd.html:3 msgid "Change password" msgstr "Şifre Değiştirme" -#: templates/advarchive.html:3 templates/advarchive.html:9 -#: templates/advbase.html:57 templates/advbase.html:61 +#: application/templates/adv_archive.html:3 +#: application/templates/adv_archive.html:13 +#: application/templates/adv_base.html:59 +#: application/templates/adv_base.html:63 msgid "Archive" msgstr "Arşiv" -#: templates/advarchive.html:10 +#: application/templates/adv_archive.html:14 msgid "Append hyperlinks for archiving or sharing." msgstr "Paylaşım linklerini makaleye ekle." -#: templates/advarchive.html:35 +#: application/templates/adv_archive.html:39 msgid "Authorized" msgstr "Yetkili" -#: templates/advarchive.html:37 +#: application/templates/adv_archive.html:41 msgid "Authorize" msgstr "Yetki vermek" -#: templates/advarchive.html:48 -#, fuzzy +#: application/templates/adv_archive.html:52 msgid "Email or Username" msgstr "Kullanıcı adı" -#: templates/advarchive.html:54 templates/advarchive.html:102 -#: templates/advarchive.html:113 templates/advarchive.html:120 -#: templates/advarchive.html:126 +#: application/templates/adv_archive.html:58 application/templates/base.html:57 msgid "Verify" msgstr "Doğrulamak" -#: templates/advarchive.html:87 -#, fuzzy -msgid "Append QR code of url to article" -msgstr "Url’in qrcode’unu makaleye ekle" - -#: templates/advarchive.html:93 templates/setting.html:193 +#: application/templates/adv_archive.html:93 +#: application/templates/setting.html:223 msgid "Save settings" msgstr "Ayarları kaydet" -#: templates/advarchive.html:105 -msgid "Verifying" -msgstr "Doğrulama" - -#: templates/advarchive.html:116 -msgid "Congratulation : the username and password are correct." -msgstr "Tebrik: kullanıcı adı ve şifre doğru." - -#: templates/advarchive.html:117 -msgid "Verified" -msgstr "Doğrulanmış" - -#: templates/advarchive.html:119 -msgid "The username or password is incorrect!" -msgstr "kullanıcı adı veya şifre yanlış!" - -#: templates/advarchive.html:125 -msgid "Error when verify the username and password for Instapaper. Status:" -msgstr "Instapaper için kullanıcı adı ve şifre doğrulanırken hata oluştu. Durum:" - -#: templates/advbase.html:39 templates/advbase.html:43 -#: templates/advdelivernow.html:3 templates/advdelivernow.html:8 +#: application/templates/adv_base.html:39 +#: application/templates/adv_base.html:43 +#: application/templates/adv_delivernow.html:3 +#: application/templates/adv_delivernow.html:8 msgid "Deliver now" msgstr "Şimdi gönder" -#: templates/advbase.html:48 templates/advbase.html:52 -#: templates/advwhitelist.html:13 +#: application/templates/adv_base.html:49 +#: application/templates/adv_base.html:53 +#: application/templates/adv_whitelist.html:13 msgid "White List" msgstr "Beyaz liste" -#: templates/advbase.html:66 templates/advbase.html:70 -#: templates/advurlfilter.html:12 -msgid "Url Filter" -msgstr "URL Filtresi" - -#: templates/advbase.html:75 templates/advbase.html:79 -#: templates/advimport.html:8 +#: application/templates/adv_base.html:68 +#: application/templates/adv_base.html:72 +#: application/templates/adv_import.html:8 msgid "Import Feeds" msgstr "feedleri içeri aktar" -#: templates/advbase.html:84 templates/advbase.html:88 +#: application/templates/adv_base.html:77 +#: application/templates/adv_base.html:81 msgid "Cover Image" msgstr "Kapak resmi" -#: templates/advbase.html:93 templates/advbase.html:97 -#: templates/advuploadcss.html:3 +#: application/templates/adv_base.html:86 +#: application/templates/adv_base.html:90 +#: application/templates/adv_uploadcss.html:3 msgid "Stylesheet" msgstr "Stylesheet" -#: templates/advcoverimage.html:3 -#, fuzzy -msgid "Cover image" -msgstr "Kapak resmi" - -#: templates/advcoverimage.html:32 -msgid "Upload cover image" -msgstr "Kapak resmi yükle" - -#: templates/advcoverimage.html:33 -msgid "Upload a cover image from local." -msgstr "Yerelden bir kapak resmi yükleyin." - -#: templates/advcoverimage.html:46 templates/advuploadcss.html:30 -msgid "Upload" -msgstr "Yükleme" - -#: templates/advcoverimage.html:66 -msgid "Size of image file must be smaller than 500KB." -msgstr "Resim dosyasının boyutu 500 KB'den küçük olmalıdır." - -#: templates/advcoverimage.html:72 -msgid "The file you chosen is not an image." -msgstr "Seçtiğiniz dosya bir görüntü değil." - -#: templates/advcoverimage.html:100 -msgid "" -"

Successfully

The cover image have been uploaded " -"successfully.

" -msgstr "

Successfully

Kapak resmi başarıyla yüklendi.

" - -#: templates/advcoverimage.html:101 templates/advuploadcss.html:74 -#: templates/my.html:533 templates/sharedlibrary.html:311 -#: templates/sharedlibrary.html:333 -msgid "Close" -msgstr "Close" - -#: templates/advcoverimage.html:107 -msgid "Failed to upload the cover image. Error:" -msgstr "Kapak resmi yüklenemedi. Hata:" - -#: templates/advcoverimage.html:163 -msgid "Failed to delete the cover image. Error:" -msgstr "Kapak resmi silinemedi. Hata:" - -#: templates/advcoverimage.html:167 -#, fuzzy -msgid "Failed to delete the cover image. Status:" -msgstr "Kapak resmi silinemedi. Hata:" - -#: templates/advdelivernow.html:9 -msgid "Deliver selected books now." -msgstr "" +#: application/templates/adv_delivernow.html:9 +msgid "Deliver selected recipes now" +msgstr "Şimdi seçilen tarifleri teslim et" -#: templates/advdelivernow.html:12 -#, fuzzy -msgid "No books are subscribed." -msgstr "Abone olduğunuz kitap yok." +#: application/templates/adv_delivernow.html:12 +msgid "There are no recipes subscribed" +msgstr "Abone olunan tarif yok" -#: templates/advdelivernow.html:23 templates/advdelivernow.html:35 +#: application/templates/adv_delivernow.html:23 msgid "Select all" -msgstr "" +msgstr "Hepsini seç" -#: templates/advdelivernow.html:24 templates/advdelivernow.html:36 +#: application/templates/adv_delivernow.html:24 msgid "Select none" -msgstr "" +msgstr "Hiçbirini seçme" -#: templates/advdelivernow.html:42 -#, fuzzy +#: application/templates/adv_delivernow.html:29 msgid "Deliver" msgstr "Şimdi gönder" -#: templates/advimport.html:3 templates/advimport.html:18 +#: application/templates/adv_import.html:3 +#: application/templates/adv_import.html:18 msgid "Import" msgstr "İçeri aktar" -#: templates/advimport.html:9 -msgid "Import custom rss from a OPML file." +#: application/templates/adv_import.html:9 +msgid "Import custom rss from an OPML file." msgstr "Bir OPML dosyasındaki rss'leri içeri aktar." -#: templates/advimport.html:15 +#: application/templates/adv_import.html:15 msgid "Import as fulltext RSS by default" -msgstr "Import as fulltext RSS by default" +msgstr "Varsayılan olarak tam metin RSS olarak içe aktar" -#: templates/advimport.html:19 +#: application/templates/adv_import.html:19 msgid "Download" msgstr "İndir" -#: templates/advuploadcss.html:22 -#, fuzzy -msgid "Upload stylesheet" -msgstr "Upload style sheet" - -#: templates/advuploadcss.html:23 -#, fuzzy -msgid "Upload a stylesheet from local (accept utf-8 only)." -msgstr "Upload a style sheet from local (accept utf-8 only)." +#: application/templates/adv_uploadcover.html:3 +msgid "Cover image" +msgstr "Kapak resmi" -#: templates/advuploadcss.html:53 -msgid "The file you chosen is not a stylesheet file." -msgstr "The file you chosen is not a stylesheet file." +#: application/templates/adv_uploadcover.html:9 +msgid "Upload cover image" +msgstr "Kapak resmi yükle" -#: templates/advuploadcss.html:73 -msgid "" -"

Successfully

The stylesheet file have been uploaded " -"successfully.

" +#: application/templates/adv_uploadcover.html:10 +msgid "Upload cover images from local with an aspect ratio of approximately 0.65." msgstr "" -"

Successfully

The stylesheet file have been uploaded " -"successfully.

" +"Yaklaşık 0.65 en boy oranına sahip kapak resimlerini yerel olarak " +"yükleyin." -#: templates/advuploadcss.html:79 templates/advuploadcss.html:83 -msgid "Failed to upload the stylesheet file. Error:" -msgstr "Failed to upload the stylesheet file. Error:" +#: application/templates/adv_uploadcover.html:15 +msgid "Rule to pick cover images" +msgstr "Kapak resimlerini seçme kuralı" -#: templates/advuploadcss.html:133 templates/advuploadcss.html:137 -msgid "Failed to delete the stylesheet. Error:" -msgstr "Failed to delete the stylesheet. Error:" +#: application/templates/adv_uploadcover.html:17 +msgid "Random" +msgstr "Rastgele" -#: templates/advurlfilter.html:3 -#, fuzzy -msgid "Url filter" -msgstr "URL Filtresi" +#: application/templates/adv_uploadcover.html:18 +msgid "Weekday" +msgstr "Hafta içi gün" -#: templates/advurlfilter.html:13 -msgid "Urls in list would not be downloaded." -msgstr "Bu listedeki URLler zamandan kazanmak için indirilmeyecektir." +#: application/templates/adv_uploadcover.html:42 +msgid "Upload/Update" +msgstr "Yükle/Güncelle" -#: templates/advurlfilter.html:30 -msgid "Please input regular expression" -msgstr "Bir regex(düzenli ifade) belirtin" +#: application/templates/adv_uploadcss.html:22 +msgid "Upload stylesheet" +msgstr "Stil sayfası yükle" -#: templates/advwhitelist.html:3 -#, fuzzy +#: application/templates/adv_uploadcss.html:23 +msgid "Upload a stylesheet from local (accept utf-8 only)." +msgstr "Yerel olarak bir stil sayfası yükle (sadece utf-8 kabul edilir)." + +#: application/templates/adv_uploadcss.html:30 +msgid "Upload" +msgstr "Yükleme" + +#: application/templates/adv_whitelist.html:3 msgid "White list" msgstr "Beyaz liste" -#: templates/advwhitelist.html:15 -#, fuzzy, python-format +#: application/templates/adv_whitelist.html:15 +#, python-format msgid "" "Emails sent to %(name)sxxx@appid.appspotmail.com will be transferred to " "your email." msgstr "" -"%sxxx@appid.appspotmail.com adresine gönderilen emailler admin " -"hesabına bağlı Kindle’a gönderilecek." +"%(name)sxxx@appid.appspotmail.com adresine gönderilen emailler admin " +"hesabına bağlı Kindle'a gönderilecek." -#: templates/advwhitelist.html:29 +#: application/templates/adv_whitelist.html:27 msgid "Please input mail address" msgstr "Lütfen e-posta adresini giriniz" -#: templates/autoback.html:3 templates/tipsandback.html:3 -#, fuzzy +#: application/templates/autoback.html:3 +#: application/templates/tipsandback.html:3 msgid "Auto back" msgstr "Geri dönmek için tıklayınız" -#: templates/autoback.html:28 templates/tipsandback.html:13 +#: application/templates/autoback.html:28 +#: application/templates/tipsandback.html:13 msgid "Auto back to previous page after 5 seconds" msgstr "5 saniye sonra otomatik olarak önceki sayfaya döneceksiniz." -#: templates/autoback.html:29 templates/tipsandback.html:14 -#: templates/tipsback.html:15 +#: application/templates/autoback.html:29 +#: application/templates/tipsandback.html:14 +#: application/templates/tipsback.html:15 msgid "Click to back" msgstr "Geri dönmek için tıklayınız" -#: templates/base.html:116 templates/home.html:15 +#: application/templates/base.html:23 +msgid "View Source Code" +msgstr "Kaynak kodunu görüntüle" + +#: application/templates/base.html:24 +msgid "Subscribe (Deliver Separately)" +msgstr "Abone ol (Ayrı teslim et)" + +#: application/templates/base.html:25 +msgid "Subscribe" +msgstr "Abone ol" + +#: application/templates/base.html:26 +msgid "Cannot add this custom rss, Error:" +msgstr "Bu özel rss eklenemiyor, Hata:" + +#: application/templates/base.html:27 +msgid "Cannot delete this feed, Error:" +msgstr "Bu yayını silemiyorum, Hata:" + +#: application/templates/base.html:28 +msgid "Fulltext" +msgstr "Tam Metin" + +#: application/templates/base.html:29 application/templates/base.html:36 +msgid "Share" +msgstr "Paylaş" + +#: application/templates/base.html:30 +msgid "Are you sure to delete ({0})?" +msgstr "({0}) silmek istediğinizden emin misiniz?" + +#: application/templates/base.html:31 +msgid "Share links, share happiness" +msgstr "Bağlantıları paylaş, mutluluk paylaş" + +#: application/templates/base.html:32 +msgid "Category" +msgstr "Kategori" + +#: application/templates/base.html:33 application/templates/setting.html:130 +msgid "Language" +msgstr "Dil" + +#: application/templates/base.html:34 +msgid "" +"Please write a category in text field if the one you wish is not in the " +"list." +msgstr "Dileğiniz kategori listede yoksa lütfen metin alanına bir kategori yazın." + +#: application/templates/base.html:35 +msgid "Cancel" +msgstr "İptal" + +#: application/templates/base.html:37 +msgid "Language code invalid" +msgstr "Dil kodu geçersiz" + +#: application/templates/base.html:38 +msgid "Thank you for sharing." +msgstr "Paylaştığınız için teşekkür ederiz." + +#: application/templates/base.html:39 +msgid "Close" +msgstr "Kapat" + +#: application/templates/base.html:40 +msgid "Unsubscribe" +msgstr "Abonelikten çık" + +#: application/templates/base.html:41 +msgid "Cannot subscribe this recipe, Error:" +msgstr "Bu tarife abone olunamıyor, Hata:" + +#: application/templates/base.html:42 +msgid "Are you sure to Unsubscribe ({0})?" +msgstr "({0}) aboneliği iptal etmek istediğinizden emin misiniz?" + +#: application/templates/base.html:43 +msgid "Cannot unsubscribe this recipe, Error:" +msgstr "Bu tarife abonelik iptal edilemiyor, Hata:" + +#: application/templates/base.html:44 +msgid "The recipe is already subscribed." +msgstr "Tarif zaten abone edilmiş." + +#: application/templates/base.html:45 +msgid "Subscription info" +msgstr "Abonelik bilgisi" + +#: application/templates/base.html:46 +msgid "Account" +msgstr "Hesap" + +#: application/templates/base.html:48 +msgid "Submit" +msgstr "Gönder" + +#: application/templates/base.html:49 +msgid "" +"If any field is left blank, the server will clear the saved login " +"information." +msgstr "" +"Herhangi bir alan boş bırakılırsa, sunucu kayıtlı giriş bilgilerini " +"silecektir." + +#: application/templates/base.html:50 +msgid "Cannot set the subscription infomation, Error:" +msgstr "Abonelik bilgisi ayarlanamıyor, Hata:" + +#: application/templates/base.html:51 +msgid "Choose a recipe file to upload" +msgstr "Yüklemek için bir tarif dosyası seçin" + +#: application/templates/base.html:52 +msgid "Congratulations" +msgstr "Tebrikler" + +#: application/templates/base.html:53 +msgid "Thanks" +msgstr "Teşekkürler" + +#: application/templates/base.html:54 +msgid "" +"Your recipe has been uploaded, and it can be found in the Library " +"section. If you dont see it, please make sure to switch to the correct " +"language." +msgstr "" +"Tarifiniz yüklendi ve Kütüphane bölümünde bulunabilir. Görmüyorsanız, " +"lütfen doğru dile geçtiğinizden emin olun." + +#: application/templates/base.html:55 +msgid "Your recipe have been deleted." +msgstr "Tarifiniz silindi." + +#: application/templates/base.html:56 +msgid "Read with Kindle" +msgstr "Kindle ile oku" + +#: application/templates/base.html:58 +msgid "Verified" +msgstr "Doğrulanmış" + +#: application/templates/base.html:59 application/view/login.py:67 +#: application/view/share.py:154 +msgid "The username does not exist or password is wrong." +msgstr "Kullanıcı adı mevcut değil veya şifre yanlış." + +#: application/templates/base.html:60 +msgid "The file you chosen is not an acceptable type." +msgstr "Seçtiğiniz dosya kabul edilebilir bir türde değil." + +#: application/templates/base.html:61 +msgid "The file have been uploaded successfully." +msgstr "Dosya başarıyla yüklendi." + +#: application/templates/base.html:62 +msgid "This feed has been successfully subscribed." +msgstr "Bu besleme başarıyla abone edildi." + +#: application/templates/base.html:63 +msgid "Thank you for your feedback, this feed will be reviewed soon." +msgstr "Geri bildiriminiz için teşekkür ederiz, bu besleme yakında incelenecek." + +#: application/templates/base.html:64 +msgid "Are you confirming to share the recipe ({0})?" +msgstr "Tarifi paylaşmayı onaylıyor musunuz ({0})?" + +#: application/templates/base.html:65 +msgid "[All]" +msgstr "[Tümü]" + +#: application/templates/base.html:66 +msgid "[By Time]" +msgstr "[Zamana Göre]" + +#: application/templates/base.html:67 +msgid "[Uncategoried]" +msgstr "[Kategorisiz]" + +#: application/templates/base.html:68 +msgid "No links found in the chosen language." +msgstr "Seçilen dilde bağlantı bulunamadı." + +#: application/templates/base.html:69 +msgid "Invalid report" +msgstr "Geçersiz rapor" + +#: application/templates/base.html:70 +msgid "Are you confirming that this link is invalid or off the cloud?" +msgstr "Bu bağlantının geçersiz veya bulutta olmadığını onaylıyor musunuz?" + +#: application/templates/base.html:71 +msgid "Customize delivery time" +msgstr "Teslimat zamanını özelleştir" + +#: application/templates/base.html:72 application/templates/setting.html:50 +msgid "Delivery days" +msgstr "Teslimat günleri" + +#: application/templates/base.html:73 application/templates/setting.html:52 +msgid "Mon" +msgstr "Pzt" + +#: application/templates/base.html:74 application/templates/setting.html:54 +msgid "Tue" +msgstr "Sal" + +#: application/templates/base.html:75 application/templates/setting.html:56 +msgid "Wed" +msgstr "Çar" + +#: application/templates/base.html:76 application/templates/setting.html:58 +msgid "Thu" +msgstr "Prş" + +#: application/templates/base.html:77 application/templates/setting.html:60 +msgid "Fri" +msgstr "Cum" + +#: application/templates/base.html:78 application/templates/setting.html:62 +msgid "Sat" +msgstr "Cts" + +#: application/templates/base.html:79 application/templates/setting.html:64 +msgid "Sun" +msgstr "Paz" + +#: application/templates/base.html:80 +msgid "Delivery times" +msgstr "Teslimat saatleri" + +#: application/templates/base.html:81 +msgid "The customized delivery time for the recipe has been successfully saved." +msgstr "Tarif için özel teslimat zamanı başarıyla kaydedildi." + +#: application/templates/base.html:82 +msgid "The account have been deleted." +msgstr "Hesap silindi." + +#: application/templates/base.html:83 application/view/admin.py:46 +#: application/view/admin.py:66 +msgid "The username or password is empty." +msgstr "Kullanıcı adı veya şifre boş." + +#: application/templates/base.html:84 application/view/admin.py:50 +#: application/view/admin.py:70 application/view/admin.py:143 +msgid "The two new passwords are dismatch." +msgstr "İki yeni şifre uyuşmuyor." + +#: application/templates/base.html:85 +msgid "Password changed successfully." +msgstr "Şifre başarıyla değiştirildi." + +#: application/templates/base.html:86 +msgid "Account added successfully." +msgstr "Hesap başarıyla eklendi." + +#: application/templates/base.html:87 application/view/login.py:106 +msgid "login required" +msgstr "Giriş yapılması gerekiyor" + +#: application/templates/base.html:88 +msgid "Upload cover files successfully." +msgstr "Kapak dosyaları başarıyla yüklendi." + +#: application/templates/base.html:89 +msgid "" +"Total size of the files you selected exceeds 16MB. Please reduce the " +"image resolution or upload in batches." +msgstr "" +"Seçtiğiniz dosyaların toplam boyutu 16 MB yi aşıyor. Lütfen görüntü " +"çözünürlüğünü azaltın veya toplu olarak yükleyin." + +#: application/templates/base.html:111 application/templates/home.html:12 msgid "Logout" msgstr "Çıkış" -#: templates/base.html:118 templates/home.html:20 templates/login.html:3 -#: templates/login.html:37 +#: application/templates/base.html:113 application/templates/home.html:17 +#: application/templates/login.html:3 application/templates/login.html:37 msgid "Login" msgstr "Giriş" -#: templates/base.html:135 templates/base.html:137 templates/home.html:14 -#: templates/my.html:3 +#: application/templates/base.html:133 application/templates/base.html:135 +#: application/templates/home.html:11 application/templates/my.html:3 msgid "Feeds" msgstr "RSSler" -#: templates/base.html:140 templates/base.html:142 templates/setting.html:3 +#: application/templates/base.html:138 application/templates/base.html:140 +#: application/templates/setting.html:3 msgid "Settings" msgstr "Ayarlar" -#: templates/base.html:145 templates/base.html:147 templates/logs.html:3 +#: application/templates/base.html:143 application/templates/base.html:145 +#: application/templates/logs.html:3 msgid "Logs" msgstr "Kayıtlar" -#: templates/base.html:155 templates/base.html:157 +#: application/templates/base.html:153 application/templates/base.html:155 msgid "Advanced" msgstr "Gelişmiş" -#: templates/base.html:160 templates/base.html:162 -#: templates/sharedlibrary.html:3 +#: application/templates/base.html:158 application/templates/base.html:160 +#: application/templates/library.html:3 msgid "Shared" -msgstr "Shared" +msgstr "Paylaşılan" -#: templates/delaccount.html:3 -#, fuzzy +#: application/templates/delaccount.html:3 msgid "Delete account" msgstr "Hesabı Sil" -#: templates/home.html:3 +#: application/templates/home.html:3 msgid "Home" -msgstr "" +msgstr "Ana Sayfa" -#: templates/home.html:12 +#: application/templates/home.html:9 msgid "Sharing Joyful News Every Step of the Way" -msgstr "" +msgstr "Her Adımda Mutlu Haberler Paylaşma" -#: templates/home.html:30 +#: application/templates/home.html:27 msgid "Inherited From Calibre" msgstr "Calibre Kodları Kullanıldı." -#: templates/home.html:32 +#: application/templates/home.html:30 #, python-format msgid "" -"With the powerful %(calibre)s, you can now effortlessly generate epub and" -" mobi books within a Python-hosted environment and seamlessly transfer " -"them to your eReader or other reading devices." +"Empowered by %(calibre)s, you can easily create e-books on a Python-" +"supported online platform and seamlessly transfer them to your e-reader " +"or other reading devices." msgstr "" +"%(calibre)s tarafından güçlendirilmiş olarak, Python destekli bir " +"çevrimiçi platformda kolayca e-kitaplar oluşturabilir ve bunları " +"e-okuyucunuza veya diğer okuma cihazlarına sorunsuz bir şekilde " +"aktarabilirsiniz." -#: templates/home.html:39 +#: application/templates/home.html:38 msgid "Share Your Ideas" msgstr "Fikrinizi Paylaşın" -#: templates/home.html:41 -#, fuzzy, python-format +#: application/templates/home.html:41 +#, python-format msgid "" -"With my open source %(app_name)s application, You can deploy your own " -"server to push news feeds to your kindle dialy or share the service with " -"your friends." +"With the open-source %(kindleear)s application, you can set up your own " +"server to deliver daily news feeds to your e-reader and effortlessly " +"share the service with friends." msgstr "" "ile siz de kendi serverınızı kurup Kindle'ınıza RSS'leri günlük " "gönderebilir veya arkadaşlarınızla paylaşabilirsiniz." -#: templates/login.html:40 -#, fuzzy +#: application/templates/library.html:48 application/templates/my.html:62 +msgid "Search" +msgstr "Ara" + +#: application/templates/login.html:40 msgid "" "The website doesn't allow registration. You can ask the owner for an " "account." @@ -776,602 +688,626 @@ msgstr "" "Yeni bir hesap açmak için bir site yönetici ile iletişime geçmeniz " "gerekmektedir." -#: templates/logs.html:34 +#: application/templates/logs.html:34 msgid "Only display last 10 logs" msgstr "Sadece son 10 işlem kaydını gösterir." -#: templates/logs.html:45 templates/logs.html:86 templates/logs.html:128 +#: application/templates/logs.html:45 application/templates/logs.html:86 msgid "Time" msgstr "Tarih/Saat" -#: templates/logs.html:46 templates/logs.html:87 templates/logs.html:129 -#: templates/my.html:16 templates/setting.html:151 +#: application/templates/logs.html:46 application/templates/logs.html:87 +#: application/templates/my.html:17 application/templates/setting.html:99 +#: application/templates/setting.html:100 +#: application/templates/setting.html:101 +#: application/templates/setting.html:102 +#: application/templates/setting.html:126 msgid "Title" msgstr "Başlık" -#: templates/logs.html:47 templates/logs.html:88 +#: application/templates/logs.html:47 application/templates/logs.html:88 msgid "Size" msgstr "Dosya Boyutu" -#: templates/logs.html:48 templates/logs.html:89 +#: application/templates/logs.html:48 application/templates/logs.html:89 msgid "To" msgstr "Kime" -#: templates/logs.html:49 templates/logs.html:90 +#: application/templates/logs.html:49 application/templates/logs.html:90 msgid "Status" msgstr "Durum" -#: templates/logs.html:69 +#: application/templates/logs.html:69 msgid "There is no log" msgstr "Kayıt yok." -#: templates/logs.html:73 +#: application/templates/logs.html:73 msgid "Logs of other users" msgstr "Diğer kullanıcıların işlem kayıtları" -#: templates/logs.html:115 -msgid "Last delivered" -msgstr "Son teslim" - -#: templates/logs.html:130 -msgid "Num" -msgstr "Num" - -#: templates/logs.html:131 -msgid "Record" -msgstr "Kayıt" - -#: templates/logs.html:164 -msgid "Please input a new number" -msgstr "Lütfen yeni bir sayı giriniz" - -#: templates/logs.html:167 -msgid "The number is invalid" -msgstr "Numara geçersiz" - -#: templates/logs.html:176 -msgid "Cannot change this record, Error:" -msgstr "Bu kaydı değiştiremiyorum, Hata:" - -#: templates/logs.html:180 -msgid "Error when try to change this record. Status:" -msgstr "Bu kaydı değiştirmeye çalışırken hata oluştu. Durum:" - -#: templates/logs.html:196 -msgid "Cannot delete this record, Error:" -msgstr "Bu kaydı silemiyorum, Hata:" - -#: templates/logs.html:200 -msgid "Error when try to delete this record. Status:" -msgstr "Bu kaydı silmeye çalışırken hata oluştu. Durum:" - -#: templates/my.html:11 +#: application/templates/my.html:12 msgid "Custom Rss" msgstr "Özel RSS" -#: templates/my.html:22 templates/my.html:42 templates/my.html:372 -msgid "Fulltext" -msgstr "Tam Metin" - -#: templates/my.html:59 templates/my.html:405 templates/my.html:564 -msgid "Share" -msgstr "Paylaş" +#: application/templates/my.html:23 +msgid "Content embedded" +msgstr "Gömülü içerik" -#: templates/my.html:66 +#: application/templates/my.html:44 msgid "Subscribed" -msgstr "Abone Olduğunuz Kitaplar" - -#: templates/my.html:68 -#, fuzzy -msgid "There are no subscribed books" -msgstr "Do not have any subscribed book." - -#: templates/my.html:74 templates/my.html:431 templates/my.html:484 -msgid "Separate" -msgstr "Ayır" - -#: templates/my.html:87 templates/my.html:453 -msgid "Login Info" -msgstr "Giriş Bilgisi" - -#: templates/my.html:89 templates/my.html:463 -msgid "Unsubscribe" -msgstr "İptal" +msgstr "Abone olundu" -#: templates/my.html:99 +#: application/templates/my.html:49 msgid "Library" -msgstr "" +msgstr "Kütüphane" -#: templates/my.html:103 +#: application/templates/my.html:57 msgid "Upload your custom recipe" -msgstr "" - -#: templates/my.html:104 -#, fuzzy -msgid "Search" -msgstr "Arşiv" +msgstr "Özel tarifinizi yükleyin" -#: templates/my.html:107 -msgid "There are No recipes unsubscribed" -msgstr "" +#: application/templates/my.html:70 +msgid "Subscription to selected recipe successful." +msgstr "Seçilen tarife abonelik başarılı." -#: templates/my.html:110 -#, fuzzy +#: application/templates/my.html:73 msgid "Bookmarklet" msgstr "Kitap modu" -#: templates/my.html:114 -#, fuzzy +#: application/templates/my.html:77 msgid "Add to KindleEar" -msgstr "Read with Kindle" +msgstr "KindleEar'a ekle" -#: templates/my.html:117 +#: application/templates/my.html:80 msgid "Drag and drop this link to your bookmarks" -msgstr "" +msgstr "Bu bağlantıyı yer imlerinize sürükleyip bırakın" -#: templates/my.html:202 -msgid "View Source Code" -msgstr "" - -#: templates/my.html:204 -#, fuzzy -msgid "Subscribe Separately" -msgstr "Abone ol" - -#: templates/my.html:205 -#, fuzzy -msgid "Merged Subscription" -msgstr "Duplicated subscription!" - -#: templates/my.html:292 -msgid "Cannot subscribe this book, Error:" -msgstr "Bu kitaba abone olamaz, Hata:" - -#: templates/my.html:296 -msgid "Error when try to subscribe this book. Status:" -msgstr "Bu kitaba abone olmaya çalışırken hata oluştu. Durum:" - -#: templates/my.html:321 -msgid "Cannot unsubscribe this book, Error:" -msgstr "Bu kitabı iptal edemem, Hata:" - -#: templates/my.html:325 -msgid "Error when try to unsubscribe this book. Status:" -msgstr "Bu kitabı iptal etmeyi denediğinizde hata oluştu. Durum:" - -#: templates/my.html:340 -msgid "Cannot delete this feed, Error:" -msgstr "Bu yayını silemiyorum, Hata:" - -#: templates/my.html:344 -msgid "Error when try to delete this feed. Status:" -msgstr "Bu yayını silmeye çalışırken hata oluştu. Durum:" - -#: templates/my.html:361 templates/my.html:582 templates/sharedlibrary.html:316 -msgid "Cannot add this feed, Error:" -msgstr "Bu yayını ekleyemiyorum, Hata:" - -#: templates/my.html:506 templates/sharedlibrary.html:220 -msgid "Subscribe" -msgstr "Abone ol" - -#: templates/my.html:532 -msgid "" -"

Thanks

Thank you for sharing, good luck will always with " -"you.

" -msgstr "" -"

Thanks

Thank you for sharing, good luck will always with " -"you.

" - -#: templates/my.html:538 -msgid "Error:" -msgstr "" - -#: templates/my.html:542 -#, fuzzy -msgid "Error when try to fetch content of the category. Status:" -msgstr "Bu kaydı değiştirmeye çalışırken hata oluştu. Durum:" - -#: templates/my.html:551 -msgid "

Share links, share happiness

" -msgstr "

Share links, share happiness

" - -#: templates/my.html:552 -#, fuzzy, python-format -msgid "

Category for [{0}]:

" -msgstr "

Category for [%s]:

" - -#: templates/my.html:558 -msgid "" -"

Please write a category in text field if the one you wish is not in " -"the list.

" +#: application/templates/setting.html:14 +msgid "Your account will pause after {0}, please log in again before it expires." msgstr "" -"

Please write a category in text field if the one you wish is not in " -"the list.

" - -#: templates/my.html:561 -msgid "Cancel" -msgstr "Cancel" - -#: templates/my.html:586 templates/sharedlibrary.html:320 -msgid "Error when try to add this feed. Status:" -msgstr "Bu yayını eklemeye çalışırken hata oluştu. Durum:" - -#: templates/my.html:627 -msgid "Read with Kindle" -msgstr "Read with Kindle" - -#: templates/setting.html:14 -msgid "Your account will pause after" -msgstr "Bu hesabın gönderileri şu tarihte duraklatılacak:" +"Bu hesabın gönderileri şu tarihte duraklatılacak: {0} duraklatılmaması " +"için bu tarihten önce giriş yapınız." -#: templates/setting.html:14 -msgid ", Please login before expire." -msgstr ", duraklatılmaması için bu tarihten önce giriş yapınız." - -#: templates/setting.html:15 +#: application/templates/setting.html:15 msgid "Delete Account" msgstr "Hesabı Sil" -#: templates/setting.html:24 +#: application/templates/setting.html:24 msgid "Base Setting" msgstr "Temel Ayarlar" -#: templates/setting.html:26 -msgid "Kindle E-mail" -msgstr "Kindle E-mail" - -#: templates/setting.html:27 -msgid "Seperated by semicolon" -msgstr "Seperated by semicolon" - -#: templates/setting.html:30 -msgid "Time zone" -msgstr "Saat dilimi" - -#: templates/setting.html:42 -msgid "Deliver days" -msgstr "Gönderim Günleri" - -#: templates/setting.html:44 -msgid "Mon" -msgstr "Pzt" +#: application/templates/setting.html:26 +msgid "Auto Delivery" +msgstr "Otomatik Teslimat" -#: templates/setting.html:46 -msgid "Tue" -msgstr "Sal" +#: application/templates/setting.html:28 +msgid "Recipes and custom RSS" +msgstr "Tarifler ve özel RSS" -#: templates/setting.html:48 -msgid "Wed" -msgstr "Çar" +#: application/templates/setting.html:29 +msgid "Recipes only" +msgstr "Sadece tarifler" -#: templates/setting.html:50 -msgid "Thu" -msgstr "Prş" +#: application/templates/setting.html:30 +msgid "Disable all" +msgstr "Tümünü devre dışı bırak" -#: templates/setting.html:52 -msgid "Fri" -msgstr "Cum" +#: application/templates/setting.html:34 +msgid "Kindle E-mail" +msgstr "Kindle E-mail" -#: templates/setting.html:54 -msgid "Sat" -msgstr "Cts" +#: application/templates/setting.html:35 +msgid "Seperated by comma" +msgstr "Virgülle ayrılmış" -#: templates/setting.html:56 -msgid "Sun" -msgstr "Paz" +#: application/templates/setting.html:38 +msgid "Time zone" +msgstr "Saat dilimi" -#: templates/setting.html:59 -msgid "Deliver time" -msgstr "Gönderim zamanı" +#: application/templates/setting.html:67 +msgid "Delivery time" +msgstr "Teslimat zamanı" -#: templates/setting.html:67 +#: application/templates/setting.html:75 msgid "Book type" msgstr "Dosya tipi" -#: templates/setting.html:74 +#: application/templates/setting.html:82 msgid "Device type" msgstr "Cihaz tipi" -#: templates/setting.html:84 +#: application/templates/setting.html:92 msgid "Others" msgstr "Diğerleri" -#: templates/setting.html:88 -msgid "Title from" -msgstr "Başlığın alınacağı yer" - -#: templates/setting.html:90 -msgid "Webpage" -msgstr "Web sitesi" - -#: templates/setting.html:91 -msgid "Feed" -msgstr "Feed" - -#: templates/setting.html:95 +#: application/templates/setting.html:96 msgid "Title format" msgstr "Başlık Formatı" -#: templates/setting.html:97 +#: application/templates/setting.html:98 msgid "Title Only" msgstr "Yalnızca Başlık" -#: templates/setting.html:98 -msgid "Title YYYY-MM-DD" -msgstr "Başlık YYYY-AA-GG" - -#: templates/setting.html:99 -msgid "Title MM-DD" -msgstr "Başlık AA-GG" - -#: templates/setting.html:102 -msgid "Title MMM DD" -msgstr "Başlık AAA GG" - -#: templates/setting.html:103 -msgid "Title Day, MMM DD" -msgstr "Başlık Gün, AAA GG" - -#: templates/setting.html:107 +#: application/templates/setting.html:106 msgid "Book mode" msgstr "Kitap modu" -#: templates/setting.html:109 +#: application/templates/setting.html:108 msgid "Periodical" msgstr "Periyodik" -#: templates/setting.html:110 +#: application/templates/setting.html:109 msgid "Comic" msgstr "Komik" -#: templates/setting.html:114 +#: application/templates/setting.html:113 msgid "Remove hyperlinks" -msgstr "Köprüler kaldır" +msgstr "Bağlantıları kaldır" -#: templates/setting.html:116 -#, fuzzy +#: application/templates/setting.html:115 msgid "Do not remove hyperlinks" -msgstr "Köprüler kaldır" +msgstr "Bağlantıları kaldırma" -#: templates/setting.html:117 -#, fuzzy +#: application/templates/setting.html:116 msgid "Remove image links" -msgstr "Köprüler kaldır" +msgstr "Resim bağlantılarını kaldır" -#: templates/setting.html:118 -#, fuzzy +#: application/templates/setting.html:117 msgid "Remove text links" -msgstr "Köprüler kaldır" +msgstr "Metin bağlantılarını kaldır" -#: templates/setting.html:119 -#, fuzzy +#: application/templates/setting.html:118 msgid "Remove all hyperlinks" -msgstr "Köprüler kaldır" +msgstr "Tüm bağlantıları kaldır" -#: templates/setting.html:123 -#, fuzzy -msgid "Author format" -msgstr "Başlık Formatı" - -#: templates/setting.html:126 -#, fuzzy -msgid "YYYY-MM-DD" -msgstr "Başlık YYYY-AA-GG" - -#: templates/setting.html:127 -#, fuzzy -msgid "MM-DD" -msgstr "Başlık AA-GG" - -#: templates/setting.html:128 -#, fuzzy -msgid "MM/DD" -msgstr "Başlık AA/GG" - -#: templates/setting.html:129 -#, fuzzy -msgid "DD/MM" -msgstr "Başlık GG/AA" - -#: templates/setting.html:130 -#, fuzzy -msgid "MMM DD" -msgstr "Başlık AAA GG" - -#: templates/setting.html:131 -#, fuzzy -msgid "Day, MMM DD" -msgstr "Başlık Gün, AAA GG" - -#: templates/setting.html:136 -msgid "Merge books into one" -msgstr "Kitapları birleştirerek gönder" - -#: templates/setting.html:140 -msgid "Enable deliver" -msgstr "Gönderimleri aktifleştir." - -#: templates/setting.html:149 +#: application/templates/setting.html:124 msgid "Custom Rss Setting" msgstr "Özel RSS Ayarları" -#: templates/setting.html:155 -msgid "Language" -msgstr "Dil" - -#: templates/setting.html:167 +#: application/templates/setting.html:142 msgid "Oldest article" msgstr "En eski içerik?" -#: templates/setting.html:169 +#: application/templates/setting.html:144 msgid "No limit" msgstr "Sınırlama yok." -#: templates/setting.html:170 +#: application/templates/setting.html:145 msgid "1 Day" msgstr "1 Günlük" -#: templates/setting.html:171 +#: application/templates/setting.html:146 msgid "2 Days" msgstr "2 Günlük" -#: templates/setting.html:172 +#: application/templates/setting.html:147 msgid "3 Days" msgstr "3 Günlük" -#: templates/setting.html:173 +#: application/templates/setting.html:148 msgid "4 Days" msgstr "4 Günlük" -#: templates/setting.html:174 +#: application/templates/setting.html:149 msgid "5 Days" msgstr "5 Günlük" -#: templates/setting.html:175 +#: application/templates/setting.html:150 msgid "6 Days" msgstr "6 Günlük" -#: templates/setting.html:181 -msgid "Keep images" -msgstr "Resimler gözüksün." +#: application/templates/setting.html:155 +msgid "Time format" +msgstr "Zaman formatı" + +#: application/templates/setting.html:167 +msgid "Author format" +msgstr "Başlık Formatı" + +#: application/templates/setting.html:182 +msgid "Send mail service" +msgstr "Posta servisi gönder" -#: templates/setting.html:185 -msgid "Enable deliver custom rss" -msgstr "Özel RSS gönderimini aktifleştir." +#: application/templates/setting.html:184 +msgid "Service" +msgstr "Servis" -#: templates/setting.html:186 -msgid "This switch only effective when 'Enable deliver' is enabled." -msgstr "" -"Bu ayar yalnızca ’Gönderimleri aktifleştir.’ seçeneği seçilmişken " -"geçerlidir." +#: application/templates/setting.html:193 +msgid "ApiKey" +msgstr "ApiKey" + +#: application/templates/setting.html:197 +msgid "Host" +msgstr "Ana bilgisayar" -#: templates/setting.html:190 -msgid "Important: Please activate your kindle firstly, and goto" -msgstr "Önemli: Lütfen ilk olarak Kindle'ınızı aktifleştirin ve" +#: application/templates/setting.html:201 +msgid "Port" +msgstr "Port" -#: templates/setting.html:190 -#, fuzzy +#: application/templates/setting.html:213 +msgid "Save path" +msgstr "Kayıt yolu" + +#: application/templates/setting.html:219 +#, python-format +msgid "" +"Important: Please activate your kindle firstly, then goto %(personal)s " +"Page and add %(sender)s to 'Approved Personal Document E-mail List'." +msgstr "" +"Önemli: Lütfen önce Kindle'ınızı etkinleştirin, ardından %(personal)s " +"Sayfasına gidin ve %(sender)s'yi 'Onaylanmış Kişisel Belge E-posta " +"Listesi'ne ekleyin." + +#: application/templates/setting.html:219 msgid "Personal Document Settings" msgstr "Ayarları kaydet" -#: templates/setting.html:190 -msgid "Page and add" -msgstr "sayfasına gidin." +#: application/view/admin.py:43 application/view/admin.py:78 +#: application/view/admin.py:149 +msgid "The password includes non-ascii chars." +msgstr "Şifre ascii olmayan karakterler içeriyor." + +#: application/view/admin.py:48 +msgid "The old password is wrong." +msgstr "Eski şifre yanlış." + +#: application/view/admin.py:64 +msgid "You do not have sufficient privileges." +msgstr "Yeterli yetkiniz yok." + +#: application/view/admin.py:68 application/view/login.py:40 +msgid "The username includes unsafe chars." +msgstr "Kullanıcı adı güvensiz karakterler içeriyor." + +#: application/view/admin.py:72 +msgid "Already exist the username." +msgstr "Kullanıcı adı zaten var." + +#: application/view/admin.py:96 application/view/admin.py:117 +#: application/view/admin.py:141 +msgid "The username '{}' does not exist." +msgstr "'{}' kullanıcı adı mevcut değil." + +#: application/view/admin.py:102 +msgid "The username is empty or you dont have right to delete it." +msgstr "Kullanıcı adı boş veya silme yetkiniz yok." + +#: application/view/admin.py:119 +msgid "Please input new password to confirm." +msgstr "Onaylamak için yeni şifre girin." + +#: application/view/admin.py:132 application/view/login.py:36 +msgid "Username is empty." +msgstr "Kullanıcı adı boş." + +#: application/view/admin.py:159 +msgid "Change password success." +msgstr "Şifre değiştirme başarılı." + +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 application/view/adv.py:79 +msgid "Append hyperlink '{}' to article" +msgstr "'{}' linkini makaleye ekle" -#: templates/setting.html:190 -msgid "to 'Approved Personal Document E-mail List'." -msgstr "mail adresini onaylanmış mail adreslerine ekleyin." +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +msgid "Save to {}" +msgstr "{} kaydedildi" -#: templates/sharedlibrary.html:50 -msgid "Database has no data yet, you can share your subscription now." -msgstr "Database has no data yet, you can share your subscription now." +#: application/view/adv.py:70 +msgid "evernote" +msgstr "evernote" -#: templates/sharedlibrary.html:123 templates/sharedlibrary.html:299 -msgid "[All]" -msgstr "[All]" +#: application/view/adv.py:71 +msgid "wiz" +msgstr "wiz" -#: templates/sharedlibrary.html:124 -msgid "[by Time]" -msgstr "[by Time]" +#: application/view/adv.py:72 +msgid "pocket" +msgstr "pocket" -#: templates/sharedlibrary.html:125 templates/sharedlibrary.html:130 -#: templates/sharedlibrary.html:137 templates/sharedlibrary.html:138 -msgid "[Uncategoried]" -msgstr "[Uncategoried]" +#: application/view/adv.py:73 +msgid "instapaper" +msgstr "instapaper" -#: templates/sharedlibrary.html:219 -msgid "Invalid" -msgstr "Invalid" +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 +msgid "Share on {}" +msgstr "{} üzerinde paylaş" -#: templates/sharedlibrary.html:310 -msgid "

Successfully

This feed has been successfully subscribed.

" -msgstr "

Successfully

This feed has been successfully subscribed.

" +#: application/view/adv.py:74 +msgid "weibo" +msgstr "weibo" + +#: application/view/adv.py:75 +msgid "tencent weibo" +msgstr "tencent weibo" + +#: application/view/adv.py:76 +msgid "facebook" +msgstr "facebook" + +#: application/view/adv.py:78 +msgid "tumblr" +msgstr "tumblr" + +#: application/view/adv.py:79 +msgid "Open in browser" +msgstr "Tarayıcıda aç" + +#: application/view/adv.py:351 +msgid "Authorization Error!
{}" +msgstr "Yetkilendirme Hatası!
{}" + +#: application/view/adv.py:374 +msgid "Success authorized by Pocket!" +msgstr "Pocket tarafından yetkilendirilen başarı!" -#: templates/sharedlibrary.html:332 +#: application/view/adv.py:380 msgid "" -"

Thanks

Thank you for your feedback, this feed will be reviewed" -" soon.

" +"Failed to request authorization of Pocket!
See details " +"below:

{}" +msgstr "" +"Pocket yetkilendirme isteği başarısız oldu!
Aşağıdaki ayrıntılara " +"bakın:

{}" + +#: application/view/adv.py:390 +msgid "Request type [{}] unsupported" +msgstr "İstek türü [{}] desteklenmiyor" + +#: application/view/adv.py:405 +msgid "The Instapaper service encountered an error. Please try again later." msgstr "" -"

Thanks

Thank you for your feedback, this feed will be reviewed" -" soon.

" +"Instapaper servisi bir hata ile karşılaştı. Lütfen daha sonra tekrar " +"deneyin." + +#: application/view/deliver.py:68 +msgid "The username does not exist or the email is empty." +msgstr "Kullanıcı adı mevcut değil veya e-posta boş." + +#: application/view/deliver.py:84 +msgid "The following recipes has been added to the push queue." +msgstr "Aşağıdaki tarifler itme kuyruğuna eklendi." + +#: application/view/deliver.py:87 +msgid "There are no recipes to deliver." +msgstr "Teslim edilecek tarif yok." + +#: application/view/library.py:31 +msgid "Cannot fetch data from {}, status: {}" +msgstr "{}, durumundan veri alınamıyor: {}" + +#: application/view/library.py:48 application/view/subscribe.py:192 +#: application/view/subscribe.py:301 application/view/subscribe.py:330 +#: application/view/subscribe.py:338 +msgid "The recipe does not exist." +msgstr "Tarif mevcut değil." + +#: application/view/login.py:20 +msgid "Please input username and password." +msgstr "Lütfen kullanıcı adı ve şifresini giriniz" + +#: application/view/login.py:22 +msgid "Please use {}/{} to login at first time." +msgstr "İlk giriş için kullanıcı adı:'{}' ve şifre: '{}'" + +#: application/view/login.py:38 +msgid "The len of username reached the limit of 25 chars." +msgstr "Kullanıcı adının uzunluğu 25 karakter sınırına ulaştı." + +#: application/view/login.py:70 application/view/login.py:72 +msgid "Forgot password?" +msgstr "Forgot password?" + +#: application/view/setting.py:19 +msgid "Chinese" +msgstr "Çince" + +#: application/view/setting.py:20 +msgid "English" +msgstr "İngilizce" + +#: application/view/setting.py:21 +msgid "French" +msgstr "Fransızca" + +#: application/view/setting.py:22 +msgid "Spanish" +msgstr "İspanyolca" + +#: application/view/setting.py:23 +msgid "Portuguese" +msgstr "Portekizce" + +#: application/view/setting.py:24 +msgid "German" +msgstr "Almanca" + +#: application/view/setting.py:25 +msgid "Italian" +msgstr "İtalyanca" + +#: application/view/setting.py:26 +msgid "Japanese" +msgstr "Japonca" + +#: application/view/setting.py:27 +msgid "Russian" +msgstr "Rusça" + +#: application/view/setting.py:28 +msgid "Turkish" +msgstr "Türkçe" + +#: application/view/setting.py:29 +msgid "Korean" +msgstr "Koreli" + +#: application/view/setting.py:30 +msgid "Arabic" +msgstr "Arapça" + +#: application/view/setting.py:31 +msgid "Czech" +msgstr "Çek" + +#: application/view/setting.py:32 +msgid "Dutch" +msgstr "Flemenkçe" + +#: application/view/setting.py:33 +msgid "Greek" +msgstr "Yunan" + +#: application/view/setting.py:34 +msgid "Hindi" +msgstr "Hintçe" + +#: application/view/setting.py:35 +msgid "Malaysian" +msgstr "Malezyalı" + +#: application/view/setting.py:36 +msgid "Bengali" +msgstr "Bengal" + +#: application/view/setting.py:37 +msgid "Persian" +msgstr "Farsça" + +#: application/view/setting.py:38 +msgid "Urdu" +msgstr "Urduca" + +#: application/view/setting.py:39 +msgid "Swahili" +msgstr "Svahili" + +#: application/view/setting.py:40 +msgid "Vietnamese" +msgstr "Vietnam" + +#: application/view/setting.py:41 +msgid "Punjabi" +msgstr "Pencap" + +#: application/view/setting.py:42 +msgid "Javanese" +msgstr "Cava" + +#: application/view/setting.py:43 +msgid "Tagalog" +msgstr "Tagalog" + +#: application/view/setting.py:44 +msgid "Hausa" +msgstr "Hausa" -#~ msgid "Please Login" -#~ msgstr "Lütfen Giriş Yapın" +#: application/view/setting.py:78 +msgid "Kindle E-mail is requied!" +msgstr "Kindle E-mail adresi gerekli!" + +#: application/view/setting.py:80 +msgid "Title is requied!" +msgstr "Başlık zorunlu!" + +#: application/view/setting.py:82 application/view/setting.py:84 +#: application/view/setting.py:86 +msgid "Some parameters are missing or wrong." +msgstr "Bazı parametreler eksik veya yanlış." -#~ msgid "Note : No supports many accounts for limit of free account of GAE." -#~ msgstr "" -#~ "Not: Ücretsiz Google App Engine " -#~ "hesabında çok fazla kullanıcı oluşturma " -#~ "sorun oluşturabilir..." +#: application/view/setting.py:116 +msgid "Settings Saved!" +msgstr "Ayarlar Kaydedildi!" -#~ msgid "Free Forever." -#~ msgstr "Daima Ücretsiz." +#: application/view/share.py:103 +msgid "'{title}'

Saved to {act} [{email}] success." +msgstr "'{title}'

{act} [{email}] başarısına kaydedildi." -#~ msgid "Good News Always Come With You." -#~ msgstr "İyi Haberler Daima Sizinle Olsun." +#: application/view/share.py:125 +msgid "Failed save to Pocket.
" +msgstr "Pocket'e kaydetme işlemi başarısız oldu.
" -#~ msgid "" -#~ "Author modified and ported %s to " -#~ "generate mobi file in GAE without " -#~ "kindlegen tool of Amazon," -#~ msgstr "" -#~ "Google App Engine de Amazonun Kindlegen" -#~ " uygulamasını kullanmadan mobi dosyalar " -#~ "oluşturabilmek için %s kodlarını yeniden " -#~ "düzenlenmiştir." +#: application/view/share.py:127 +msgid "'{}'

Saved to your Pocket account." +msgstr "'{}'

Pocket hesabınıza kaydedildi." -#~ msgid "for periodical mobi file is a better format to represent news feeds." -#~ msgstr "Çünkü mobi formatı RSSleri sunmak için iyi bir formattır." +#: application/view/share.py:130 +msgid "See details below:

{}" +msgstr "Aşağıdaki ayrıntılara bakın:

{}" -#~ msgid "With my" -#~ msgstr "Bu" +#: application/view/share.py:150 +msgid "'{}'

Saved to your Instapaper account." +msgstr "'{}'

Instapaper hesabınıza kaydedildi." -#~ msgid "open source KindleEar application" -#~ msgstr "açık kaynak KindleEar uygulaması" +#: application/view/share.py:154 application/view/share.py:158 +msgid "Failed save to Instapaper
'{}'

Reason :" +msgstr "Instapaper'a kaydetme başarısız
'{}'

Neden :" -#~ msgid "No have book unsubscribed" -#~ msgstr "No have book unsubscribed" +#: application/view/share.py:158 +msgid "Unknown({})" +msgstr "Bilinmeyen({})" -#~ msgid "Unsubscribed" -#~ msgstr "Abone Olmadığınız Kitaplar" +#: application/view/subscribe.py:55 +msgid "Title or url is empty!" +msgstr "URL veya başlık hatalı" -#~ msgid "No have book unsubscrebed" -#~ msgstr "Abone olmadığınız kitap yok." +#: application/view/subscribe.py:62 application/view/subscribe.py:132 +msgid "Duplicated subscription!" +msgstr "Duplicated subscription!" -#~ msgid "The item is empty" -#~ msgstr "İçerik boş" +#: application/view/subscribe.py:85 +msgid "The Rss does not exist." +msgstr "Rss mevcut değil." -#~ msgid "Note: task deliver will be executed after some minutes." -#~ msgstr "Not: Gönderim, tıkladıktan birkaç dakika sonra gerçekleşir." +#: application/view/subscribe.py:96 +msgid "The Title or Url is empty." +msgstr "Başlık veya URL boş." -#~ msgid "Fuck Gfw (For users in China)" -#~ msgstr "Fuck Gfw (Çindeki kullanıcılar için)" +#: application/view/subscribe.py:109 +msgid "Failed to fetch the recipe." +msgstr "Tarif alınamadı." -#~ msgid "Input website login info for book '%s'" -#~ msgstr "'%s' kitabı için giriş bilgilerini belirtin" +#: application/view/subscribe.py:123 application/view/subscribe.py:262 +msgid "Failed to save the recipe. Error:" +msgstr "Tarif kaydedilemedi. Hata:" -#~ msgid "Leave any field empty to delete info from database." -#~ msgstr "Herhangi bir bilgiyi silmek için alanını boş bırakın." +#: application/view/subscribe.py:221 +msgid "You can only delete the uploaded recipe." +msgstr "Yalnızca yüklenen tarifi silebilirsiniz." -#~ msgid "Account" -#~ msgstr "Hesap" +#: application/view/subscribe.py:235 +msgid "This recipe has not been subscribed to yet." +msgstr "Bu tarife henüz abone olunmadı." -#~ msgid "Submit" -#~ msgstr "Gönder" +#: application/view/subscribe.py:237 +msgid "Unknown command: {}" +msgstr "Bilinmeyen komut: {}" -#~ msgid "Not remove" -#~ msgstr "Kaldırmak yok" +#: application/view/subscribe.py:249 +msgid "Can not read uploaded file, Error:" +msgstr "Yüklenen dosya okunamıyor, Hata:" -#~ msgid "Image" -#~ msgstr "Görüntü" +#: application/view/subscribe.py:257 +msgid "" +"Failed to decode the recipe. Please ensure that your recipe is saved in " +"utf-8 encoding." +msgstr "" +"Tarif çözümlenemedi. Lütfen tarifinizin utf-8 kodlamasında " +"kaydedildiğinden emin olun." -#~ msgid "Text" -#~ msgstr "Metin" +#: application/view/subscribe.py:277 +msgid "The recipe is already in the library" +msgstr "Tarif zaten kütüphanede" -#~ msgid "All" -#~ msgstr "Herşey" +#: application/view/subscribe.py:308 +msgid "The login information for this recipe has been cleared" +msgstr "Bu tarifin giriş bilgileri temizlendi" -#~ msgid "This feed has been successfully subscribed." -#~ msgstr "This feed has been successfully subscribed." +#: application/view/subscribe.py:312 +msgid "The login information for this recipe has been saved" +msgstr "Bu tarifin giriş bilgileri kaydedildi" diff --git a/application/translations/zh/LC_MESSAGES/messages.mo b/application/translations/zh/LC_MESSAGES/messages.mo index c94e049cf9521aea49b6f6bdeac1d7d062a9dad8..0900434dd96e2220b579e75fe6626d2318af80e8 100644 GIT binary patch literal 18234 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, 2024. # msgid "" msgstr "" -"Project-Id-Version: PROJECT VERSION\n" +"Project-Id-Version: KindleEar v3.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-22 08:34-0300\n" -"PO-Revision-Date: 2024-01-22 08:57-0300\n" +"POT-Creation-Date: 2024-02-14 21:49-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: zh\n" "Language-Team: zh \n" @@ -18,1340 +18,1269 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.14.0\n" -#: apps/view/admin.py:46 apps/view/admin.py:72 apps/view/admin.py:126 -msgid "The password includes non-ascii chars!" -msgstr "密码包含非ASCII字符!" - -#: apps/view/admin.py:49 -msgid "Old password is wrong!" -msgstr "原密码错误!" - -#: apps/view/admin.py:51 apps/view/admin.py:64 apps/view/admin.py:120 -msgid "The two new passwords are dismatch!" -msgstr "两次输入的新密码不匹配!" - -#: apps/view/admin.py:53 apps/view/admin.py:136 -msgid "Change password success!" -msgstr "密码修改成功!" - -#: apps/view/admin.py:62 apps/view/login.py:41 -msgid "The username includes unsafe chars!" -msgstr "用户名包含非法字符!" - -#: apps/view/admin.py:66 -msgid "Already exist the username!" -msgstr "用户名已经存在!" - -#: apps/view/admin.py:86 -msgid "Add a account success!" -msgstr "添加用户账号成功!" - -#: apps/view/admin.py:98 apps/view/admin.py:118 apps/view/admin.py:157 -msgid "The username '{}' not exist!" -msgstr "用户名'{}'不存在!" - -#: apps/view/admin.py:100 -msgid "Please input new password to confirm!" -msgstr "请输入新的密码并确认!" - -#: apps/view/admin.py:113 apps/view/login.py:37 -msgid "Username is empty!" -msgstr "用户名为空!" - -#: apps/view/admin.py:145 -msgid "Please confirm to delete the account!" -msgstr "请确认是否要删除此账号!" - -#: apps/view/admin.py:163 -msgid "The username is empty or you dont have right to delete it!" -msgstr "用户名为空或你没有权限删除此账号!" - -#: apps/view/adv.py:62 apps/view/adv.py:63 apps/view/adv.py:64 -#: apps/view/adv.py:65 apps/view/adv.py:66 apps/view/adv.py:67 -#: apps/view/adv.py:68 apps/view/adv.py:69 apps/view/adv.py:70 -#: apps/view/adv.py:71 -#, fuzzy, python-format -msgid "Append hyperlink '{}' to article" -msgstr "在每篇文章后附加 '%s' 超链接" - -#: apps/view/adv.py:364 -#, fuzzy, python-format -msgid "Authorization Error!
{}" -msgstr "申请授权过程失败!
%s" - -#: apps/view/adv.py:387 -msgid "Success authorized by Pocket!" -msgstr "已经成功获得Pocket的授权!" - -#: apps/view/adv.py:393 -msgid "" -"Failed to request authorization of Pocket!
See details " -"below:

{}" -msgstr "申请Pocket授权失败!
错误信息参考如下:

{}" - -#: apps/view/adv.py:403 -msgid "Request type [{}] unsupported" -msgstr "不支持你请求的命令类型 [{}]" - -#: apps/view/adv.py:418 -msgid "The Instapaper service encountered an error. Please try again later." -msgstr "Instapaper服务器异常,请稍候再试。" - -#: apps/view/deliver.py:108 -msgid "The username not exist or the email of kindle is empty." -msgstr "对应用户名不存在或kindle email未设置。" - -#: apps/view/deliver.py:123 -msgid "Book(s) ({}) put to queue!" -msgstr "书籍 ({}) 已放入推送队列!" - -#: apps/view/deliver.py:125 -msgid "No book to deliver!" -msgstr "没有需要推送的书籍!" - -#: apps/view/library.py:39 apps/view/library.py:85 apps/view/library.py:105 -msgid "Cannot fetch data from {}, status: {}" -msgstr "无法从 {} 获取数据,状态: {}" - -#: apps/view/library.py:56 apps/view/library.py:148 apps/view/subscribe.py:84 -#, fuzzy -msgid "Title or Url is empty!" -msgstr "标题和URL都不能为空!" - -#: apps/view/library.py:198 apps/view/library.py:240 -msgid "Url is empty!" -msgstr "URL为空!" - -#: apps/view/library.py:208 apps/view/library.py:254 -msgid "URL not found in database!" -msgstr "" - -#: apps/view/login.py:21 -msgid "Please input username and password." -msgstr "请输入正确的用户名和密码。" - -#: apps/view/login.py:23 -msgid "Please use {}/{} to login at first time." -msgstr "初次登录请使用用户名'{}'/密码'{}'。" - -#: apps/view/login.py:39 -msgid "The len of username reached the limit of 25 chars!" -msgstr "用户名限制为25个字符!" - -#: apps/view/login.py:68 -msgid "The username not exist or password is wrong!" -msgstr "用户名不存在或密码错误!" - -#: apps/view/login.py:71 apps/view/login.py:73 -msgid "Forgot password?" -msgstr "忘记密码?" - -#: apps/view/login.py:109 -msgid "login required" -msgstr "" - -#: apps/view/logs.py:88 apps/view/logs.py:104 -#, fuzzy -msgid "The LastDelivered item ({}) not exist!" -msgstr "订阅源(数据库ID: {})不存在!" - -#: apps/view/logs.py:95 -#, fuzzy -msgid "The id or num is invalid!" -msgstr "ID不是合法的数值!" - -#: apps/view/setting.py:17 -msgid "Chinese" -msgstr "中文" - -#: apps/view/setting.py:18 -msgid "English" -msgstr "英语" - -#: apps/view/setting.py:19 -msgid "French" -msgstr "法语" - -#: apps/view/setting.py:20 -msgid "Spanish" -msgstr "西班牙语" - -#: apps/view/setting.py:21 -msgid "Portuguese" -msgstr "葡萄牙语" - -#: apps/view/setting.py:22 -msgid "German" -msgstr "德语" - -#: apps/view/setting.py:23 -msgid "Italian" -msgstr "意大利语" - -#: apps/view/setting.py:24 -msgid "Japanese" -msgstr "日语" - -#: apps/view/setting.py:25 -msgid "Russian" -msgstr "俄语" - -#: apps/view/setting.py:26 -msgid "Turkish" -msgstr "土耳其语" - -#: apps/view/setting.py:27 -msgid "Korean" -msgstr "韩语" - -#: apps/view/setting.py:28 -msgid "Arabic" -msgstr "阿拉伯语" - -#: apps/view/setting.py:29 -msgid "Czech" -msgstr "捷克语" - -#: apps/view/setting.py:30 -msgid "Dutch" -msgstr "荷兰语" - -#: apps/view/setting.py:31 -msgid "Greek" -msgstr "希腊语" - -#: apps/view/setting.py:32 -msgid "Hindi" -msgstr "印地语" - -#: apps/view/setting.py:33 -msgid "Malaysian" -msgstr "马来西亚语" - -#: apps/view/setting.py:34 -msgid "Bengali" -msgstr "孟加拉语" - -#: apps/view/setting.py:35 -msgid "Persian" -msgstr "波斯语" - -#: apps/view/setting.py:36 -msgid "Urdu" -msgstr "乌尔都语" - -#: apps/view/setting.py:37 -msgid "Swahili" -msgstr "斯瓦希里语" - -#: apps/view/setting.py:38 -msgid "Vietnamese" -msgstr "越南语" - -#: apps/view/setting.py:39 -msgid "Punjabi" -msgstr "旁遮普语" - -#: apps/view/setting.py:40 -msgid "Javanese" -msgstr "爪哇语" - -#: apps/view/setting.py:41 -msgid "Tagalog" -msgstr "他加禄语" - -#: apps/view/setting.py:42 -msgid "Hausa" -msgstr "豪萨语" - -#: apps/view/setting.py:58 -msgid "Kindle E-mail is requied!" -msgstr "Kindle E-mail必须填写!" - -#: apps/view/setting.py:60 -msgid "Title is requied!" -msgstr "书籍标题不能为空!" - -#: apps/view/setting.py:86 -msgid "Settings Saved!" -msgstr "恭喜,保存成功!" - -#: apps/view/share.py:112 -msgid "'{title}'

Saved to {act} [{email}] success." -msgstr "《{title}》

成功被保存至 {act} [{email}]。" - -#: apps/view/share.py:134 -msgid "Failed save to Pocket.
" -msgstr "保存到 Pocket 失败。
" - -#: apps/view/share.py:136 -msgid "'{}'

Saved to your Pocket account." -msgstr "《{}》

已经成功被保存到你的Pocket账户。" - -#: apps/view/share.py:139 -msgid "See details below:

{}" -msgstr "下面是一些技术细节:

{}" - -#: apps/view/share.py:159 -msgid "'{}'

Saved to your Instapaper account." -msgstr "《{}》

已经成功被保存到你的Instapaper账户。" - -#: apps/view/share.py:163 -msgid "" -"Failed save to Instapaper
'{}'

Reason : Invalid username or " -"password." -msgstr "" - -#: apps/view/share.py:167 -msgid "Failed save to Instapaper
'{}'

Reason : Unknown({})." -msgstr "" - -#: apps/view/subscribe.py:46 -msgid "Title or url is empty!" -msgstr "标题和URL都不能为空!" - -#: apps/view/subscribe.py:53 apps/view/subscribe.py:93 -msgid "Duplicated subscription!" -msgstr "重复的订阅!" - -#: apps/view/subscribe.py:74 -msgid "The feed ({}) not exist!" -msgstr "订阅源(数据库ID: {})不存在!" - -#: apps/view/subscribe.py:133 -msgid "The book ({}) not exist!" -msgstr "内置书籍(数据库ID: {})不存在!" - -#: books/serialize_builtin_recipes.py:27 -msgid "You" -msgstr "" - -#: books/serialize_builtin_recipes.py:27 books/serialize_builtin_recipes.py:36 -msgid "Unknown" -msgstr "" - -#: templates/admin.html:3 templates/base.html:150 templates/base.html:152 +#: application/templates/admin.html:3 application/templates/base.html:148 +#: application/templates/base.html:150 msgid "Admin" msgstr "账户管理" -#: templates/admin.html:14 +#: application/templates/admin.html:14 msgid "Change Password" msgstr "修改密码" -#: templates/admin.html:19 +#: application/templates/admin.html:19 msgid "Old password" msgstr "原密码" -#: templates/admin.html:23 templates/adminmgrpwd.html:19 -#: templates/adminmgrpwd.html:20 +#: application/templates/admin.html:23 +#: application/templates/adminmgrpwd.html:19 +#: application/templates/adminmgrpwd.html:20 msgid "New password" msgstr "新密码" -#: templates/admin.html:27 templates/admin.html:52 -#: templates/adminmgrpwd.html:23 templates/adminmgrpwd.html:24 +#: application/templates/admin.html:27 application/templates/admin.html:52 +#: application/templates/adminmgrpwd.html:23 +#: application/templates/adminmgrpwd.html:24 msgid "Confirm password" msgstr "确认密码" -#: templates/admin.html:31 templates/adminmgrpwd.html:39 +#: application/templates/admin.html:31 +#: application/templates/adminmgrpwd.html:39 msgid "Confirm Change" msgstr "确认修改" -#: templates/admin.html:39 +#: application/templates/admin.html:39 msgid "Add Account" msgstr "添加用户账号" -#: templates/admin.html:44 templates/admin.html:85 -#: templates/adminmgrpwd.html:15 templates/adminmgrpwd.html:16 -#: templates/delaccount.html:16 templates/home.html:18 templates/login.html:29 -#: templates/login.html:30 templates/logs.html:85 templates/logs.html:127 +#: application/templates/admin.html:44 application/templates/admin.html:86 +#: application/templates/adminmgrpwd.html:15 +#: application/templates/adminmgrpwd.html:16 +#: application/templates/delaccount.html:16 application/templates/home.html:15 +#: application/templates/login.html:29 application/templates/login.html:30 +#: application/templates/logs.html:85 application/templates/setting.html:205 msgid "Username" msgstr "用户名" -#: templates/admin.html:48 templates/advarchive.html:51 templates/home.html:19 -#: templates/login.html:33 templates/login.html:34 +#: application/templates/admin.html:48 +#: application/templates/adv_archive.html:55 application/templates/base.html:47 +#: application/templates/home.html:16 application/templates/login.html:33 +#: application/templates/login.html:34 application/templates/setting.html:209 msgid "Password" msgstr "密码" -#: templates/admin.html:56 templates/adminmgrpwd.html:27 +#: application/templates/admin.html:56 application/templates/admin.html:88 +#: application/templates/adminmgrpwd.html:27 msgid "Expiration" msgstr "有效期" -#: templates/admin.html:58 templates/adminmgrpwd.html:29 +#: application/templates/admin.html:58 application/templates/admin.html:99 +#: application/templates/adminmgrpwd.html:29 msgid "Never expire" msgstr "永久有效" -#: templates/admin.html:59 templates/adminmgrpwd.html:30 -#: templates/setting.html:176 +#: application/templates/admin.html:59 application/templates/admin.html:101 +#: application/templates/adminmgrpwd.html:30 +#: application/templates/setting.html:151 msgid "7 Days" msgstr "一星期" -#: templates/admin.html:60 templates/adminmgrpwd.html:31 +#: application/templates/admin.html:60 application/templates/admin.html:103 +#: application/templates/adminmgrpwd.html:31 msgid "1 Month" msgstr "1个月" -#: templates/admin.html:61 templates/adminmgrpwd.html:32 +#: application/templates/admin.html:61 application/templates/admin.html:105 +#: application/templates/adminmgrpwd.html:32 msgid "3 Months" msgstr "3个月" -#: templates/admin.html:62 templates/adminmgrpwd.html:33 +#: application/templates/admin.html:62 application/templates/admin.html:107 +#: application/templates/adminmgrpwd.html:33 msgid "6 Months" msgstr "6个月" -#: templates/admin.html:63 templates/adminmgrpwd.html:34 +#: application/templates/admin.html:63 application/templates/admin.html:109 +#: application/templates/adminmgrpwd.html:34 msgid "1 Year" msgstr "1年" -#: templates/admin.html:64 templates/adminmgrpwd.html:35 -#, fuzzy +#: application/templates/admin.html:64 application/templates/admin.html:111 +#: application/templates/adminmgrpwd.html:35 msgid "2 Years" -msgstr "1年" +msgstr "2年" -#: templates/admin.html:68 templates/advurlfilter.html:32 -#: templates/advwhitelist.html:31 templates/my.html:31 +#: application/templates/admin.html:68 +#: application/templates/adv_whitelist.html:29 application/templates/my.html:32 msgid "Add" msgstr "添加" -#: templates/admin.html:74 +#: application/templates/admin.html:74 msgid "Accounts" msgstr "用户账号列表" -#: templates/admin.html:84 +#: application/templates/admin.html:85 msgid "No." msgstr "序号" -#: templates/admin.html:86 -msgid "Enable" +#: application/templates/admin.html:87 +msgid "AutoSend" msgstr "使能发送" -#: templates/admin.html:87 templates/logs.html:132 +#: application/templates/admin.html:89 msgid "Operation" -msgstr "命令" +msgstr "操作" + +#: application/templates/admin.html:97 +msgid "Yes" +msgstr "是" + +#: application/templates/admin.html:97 +msgid "No" +msgstr "否" -#: templates/admin.html:97 templates/logs.html:145 +#: application/templates/admin.html:117 application/templates/admin.html:120 msgid "Change" msgstr "修改" -#: templates/admin.html:98 templates/advcoverimage.html:47 -#: templates/advuploadcss.html:31 templates/advurlfilter.html:24 -#: templates/advwhitelist.html:23 templates/delaccount.html:20 -#: templates/logs.html:148 templates/my.html:60 templates/my.html:201 -#: templates/my.html:412 +#: application/templates/admin.html:118 application/templates/admin.html:121 +#: application/templates/adv_uploadcss.html:31 +#: application/templates/adv_whitelist.html:22 +#: application/templates/base.html:22 application/templates/delaccount.html:20 msgid "Delete" msgstr "删除" -#: templates/adminmgrpwd.html:3 -#, fuzzy +#: application/templates/adminmgrpwd.html:3 msgid "Change password" msgstr "修改密码" -#: templates/advarchive.html:3 templates/advarchive.html:9 -#: templates/advbase.html:57 templates/advbase.html:61 +#: application/templates/adv_archive.html:3 +#: application/templates/adv_archive.html:13 +#: application/templates/adv_base.html:59 +#: application/templates/adv_base.html:63 msgid "Archive" msgstr "归档" -#: templates/advarchive.html:10 +#: application/templates/adv_archive.html:14 msgid "Append hyperlinks for archiving or sharing." msgstr "在文章最后附加归档或分享链接。" -#: templates/advarchive.html:35 +#: application/templates/adv_archive.html:39 msgid "Authorized" msgstr "已授权" -#: templates/advarchive.html:37 +#: application/templates/adv_archive.html:41 msgid "Authorize" msgstr "申请授权" -#: templates/advarchive.html:48 +#: application/templates/adv_archive.html:52 msgid "Email or Username" msgstr "邮箱或用户名" -#: templates/advarchive.html:54 templates/advarchive.html:102 -#: templates/advarchive.html:113 templates/advarchive.html:120 -#: templates/advarchive.html:126 +#: application/templates/adv_archive.html:58 application/templates/base.html:57 msgid "Verify" msgstr "校验" -#: templates/advarchive.html:87 -#, fuzzy -msgid "Append QR code of url to article" -msgstr "在每篇文章后附加文章地址的二维码" - -#: templates/advarchive.html:93 templates/setting.html:193 +#: application/templates/adv_archive.html:93 +#: application/templates/setting.html:223 msgid "Save settings" msgstr "保存设置" -#: templates/advarchive.html:105 -msgid "Verifying" -msgstr "校验中" - -#: templates/advarchive.html:116 -msgid "Congratulation : the username and password are correct." -msgstr "恭喜:你提供的账号和密码都正确。" - -#: templates/advarchive.html:117 -msgid "Verified" -msgstr "已校验" - -#: templates/advarchive.html:119 -msgid "The username or password is incorrect!" -msgstr "你提供的账号或密码有误!" - -#: templates/advarchive.html:125 -msgid "Error when verify the username and password for Instapaper. Status:" -msgstr "在校验Instapaper的账号和密码时发生错误。错误码:" - -#: templates/advbase.html:39 templates/advbase.html:43 -#: templates/advdelivernow.html:3 templates/advdelivernow.html:8 +#: application/templates/adv_base.html:39 +#: application/templates/adv_base.html:43 +#: application/templates/adv_delivernow.html:3 +#: application/templates/adv_delivernow.html:8 msgid "Deliver now" msgstr "现在投递" -#: templates/advbase.html:48 templates/advbase.html:52 -#: templates/advwhitelist.html:13 +#: application/templates/adv_base.html:49 +#: application/templates/adv_base.html:53 +#: application/templates/adv_whitelist.html:13 msgid "White List" msgstr "邮件白名单" -#: templates/advbase.html:66 templates/advbase.html:70 -#: templates/advurlfilter.html:12 -msgid "Url Filter" -msgstr "URL过滤" - -#: templates/advbase.html:75 templates/advbase.html:79 -#: templates/advimport.html:8 +#: application/templates/adv_base.html:68 +#: application/templates/adv_base.html:72 +#: application/templates/adv_import.html:8 msgid "Import Feeds" msgstr "导入订阅列表" -#: templates/advbase.html:84 templates/advbase.html:88 +#: application/templates/adv_base.html:77 +#: application/templates/adv_base.html:81 msgid "Cover Image" msgstr "封面图片" -#: templates/advbase.html:93 templates/advbase.html:97 -#: templates/advuploadcss.html:3 +#: application/templates/adv_base.html:86 +#: application/templates/adv_base.html:90 +#: application/templates/adv_uploadcss.html:3 msgid "Stylesheet" msgstr "样式表" -#: templates/advcoverimage.html:3 -#, fuzzy -msgid "Cover image" -msgstr "封面图片" - -#: templates/advcoverimage.html:32 -msgid "Upload cover image" -msgstr "上传封面图片" - -#: templates/advcoverimage.html:33 -msgid "Upload a cover image from local." -msgstr "从本机上传一个封面图片。" - -#: templates/advcoverimage.html:46 templates/advuploadcss.html:30 -msgid "Upload" -msgstr "上传" - -#: templates/advcoverimage.html:66 -msgid "Size of image file must be smaller than 500KB." -msgstr "封面图片大小必须要小于500KB。" - -#: templates/advcoverimage.html:72 -msgid "The file you chosen is not an image." -msgstr "你选择的文件不是一个图像文件。" - -#: templates/advcoverimage.html:100 -msgid "" -"

Successfully

The cover image have been uploaded " -"successfully.

" -msgstr "

成功

封面图片已经成功上传。

" - -#: templates/advcoverimage.html:101 templates/advuploadcss.html:74 -#: templates/my.html:533 templates/sharedlibrary.html:311 -#: templates/sharedlibrary.html:333 -msgid "Close" -msgstr "关闭" - -#: templates/advcoverimage.html:107 -msgid "Failed to upload the cover image. Error:" -msgstr "上传封面图片失败。错误信息:" +#: application/templates/adv_delivernow.html:9 +msgid "Deliver selected recipes now" +msgstr "现在推送选择的Recipe" -#: templates/advcoverimage.html:163 -msgid "Failed to delete the cover image. Error:" -msgstr "删除封面图片失败。错误信息:" +#: application/templates/adv_delivernow.html:12 +msgid "There are no recipes subscribed" +msgstr "没有任何被订阅的Recipe" -#: templates/advcoverimage.html:167 -#, fuzzy -msgid "Failed to delete the cover image. Status:" -msgstr "删除封面图片失败。错误信息:" - -#: templates/advdelivernow.html:9 -msgid "Deliver selected books now." -msgstr "手动推送已选择的书籍。" - -#: templates/advdelivernow.html:12 -#, fuzzy -msgid "No books are subscribed." -msgstr "暂时没有已订阅的书籍" - -#: templates/advdelivernow.html:23 templates/advdelivernow.html:35 +#: application/templates/adv_delivernow.html:23 msgid "Select all" msgstr "选择全部" -#: templates/advdelivernow.html:24 templates/advdelivernow.html:36 +#: application/templates/adv_delivernow.html:24 msgid "Select none" msgstr "取消全部" -#: templates/advdelivernow.html:42 +#: application/templates/adv_delivernow.html:29 msgid "Deliver" msgstr "推送" -#: templates/advimport.html:3 templates/advimport.html:18 +#: application/templates/adv_import.html:3 +#: application/templates/adv_import.html:18 msgid "Import" msgstr "导入" -#: templates/advimport.html:9 -msgid "Import custom rss from a OPML file." -msgstr "从OPML文件中导入订阅列表。" +#: application/templates/adv_import.html:9 +msgid "Import custom rss from an OPML file." +msgstr "从一个OPML文件中导入自定义RSS。" -#: templates/advimport.html:15 +#: application/templates/adv_import.html:15 msgid "Import as fulltext RSS by default" msgstr "默认导入为全文订阅源" -#: templates/advimport.html:19 +#: application/templates/adv_import.html:19 msgid "Download" msgstr "下载" -#: templates/advuploadcss.html:22 -#, fuzzy -msgid "Upload stylesheet" -msgstr "上传样式表" +#: application/templates/adv_uploadcover.html:3 +msgid "Cover image" +msgstr "封面图像" -#: templates/advuploadcss.html:23 -#, fuzzy -msgid "Upload a stylesheet from local (accept utf-8 only)." -msgstr "从本机上传一个样式表(仅接受utf-8格式)。" +#: application/templates/adv_uploadcover.html:9 +msgid "Upload cover image" +msgstr "上传封面图像" -#: templates/advuploadcss.html:53 -msgid "The file you chosen is not a stylesheet file." -msgstr "您选择的文件不是样式表。" +#: application/templates/adv_uploadcover.html:10 +msgid "Upload cover images from local with an aspect ratio of approximately 0.65." +msgstr "从本机上传封面图像,建议宽高比为0.65左右。" -#: templates/advuploadcss.html:73 -msgid "" -"

Successfully

The stylesheet file have been uploaded " -"successfully.

" -msgstr "

成功

样式表文件已经上传成功。

" +#: application/templates/adv_uploadcover.html:15 +msgid "Rule to pick cover images" +msgstr "封面图像使用顺序" -#: templates/advuploadcss.html:79 templates/advuploadcss.html:83 -msgid "Failed to upload the stylesheet file. Error:" -msgstr "上传样式表文件失败,错误信息:" +#: application/templates/adv_uploadcover.html:17 +msgid "Random" +msgstr "随机" -#: templates/advuploadcss.html:133 templates/advuploadcss.html:137 -msgid "Failed to delete the stylesheet. Error:" -msgstr "删除样式表文件失败,错误信息:" +#: application/templates/adv_uploadcover.html:18 +msgid "Weekday" +msgstr "按周内日" -#: templates/advurlfilter.html:3 -#, fuzzy -msgid "Url filter" -msgstr "URL过滤" +#: application/templates/adv_uploadcover.html:42 +msgid "Upload/Update" +msgstr "上传/更新" -#: templates/advurlfilter.html:13 -msgid "Urls in list would not be downloaded." -msgstr "在此列表中的URL将不会被下载,以便节省时间,仅适用于文章中的图片URL。" +#: application/templates/adv_uploadcss.html:22 +msgid "Upload stylesheet" +msgstr "上传样式表" -#: templates/advurlfilter.html:30 -msgid "Please input regular expression" -msgstr "请输入正则表达式" +#: application/templates/adv_uploadcss.html:23 +msgid "Upload a stylesheet from local (accept utf-8 only)." +msgstr "从本机上传一个样式表(仅接受utf-8格式)。" -#: templates/advwhitelist.html:3 -#, fuzzy +#: application/templates/adv_uploadcss.html:30 +msgid "Upload" +msgstr "上传" + +#: application/templates/adv_whitelist.html:3 msgid "White list" msgstr "邮件白名单" -#: templates/advwhitelist.html:15 -#, fuzzy, python-format +#: application/templates/adv_whitelist.html:15 +#, python-format msgid "" "Emails sent to %(name)sxxx@appid.appspotmail.com will be transferred to " "your email." -msgstr "发送到%sxxx@appid.appspotmail.com的邮件正文将会被转发至你注册的邮箱。" +msgstr "发送至 %(name)sxxx@appid.appspotmail.com 的邮件将被转发到您的邮箱。" -#: templates/advwhitelist.html:29 +#: application/templates/adv_whitelist.html:27 msgid "Please input mail address" msgstr "请输入邮件地址" -#: templates/autoback.html:3 templates/tipsandback.html:3 -#, fuzzy +#: application/templates/autoback.html:3 +#: application/templates/tipsandback.html:3 msgid "Auto back" +msgstr "直接返回" + +#: application/templates/autoback.html:28 +#: application/templates/tipsandback.html:13 +msgid "Auto back to previous page after 5 seconds" +msgstr "5秒钟后自动返回上一页" + +#: application/templates/autoback.html:29 +#: application/templates/tipsandback.html:14 +#: application/templates/tipsback.html:15 +msgid "Click to back" msgstr "点击直接返回" -#: templates/autoback.html:28 templates/tipsandback.html:13 -msgid "Auto back to previous page after 5 seconds" -msgstr "5秒钟后自动返回上一页" +#: application/templates/base.html:23 +msgid "View Source Code" +msgstr "查看源代码" + +#: application/templates/base.html:24 +msgid "Subscribe (Deliver Separately)" +msgstr "订阅 (单独推送)" + +#: application/templates/base.html:25 +msgid "Subscribe" +msgstr "订阅" + +#: application/templates/base.html:26 +msgid "Cannot add this custom rss, Error:" +msgstr "无法添加这个自定义RSS,错误描述:" + +#: application/templates/base.html:27 +msgid "Cannot delete this feed, Error:" +msgstr "无法删除此订阅,错误描述:" + +#: application/templates/base.html:28 +msgid "Fulltext" +msgstr "全文RSS" + +#: application/templates/base.html:29 application/templates/base.html:36 +msgid "Share" +msgstr "分享" + +#: application/templates/base.html:30 +msgid "Are you sure to delete ({0})?" +msgstr "您确认要删除 ({0}) 吗?" + +#: application/templates/base.html:31 +msgid "Share links, share happiness" +msgstr "分享链接,分享快乐" + +#: application/templates/base.html:32 +msgid "Category" +msgstr "类别" + +#: application/templates/base.html:33 application/templates/setting.html:130 +msgid "Language" +msgstr "语言" + +#: application/templates/base.html:34 +msgid "" +"Please write a category in text field if the one you wish is not in the " +"list." +msgstr "如果您需要的类别不在列表中,可以在文本框中直接输入。" + +#: application/templates/base.html:35 +msgid "Cancel" +msgstr "取消" + +#: application/templates/base.html:37 +msgid "Language code invalid" +msgstr "语言代码不合法" + +#: application/templates/base.html:38 +msgid "Thank you for sharing." +msgstr "谢谢您的分享。" + +#: application/templates/base.html:39 +msgid "Close" +msgstr "关闭" + +#: application/templates/base.html:40 +msgid "Unsubscribe" +msgstr "退订" + +#: application/templates/base.html:41 +msgid "Cannot subscribe this recipe, Error:" +msgstr "无法订阅这个Recipe,错误描述:" + +#: application/templates/base.html:42 +msgid "Are you sure to Unsubscribe ({0})?" +msgstr "您确认要取消订阅 ({0}) 吗?" + +#: application/templates/base.html:43 +msgid "Cannot unsubscribe this recipe, Error:" +msgstr "无法取消订阅这个Recipe,错误描述:" + +#: application/templates/base.html:44 +msgid "The recipe is already subscribed." +msgstr "这个Recipe已经被订阅了。" + +#: application/templates/base.html:45 +msgid "Subscription info" +msgstr "网站登录信息" + +#: application/templates/base.html:46 +msgid "Account" +msgstr "账号" + +#: application/templates/base.html:48 +msgid "Submit" +msgstr "提交" + +#: application/templates/base.html:49 +msgid "" +"If any field is left blank, the server will clear the saved login " +"information." +msgstr "如果任意文本框留空白,则此登录信息将从服务器删除。" + +#: application/templates/base.html:50 +msgid "Cannot set the subscription infomation, Error:" +msgstr "无法设置登录信息,错误描述:" + +#: application/templates/base.html:51 +msgid "Choose a recipe file to upload" +msgstr "选择一个Recipe文件上传" + +#: application/templates/base.html:52 +msgid "Congratulations" +msgstr "恭喜" + +#: application/templates/base.html:53 +msgid "Thanks" +msgstr "谢谢" + +#: application/templates/base.html:54 +msgid "" +"Your recipe has been uploaded, and it can be found in the Library " +"section. If you dont see it, please make sure to switch to the correct " +"language." +msgstr "您的Recipe已经上传,可以在本页面的 \"新闻源\" 区段找到。如果没有,请确认您已经切换到正确的语种。" + +#: application/templates/base.html:55 +msgid "Your recipe have been deleted." +msgstr "您的Recipe已经被删除。" + +#: application/templates/base.html:56 +msgid "Read with Kindle" +msgstr "在Kindle阅读" + +#: application/templates/base.html:58 +msgid "Verified" +msgstr "已校验" + +#: application/templates/base.html:59 application/view/login.py:67 +#: application/view/share.py:154 +msgid "The username does not exist or password is wrong." +msgstr "用户名不存在或密码错误。" + +#: application/templates/base.html:60 +msgid "The file you chosen is not an acceptable type." +msgstr "您选择的文件不是可以接受的类型。" + +#: application/templates/base.html:61 +msgid "The file have been uploaded successfully." +msgstr "文件已经成功上传。" + +#: application/templates/base.html:62 +msgid "This feed has been successfully subscribed." +msgstr "已经成功订阅此新闻源。" + +#: application/templates/base.html:63 +msgid "Thank you for your feedback, this feed will be reviewed soon." +msgstr "谢谢您的反馈,此新闻源将很快会被检视和确认。" + +#: application/templates/base.html:64 +msgid "Are you confirming to share the recipe ({0})?" +msgstr "您确认要分享这个Recipe ({0}) 吗?" + +#: application/templates/base.html:65 +msgid "[All]" +msgstr "[所有分类]" + +#: application/templates/base.html:66 +msgid "[By Time]" +msgstr "[按时间]" + +#: application/templates/base.html:67 +msgid "[Uncategoried]" +msgstr "[未分类]" + +#: application/templates/base.html:68 +msgid "No links found in the chosen language." +msgstr "没有您选择的语种对应的链接。" + +#: application/templates/base.html:69 +msgid "Invalid report" +msgstr "报告新闻源已失效" + +#: application/templates/base.html:70 +msgid "Are you confirming that this link is invalid or off the cloud?" +msgstr "您确认这个链接已经失效或无法链接吗?" + +#: application/templates/base.html:71 +msgid "Customize delivery time" +msgstr "自定义推送时间" + +#: application/templates/base.html:72 application/templates/setting.html:50 +msgid "Delivery days" +msgstr "推送日" + +#: application/templates/base.html:73 application/templates/setting.html:52 +msgid "Mon" +msgstr "一" + +#: application/templates/base.html:74 application/templates/setting.html:54 +msgid "Tue" +msgstr "二" + +#: application/templates/base.html:75 application/templates/setting.html:56 +msgid "Wed" +msgstr "三" + +#: application/templates/base.html:76 application/templates/setting.html:58 +msgid "Thu" +msgstr "四" + +#: application/templates/base.html:77 application/templates/setting.html:60 +msgid "Fri" +msgstr "五" + +#: application/templates/base.html:78 application/templates/setting.html:62 +msgid "Sat" +msgstr "六" + +#: application/templates/base.html:79 application/templates/setting.html:64 +msgid "Sun" +msgstr "日" + +#: application/templates/base.html:80 +msgid "Delivery times" +msgstr "推送时间" + +#: application/templates/base.html:81 +msgid "The customized delivery time for the recipe has been successfully saved." +msgstr "这个Recipe的自定义推送时间已经设定成功。" + +#: application/templates/base.html:82 +msgid "The account have been deleted." +msgstr "这个账号已经被删除。" + +#: application/templates/base.html:83 application/view/admin.py:46 +#: application/view/admin.py:66 +msgid "The username or password is empty." +msgstr "用户名或密码为空。" + +#: application/templates/base.html:84 application/view/admin.py:50 +#: application/view/admin.py:70 application/view/admin.py:143 +msgid "The two new passwords are dismatch." +msgstr "两个密码不匹配。" + +#: application/templates/base.html:85 +msgid "Password changed successfully." +msgstr "修改密码成功。" + +#: application/templates/base.html:86 +msgid "Account added successfully." +msgstr "添加账号成功。" + +#: application/templates/base.html:87 application/view/login.py:106 +msgid "login required" +msgstr "需要登录" + +#: application/templates/base.html:88 +msgid "Upload cover files successfully." +msgstr "上传封面图像成功。" -#: templates/autoback.html:29 templates/tipsandback.html:14 -#: templates/tipsback.html:15 -msgid "Click to back" -msgstr "点击直接返回" +#: application/templates/base.html:89 +msgid "" +"Total size of the files you selected exceeds 16MB. Please reduce the " +"image resolution or upload in batches." +msgstr "您选择的文件总和超过16MB,请减小图像分辨率或分批上传。" -#: templates/base.html:116 templates/home.html:15 +#: application/templates/base.html:111 application/templates/home.html:12 msgid "Logout" msgstr "退出" -#: templates/base.html:118 templates/home.html:20 templates/login.html:3 -#: templates/login.html:37 +#: application/templates/base.html:113 application/templates/home.html:17 +#: application/templates/login.html:3 application/templates/login.html:37 msgid "Login" msgstr "登录" -#: templates/base.html:135 templates/base.html:137 templates/home.html:14 -#: templates/my.html:3 +#: application/templates/base.html:133 application/templates/base.html:135 +#: application/templates/home.html:11 application/templates/my.html:3 msgid "Feeds" msgstr "我的订阅" -#: templates/base.html:140 templates/base.html:142 templates/setting.html:3 +#: application/templates/base.html:138 application/templates/base.html:140 +#: application/templates/setting.html:3 msgid "Settings" msgstr "设置" -#: templates/base.html:145 templates/base.html:147 templates/logs.html:3 +#: application/templates/base.html:143 application/templates/base.html:145 +#: application/templates/logs.html:3 msgid "Logs" msgstr "投递日志" -#: templates/base.html:155 templates/base.html:157 +#: application/templates/base.html:153 application/templates/base.html:155 msgid "Advanced" msgstr "高级设置" -#: templates/base.html:160 templates/base.html:162 -#: templates/sharedlibrary.html:3 +#: application/templates/base.html:158 application/templates/base.html:160 +#: application/templates/library.html:3 msgid "Shared" msgstr "网友分享" -#: templates/delaccount.html:3 -#, fuzzy +#: application/templates/delaccount.html:3 msgid "Delete account" msgstr "删除此账户" -#: templates/home.html:3 +#: application/templates/home.html:3 msgid "Home" msgstr "首页" -#: templates/home.html:12 +#: application/templates/home.html:9 msgid "Sharing Joyful News Every Step of the Way" -msgstr "" +msgstr "分享喜悦,步步欢欣" -#: templates/home.html:30 +#: application/templates/home.html:27 msgid "Inherited From Calibre" msgstr "源自Calibre" -#: templates/home.html:32 +#: application/templates/home.html:30 #, python-format msgid "" -"With the powerful %(calibre)s, you can now effortlessly generate epub and" -" mobi books within a Python-hosted environment and seamlessly transfer " -"them to your eReader or other reading devices." -msgstr "" +"Empowered by %(calibre)s, you can easily create e-books on a Python-" +"supported online platform and seamlessly transfer them to your e-reader " +"or other reading devices." +msgstr "借助 %(calibre)s 的强大引擎,现在您可以在各种 Python 托管平台上轻松创建电子书,并直接推送至您的 Kindle 和其他阅读器。" -#: templates/home.html:39 +#: application/templates/home.html:38 msgid "Share Your Ideas" msgstr "分享智慧" -#: templates/home.html:41 -#, fuzzy, python-format +#: application/templates/home.html:41 +#, python-format msgid "" -"With my open source %(app_name)s application, You can deploy your own " -"server to push news feeds to your kindle dialy or share the service with " -"your friends." -msgstr ",你可以在GAE上搭建自己的推送服务器,下载包含图片的RSS订阅或网页推送到你的Kindle,并支持多账号,可以提供给三五好友同时使用。" +"With the open-source %(kindleear)s application, you can set up your own " +"server to deliver daily news feeds to your e-reader and effortlessly " +"share the service with friends." +msgstr "使用开源 %(kindleear)s 应用,您可以部署您自己的网站,每天自动抓取全球新闻热点,并支持多账号,可以提供给多位好友同时使用。" -#: templates/login.html:40 -#, fuzzy +#: application/templates/library.html:48 application/templates/my.html:62 +msgid "Search" +msgstr "搜索" + +#: application/templates/login.html:40 msgid "" "The website doesn't allow registration. You can ask the owner for an " "account." -msgstr "本站不开放注册,需要管理员先添加账号然后才能使用对应账号登录使用相应服务。" +msgstr "这个网站不支持注册,您可以请求管理员创建账号。" -#: templates/logs.html:34 +#: application/templates/logs.html:34 msgid "Only display last 10 logs" msgstr "只显示最后10条日志" -#: templates/logs.html:45 templates/logs.html:86 templates/logs.html:128 +#: application/templates/logs.html:45 application/templates/logs.html:86 msgid "Time" msgstr "时间" -#: templates/logs.html:46 templates/logs.html:87 templates/logs.html:129 -#: templates/my.html:16 templates/setting.html:151 +#: application/templates/logs.html:46 application/templates/logs.html:87 +#: application/templates/my.html:17 application/templates/setting.html:99 +#: application/templates/setting.html:100 +#: application/templates/setting.html:101 +#: application/templates/setting.html:102 +#: application/templates/setting.html:126 msgid "Title" msgstr "书籍标题" -#: templates/logs.html:47 templates/logs.html:88 +#: application/templates/logs.html:47 application/templates/logs.html:88 msgid "Size" msgstr "附件大小" -#: templates/logs.html:48 templates/logs.html:89 +#: application/templates/logs.html:48 application/templates/logs.html:89 msgid "To" msgstr "收件人" -#: templates/logs.html:49 templates/logs.html:90 +#: application/templates/logs.html:49 application/templates/logs.html:90 msgid "Status" msgstr "状态" -#: templates/logs.html:69 +#: application/templates/logs.html:69 msgid "There is no log" msgstr "还没有投递过" -#: templates/logs.html:73 +#: application/templates/logs.html:73 msgid "Logs of other users" msgstr "其他用户的日志" -#: templates/logs.html:115 -msgid "Last delivered" -msgstr "已推送期号" - -#: templates/logs.html:130 -msgid "Num" -msgstr "期号" - -#: templates/logs.html:131 -msgid "Record" -msgstr "信息" - -#: templates/logs.html:164 -msgid "Please input a new number" -msgstr "请输入一个新的数值" - -#: templates/logs.html:167 -msgid "The number is invalid" -msgstr "数值非法" - -#: templates/logs.html:176 -msgid "Cannot change this record, Error:" -msgstr "无法修改此记录,错误码:" - -#: templates/logs.html:180 -msgid "Error when try to change this record. Status:" -msgstr "在试图修改此记录时出错。错误码:" - -#: templates/logs.html:196 -msgid "Cannot delete this record, Error:" -msgstr "无法删除此记录,错误码:" - -#: templates/logs.html:200 -msgid "Error when try to delete this record. Status:" -msgstr "在试图删除此记录时出错。错误码:" - -#: templates/my.html:11 +#: application/templates/my.html:12 msgid "Custom Rss" msgstr "自定义RSS" -#: templates/my.html:22 templates/my.html:42 templates/my.html:372 -msgid "Fulltext" +#: application/templates/my.html:23 +msgid "Content embedded" msgstr "全文RSS" -#: templates/my.html:59 templates/my.html:405 templates/my.html:564 -msgid "Share" -msgstr "分享" - -#: templates/my.html:66 +#: application/templates/my.html:44 msgid "Subscribed" msgstr "已订阅" -#: templates/my.html:68 -#, fuzzy -msgid "There are no subscribed books" -msgstr "暂时没有已订阅的书籍。" - -#: templates/my.html:74 templates/my.html:431 templates/my.html:484 -msgid "Separate" -msgstr "单独推送" - -#: templates/my.html:87 templates/my.html:453 -msgid "Login Info" -msgstr "登录信息" - -#: templates/my.html:89 templates/my.html:463 -msgid "Unsubscribe" -msgstr "退订" - -#: templates/my.html:99 +#: application/templates/my.html:49 msgid "Library" -msgstr "" +msgstr "新闻源" -#: templates/my.html:103 +#: application/templates/my.html:57 msgid "Upload your custom recipe" -msgstr "" - -#: templates/my.html:104 -#, fuzzy -msgid "Search" -msgstr "归档" +msgstr "上传您的 Recipe" -#: templates/my.html:107 -msgid "There are No recipes unsubscribed" -msgstr "" +#: application/templates/my.html:70 +msgid "Subscription to selected recipe successful." +msgstr "已成功订阅您选择的 Recipe" -#: templates/my.html:110 +#: application/templates/my.html:73 msgid "Bookmarklet" msgstr "书签小应用" -#: templates/my.html:114 +#: application/templates/my.html:77 msgid "Add to KindleEar" msgstr "在KindleEar中订阅" -#: templates/my.html:117 +#: application/templates/my.html:80 msgid "Drag and drop this link to your bookmarks" msgstr "将链接拖动到书签栏" -#: templates/my.html:202 -msgid "View Source Code" -msgstr "" - -#: templates/my.html:204 -#, fuzzy -msgid "Subscribe Separately" -msgstr "订阅" - -#: templates/my.html:205 -#, fuzzy -msgid "Merged Subscription" -msgstr "重复的订阅!" - -#: templates/my.html:292 -msgid "Cannot subscribe this book, Error:" -msgstr "无法订阅此书籍,错误描述:" - -#: templates/my.html:296 -msgid "Error when try to subscribe this book. Status:" -msgstr "试图订阅此书籍时出错。错误码:" - -#: templates/my.html:321 -msgid "Cannot unsubscribe this book, Error:" -msgstr "无法退订此书籍,错误描述:" - -#: templates/my.html:325 -msgid "Error when try to unsubscribe this book. Status:" -msgstr "试图退订此书籍时出错。错误码:" - -#: templates/my.html:340 -msgid "Cannot delete this feed, Error:" -msgstr "无法删除此订阅源,错误描述:" - -#: templates/my.html:344 -msgid "Error when try to delete this feed. Status:" -msgstr "试图删除此订阅源时出错,错误码:" - -#: templates/my.html:361 templates/my.html:582 templates/sharedlibrary.html:316 -msgid "Cannot add this feed, Error:" -msgstr "无法添加此订阅源,错误描述:" - -#: templates/my.html:506 templates/sharedlibrary.html:220 -msgid "Subscribe" -msgstr "订阅" - -#: templates/my.html:532 -msgid "" -"

Thanks

Thank you for sharing, good luck will always with " -"you.

" -msgstr "

非常感谢

谢谢您的分享,愿好运永远伴随您。

" - -#: templates/my.html:538 -msgid "Error:" -msgstr "" - -#: templates/my.html:542 -#, fuzzy -msgid "Error when try to fetch content of the category. Status:" -msgstr "在试图修改此记录时出错。错误码:" - -#: templates/my.html:551 -msgid "

Share links, share happiness

" -msgstr "

分享链接,分享快乐

" - -#: templates/my.html:552 -#, fuzzy, python-format -msgid "

Category for [{0}]:

" -msgstr "

[%s] 的类别:

" - -#: templates/my.html:558 -msgid "" -"

Please write a category in text field if the one you wish is not in " -"the list.

" -msgstr "

如果列表中没有合适的分类,请直接在文本框中填写。

" - -#: templates/my.html:561 -msgid "Cancel" -msgstr "取消" - -#: templates/my.html:586 templates/sharedlibrary.html:320 -msgid "Error when try to add this feed. Status:" -msgstr "试图添加此订阅源时出错,错误码:" - -#: templates/my.html:627 -msgid "Read with Kindle" -msgstr "在Kindle阅读" - -#: templates/setting.html:14 -msgid "Your account will pause after" -msgstr "你的投递将于" - -#: templates/setting.html:14 -msgid ", Please login before expire." -msgstr "自动停止,每次登录后自动延期。" +#: application/templates/setting.html:14 +msgid "Your account will pause after {0}, please log in again before it expires." +msgstr "你的投递将于 {0} 自动停止,每次登录后自动延期。" -#: templates/setting.html:15 +#: application/templates/setting.html:15 msgid "Delete Account" msgstr "删除此账户" -#: templates/setting.html:24 +#: application/templates/setting.html:24 msgid "Base Setting" msgstr "基本设置" -#: templates/setting.html:26 -msgid "Kindle E-mail" -msgstr "Kindle邮箱" - -#: templates/setting.html:27 -msgid "Seperated by semicolon" -msgstr "分号隔开多个地址" - -#: templates/setting.html:30 -msgid "Time zone" -msgstr "所在时区" - -#: templates/setting.html:42 -msgid "Deliver days" -msgstr "投递日" - -#: templates/setting.html:44 -msgid "Mon" -msgstr "一" +#: application/templates/setting.html:26 +msgid "Auto Delivery" +msgstr "自动推送" -#: templates/setting.html:46 -msgid "Tue" -msgstr "二" +#: application/templates/setting.html:28 +msgid "Recipes and custom RSS" +msgstr "Recipe和自定义RSS" -#: templates/setting.html:48 -msgid "Wed" -msgstr "三" +#: application/templates/setting.html:29 +msgid "Recipes only" +msgstr "仅Recipe" -#: templates/setting.html:50 -msgid "Thu" -msgstr "四" +#: application/templates/setting.html:30 +msgid "Disable all" +msgstr "禁止" -#: templates/setting.html:52 -msgid "Fri" -msgstr "五" +#: application/templates/setting.html:34 +msgid "Kindle E-mail" +msgstr "Kindle邮箱" -#: templates/setting.html:54 -msgid "Sat" -msgstr "六" +#: application/templates/setting.html:35 +msgid "Seperated by comma" +msgstr "逗号分隔多个地址" -#: templates/setting.html:56 -msgid "Sun" -msgstr "日" +#: application/templates/setting.html:38 +msgid "Time zone" +msgstr "所在时区" -#: templates/setting.html:59 -msgid "Deliver time" -msgstr "投递时间" +#: application/templates/setting.html:67 +msgid "Delivery time" +msgstr "推送时间" -#: templates/setting.html:67 +#: application/templates/setting.html:75 msgid "Book type" msgstr "投递格式" -#: templates/setting.html:74 +#: application/templates/setting.html:82 msgid "Device type" msgstr "设备类型" -#: templates/setting.html:84 +#: application/templates/setting.html:92 msgid "Others" msgstr "其他" -#: templates/setting.html:88 -msgid "Title from" -msgstr "标题来源" - -#: templates/setting.html:90 -msgid "Webpage" -msgstr "网页" - -#: templates/setting.html:91 -msgid "Feed" -msgstr "Feed" - -#: templates/setting.html:95 +#: application/templates/setting.html:96 msgid "Title format" msgstr "标题样式" -#: templates/setting.html:97 +#: application/templates/setting.html:98 msgid "Title Only" msgstr "仅标题" -#: templates/setting.html:98 -msgid "Title YYYY-MM-DD" -msgstr "标题 年-月-日" - -#: templates/setting.html:99 -msgid "Title MM-DD" -msgstr "标题 月-日" - -#: templates/setting.html:102 -msgid "Title MMM DD" -msgstr "标题 英文月 日" - -#: templates/setting.html:103 -msgid "Title Day, MMM DD" -msgstr "标题 星期, 英文月 日" - -#: templates/setting.html:107 +#: application/templates/setting.html:106 msgid "Book mode" msgstr "书籍模式" -#: templates/setting.html:109 +#: application/templates/setting.html:108 msgid "Periodical" msgstr "期刊" -#: templates/setting.html:110 +#: application/templates/setting.html:109 msgid "Comic" msgstr "漫画" -#: templates/setting.html:114 +#: application/templates/setting.html:113 msgid "Remove hyperlinks" msgstr "移除链接" -#: templates/setting.html:116 -#, fuzzy +#: application/templates/setting.html:115 msgid "Do not remove hyperlinks" -msgstr "移除链接" +msgstr "不移除链接" -#: templates/setting.html:117 -#, fuzzy +#: application/templates/setting.html:116 msgid "Remove image links" -msgstr "移除链接" +msgstr "移除图像上的链接" -#: templates/setting.html:118 -#, fuzzy +#: application/templates/setting.html:117 msgid "Remove text links" -msgstr "移除链接" +msgstr "移除文本上的链接" -#: templates/setting.html:119 -#, fuzzy +#: application/templates/setting.html:118 msgid "Remove all hyperlinks" -msgstr "移除链接" - -#: templates/setting.html:123 -#, fuzzy -msgid "Author format" -msgstr "标题样式" +msgstr "移除所有链接" -#: templates/setting.html:126 -#, fuzzy -msgid "YYYY-MM-DD" -msgstr "标题 年-月-日" - -#: templates/setting.html:127 -#, fuzzy -msgid "MM-DD" -msgstr "标题 月-日" - -#: templates/setting.html:128 -#, fuzzy -msgid "MM/DD" -msgstr "标题 月/日" - -#: templates/setting.html:129 -#, fuzzy -msgid "DD/MM" -msgstr "标题 日/月" - -#: templates/setting.html:130 -#, fuzzy -msgid "MMM DD" -msgstr "标题 英文月 日" - -#: templates/setting.html:131 -#, fuzzy -msgid "Day, MMM DD" -msgstr "标题 星期, 英文月 日" - -#: templates/setting.html:136 -msgid "Merge books into one" -msgstr "多本书籍合并投递为一本" - -#: templates/setting.html:140 -msgid "Enable deliver" -msgstr "使能自动定时投递" - -#: templates/setting.html:149 +#: application/templates/setting.html:124 msgid "Custom Rss Setting" msgstr "自定义RSS设置" -#: templates/setting.html:155 -msgid "Language" -msgstr "投递语言" - -#: templates/setting.html:167 +#: application/templates/setting.html:142 msgid "Oldest article" msgstr "最旧文章" -#: templates/setting.html:169 +#: application/templates/setting.html:144 msgid "No limit" msgstr "不限制" -#: templates/setting.html:170 +#: application/templates/setting.html:145 msgid "1 Day" msgstr "一天" -#: templates/setting.html:171 +#: application/templates/setting.html:146 msgid "2 Days" msgstr "两天" -#: templates/setting.html:172 +#: application/templates/setting.html:147 msgid "3 Days" msgstr "三天" -#: templates/setting.html:173 +#: application/templates/setting.html:148 msgid "4 Days" msgstr "四天" -#: templates/setting.html:174 +#: application/templates/setting.html:149 msgid "5 Days" msgstr "五天" -#: templates/setting.html:175 +#: application/templates/setting.html:150 msgid "6 Days" msgstr "六天" -#: templates/setting.html:181 -msgid "Keep images" -msgstr "保留文章图片" +#: application/templates/setting.html:155 +msgid "Time format" +msgstr "时间格式" -#: templates/setting.html:185 -msgid "Enable deliver custom rss" -msgstr "自动定时投递自定义RSS" +#: application/templates/setting.html:167 +msgid "Author format" +msgstr "标题样式" + +#: application/templates/setting.html:182 +msgid "Send mail service" +msgstr "发送邮件服务" + +#: application/templates/setting.html:184 +msgid "Service" +msgstr "服务" -#: templates/setting.html:186 -msgid "This switch only effective when 'Enable deliver' is enabled." -msgstr "此开关受制于'基本设置'的总开关,'总开关'使能,此选项才有效。" +#: application/templates/setting.html:193 +msgid "ApiKey" +msgstr "ApiKey" -#: templates/setting.html:190 -msgid "Important: Please activate your kindle firstly, and goto" -msgstr "注意:必须首先注册您的Kindle设备,同时请到亚马逊账户中心" +#: application/templates/setting.html:197 +msgid "Host" +msgstr "主机" + +#: application/templates/setting.html:201 +msgid "Port" +msgstr "端口" + +#: application/templates/setting.html:213 +msgid "Save path" +msgstr "保存路径" + +#: application/templates/setting.html:219 +#, python-format +msgid "" +"Important: Please activate your kindle firstly, then goto %(personal)s " +"Page and add %(sender)s to 'Approved Personal Document E-mail List'." +msgstr "" +"注意:必须首先注册您的Kindle设备,同时请到亚马逊账户中心 %(personal)s 页面,将 %(sender)s 添加到 " +"'已认可的发件人电子邮箱列表'。" -#: templates/setting.html:190 +#: application/templates/setting.html:219 msgid "Personal Document Settings" msgstr "个人文档设置" -#: templates/setting.html:190 -msgid "Page and add" -msgstr "页面将" +#: application/view/admin.py:43 application/view/admin.py:78 +#: application/view/admin.py:149 +msgid "The password includes non-ascii chars." +msgstr "密码包含非ASCII字符。" + +#: application/view/admin.py:48 +msgid "The old password is wrong." +msgstr "原密码错误。" + +#: application/view/admin.py:64 +msgid "You do not have sufficient privileges." +msgstr "您没有足够的权限。" + +#: application/view/admin.py:68 application/view/login.py:40 +msgid "The username includes unsafe chars." +msgstr "用户名包含不安全字符。" + +#: application/view/admin.py:72 +msgid "Already exist the username." +msgstr "此账号已经存在。" + +#: application/view/admin.py:96 application/view/admin.py:117 +#: application/view/admin.py:141 +msgid "The username '{}' does not exist." +msgstr "账号名 '{}' 不存在。" + +#: application/view/admin.py:102 +msgid "The username is empty or you dont have right to delete it." +msgstr "账号名为空或您没有删除权限。" + +#: application/view/admin.py:119 +msgid "Please input new password to confirm." +msgstr "请输入新密码确认。" + +#: application/view/admin.py:132 application/view/login.py:36 +msgid "Username is empty." +msgstr "账号名为空。" + +#: application/view/admin.py:159 +msgid "Change password success." +msgstr "修改密码成功。" + +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 application/view/adv.py:79 +msgid "Append hyperlink '{}' to article" +msgstr "在每篇文章后附加 '{}' 超链接" -#: templates/setting.html:190 -msgid "to 'Approved Personal Document E-mail List'." -msgstr "加入“已认可的发件人电子邮箱列表”。" +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +msgid "Save to {}" +msgstr "保存到 {}" -#: templates/sharedlibrary.html:50 -msgid "Database has no data yet, you can share your subscription now." -msgstr "数据库还没有数据,您可以分享现在的订阅源。" +#: application/view/adv.py:70 +msgid "evernote" +msgstr "evernote" -#: templates/sharedlibrary.html:123 templates/sharedlibrary.html:299 -msgid "[All]" -msgstr "[所有分类]" +#: application/view/adv.py:71 +msgid "wiz" +msgstr "为知笔记" -#: templates/sharedlibrary.html:124 -msgid "[by Time]" -msgstr "[按时间]" +#: application/view/adv.py:72 +msgid "pocket" +msgstr "pocket" -#: templates/sharedlibrary.html:125 templates/sharedlibrary.html:130 -#: templates/sharedlibrary.html:137 templates/sharedlibrary.html:138 -msgid "[Uncategoried]" -msgstr "[未分类]" +#: application/view/adv.py:73 +msgid "instapaper" +msgstr "instapaper" -#: templates/sharedlibrary.html:219 -msgid "Invalid" -msgstr "报失效" +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 +msgid "Share on {}" +msgstr "分享到 {}" -#: templates/sharedlibrary.html:310 -msgid "

Successfully

This feed has been successfully subscribed.

" -msgstr "

成功

已经成功订阅了此订阅源。

" +#: application/view/adv.py:74 +msgid "weibo" +msgstr "微博" -#: templates/sharedlibrary.html:332 +#: application/view/adv.py:75 +msgid "tencent weibo" +msgstr "腾讯微博" + +#: application/view/adv.py:76 +msgid "facebook" +msgstr "facebook" + +#: application/view/adv.py:78 +msgid "tumblr" +msgstr "tumblr" + +#: application/view/adv.py:79 +msgid "Open in browser" +msgstr "在浏览器打开" + +#: application/view/adv.py:351 +msgid "Authorization Error!
{}" +msgstr "申请授权过程失败!
{}" + +#: application/view/adv.py:374 +msgid "Success authorized by Pocket!" +msgstr "已经成功获得Pocket的授权!" + +#: application/view/adv.py:380 msgid "" -"

Thanks

Thank you for your feedback, this feed will be reviewed" -" soon.

" -msgstr "

非常感谢

非常感谢您的反馈,此订阅源将很快被检视。

" +"Failed to request authorization of Pocket!
See details " +"below:

{}" +msgstr "申请Pocket授权失败!
错误信息参考如下:

{}" + +#: application/view/adv.py:390 +msgid "Request type [{}] unsupported" +msgstr "不支持你请求的命令类型 [{}]" + +#: application/view/adv.py:405 +msgid "The Instapaper service encountered an error. Please try again later." +msgstr "Instapaper服务器异常,请稍候再试。" + +#: application/view/deliver.py:68 +msgid "The username does not exist or the email is empty." +msgstr "用户名不存在或email为空。" + +#: application/view/deliver.py:84 +msgid "The following recipes has been added to the push queue." +msgstr "下列Recipe已经被添加到推送队列。" + +#: application/view/deliver.py:87 +msgid "There are no recipes to deliver." +msgstr "没有需要推送的Recipe。" + +#: application/view/library.py:31 +msgid "Cannot fetch data from {}, status: {}" +msgstr "无法从 {} 获取数据,状态: {}" + +#: application/view/library.py:48 application/view/subscribe.py:192 +#: application/view/subscribe.py:301 application/view/subscribe.py:330 +#: application/view/subscribe.py:338 +msgid "The recipe does not exist." +msgstr "此Recipe不存在。" + +#: application/view/login.py:20 +msgid "Please input username and password." +msgstr "请输入正确的用户名和密码。" + +#: application/view/login.py:22 +msgid "Please use {}/{} to login at first time." +msgstr "初次登录请使用用户名'{}'/密码'{}'。" + +#: application/view/login.py:38 +msgid "The len of username reached the limit of 25 chars." +msgstr "用户名超过25字符。" + +#: application/view/login.py:70 application/view/login.py:72 +msgid "Forgot password?" +msgstr "忘记密码?" + +#: application/view/setting.py:19 +msgid "Chinese" +msgstr "中文" + +#: application/view/setting.py:20 +msgid "English" +msgstr "英语" + +#: application/view/setting.py:21 +msgid "French" +msgstr "法语" + +#: application/view/setting.py:22 +msgid "Spanish" +msgstr "西班牙语" + +#: application/view/setting.py:23 +msgid "Portuguese" +msgstr "葡萄牙语" + +#: application/view/setting.py:24 +msgid "German" +msgstr "德语" + +#: application/view/setting.py:25 +msgid "Italian" +msgstr "意大利语" + +#: application/view/setting.py:26 +msgid "Japanese" +msgstr "日语" + +#: application/view/setting.py:27 +msgid "Russian" +msgstr "俄语" + +#: application/view/setting.py:28 +msgid "Turkish" +msgstr "土耳其语" + +#: application/view/setting.py:29 +msgid "Korean" +msgstr "韩语" + +#: application/view/setting.py:30 +msgid "Arabic" +msgstr "阿拉伯语" + +#: application/view/setting.py:31 +msgid "Czech" +msgstr "捷克语" + +#: application/view/setting.py:32 +msgid "Dutch" +msgstr "荷兰语" + +#: application/view/setting.py:33 +msgid "Greek" +msgstr "希腊语" + +#: application/view/setting.py:34 +msgid "Hindi" +msgstr "印地语" + +#: application/view/setting.py:35 +msgid "Malaysian" +msgstr "马来西亚语" + +#: application/view/setting.py:36 +msgid "Bengali" +msgstr "孟加拉语" + +#: application/view/setting.py:37 +msgid "Persian" +msgstr "波斯语" + +#: application/view/setting.py:38 +msgid "Urdu" +msgstr "乌尔都语" + +#: application/view/setting.py:39 +msgid "Swahili" +msgstr "斯瓦希里语" + +#: application/view/setting.py:40 +msgid "Vietnamese" +msgstr "越南语" + +#: application/view/setting.py:41 +msgid "Punjabi" +msgstr "旁遮普语" -#~ msgid "Please Login" -#~ msgstr "请先登录" +#: application/view/setting.py:42 +msgid "Javanese" +msgstr "爪哇语" + +#: application/view/setting.py:43 +msgid "Tagalog" +msgstr "他加禄语" -#~ msgid "Note : No supports many accounts for limit of free account of GAE." -#~ msgstr "因为GAE免费资源的有限,不建议添加很多用户账户。" +#: application/view/setting.py:44 +msgid "Hausa" +msgstr "豪萨语" -#~ msgid "Free Forever." -#~ msgstr "分享自由。" +#: application/view/setting.py:78 +msgid "Kindle E-mail is requied!" +msgstr "Kindle E-mail必须填写!" -#~ msgid "Good News Always Come With You." -#~ msgstr "好消息时刻相随。" +#: application/view/setting.py:80 +msgid "Title is requied!" +msgstr "书籍标题不能为空!" -#~ msgid "" -#~ "Author modified and ported %s to " -#~ "generate mobi file in GAE without " -#~ "kindlegen tool of Amazon," -#~ msgstr "作者提取了%s的mobi模块用于通过Python在线生成mobi格式文件,不依赖Amazon的kindlegen工具," +#: application/view/setting.py:82 application/view/setting.py:84 +#: application/view/setting.py:86 +msgid "Some parameters are missing or wrong." +msgstr "一些参数为空或错误。" -#~ msgid "for periodical mobi file is a better format to represent news feeds." -#~ msgstr "杂志格式书籍排版精美,跳转方便,阅读体验更好。" +#: application/view/setting.py:116 +msgid "Settings Saved!" +msgstr "恭喜,保存成功!" -#~ msgid "With my" -#~ msgstr "使用本站" +#: application/view/share.py:103 +msgid "'{title}'

Saved to {act} [{email}] success." +msgstr "'{title}'

成功被保存至 {act} [{email}]。" -#~ msgid "open source KindleEar application" -#~ msgstr "开源的KindleEar程序" +#: application/view/share.py:125 +msgid "Failed save to Pocket.
" +msgstr "保存到 Pocket 失败。
" -#~ msgid "No have book unsubscribed" -#~ msgstr "暂时没有未订阅的书籍" +#: application/view/share.py:127 +msgid "'{}'

Saved to your Pocket account." +msgstr " '{}'

已经成功被保存到你的Pocket账户。" -#~ msgid "Unsubscribed" -#~ msgstr "未订阅" +#: application/view/share.py:130 +msgid "See details below:

{}" +msgstr "下面是一些技术细节:

{}" -#~ msgid "No have book unsubscrebed" -#~ msgstr "暂时没有未订阅的书籍" +#: application/view/share.py:150 +msgid "'{}'

Saved to your Instapaper account." +msgstr "'{}'

已经成功被保存到你的Instapaper账户。" -#~ msgid "The item is empty" -#~ msgstr "此项不能为空" +#: application/view/share.py:154 application/view/share.py:158 +msgid "Failed save to Instapaper
'{}'

Reason :" +msgstr "保存到 Instapaper 失败
'{}'

原因:" -#~ msgid "Note: task deliver will be executed after some minutes." -#~ msgstr "注意:投递需一段时间,更新内容越多所需时间越长。" +#: application/view/share.py:158 +msgid "Unknown({})" +msgstr "未知({})" -#~ msgid "Fuck Gfw (For users in China)" -#~ msgstr "我需要翻墙(针对中国用户)" +#: application/view/subscribe.py:55 +msgid "Title or url is empty!" +msgstr "标题或 URL 为空!" -#~ msgid "Input website login info for book '%s'" -#~ msgstr "请提供书籍 '%s' 的网站登录信息" +#: application/view/subscribe.py:62 application/view/subscribe.py:132 +msgid "Duplicated subscription!" +msgstr "重复的订阅!" -#~ msgid "Leave any field empty to delete info from database." -#~ msgstr "留空任何一项则从数据库中删除网站登录信息。" +#: application/view/subscribe.py:85 +msgid "The Rss does not exist." +msgstr "此RSS不存在。" -#~ msgid "Account" -#~ msgstr "账号" +#: application/view/subscribe.py:96 +msgid "The Title or Url is empty." +msgstr "标题或URL为空。" -#~ msgid "Submit" -#~ msgstr "提交" +#: application/view/subscribe.py:109 +msgid "Failed to fetch the recipe." +msgstr "抓取Recipe失败。" -#~ msgid "Not remove" -#~ msgstr "不移除" +#: application/view/subscribe.py:123 application/view/subscribe.py:262 +msgid "Failed to save the recipe. Error:" +msgstr "保存Recipe失败。错误:" -#~ msgid "Image" -#~ msgstr "图片" +#: application/view/subscribe.py:221 +msgid "You can only delete the uploaded recipe." +msgstr "您只能删除你自己上传的Recipe。" -#~ msgid "Text" -#~ msgstr "正文" +#: application/view/subscribe.py:235 +msgid "This recipe has not been subscribed to yet." +msgstr "此Recipe尚未被订阅。" -#~ msgid "All" -#~ msgstr "全部" +#: application/view/subscribe.py:237 +msgid "Unknown command: {}" +msgstr "未知命令:{}" -#~ msgid "Sendgrid Mail Setting" -#~ msgstr "Sendgrid邮件设置" +#: application/view/subscribe.py:249 +msgid "Can not read uploaded file, Error:" +msgstr "无法读取上传的文件,错误:" -#~ msgid "Use Sendgrid" -#~ msgstr "使用Sendgrid" +#: application/view/subscribe.py:257 +msgid "" +"Failed to decode the recipe. Please ensure that your recipe is saved in " +"utf-8 encoding." +msgstr "解码Recipe失败,请确保您的Recipe为utf-8编码。" -#~ msgid "ApiKey" -#~ msgstr "密钥" +#: application/view/subscribe.py:277 +msgid "The recipe is already in the library" +msgstr "此Recipe已经在新闻源中" -#~ msgid "Need sendgrid ApiKey!" -#~ msgstr "请输入Sendgrid的ApiKey!" +#: application/view/subscribe.py:308 +msgid "The login information for this recipe has been cleared" +msgstr "此Recipe的网站登录信息已经被删除" -#~ msgid "This feed has been successfully subscribed." -#~ msgstr "已经成功订阅了此订阅源。" +#: application/view/subscribe.py:312 +msgid "The login information for this recipe has been saved" +msgstr "此Recipe的网站登录信息已经保存" diff --git a/application/view/admin.py b/application/view/admin.py index 27ec5240..ae383be9 100644 --- a/application/view/admin.py +++ b/application/view/admin.py @@ -59,7 +59,7 @@ def AdminPost(): password2 = form.get('new_u_pwd2') expiration = str_to_int(form.get('new_u_expiration', '0')) - specialChars = ['<', '>', '&', '\\', '/', '%', '*', '.', '{', '}', ',', ';', '|'] + specialChars = ['<', '>', '&', '\\', '/', '%', '*', '.', '{', '}', ',', ';', '|', ' '] if user.name != adminName: #只有管理员能添加账号 tips = _("You do not have sufficient privileges.") elif not all((userName, password1, password2)): diff --git a/application/view/adv.py b/application/view/adv.py index ac26a79c..648b413b 100644 --- a/application/view/adv.py +++ b/application/view/adv.py @@ -285,7 +285,7 @@ def AdvUploadCoverAjaxPost(): @login_required() def AdvUploadCss(tips=None): user = get_login_user() - extra_css = user.get_extra_css('') + extra_css = user.get_extra_css() return render_template('adv_uploadcss.html', tab='advset', extra_css=extra_css, user=user, advCurr='uploadCss', uploadUrl=url_for("bpAdv.AdvUploadCssAjaxPost"), deleteUrl=url_for("bpAdv.AdvDeleteCssAjaxPost"), tips=tips, diff --git a/application/view/inbound_email.py b/application/view/inbound_email.py index 6e14ac3e..a36c18f4 100644 --- a/application/view/inbound_email.py +++ b/application/view/inbound_email.py @@ -11,7 +11,7 @@ from flask import Blueprint, request, current_app as app from google.appengine.api import mail from calibre import guess_type -from ..back_end.task_queue_adpt import create_delivery_task +from ..back_end.task_queue_adpt import create_delivery_task, create_url2book_task from ..back_end.db_models import KeUser, WhiteList from ..back_end.send_mail_adpt import send_to_kindle from ..base_handler import * @@ -42,7 +42,7 @@ def decode_subject(subject): def IsHyperLink(txt): expr = r"""^(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>???“”‘’]))""" match = re.match(expr, txt) - return m.group() if match else '' + return match.group() if match else '' #从接收地址提取账号名和真实地址 #如果有多个收件人的话,只解释第一个收件人 @@ -64,32 +64,31 @@ def IsSpamMail(sender, user): return True mailHost = sender.split('@')[1] - whitelist = [item.mail.lower() for item in user.white_lists] + whitelist = [item.mail.lower() for item in user.white_lists()] - return not (('*' in whitelist) or (sender.lower() in whitelist) or (f'@{mail_host}' in whitelist)) + return not (('*' in whitelist) or (sender.lower() in whitelist) or (f'@{mailHost}' in whitelist)) #GAE的退信通知 @bpInBoundEmail.post("/_ah/bounce") def ReceiveBounce(): msg = mail.BounceNotification(dict(request.form.lists())) - default_log.warning("Bounce original: {}, notification: {}".format(msg.original, msg.notification)) + #default_log.warning("Bounce original: {}, notification: {}".format(msg.original, msg.notification)) return "OK", 200 -#有新的邮件到达 +#有新的邮件到达, _ah=apphosting +#每个邮件限额: 31.5 MB @bpInBoundEmail.post("/_ah/mail/") def ReceiveMail(path): global default_log log = default_log message = mail.InboundEmailMessage(request.get_data()) + userName, to = extractUsernameFromEmail(message.to) #从接收地址提取账号名和真实地址 + adminName = app.config['ADMIN_NAME'] - #从接收地址提取账号名和真实地址 - userName, to = extractUsernameFromEmail(message.to) - - user = KeUser.get_or_none(KeUser.name == userName) - if not user: - userName = app.config['ADMIN_NAME'] - user = KeUser.get_or_none(KeUser.name == userName) + user = KeUser.get_or_none(KeUser.name == (userName or adminName)) + if not user and (userName != adminName): + user = KeUser.get_or_none(KeUser.name == adminName) if not user or not user.kindle_email: return "OK", 200 @@ -97,9 +96,8 @@ def ReceiveMail(path): #阻挡垃圾邮件 sender = parseaddr(message.sender)[1] if IsSpamMail(sender, user): - self.response.out.write("Spam mail!") log.warning('Spam mail from : {}'.format(sender)) - return "OK", 200 + return "Spam mail!" if hasattr(message, 'subject'): subject = decode_subject(message.subject).strip() @@ -121,7 +119,7 @@ def ReceiveMail(path): #通过邮件触发一次“现在投递” if to.lower() == 'trigger': create_delivery_task({'userName': userName, 'recipeId': subject}) - return "OK", 200 + return f'A delivery task for "{userName}" is triggered' #获取和解码邮件内容 txtBodies = message.bodies('text/plain') @@ -133,7 +131,7 @@ def ReceiveMail(path): #此邮件为纯文本邮件,将文本信息转换为HTML格式 if not allBodies: - log.info('There is no html body, use text body.') + log.info('There is no html body, use text body instead.') try: allBodies = [body.decode() for cType, body in txtBodies] except: @@ -141,7 +139,7 @@ def ReceiveMail(path): allBodies = [] bodies = ''.join(allBodies) if not bodies: - return "OK", 200 + return "There is no html body neither text body." bodyUrls = [] for line in bodies.split('\n'): @@ -268,8 +266,8 @@ def ReceiveMail(path): soup.html.head.insert(0, m) else: m['content'] = "text/html; charset=utf-8" - book = str(soup) + book = (f'KindleEar_{local_time("%Y-%m-%d_%H-%M", user.timezone)}.html', str(soup).encode('utf-8')) send_to_kindle(user, subject[:SUBJECT_WORDCNT], book, fileWithTime=False) - return "OK", 200 + return 'OK' diff --git a/application/view/library.py b/application/view/library.py index 66d224c8..c4466717 100644 --- a/application/view/library.py +++ b/application/view/library.py @@ -79,12 +79,14 @@ def SharedLibraryMgrPost(mgrType): url = buildKeUrl(LIBRARY_KINDLEEAR) resp = opener.open(f'{url}?key={KINDLEEAR_SITE_KEY}&data_type={LIBRARY_GETRSS}') keRss = [] + keStatus = '' if resp.status_code == 200: keRss = resp.json() else: - ret['status'] = srvErrStr(resp.status_code) + keStatus = srvErrStr(resp.status_code) #另一个来源是github分享库 + ghStatus = '' resp = opener.open(GITHUB_SHARED_RSS) if resp.status_code == 200: recipes = resp.json() @@ -93,8 +95,10 @@ def SharedLibraryMgrPost(mgrType): for item in recipes: if item.get('u') not in existingUrls: keRss.append(item) - #elif ret['status'] == 'ok': - # ret['status'] = srvErrStr(resp.status_code, 'github') + else: + ghStatus = srvErrStr(resp.status_code, 'github') + + ret['status'] = 'ok' if not (keStatus and ghStatus) else keStatus ret['data'] = keRss return ret elif mgrType == LIBRARY_REPORT_INVALID: #报告一个源失效了 diff --git a/application/view/share.py b/application/view/share.py index 245afb48..63cad5ff 100644 --- a/application/view/share.py +++ b/application/view/share.py @@ -151,11 +151,11 @@ def SaveToInstapaper(user, action, orgUrl, title): info += '

by KindleEar  

' info = SHARE_INFO_TPL.format(title='Saved to Instapaper', info=info) elif ret.status_code == 403: - info = _("Failed save to Instapaper
'{}'

Reason : Invalid username or password.").format(title) + info = _("Failed save to Instapaper
'{}'

Reason :").format(title) + _("The username does not exist or password is wrong.") info += '

by KindleEar  

' info = T_INFO % ('Failed to save', info) else: - info = _("Failed save to Instapaper
'{}'

Reason : Unknown({}).").format(title, ret.status_code) + info = _("Failed save to Instapaper
'{}'

Reason :").format(title) + _('Unknown({})').format(ret.status_code) info += '

by KindleEar  

' info = SHARE_INFO_TPL.format(title='Failed to save', info=info) diff --git a/application/work/url2book.py b/application/work/url2book.py index d784feb4..e3a178ed 100644 --- a/application/work/url2book.py +++ b/application/work/url2book.py @@ -42,7 +42,7 @@ def Url2BookImpl(userName: str, urls: str, subject: str, action: str): urls = zlib.decompress(base64.urlsafe_b64decode(urls)).decode('utf-8') urls = urls.split('|') - if bookType == 'download': #直接下载电子书并推送 + if action == 'download': #直接下载电子书并推送 from filedownload import Download for url in urls: result = Download(url) @@ -58,7 +58,7 @@ def Url2BookImpl(userName: str, urls: str, subject: str, action: str): save_delivery_log(user, fileName, 0, status=result.status) default_log.info("{} Sent!".format(fileName)) return "{} Sent!".format(fileName) - elif bookType == 'debug': #调试目的,将链接直接下载,发送到管理员邮箱 + elif action == 'debug': #调试目的,将链接直接下载,发送到管理员邮箱 #如果标题已经给定了文件名,则使用标题文件名,否则为默认文件名(page.html) fileName = None if '.' in subject and (1 < len(subject.split('.')[-1]) < 5): @@ -81,6 +81,6 @@ def Url2BookImpl(userName: str, urls: str, subject: str, action: str): send_to_kindle(user, subject, book) rs = f"Sent {subject}.{user.book_type}" else: - save_delivery_log(user, title, 0, status='fetch failed') + save_delivery_log(user, subject, 0, status='fetch failed') rs = "[Url2Book]Fetch url failed." return rs diff --git a/application/work/worker.py b/application/work/worker.py index e67ffdb7..97a3e372 100644 --- a/application/work/worker.py +++ b/application/work/worker.py @@ -3,7 +3,7 @@ #后台实际的推送任务,由任务队列触发 from collections import defaultdict -import datetime, time, imghdr, io, logging +import datetime, time, io, logging from flask import Blueprint, request from ..base_handler import * from ..back_end.send_mail_adpt import send_to_kindle @@ -19,42 +19,17 @@ #如果是Task触发的,则环境变量会包含以下一些变量 #X-AppEngine-QueueName/X-AppEngine-TaskName/X-AppEngine-TaskRetryCount/X-AppEngine-TaskExecutionCount/X-AppEngine-TaskETA -#在已订阅的Recipe或自定义RSS列表创建Recipe源码列表,最重要的作用是合并自定义RSS -#返回一个字典,键名为title,元素为 [BookedRecipe, recipe, src] -def GetAllRecipeSrc(user, idList): - srcDict = {} - rssList = [] - ftRssList = [] - for bked in filter(bool, [BookedRecipe.get_or_none(BookedRecipe.recipe_id == id_) for id_ in idList]): - recipeId = bked.recipe_id - recipeType, dbId = Recipe.type_and_id(recipeId) - if recipeType == 'builtin': - bnInfo = GetBuiltinRecipeInfo(recipeId) - src = GetBuiltinRecipeSource(recipeId) - if bnInfo and src: - srcDict[bnInfo.get('title', '')] = [bked, bnInfo, src] - continue - - recipe = Recipe.get_by_id_or_none(dbId) - if recipe: - title = recipe.title - if recipeType == 'upload': #上传的Recipe - srcDict[title] = [bked, recipe, recipe.src] - else: #自定义RSS - src = GenerateRecipeSource(title, [(title, recipe.url)], user, isfulltext=recipe.isfulltext) - srcDict[title] = [bked, recipe, src] - return srcDict +#提供给外部不通过任务队列直接调用的便捷接口 +#注意此函数可能需要很长时间才返回 +def WorkerAllNow(): + return '\n'.join([WorkerImpl(user.name) for user in KeUser.get_all()]) -# 实际下载文章和生成电子书并且发送邮件 +#下载文章和生成电子书并且发送邮件 @bpWorker.route("/worker") def Worker(): - global default_log - log = default_log - args = request.args - userName = args.get('userName', '') - recipeId = args.get('recipeId', '') #如果有多个Recipe,使用','分隔 - - return WorkerImpl(userName, recipeId, log) + userName = request.args.get('userName', '') + recipeId = request.args.get('recipeId', '') #如果有多个Recipe,使用','分隔 + return WorkerImpl(userName, recipeId, default_log) #执行实际抓取网页生成电子书任务 #userName: 需要执行任务的账号名 @@ -62,11 +37,11 @@ def Worker(): #返回执行结果字符串 def WorkerImpl(userName: str, recipeId: list=None, log=None): if not userName: - return "Parameters invalid." + return "The userName is empty." user = KeUser.get_or_none(KeUser.name == userName) if not user: - return "The user does not exist." + return f"The user '{userName}' does not exist." if not log: log = logging.getLogger('WorkerImpl') @@ -74,28 +49,30 @@ def WorkerImpl(userName: str, recipeId: list=None, log=None): if not recipeId: recipeId = [item.recipe_id for item in user.get_booked_recipe()] - elif not isinstance(recipeId, list): + elif not isinstance(recipeId, (list, tuple)): recipeId = recipeId.replace('__', ':').split(',') if not recipeId: - log.warning('There are nothing to push.') - return 'There are nothing to push.' + info = f"There are no feeds to push for user '{userName}'." + log.warning(info) + return info #编译recipe srcDict = GetAllRecipeSrc(user, recipeId) recipes = defaultdict(list) #编译好的recipe代码对象 + userCss = user.get_extra_css() + combine_css = lambda c1, c2=userCss: f'{c1}\n\n{c2}' if c1 else c2 for title, (bked, recipeDb, src) in srcDict.items(): try: ro = compile_recipe(src) - assert(ro.title) except Exception as e: - log.warning('Failed to compile recipe {}: {}'.format(title, e)) + log.warning('Failed to compile recipe {}: {}'.format(title, str(e))) if not ro.language or ro.language == 'und': ro.language = user.book_language #合并自定义css - ro.extra_css = user.get_extra_css(ro.extra_css) + ro.extra_css = combine_css(ro.extra_css) #如果需要登录网站 if ro.needs_subscription: @@ -128,10 +105,28 @@ def WorkerImpl(userName: str, recipeId: list=None, log=None): return '\n'.join(ret) if ret else "There are no new feeds available." -#提供给外部不通过任务队列直接调用的接口 -def WorkerAllNow(): - result = [] - for user in KeUser.get_all(): - result.append(WorkerImpl(user.name)) - return '\n'.join(result) - +#在已订阅的Recipe或自定义RSS列表创建Recipe源码列表,最重要的作用是合并自定义RSS +#返回一个字典,键名为title,元素为 [BookedRecipe, recipe, src] +def GetAllRecipeSrc(user, idList): + srcDict = {} + rssList = [] + ftRssList = [] + for bked in filter(bool, [BookedRecipe.get_or_none(BookedRecipe.recipe_id == id_) for id_ in idList]): + recipeId = bked.recipe_id + recipeType, dbId = Recipe.type_and_id(recipeId) + if recipeType == 'builtin': + bnInfo = GetBuiltinRecipeInfo(recipeId) + src = GetBuiltinRecipeSource(recipeId) + if bnInfo and src: + srcDict[bnInfo.get('title', '')] = [bked, bnInfo, src] + continue + + recipe = Recipe.get_by_id_or_none(dbId) + if recipe: + title = recipe.title + if recipeType == 'upload': #上传的Recipe + srcDict[title] = [bked, recipe, recipe.src] + else: #自定义RSS + src = GenerateRecipeSource(title, [(title, recipe.url)], user, isfulltext=recipe.isfulltext) + srcDict[title] = [bked, recipe, src] + return srcDict diff --git a/main.py b/main.py index de7a8357..478dbe6b 100644 --- a/main.py +++ b/main.py @@ -37,6 +37,7 @@ def set_env(): os.environ['CELERY_BROKER_URL'] = CELERY_BROKER_URL os.environ['CELERY_RESULT_BACKEND'] = CELERY_RESULT_BACKEND os.environ['KE_DOMAIN'] = 'http://127.0.0.1:5000/' #KE_DOMAIN + os.environ['SRC_EMAIL'] = SRC_EMAIL set_env() diff --git a/messages.pot b/messages.pot index a5a34af2..04b49297 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-01-22 08:34-0300\n" +"POT-Creation-Date: 2024-02-14 21:49-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,1221 +17,1267 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.14.0\n" -#: apps/view/admin.py:46 apps/view/admin.py:72 apps/view/admin.py:126 -msgid "The password includes non-ascii chars!" +#: application/templates/admin.html:3 application/templates/base.html:148 +#: application/templates/base.html:150 +msgid "Admin" msgstr "" -#: apps/view/admin.py:49 -msgid "Old password is wrong!" +#: application/templates/admin.html:14 +msgid "Change Password" msgstr "" -#: apps/view/admin.py:51 apps/view/admin.py:64 apps/view/admin.py:120 -msgid "The two new passwords are dismatch!" +#: application/templates/admin.html:19 +msgid "Old password" msgstr "" -#: apps/view/admin.py:53 apps/view/admin.py:136 -msgid "Change password success!" +#: application/templates/admin.html:23 +#: application/templates/adminmgrpwd.html:19 +#: application/templates/adminmgrpwd.html:20 +msgid "New password" msgstr "" -#: apps/view/admin.py:62 apps/view/login.py:41 -msgid "The username includes unsafe chars!" +#: application/templates/admin.html:27 application/templates/admin.html:52 +#: application/templates/adminmgrpwd.html:23 +#: application/templates/adminmgrpwd.html:24 +msgid "Confirm password" msgstr "" -#: apps/view/admin.py:66 -msgid "Already exist the username!" +#: application/templates/admin.html:31 +#: application/templates/adminmgrpwd.html:39 +msgid "Confirm Change" msgstr "" -#: apps/view/admin.py:86 -msgid "Add a account success!" +#: application/templates/admin.html:39 +msgid "Add Account" msgstr "" -#: apps/view/admin.py:98 apps/view/admin.py:118 apps/view/admin.py:157 -msgid "The username '{}' not exist!" +#: application/templates/admin.html:44 application/templates/admin.html:86 +#: application/templates/adminmgrpwd.html:15 +#: application/templates/adminmgrpwd.html:16 +#: application/templates/delaccount.html:16 application/templates/home.html:15 +#: application/templates/login.html:29 application/templates/login.html:30 +#: application/templates/logs.html:85 application/templates/setting.html:205 +msgid "Username" msgstr "" -#: apps/view/admin.py:100 -msgid "Please input new password to confirm!" +#: application/templates/admin.html:48 +#: application/templates/adv_archive.html:55 application/templates/base.html:47 +#: application/templates/home.html:16 application/templates/login.html:33 +#: application/templates/login.html:34 application/templates/setting.html:209 +msgid "Password" msgstr "" -#: apps/view/admin.py:113 apps/view/login.py:37 -msgid "Username is empty!" +#: application/templates/admin.html:56 application/templates/admin.html:88 +#: application/templates/adminmgrpwd.html:27 +msgid "Expiration" msgstr "" -#: apps/view/admin.py:145 -msgid "Please confirm to delete the account!" +#: application/templates/admin.html:58 application/templates/admin.html:99 +#: application/templates/adminmgrpwd.html:29 +msgid "Never expire" msgstr "" -#: apps/view/admin.py:163 -msgid "The username is empty or you dont have right to delete it!" +#: application/templates/admin.html:59 application/templates/admin.html:101 +#: application/templates/adminmgrpwd.html:30 +#: application/templates/setting.html:151 +msgid "7 Days" msgstr "" -#: apps/view/adv.py:62 apps/view/adv.py:63 apps/view/adv.py:64 -#: apps/view/adv.py:65 apps/view/adv.py:66 apps/view/adv.py:67 -#: apps/view/adv.py:68 apps/view/adv.py:69 apps/view/adv.py:70 -#: apps/view/adv.py:71 -msgid "Append hyperlink '{}' to article" +#: application/templates/admin.html:60 application/templates/admin.html:103 +#: application/templates/adminmgrpwd.html:31 +msgid "1 Month" msgstr "" -#: apps/view/adv.py:364 -msgid "Authorization Error!
{}" +#: application/templates/admin.html:61 application/templates/admin.html:105 +#: application/templates/adminmgrpwd.html:32 +msgid "3 Months" msgstr "" -#: apps/view/adv.py:387 -msgid "Success authorized by Pocket!" +#: application/templates/admin.html:62 application/templates/admin.html:107 +#: application/templates/adminmgrpwd.html:33 +msgid "6 Months" msgstr "" -#: apps/view/adv.py:393 -msgid "" -"Failed to request authorization of Pocket!
See details " -"below:

{}" +#: application/templates/admin.html:63 application/templates/admin.html:109 +#: application/templates/adminmgrpwd.html:34 +msgid "1 Year" msgstr "" -#: apps/view/adv.py:403 -msgid "Request type [{}] unsupported" +#: application/templates/admin.html:64 application/templates/admin.html:111 +#: application/templates/adminmgrpwd.html:35 +msgid "2 Years" msgstr "" -#: apps/view/adv.py:418 -msgid "The Instapaper service encountered an error. Please try again later." +#: application/templates/admin.html:68 +#: application/templates/adv_whitelist.html:29 application/templates/my.html:32 +msgid "Add" msgstr "" -#: apps/view/deliver.py:108 -msgid "The username not exist or the email of kindle is empty." +#: application/templates/admin.html:74 +msgid "Accounts" msgstr "" -#: apps/view/deliver.py:123 -msgid "Book(s) ({}) put to queue!" +#: application/templates/admin.html:85 +msgid "No." msgstr "" -#: apps/view/deliver.py:125 -msgid "No book to deliver!" +#: application/templates/admin.html:87 +msgid "AutoSend" msgstr "" -#: apps/view/library.py:39 apps/view/library.py:85 apps/view/library.py:105 -msgid "Cannot fetch data from {}, status: {}" +#: application/templates/admin.html:89 +msgid "Operation" msgstr "" -#: apps/view/library.py:56 apps/view/library.py:148 apps/view/subscribe.py:84 -msgid "Title or Url is empty!" +#: application/templates/admin.html:97 +msgid "Yes" msgstr "" -#: apps/view/library.py:198 apps/view/library.py:240 -msgid "Url is empty!" +#: application/templates/admin.html:97 +msgid "No" msgstr "" -#: apps/view/library.py:208 apps/view/library.py:254 -msgid "URL not found in database!" +#: application/templates/admin.html:117 application/templates/admin.html:120 +msgid "Change" msgstr "" -#: apps/view/login.py:21 -msgid "Please input username and password." +#: application/templates/admin.html:118 application/templates/admin.html:121 +#: application/templates/adv_uploadcss.html:31 +#: application/templates/adv_whitelist.html:22 +#: application/templates/base.html:22 application/templates/delaccount.html:20 +msgid "Delete" msgstr "" -#: apps/view/login.py:23 -msgid "Please use {}/{} to login at first time." +#: application/templates/adminmgrpwd.html:3 +msgid "Change password" msgstr "" -#: apps/view/login.py:39 -msgid "The len of username reached the limit of 25 chars!" +#: application/templates/adv_archive.html:3 +#: application/templates/adv_archive.html:13 +#: application/templates/adv_base.html:59 +#: application/templates/adv_base.html:63 +msgid "Archive" msgstr "" -#: apps/view/login.py:68 -msgid "The username not exist or password is wrong!" +#: application/templates/adv_archive.html:14 +msgid "Append hyperlinks for archiving or sharing." msgstr "" -#: apps/view/login.py:71 apps/view/login.py:73 -msgid "Forgot password?" +#: application/templates/adv_archive.html:39 +msgid "Authorized" msgstr "" -#: apps/view/login.py:109 -msgid "login required" +#: application/templates/adv_archive.html:41 +msgid "Authorize" msgstr "" -#: apps/view/logs.py:88 apps/view/logs.py:104 -msgid "The LastDelivered item ({}) not exist!" +#: application/templates/adv_archive.html:52 +msgid "Email or Username" msgstr "" -#: apps/view/logs.py:95 -msgid "The id or num is invalid!" +#: application/templates/adv_archive.html:58 application/templates/base.html:57 +msgid "Verify" msgstr "" -#: apps/view/setting.py:17 -msgid "Chinese" +#: application/templates/adv_archive.html:93 +#: application/templates/setting.html:223 +msgid "Save settings" msgstr "" -#: apps/view/setting.py:18 -msgid "English" +#: application/templates/adv_base.html:39 +#: application/templates/adv_base.html:43 +#: application/templates/adv_delivernow.html:3 +#: application/templates/adv_delivernow.html:8 +msgid "Deliver now" msgstr "" -#: apps/view/setting.py:19 -msgid "French" +#: application/templates/adv_base.html:49 +#: application/templates/adv_base.html:53 +#: application/templates/adv_whitelist.html:13 +msgid "White List" msgstr "" -#: apps/view/setting.py:20 -msgid "Spanish" +#: application/templates/adv_base.html:68 +#: application/templates/adv_base.html:72 +#: application/templates/adv_import.html:8 +msgid "Import Feeds" msgstr "" -#: apps/view/setting.py:21 -msgid "Portuguese" +#: application/templates/adv_base.html:77 +#: application/templates/adv_base.html:81 +msgid "Cover Image" msgstr "" -#: apps/view/setting.py:22 -msgid "German" +#: application/templates/adv_base.html:86 +#: application/templates/adv_base.html:90 +#: application/templates/adv_uploadcss.html:3 +msgid "Stylesheet" msgstr "" -#: apps/view/setting.py:23 -msgid "Italian" +#: application/templates/adv_delivernow.html:9 +msgid "Deliver selected recipes now" msgstr "" -#: apps/view/setting.py:24 -msgid "Japanese" +#: application/templates/adv_delivernow.html:12 +msgid "There are no recipes subscribed" msgstr "" -#: apps/view/setting.py:25 -msgid "Russian" +#: application/templates/adv_delivernow.html:23 +msgid "Select all" msgstr "" -#: apps/view/setting.py:26 -msgid "Turkish" +#: application/templates/adv_delivernow.html:24 +msgid "Select none" msgstr "" -#: apps/view/setting.py:27 -msgid "Korean" +#: application/templates/adv_delivernow.html:29 +msgid "Deliver" msgstr "" -#: apps/view/setting.py:28 -msgid "Arabic" +#: application/templates/adv_import.html:3 +#: application/templates/adv_import.html:18 +msgid "Import" msgstr "" -#: apps/view/setting.py:29 -msgid "Czech" +#: application/templates/adv_import.html:9 +msgid "Import custom rss from an OPML file." msgstr "" -#: apps/view/setting.py:30 -msgid "Dutch" +#: application/templates/adv_import.html:15 +msgid "Import as fulltext RSS by default" msgstr "" -#: apps/view/setting.py:31 -msgid "Greek" +#: application/templates/adv_import.html:19 +msgid "Download" msgstr "" -#: apps/view/setting.py:32 -msgid "Hindi" +#: application/templates/adv_uploadcover.html:3 +msgid "Cover image" msgstr "" -#: apps/view/setting.py:33 -msgid "Malaysian" +#: application/templates/adv_uploadcover.html:9 +msgid "Upload cover image" msgstr "" -#: apps/view/setting.py:34 -msgid "Bengali" +#: application/templates/adv_uploadcover.html:10 +msgid "Upload cover images from local with an aspect ratio of approximately 0.65." msgstr "" -#: apps/view/setting.py:35 -msgid "Persian" +#: application/templates/adv_uploadcover.html:15 +msgid "Rule to pick cover images" msgstr "" -#: apps/view/setting.py:36 -msgid "Urdu" +#: application/templates/adv_uploadcover.html:17 +msgid "Random" msgstr "" -#: apps/view/setting.py:37 -msgid "Swahili" +#: application/templates/adv_uploadcover.html:18 +msgid "Weekday" msgstr "" -#: apps/view/setting.py:38 -msgid "Vietnamese" +#: application/templates/adv_uploadcover.html:42 +msgid "Upload/Update" msgstr "" -#: apps/view/setting.py:39 -msgid "Punjabi" +#: application/templates/adv_uploadcss.html:22 +msgid "Upload stylesheet" msgstr "" -#: apps/view/setting.py:40 -msgid "Javanese" +#: application/templates/adv_uploadcss.html:23 +msgid "Upload a stylesheet from local (accept utf-8 only)." msgstr "" -#: apps/view/setting.py:41 -msgid "Tagalog" +#: application/templates/adv_uploadcss.html:30 +msgid "Upload" msgstr "" -#: apps/view/setting.py:42 -msgid "Hausa" +#: application/templates/adv_whitelist.html:3 +msgid "White list" msgstr "" -#: apps/view/setting.py:58 -msgid "Kindle E-mail is requied!" +#: application/templates/adv_whitelist.html:15 +#, python-format +msgid "" +"Emails sent to %(name)sxxx@appid.appspotmail.com will be transferred to " +"your email." msgstr "" -#: apps/view/setting.py:60 -msgid "Title is requied!" +#: application/templates/adv_whitelist.html:27 +msgid "Please input mail address" msgstr "" -#: apps/view/setting.py:86 -msgid "Settings Saved!" +#: application/templates/autoback.html:3 +#: application/templates/tipsandback.html:3 +msgid "Auto back" msgstr "" -#: apps/view/share.py:112 -msgid "'{title}'

Saved to {act} [{email}] success." +#: application/templates/autoback.html:28 +#: application/templates/tipsandback.html:13 +msgid "Auto back to previous page after 5 seconds" msgstr "" -#: apps/view/share.py:134 -msgid "Failed save to Pocket.
" +#: application/templates/autoback.html:29 +#: application/templates/tipsandback.html:14 +#: application/templates/tipsback.html:15 +msgid "Click to back" msgstr "" -#: apps/view/share.py:136 -msgid "'{}'

Saved to your Pocket account." +#: application/templates/base.html:23 +msgid "View Source Code" msgstr "" -#: apps/view/share.py:139 -msgid "See details below:

{}" +#: application/templates/base.html:24 +msgid "Subscribe (Deliver Separately)" msgstr "" -#: apps/view/share.py:159 -msgid "'{}'

Saved to your Instapaper account." +#: application/templates/base.html:25 +msgid "Subscribe" msgstr "" -#: apps/view/share.py:163 -msgid "" -"Failed save to Instapaper
'{}'

Reason : Invalid username or " -"password." +#: application/templates/base.html:26 +msgid "Cannot add this custom rss, Error:" msgstr "" -#: apps/view/share.py:167 -msgid "Failed save to Instapaper
'{}'

Reason : Unknown({})." +#: application/templates/base.html:27 +msgid "Cannot delete this feed, Error:" msgstr "" -#: apps/view/subscribe.py:46 -msgid "Title or url is empty!" +#: application/templates/base.html:28 +msgid "Fulltext" msgstr "" -#: apps/view/subscribe.py:53 apps/view/subscribe.py:93 -msgid "Duplicated subscription!" +#: application/templates/base.html:29 application/templates/base.html:36 +msgid "Share" msgstr "" -#: apps/view/subscribe.py:74 -msgid "The feed ({}) not exist!" +#: application/templates/base.html:30 +msgid "Are you sure to delete ({0})?" msgstr "" -#: apps/view/subscribe.py:133 -msgid "The book ({}) not exist!" +#: application/templates/base.html:31 +msgid "Share links, share happiness" msgstr "" -#: books/serialize_builtin_recipes.py:27 -msgid "You" +#: application/templates/base.html:32 +msgid "Category" msgstr "" -#: books/serialize_builtin_recipes.py:27 books/serialize_builtin_recipes.py:36 -msgid "Unknown" +#: application/templates/base.html:33 application/templates/setting.html:130 +msgid "Language" msgstr "" -#: templates/admin.html:3 templates/base.html:150 templates/base.html:152 -msgid "Admin" +#: application/templates/base.html:34 +msgid "" +"Please write a category in text field if the one you wish is not in the " +"list." msgstr "" -#: templates/admin.html:14 -msgid "Change Password" +#: application/templates/base.html:35 +msgid "Cancel" msgstr "" -#: templates/admin.html:19 -msgid "Old password" +#: application/templates/base.html:37 +msgid "Language code invalid" msgstr "" -#: templates/admin.html:23 templates/adminmgrpwd.html:19 -#: templates/adminmgrpwd.html:20 -msgid "New password" +#: application/templates/base.html:38 +msgid "Thank you for sharing." msgstr "" -#: templates/admin.html:27 templates/admin.html:52 -#: templates/adminmgrpwd.html:23 templates/adminmgrpwd.html:24 -msgid "Confirm password" +#: application/templates/base.html:39 +msgid "Close" msgstr "" -#: templates/admin.html:31 templates/adminmgrpwd.html:39 -msgid "Confirm Change" +#: application/templates/base.html:40 +msgid "Unsubscribe" msgstr "" -#: templates/admin.html:39 -msgid "Add Account" +#: application/templates/base.html:41 +msgid "Cannot subscribe this recipe, Error:" msgstr "" -#: templates/admin.html:44 templates/admin.html:85 -#: templates/adminmgrpwd.html:15 templates/adminmgrpwd.html:16 -#: templates/delaccount.html:16 templates/home.html:18 templates/login.html:29 -#: templates/login.html:30 templates/logs.html:85 templates/logs.html:127 -msgid "Username" +#: application/templates/base.html:42 +msgid "Are you sure to Unsubscribe ({0})?" msgstr "" -#: templates/admin.html:48 templates/advarchive.html:51 templates/home.html:19 -#: templates/login.html:33 templates/login.html:34 -msgid "Password" +#: application/templates/base.html:43 +msgid "Cannot unsubscribe this recipe, Error:" msgstr "" -#: templates/admin.html:56 templates/adminmgrpwd.html:27 -msgid "Expiration" +#: application/templates/base.html:44 +msgid "The recipe is already subscribed." msgstr "" -#: templates/admin.html:58 templates/adminmgrpwd.html:29 -msgid "Never expire" +#: application/templates/base.html:45 +msgid "Subscription info" msgstr "" -#: templates/admin.html:59 templates/adminmgrpwd.html:30 -#: templates/setting.html:176 -msgid "7 Days" +#: application/templates/base.html:46 +msgid "Account" msgstr "" -#: templates/admin.html:60 templates/adminmgrpwd.html:31 -msgid "1 Month" +#: application/templates/base.html:48 +msgid "Submit" msgstr "" -#: templates/admin.html:61 templates/adminmgrpwd.html:32 -msgid "3 Months" +#: application/templates/base.html:49 +msgid "" +"If any field is left blank, the server will clear the saved login " +"information." msgstr "" -#: templates/admin.html:62 templates/adminmgrpwd.html:33 -msgid "6 Months" +#: application/templates/base.html:50 +msgid "Cannot set the subscription infomation, Error:" msgstr "" -#: templates/admin.html:63 templates/adminmgrpwd.html:34 -msgid "1 Year" +#: application/templates/base.html:51 +msgid "Choose a recipe file to upload" msgstr "" -#: templates/admin.html:64 templates/adminmgrpwd.html:35 -msgid "2 Years" +#: application/templates/base.html:52 +msgid "Congratulations" msgstr "" -#: templates/admin.html:68 templates/advurlfilter.html:32 -#: templates/advwhitelist.html:31 templates/my.html:31 -msgid "Add" +#: application/templates/base.html:53 +msgid "Thanks" msgstr "" -#: templates/admin.html:74 -msgid "Accounts" +#: application/templates/base.html:54 +msgid "" +"Your recipe has been uploaded, and it can be found in the Library " +"section. If you dont see it, please make sure to switch to the correct " +"language." msgstr "" -#: templates/admin.html:84 -msgid "No." +#: application/templates/base.html:55 +msgid "Your recipe have been deleted." msgstr "" -#: templates/admin.html:86 -msgid "Enable" +#: application/templates/base.html:56 +msgid "Read with Kindle" msgstr "" -#: templates/admin.html:87 templates/logs.html:132 -msgid "Operation" +#: application/templates/base.html:58 +msgid "Verified" msgstr "" -#: templates/admin.html:97 templates/logs.html:145 -msgid "Change" +#: application/templates/base.html:59 application/view/login.py:67 +#: application/view/share.py:154 +msgid "The username does not exist or password is wrong." msgstr "" -#: templates/admin.html:98 templates/advcoverimage.html:47 -#: templates/advuploadcss.html:31 templates/advurlfilter.html:24 -#: templates/advwhitelist.html:23 templates/delaccount.html:20 -#: templates/logs.html:148 templates/my.html:60 templates/my.html:201 -#: templates/my.html:412 -msgid "Delete" +#: application/templates/base.html:60 +msgid "The file you chosen is not an acceptable type." msgstr "" -#: templates/adminmgrpwd.html:3 -msgid "Change password" +#: application/templates/base.html:61 +msgid "The file have been uploaded successfully." msgstr "" -#: templates/advarchive.html:3 templates/advarchive.html:9 -#: templates/advbase.html:57 templates/advbase.html:61 -msgid "Archive" +#: application/templates/base.html:62 +msgid "This feed has been successfully subscribed." msgstr "" -#: templates/advarchive.html:10 -msgid "Append hyperlinks for archiving or sharing." +#: application/templates/base.html:63 +msgid "Thank you for your feedback, this feed will be reviewed soon." msgstr "" -#: templates/advarchive.html:35 -msgid "Authorized" +#: application/templates/base.html:64 +msgid "Are you confirming to share the recipe ({0})?" msgstr "" -#: templates/advarchive.html:37 -msgid "Authorize" +#: application/templates/base.html:65 +msgid "[All]" msgstr "" -#: templates/advarchive.html:48 -msgid "Email or Username" +#: application/templates/base.html:66 +msgid "[By Time]" msgstr "" -#: templates/advarchive.html:54 templates/advarchive.html:102 -#: templates/advarchive.html:113 templates/advarchive.html:120 -#: templates/advarchive.html:126 -msgid "Verify" +#: application/templates/base.html:67 +msgid "[Uncategoried]" msgstr "" -#: templates/advarchive.html:87 -msgid "Append QR code of url to article" +#: application/templates/base.html:68 +msgid "No links found in the chosen language." msgstr "" -#: templates/advarchive.html:93 templates/setting.html:193 -msgid "Save settings" +#: application/templates/base.html:69 +msgid "Invalid report" msgstr "" -#: templates/advarchive.html:105 -msgid "Verifying" +#: application/templates/base.html:70 +msgid "Are you confirming that this link is invalid or off the cloud?" msgstr "" -#: templates/advarchive.html:116 -msgid "Congratulation : the username and password are correct." +#: application/templates/base.html:71 +msgid "Customize delivery time" msgstr "" -#: templates/advarchive.html:117 -msgid "Verified" +#: application/templates/base.html:72 application/templates/setting.html:50 +msgid "Delivery days" msgstr "" -#: templates/advarchive.html:119 -msgid "The username or password is incorrect!" +#: application/templates/base.html:73 application/templates/setting.html:52 +msgid "Mon" msgstr "" -#: templates/advarchive.html:125 -msgid "Error when verify the username and password for Instapaper. Status:" +#: application/templates/base.html:74 application/templates/setting.html:54 +msgid "Tue" msgstr "" -#: templates/advbase.html:39 templates/advbase.html:43 -#: templates/advdelivernow.html:3 templates/advdelivernow.html:8 -msgid "Deliver now" +#: application/templates/base.html:75 application/templates/setting.html:56 +msgid "Wed" msgstr "" -#: templates/advbase.html:48 templates/advbase.html:52 -#: templates/advwhitelist.html:13 -msgid "White List" +#: application/templates/base.html:76 application/templates/setting.html:58 +msgid "Thu" msgstr "" -#: templates/advbase.html:66 templates/advbase.html:70 -#: templates/advurlfilter.html:12 -msgid "Url Filter" +#: application/templates/base.html:77 application/templates/setting.html:60 +msgid "Fri" msgstr "" -#: templates/advbase.html:75 templates/advbase.html:79 -#: templates/advimport.html:8 -msgid "Import Feeds" +#: application/templates/base.html:78 application/templates/setting.html:62 +msgid "Sat" msgstr "" -#: templates/advbase.html:84 templates/advbase.html:88 -msgid "Cover Image" +#: application/templates/base.html:79 application/templates/setting.html:64 +msgid "Sun" msgstr "" -#: templates/advbase.html:93 templates/advbase.html:97 -#: templates/advuploadcss.html:3 -msgid "Stylesheet" +#: application/templates/base.html:80 +msgid "Delivery times" msgstr "" -#: templates/advcoverimage.html:3 -msgid "Cover image" +#: application/templates/base.html:81 +msgid "The customized delivery time for the recipe has been successfully saved." msgstr "" -#: templates/advcoverimage.html:32 -msgid "Upload cover image" +#: application/templates/base.html:82 +msgid "The account have been deleted." msgstr "" -#: templates/advcoverimage.html:33 -msgid "Upload a cover image from local." +#: application/templates/base.html:83 application/view/admin.py:46 +#: application/view/admin.py:66 +msgid "The username or password is empty." msgstr "" -#: templates/advcoverimage.html:46 templates/advuploadcss.html:30 -msgid "Upload" +#: application/templates/base.html:84 application/view/admin.py:50 +#: application/view/admin.py:70 application/view/admin.py:143 +msgid "The two new passwords are dismatch." msgstr "" -#: templates/advcoverimage.html:66 -msgid "Size of image file must be smaller than 500KB." +#: application/templates/base.html:85 +msgid "Password changed successfully." msgstr "" -#: templates/advcoverimage.html:72 -msgid "The file you chosen is not an image." +#: application/templates/base.html:86 +msgid "Account added successfully." msgstr "" -#: templates/advcoverimage.html:100 -msgid "" -"

Successfully

The cover image have been uploaded " -"successfully.

" +#: application/templates/base.html:87 application/view/login.py:106 +msgid "login required" msgstr "" -#: templates/advcoverimage.html:101 templates/advuploadcss.html:74 -#: templates/my.html:533 templates/sharedlibrary.html:311 -#: templates/sharedlibrary.html:333 -msgid "Close" +#: application/templates/base.html:88 +msgid "Upload cover files successfully." msgstr "" -#: templates/advcoverimage.html:107 -msgid "Failed to upload the cover image. Error:" +#: application/templates/base.html:89 +msgid "" +"Total size of the files you selected exceeds 16MB. Please reduce the " +"image resolution or upload in batches." msgstr "" -#: templates/advcoverimage.html:163 -msgid "Failed to delete the cover image. Error:" +#: application/templates/base.html:111 application/templates/home.html:12 +msgid "Logout" msgstr "" -#: templates/advcoverimage.html:167 -msgid "Failed to delete the cover image. Status:" +#: application/templates/base.html:113 application/templates/home.html:17 +#: application/templates/login.html:3 application/templates/login.html:37 +msgid "Login" msgstr "" -#: templates/advdelivernow.html:9 -msgid "Deliver selected books now." +#: application/templates/base.html:133 application/templates/base.html:135 +#: application/templates/home.html:11 application/templates/my.html:3 +msgid "Feeds" msgstr "" -#: templates/advdelivernow.html:12 -msgid "No books are subscribed." +#: application/templates/base.html:138 application/templates/base.html:140 +#: application/templates/setting.html:3 +msgid "Settings" msgstr "" -#: templates/advdelivernow.html:23 templates/advdelivernow.html:35 -msgid "Select all" +#: application/templates/base.html:143 application/templates/base.html:145 +#: application/templates/logs.html:3 +msgid "Logs" msgstr "" -#: templates/advdelivernow.html:24 templates/advdelivernow.html:36 -msgid "Select none" +#: application/templates/base.html:153 application/templates/base.html:155 +msgid "Advanced" msgstr "" -#: templates/advdelivernow.html:42 -msgid "Deliver" +#: application/templates/base.html:158 application/templates/base.html:160 +#: application/templates/library.html:3 +msgid "Shared" msgstr "" -#: templates/advimport.html:3 templates/advimport.html:18 -msgid "Import" +#: application/templates/delaccount.html:3 +msgid "Delete account" msgstr "" -#: templates/advimport.html:9 -msgid "Import custom rss from a OPML file." +#: application/templates/home.html:3 +msgid "Home" msgstr "" -#: templates/advimport.html:15 -msgid "Import as fulltext RSS by default" +#: application/templates/home.html:9 +msgid "Sharing Joyful News Every Step of the Way" msgstr "" -#: templates/advimport.html:19 -msgid "Download" +#: application/templates/home.html:27 +msgid "Inherited From Calibre" msgstr "" -#: templates/advuploadcss.html:22 -msgid "Upload stylesheet" +#: application/templates/home.html:30 +#, python-format +msgid "" +"Empowered by %(calibre)s, you can easily create e-books on a Python-" +"supported online platform and seamlessly transfer them to your e-reader " +"or other reading devices." msgstr "" -#: templates/advuploadcss.html:23 -msgid "Upload a stylesheet from local (accept utf-8 only)." +#: application/templates/home.html:38 +msgid "Share Your Ideas" msgstr "" -#: templates/advuploadcss.html:53 -msgid "The file you chosen is not a stylesheet file." +#: application/templates/home.html:41 +#, python-format +msgid "" +"With the open-source %(kindleear)s application, you can set up your own " +"server to deliver daily news feeds to your e-reader and effortlessly " +"share the service with friends." msgstr "" -#: templates/advuploadcss.html:73 +#: application/templates/library.html:48 application/templates/my.html:62 +msgid "Search" +msgstr "" + +#: application/templates/login.html:40 msgid "" -"

Successfully

The stylesheet file have been uploaded " -"successfully.

" +"The website doesn't allow registration. You can ask the owner for an " +"account." msgstr "" -#: templates/advuploadcss.html:79 templates/advuploadcss.html:83 -msgid "Failed to upload the stylesheet file. Error:" +#: application/templates/logs.html:34 +msgid "Only display last 10 logs" msgstr "" -#: templates/advuploadcss.html:133 templates/advuploadcss.html:137 -msgid "Failed to delete the stylesheet. Error:" +#: application/templates/logs.html:45 application/templates/logs.html:86 +msgid "Time" msgstr "" -#: templates/advurlfilter.html:3 -msgid "Url filter" +#: application/templates/logs.html:46 application/templates/logs.html:87 +#: application/templates/my.html:17 application/templates/setting.html:99 +#: application/templates/setting.html:100 +#: application/templates/setting.html:101 +#: application/templates/setting.html:102 +#: application/templates/setting.html:126 +msgid "Title" msgstr "" -#: templates/advurlfilter.html:13 -msgid "Urls in list would not be downloaded." +#: application/templates/logs.html:47 application/templates/logs.html:88 +msgid "Size" msgstr "" -#: templates/advurlfilter.html:30 -msgid "Please input regular expression" +#: application/templates/logs.html:48 application/templates/logs.html:89 +msgid "To" msgstr "" -#: templates/advwhitelist.html:3 -msgid "White list" +#: application/templates/logs.html:49 application/templates/logs.html:90 +msgid "Status" msgstr "" -#: templates/advwhitelist.html:15 -#, python-format -msgid "" -"Emails sent to %(name)sxxx@appid.appspotmail.com will be transferred to " -"your email." +#: application/templates/logs.html:69 +msgid "There is no log" msgstr "" -#: templates/advwhitelist.html:29 -msgid "Please input mail address" +#: application/templates/logs.html:73 +msgid "Logs of other users" msgstr "" -#: templates/autoback.html:3 templates/tipsandback.html:3 -msgid "Auto back" +#: application/templates/my.html:12 +msgid "Custom Rss" msgstr "" -#: templates/autoback.html:28 templates/tipsandback.html:13 -msgid "Auto back to previous page after 5 seconds" +#: application/templates/my.html:23 +msgid "Content embedded" msgstr "" -#: templates/autoback.html:29 templates/tipsandback.html:14 -#: templates/tipsback.html:15 -msgid "Click to back" +#: application/templates/my.html:44 +msgid "Subscribed" msgstr "" -#: templates/base.html:116 templates/home.html:15 -msgid "Logout" +#: application/templates/my.html:49 +msgid "Library" msgstr "" -#: templates/base.html:118 templates/home.html:20 templates/login.html:3 -#: templates/login.html:37 -msgid "Login" +#: application/templates/my.html:57 +msgid "Upload your custom recipe" msgstr "" -#: templates/base.html:135 templates/base.html:137 templates/home.html:14 -#: templates/my.html:3 -msgid "Feeds" +#: application/templates/my.html:70 +msgid "Subscription to selected recipe successful." msgstr "" -#: templates/base.html:140 templates/base.html:142 templates/setting.html:3 -msgid "Settings" +#: application/templates/my.html:73 +msgid "Bookmarklet" msgstr "" -#: templates/base.html:145 templates/base.html:147 templates/logs.html:3 -msgid "Logs" +#: application/templates/my.html:77 +msgid "Add to KindleEar" msgstr "" -#: templates/base.html:155 templates/base.html:157 -msgid "Advanced" +#: application/templates/my.html:80 +msgid "Drag and drop this link to your bookmarks" msgstr "" -#: templates/base.html:160 templates/base.html:162 -#: templates/sharedlibrary.html:3 -msgid "Shared" +#: application/templates/setting.html:14 +msgid "Your account will pause after {0}, please log in again before it expires." msgstr "" -#: templates/delaccount.html:3 -msgid "Delete account" +#: application/templates/setting.html:15 +msgid "Delete Account" msgstr "" -#: templates/home.html:3 -msgid "Home" +#: application/templates/setting.html:24 +msgid "Base Setting" msgstr "" -#: templates/home.html:12 -msgid "Sharing Joyful News Every Step of the Way" +#: application/templates/setting.html:26 +msgid "Auto Delivery" msgstr "" -#: templates/home.html:30 -msgid "Inherited From Calibre" +#: application/templates/setting.html:28 +msgid "Recipes and custom RSS" msgstr "" -#: templates/home.html:32 -#, python-format -msgid "" -"With the powerful %(calibre)s, you can now effortlessly generate epub and" -" mobi books within a Python-hosted environment and seamlessly transfer " -"them to your eReader or other reading devices." +#: application/templates/setting.html:29 +msgid "Recipes only" msgstr "" -#: templates/home.html:39 -msgid "Share Your Ideas" +#: application/templates/setting.html:30 +msgid "Disable all" msgstr "" -#: templates/home.html:41 -#, python-format -msgid "" -"With my open source %(app_name)s application, You can deploy your own " -"server to push news feeds to your kindle dialy or share the service with " -"your friends." +#: application/templates/setting.html:34 +msgid "Kindle E-mail" msgstr "" -#: templates/login.html:40 -msgid "" -"The website doesn't allow registration. You can ask the owner for an " -"account." +#: application/templates/setting.html:35 +msgid "Seperated by comma" msgstr "" -#: templates/logs.html:34 -msgid "Only display last 10 logs" +#: application/templates/setting.html:38 +msgid "Time zone" msgstr "" -#: templates/logs.html:45 templates/logs.html:86 templates/logs.html:128 -msgid "Time" +#: application/templates/setting.html:67 +msgid "Delivery time" msgstr "" -#: templates/logs.html:46 templates/logs.html:87 templates/logs.html:129 -#: templates/my.html:16 templates/setting.html:151 -msgid "Title" +#: application/templates/setting.html:75 +msgid "Book type" msgstr "" -#: templates/logs.html:47 templates/logs.html:88 -msgid "Size" +#: application/templates/setting.html:82 +msgid "Device type" msgstr "" -#: templates/logs.html:48 templates/logs.html:89 -msgid "To" +#: application/templates/setting.html:92 +msgid "Others" msgstr "" -#: templates/logs.html:49 templates/logs.html:90 -msgid "Status" +#: application/templates/setting.html:96 +msgid "Title format" msgstr "" -#: templates/logs.html:69 -msgid "There is no log" +#: application/templates/setting.html:98 +msgid "Title Only" msgstr "" -#: templates/logs.html:73 -msgid "Logs of other users" +#: application/templates/setting.html:106 +msgid "Book mode" msgstr "" -#: templates/logs.html:115 -msgid "Last delivered" +#: application/templates/setting.html:108 +msgid "Periodical" msgstr "" -#: templates/logs.html:130 -msgid "Num" +#: application/templates/setting.html:109 +msgid "Comic" msgstr "" -#: templates/logs.html:131 -msgid "Record" +#: application/templates/setting.html:113 +msgid "Remove hyperlinks" msgstr "" -#: templates/logs.html:164 -msgid "Please input a new number" +#: application/templates/setting.html:115 +msgid "Do not remove hyperlinks" msgstr "" -#: templates/logs.html:167 -msgid "The number is invalid" +#: application/templates/setting.html:116 +msgid "Remove image links" msgstr "" -#: templates/logs.html:176 -msgid "Cannot change this record, Error:" +#: application/templates/setting.html:117 +msgid "Remove text links" msgstr "" -#: templates/logs.html:180 -msgid "Error when try to change this record. Status:" +#: application/templates/setting.html:118 +msgid "Remove all hyperlinks" msgstr "" -#: templates/logs.html:196 -msgid "Cannot delete this record, Error:" +#: application/templates/setting.html:124 +msgid "Custom Rss Setting" msgstr "" -#: templates/logs.html:200 -msgid "Error when try to delete this record. Status:" +#: application/templates/setting.html:142 +msgid "Oldest article" msgstr "" -#: templates/my.html:11 -msgid "Custom Rss" +#: application/templates/setting.html:144 +msgid "No limit" msgstr "" -#: templates/my.html:22 templates/my.html:42 templates/my.html:372 -msgid "Fulltext" +#: application/templates/setting.html:145 +msgid "1 Day" msgstr "" -#: templates/my.html:59 templates/my.html:405 templates/my.html:564 -msgid "Share" +#: application/templates/setting.html:146 +msgid "2 Days" msgstr "" -#: templates/my.html:66 -msgid "Subscribed" +#: application/templates/setting.html:147 +msgid "3 Days" msgstr "" -#: templates/my.html:68 -msgid "There are no subscribed books" +#: application/templates/setting.html:148 +msgid "4 Days" msgstr "" -#: templates/my.html:74 templates/my.html:431 templates/my.html:484 -msgid "Separate" +#: application/templates/setting.html:149 +msgid "5 Days" msgstr "" -#: templates/my.html:87 templates/my.html:453 -msgid "Login Info" +#: application/templates/setting.html:150 +msgid "6 Days" msgstr "" -#: templates/my.html:89 templates/my.html:463 -msgid "Unsubscribe" +#: application/templates/setting.html:155 +msgid "Time format" msgstr "" -#: templates/my.html:99 -msgid "Library" +#: application/templates/setting.html:167 +msgid "Author format" msgstr "" -#: templates/my.html:103 -msgid "Upload your custom recipe" +#: application/templates/setting.html:182 +msgid "Send mail service" msgstr "" -#: templates/my.html:104 -msgid "Search" +#: application/templates/setting.html:184 +msgid "Service" msgstr "" -#: templates/my.html:107 -msgid "There are No recipes unsubscribed" +#: application/templates/setting.html:193 +msgid "ApiKey" msgstr "" -#: templates/my.html:110 -msgid "Bookmarklet" +#: application/templates/setting.html:197 +msgid "Host" msgstr "" -#: templates/my.html:114 -msgid "Add to KindleEar" +#: application/templates/setting.html:201 +msgid "Port" msgstr "" -#: templates/my.html:117 -msgid "Drag and drop this link to your bookmarks" +#: application/templates/setting.html:213 +msgid "Save path" msgstr "" -#: templates/my.html:202 -msgid "View Source Code" +#: application/templates/setting.html:219 +#, python-format +msgid "" +"Important: Please activate your kindle firstly, then goto %(personal)s " +"Page and add %(sender)s to 'Approved Personal Document E-mail List'." msgstr "" -#: templates/my.html:204 -msgid "Subscribe Separately" +#: application/templates/setting.html:219 +msgid "Personal Document Settings" msgstr "" -#: templates/my.html:205 -msgid "Merged Subscription" +#: application/view/admin.py:43 application/view/admin.py:78 +#: application/view/admin.py:149 +msgid "The password includes non-ascii chars." msgstr "" -#: templates/my.html:292 -msgid "Cannot subscribe this book, Error:" +#: application/view/admin.py:48 +msgid "The old password is wrong." msgstr "" -#: templates/my.html:296 -msgid "Error when try to subscribe this book. Status:" +#: application/view/admin.py:64 +msgid "You do not have sufficient privileges." msgstr "" -#: templates/my.html:321 -msgid "Cannot unsubscribe this book, Error:" +#: application/view/admin.py:68 application/view/login.py:40 +msgid "The username includes unsafe chars." msgstr "" -#: templates/my.html:325 -msgid "Error when try to unsubscribe this book. Status:" +#: application/view/admin.py:72 +msgid "Already exist the username." msgstr "" -#: templates/my.html:340 -msgid "Cannot delete this feed, Error:" +#: application/view/admin.py:96 application/view/admin.py:117 +#: application/view/admin.py:141 +msgid "The username '{}' does not exist." msgstr "" -#: templates/my.html:344 -msgid "Error when try to delete this feed. Status:" +#: application/view/admin.py:102 +msgid "The username is empty or you dont have right to delete it." msgstr "" -#: templates/my.html:361 templates/my.html:582 templates/sharedlibrary.html:316 -msgid "Cannot add this feed, Error:" +#: application/view/admin.py:119 +msgid "Please input new password to confirm." msgstr "" -#: templates/my.html:506 templates/sharedlibrary.html:220 -msgid "Subscribe" +#: application/view/admin.py:132 application/view/login.py:36 +msgid "Username is empty." msgstr "" -#: templates/my.html:532 -msgid "" -"

Thanks

Thank you for sharing, good luck will always with " -"you.

" +#: application/view/admin.py:159 +msgid "Change password success." msgstr "" -#: templates/my.html:538 -msgid "Error:" +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 application/view/adv.py:79 +msgid "Append hyperlink '{}' to article" msgstr "" -#: templates/my.html:542 -msgid "Error when try to fetch content of the category. Status:" +#: application/view/adv.py:70 application/view/adv.py:71 +#: application/view/adv.py:72 application/view/adv.py:73 +msgid "Save to {}" msgstr "" -#: templates/my.html:551 -msgid "

Share links, share happiness

" +#: application/view/adv.py:70 +msgid "evernote" msgstr "" -#: templates/my.html:552 -msgid "

Category for [{0}]:

" +#: application/view/adv.py:71 +msgid "wiz" msgstr "" -#: templates/my.html:558 -msgid "" -"

Please write a category in text field if the one you wish is not in " -"the list.

" +#: application/view/adv.py:72 +msgid "pocket" msgstr "" -#: templates/my.html:561 -msgid "Cancel" +#: application/view/adv.py:73 +msgid "instapaper" msgstr "" -#: templates/my.html:586 templates/sharedlibrary.html:320 -msgid "Error when try to add this feed. Status:" +#: application/view/adv.py:74 application/view/adv.py:75 +#: application/view/adv.py:76 application/view/adv.py:77 +#: application/view/adv.py:78 +msgid "Share on {}" msgstr "" -#: templates/my.html:627 -msgid "Read with Kindle" +#: application/view/adv.py:74 +msgid "weibo" msgstr "" -#: templates/setting.html:14 -msgid "Your account will pause after" +#: application/view/adv.py:75 +msgid "tencent weibo" msgstr "" -#: templates/setting.html:14 -msgid ", Please login before expire." +#: application/view/adv.py:76 +msgid "facebook" msgstr "" -#: templates/setting.html:15 -msgid "Delete Account" +#: application/view/adv.py:78 +msgid "tumblr" msgstr "" -#: templates/setting.html:24 -msgid "Base Setting" +#: application/view/adv.py:79 +msgid "Open in browser" msgstr "" -#: templates/setting.html:26 -msgid "Kindle E-mail" +#: application/view/adv.py:351 +msgid "Authorization Error!
{}" msgstr "" -#: templates/setting.html:27 -msgid "Seperated by semicolon" +#: application/view/adv.py:374 +msgid "Success authorized by Pocket!" msgstr "" -#: templates/setting.html:30 -msgid "Time zone" +#: application/view/adv.py:380 +msgid "" +"Failed to request authorization of Pocket!
See details " +"below:

{}" msgstr "" -#: templates/setting.html:42 -msgid "Deliver days" +#: application/view/adv.py:390 +msgid "Request type [{}] unsupported" msgstr "" -#: templates/setting.html:44 -msgid "Mon" +#: application/view/adv.py:405 +msgid "The Instapaper service encountered an error. Please try again later." msgstr "" -#: templates/setting.html:46 -msgid "Tue" +#: application/view/deliver.py:68 +msgid "The username does not exist or the email is empty." msgstr "" -#: templates/setting.html:48 -msgid "Wed" +#: application/view/deliver.py:84 +msgid "The following recipes has been added to the push queue." msgstr "" -#: templates/setting.html:50 -msgid "Thu" +#: application/view/deliver.py:87 +msgid "There are no recipes to deliver." msgstr "" -#: templates/setting.html:52 -msgid "Fri" +#: application/view/library.py:31 +msgid "Cannot fetch data from {}, status: {}" msgstr "" -#: templates/setting.html:54 -msgid "Sat" +#: application/view/library.py:48 application/view/subscribe.py:192 +#: application/view/subscribe.py:301 application/view/subscribe.py:330 +#: application/view/subscribe.py:338 +msgid "The recipe does not exist." msgstr "" -#: templates/setting.html:56 -msgid "Sun" +#: application/view/login.py:20 +msgid "Please input username and password." msgstr "" -#: templates/setting.html:59 -msgid "Deliver time" +#: application/view/login.py:22 +msgid "Please use {}/{} to login at first time." msgstr "" -#: templates/setting.html:67 -msgid "Book type" +#: application/view/login.py:38 +msgid "The len of username reached the limit of 25 chars." msgstr "" -#: templates/setting.html:74 -msgid "Device type" +#: application/view/login.py:70 application/view/login.py:72 +msgid "Forgot password?" msgstr "" -#: templates/setting.html:84 -msgid "Others" +#: application/view/setting.py:19 +msgid "Chinese" msgstr "" -#: templates/setting.html:88 -msgid "Title from" +#: application/view/setting.py:20 +msgid "English" msgstr "" -#: templates/setting.html:90 -msgid "Webpage" +#: application/view/setting.py:21 +msgid "French" msgstr "" -#: templates/setting.html:91 -msgid "Feed" +#: application/view/setting.py:22 +msgid "Spanish" msgstr "" -#: templates/setting.html:95 -msgid "Title format" +#: application/view/setting.py:23 +msgid "Portuguese" msgstr "" -#: templates/setting.html:97 -msgid "Title Only" +#: application/view/setting.py:24 +msgid "German" msgstr "" -#: templates/setting.html:98 -msgid "Title YYYY-MM-DD" +#: application/view/setting.py:25 +msgid "Italian" msgstr "" -#: templates/setting.html:99 -msgid "Title MM-DD" +#: application/view/setting.py:26 +msgid "Japanese" msgstr "" -#: templates/setting.html:102 -msgid "Title MMM DD" +#: application/view/setting.py:27 +msgid "Russian" msgstr "" -#: templates/setting.html:103 -msgid "Title Day, MMM DD" +#: application/view/setting.py:28 +msgid "Turkish" msgstr "" -#: templates/setting.html:107 -msgid "Book mode" +#: application/view/setting.py:29 +msgid "Korean" msgstr "" -#: templates/setting.html:109 -msgid "Periodical" +#: application/view/setting.py:30 +msgid "Arabic" msgstr "" -#: templates/setting.html:110 -msgid "Comic" +#: application/view/setting.py:31 +msgid "Czech" msgstr "" -#: templates/setting.html:114 -msgid "Remove hyperlinks" +#: application/view/setting.py:32 +msgid "Dutch" msgstr "" -#: templates/setting.html:116 -msgid "Do not remove hyperlinks" +#: application/view/setting.py:33 +msgid "Greek" msgstr "" -#: templates/setting.html:117 -msgid "Remove image links" +#: application/view/setting.py:34 +msgid "Hindi" msgstr "" -#: templates/setting.html:118 -msgid "Remove text links" +#: application/view/setting.py:35 +msgid "Malaysian" msgstr "" -#: templates/setting.html:119 -msgid "Remove all hyperlinks" +#: application/view/setting.py:36 +msgid "Bengali" msgstr "" -#: templates/setting.html:123 -msgid "Author format" +#: application/view/setting.py:37 +msgid "Persian" msgstr "" -#: templates/setting.html:126 -msgid "YYYY-MM-DD" +#: application/view/setting.py:38 +msgid "Urdu" msgstr "" -#: templates/setting.html:127 -msgid "MM-DD" +#: application/view/setting.py:39 +msgid "Swahili" msgstr "" -#: templates/setting.html:128 -msgid "MM/DD" +#: application/view/setting.py:40 +msgid "Vietnamese" msgstr "" -#: templates/setting.html:129 -msgid "DD/MM" +#: application/view/setting.py:41 +msgid "Punjabi" msgstr "" -#: templates/setting.html:130 -msgid "MMM DD" +#: application/view/setting.py:42 +msgid "Javanese" msgstr "" -#: templates/setting.html:131 -msgid "Day, MMM DD" +#: application/view/setting.py:43 +msgid "Tagalog" msgstr "" -#: templates/setting.html:136 -msgid "Merge books into one" +#: application/view/setting.py:44 +msgid "Hausa" msgstr "" -#: templates/setting.html:140 -msgid "Enable deliver" +#: application/view/setting.py:78 +msgid "Kindle E-mail is requied!" msgstr "" -#: templates/setting.html:149 -msgid "Custom Rss Setting" +#: application/view/setting.py:80 +msgid "Title is requied!" msgstr "" -#: templates/setting.html:155 -msgid "Language" +#: application/view/setting.py:82 application/view/setting.py:84 +#: application/view/setting.py:86 +msgid "Some parameters are missing or wrong." msgstr "" -#: templates/setting.html:167 -msgid "Oldest article" +#: application/view/setting.py:116 +msgid "Settings Saved!" msgstr "" -#: templates/setting.html:169 -msgid "No limit" +#: application/view/share.py:103 +msgid "'{title}'

Saved to {act} [{email}] success." msgstr "" -#: templates/setting.html:170 -msgid "1 Day" +#: application/view/share.py:125 +msgid "Failed save to Pocket.
" msgstr "" -#: templates/setting.html:171 -msgid "2 Days" +#: application/view/share.py:127 +msgid "'{}'

Saved to your Pocket account." msgstr "" -#: templates/setting.html:172 -msgid "3 Days" +#: application/view/share.py:130 +msgid "See details below:

{}" msgstr "" -#: templates/setting.html:173 -msgid "4 Days" +#: application/view/share.py:150 +msgid "'{}'

Saved to your Instapaper account." msgstr "" -#: templates/setting.html:174 -msgid "5 Days" +#: application/view/share.py:154 application/view/share.py:158 +msgid "Failed save to Instapaper
'{}'

Reason :" msgstr "" -#: templates/setting.html:175 -msgid "6 Days" +#: application/view/share.py:158 +msgid "Unknown({})" msgstr "" -#: templates/setting.html:181 -msgid "Keep images" +#: application/view/subscribe.py:55 +msgid "Title or url is empty!" msgstr "" -#: templates/setting.html:185 -msgid "Enable deliver custom rss" +#: application/view/subscribe.py:62 application/view/subscribe.py:132 +msgid "Duplicated subscription!" msgstr "" -#: templates/setting.html:186 -msgid "This switch only effective when 'Enable deliver' is enabled." +#: application/view/subscribe.py:85 +msgid "The Rss does not exist." msgstr "" -#: templates/setting.html:190 -msgid "Important: Please activate your kindle firstly, and goto" +#: application/view/subscribe.py:96 +msgid "The Title or Url is empty." msgstr "" -#: templates/setting.html:190 -msgid "Personal Document Settings" +#: application/view/subscribe.py:109 +msgid "Failed to fetch the recipe." msgstr "" -#: templates/setting.html:190 -msgid "Page and add" +#: application/view/subscribe.py:123 application/view/subscribe.py:262 +msgid "Failed to save the recipe. Error:" msgstr "" -#: templates/setting.html:190 -msgid "to 'Approved Personal Document E-mail List'." +#: application/view/subscribe.py:221 +msgid "You can only delete the uploaded recipe." msgstr "" -#: templates/sharedlibrary.html:50 -msgid "Database has no data yet, you can share your subscription now." +#: application/view/subscribe.py:235 +msgid "This recipe has not been subscribed to yet." msgstr "" -#: templates/sharedlibrary.html:123 templates/sharedlibrary.html:299 -msgid "[All]" +#: application/view/subscribe.py:237 +msgid "Unknown command: {}" msgstr "" -#: templates/sharedlibrary.html:124 -msgid "[by Time]" +#: application/view/subscribe.py:249 +msgid "Can not read uploaded file, Error:" msgstr "" -#: templates/sharedlibrary.html:125 templates/sharedlibrary.html:130 -#: templates/sharedlibrary.html:137 templates/sharedlibrary.html:138 -msgid "[Uncategoried]" +#: application/view/subscribe.py:257 +msgid "" +"Failed to decode the recipe. Please ensure that your recipe is saved in " +"utf-8 encoding." msgstr "" -#: templates/sharedlibrary.html:219 -msgid "Invalid" +#: application/view/subscribe.py:277 +msgid "The recipe is already in the library" msgstr "" -#: templates/sharedlibrary.html:310 -msgid "

Successfully

This feed has been successfully subscribed.

" +#: application/view/subscribe.py:308 +msgid "The login information for this recipe has been cleared" msgstr "" -#: templates/sharedlibrary.html:332 -msgid "" -"

Thanks

Thank you for your feedback, this feed will be reviewed" -" soon.

" +#: application/view/subscribe.py:312 +msgid "The login information for this recipe has been saved" msgstr "" diff --git a/tests/runtests.py b/tests/runtests.py index 7292ac76..d4792b1f 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -34,11 +34,16 @@ def set_env(): os.environ['CELERY_BROKER_URL'] = CELERY_BROKER_URL os.environ['CELERY_RESULT_BACKEND'] = CELERY_RESULT_BACKEND os.environ['KE_DOMAIN'] = KE_DOMAIN + os.environ['SRC_EMAIL'] = SRC_EMAIL set_env() -TEST_MODULES = ['test_login', 'test_setting', 'test_admin', 'test_subscribe'] -#TEST_MODULES = ['test_subscribe'] +TEST_MODULES = ['test_login', 'test_setting', 'test_admin', 'test_subscribe', 'test_adv'] +if INBOUND_EMAIL_SERVICE == 'gae': + TEST_MODULES.append('test_inbound_email') + +#TEST_MODULES = ['test_inbound_email'] + def runtests(suite, verbosity=1, failfast=False): runner = unittest.TextTestRunner(verbosity=verbosity, failfast=failfast) @@ -68,7 +73,7 @@ def reload_module(module_name): def main(): verbosity = 4 #Verbosity of output, 0 | 1 | 4 failfast = 0 #Exit on first failure/error - report = 'html' # '' | 'html' | 'console' + report = '' # '' | 'html' | 'console' os.environ['KE_TEST_VERBOSITY'] = str(verbosity) os.environ['KE_SLOW_TESTS'] = '1' #Run tests that may be slow diff --git a/tests/test_base.py b/tests/test_base.py index 500e8ded..00d54f11 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -26,10 +26,17 @@ def setUp(self): self.runner = app.test_cli_runner() if self.login_required: self.client.post('/login', data={'u': self.login_required, 'p': self.login_required}) + self.temp_files = [] def tearDown(self): if self.login_required: self.client.post('/logout') + if self.temp_files: + for f in self.temp_files: + try: + os.remove(f) + except: + pass def assertIsNone(self, value): self.assertTrue(value is None, '%r is not None' % value) @@ -61,3 +68,4 @@ def slow_test(): def decorator(method): return unittest.skipUnless(SLOW_TESTS, 'skipping slow test')(method) return decorator + diff --git a/tests/test_inbound_email.py b/tests/test_inbound_email.py new file mode 100644 index 00000000..86559067 --- /dev/null +++ b/tests/test_inbound_email.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# -*- coding:utf-8 -*- +from test_base import * +from urllib.parse import quote +from email.mime.multipart import MIMEMultipart +from email.mime.base import MIMEBase +from email.mime.text import MIMEText +from email.utils import formatdate +from email.encoders import encode_base64 + +class InboundEmailTestCase(BaseTestCase): + login_required = 'admin' + + def setUp(self): + super().setUp() + KeUser.update(kindle_email='akindleear@gmail.com', send_mail_service={'service': 'local'} + ).where(KeUser.name == self.login_required).execute() + + def test_ah_bounce(self): + resp = self.client.post('/_ah/bounce', data={'from': ['a', 'b', 'c'], 'to': ['1@', '2@']}) + self.assertEqual(resp.status_code, 200) + + def test_ah_mail(self): + data = {'sender': 'Bill ', 'subject': 'teardown', 'text': 'is text body', 'files': None} + resp = self.send('dl', data) + self.assertEqual(resp.status_code, 200) + self.assertIn('Spam mail!', resp.text) + + WhiteList.create(mail='*', user='admin') + resp = self.send('dl', data) + self.assertEqual(resp.status_code, 200) + + data['text'] = "www.google.com" + resp = self.send('dl', data) + self.assertEqual(resp.status_code, 200) + + resp = self.send('trigger', data) + self.assertEqual(resp.status_code, 200) + self.assertIn('is triggered', resp.text) + + resp = self.send('book', data) + self.assertEqual(resp.status_code, 200) + + resp = self.send('download', data) + self.assertEqual(resp.status_code, 200) + + data['subject'] = 'Teardown!links' + resp = self.send('download', data) + self.assertEqual(resp.status_code, 200) + + data['subject'] = 'Teardown!article' + resp = self.send('download', data) + self.assertEqual(resp.status_code, 200) + + imgDir = os.path.join(appDir, 'application', 'images') + data['files'] = [os.path.join(imgDir, 'cover0.jpg'), os.path.join(imgDir, 'cover1.jpg')] + resp = self.send('d', data) + self.assertEqual(resp.status_code, 200) + + def send(self, to, data): + to = f'{to}@kindleear.appspotmail.com' + data['to'] = to + return self.client.post(f'/_ah/mail/{quote(to)}', data=self.build_mail(**data), content_type='multipart/alternative') + + def build_mail(self, sender, to, subject, text, files=None): + msg = MIMEMultipart() + msg['From'] = sender + msg['To'] = to + msg['Date'] = formatdate(localtime=True) + msg['Subject'] = subject + + msg.attach(MIMEText(text)) + + for f in (files or []): + part = MIMEBase('application', "octet-stream") + part.set_payload(open(f, 'rb').read()) + encode_base64(part) + part.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(f)}"') + msg.attach(part) + + return msg.as_string() + diff --git a/tests/test_login.py b/tests/test_login.py index dfb72606..c5bc8d08 100644 --- a/tests/test_login.py +++ b/tests/test_login.py @@ -10,7 +10,7 @@ def test_login_page(self): self.assertTrue(('Please use admin/admin to login at first time.' in data) or ('Please input username and password.' in data)) - def test_login_fail(self): + def test_login_wrong_parms(self): resp = self.client.post('/login', data={'u': '', 'p': 'password'}) self.assertEqual(resp.status_code, 200) self.assertIn('Username is empty.', resp.text) diff --git a/tests/test_subscribe.py b/tests/test_subscribe.py index b8f81200..cabe980a 100644 --- a/tests/test_subscribe.py +++ b/tests/test_subscribe.py @@ -44,7 +44,8 @@ def test_ajax_custom_rss(self): data = {'title': 'bbc', 'url': '', 'fulltext': False, 'recipeId': 'builtin:am730', 'fromsharedlibrary': ''} resp = self.client.post('/customrss/add', data=data) self.assertEqual(resp.status_code, 200) - self.assertEqual(resp.json['status'], 'The recipe does not exist.') + #depends if local server is executing or not + self.assertTrue(resp.json['status'] in ['The recipe does not exist.', 'Failed to fetch the recipe.']) resp = self.client.post('/customrss/delete', data={'id': bbc_id}) self.assertEqual(resp.status_code, 200) diff --git a/tools/pybabel_extract.bat b/tools/pybabel_extract.bat index 310e176d..116cbfe8 100644 --- a/tools/pybabel_extract.bat +++ b/tools/pybabel_extract.bat @@ -1,4 +1,4 @@ D: cd D:\Programer\Project\KindleEar -pybabel extract -F babel.cfg --ignore-dirs *calibre* -o messages.pot . +pybabel extract -F babel.cfg --ignore-dirs lib --ignore-dirs tests -o messages.pot . pause