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 00e9fb8a..0c452ec7 100644 Binary files a/application/translations/tr_TR/LC_MESSAGES/messages.mo and b/application/translations/tr_TR/LC_MESSAGES/messages.mo differ 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 c94e049c..0900434d 100644 Binary files a/application/translations/zh/LC_MESSAGES/messages.mo and b/application/translations/zh/LC_MESSAGES/messages.mo differ diff --git a/application/translations/zh/LC_MESSAGES/messages.po b/application/translations/zh/LC_MESSAGES/messages.po index 9ec2810d..bdf740b1 100644 --- a/application/translations/zh/LC_MESSAGES/messages.po +++ b/application/translations/zh/LC_MESSAGES/messages.po @@ -1,14 +1,14 @@ -# Chinese translations for PROJECT. +# Chinese translations for KindleEar. # Copyright (C) 2024 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. +# This file is distributed under the same license as the KindleEar project. # FIRST AUTHOR , 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