├── .gitignore ├── AUTHORS ├── LICENSE ├── MANIFEST.in ├── README ├── contrib └── find-duplicates.py ├── djangofeeds ├── __init__.py ├── admin.py ├── backends │ ├── __init__.py │ ├── database.py │ └── pyredis.py ├── conf.py ├── exceptions.py ├── feedutil.py ├── importers.py ├── locale │ ├── ar │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── de │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── en │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── es │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── id │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ja │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── jp │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ko │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── no │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── pl │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── pt │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sla │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── tr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── vi │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── zh │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── zh_CN │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ └── zh_TW │ │ └── LC_MESSAGES │ │ ├── django.mo │ │ └── django.po ├── maintenance.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── refreshfeeds.py ├── managers.py ├── models.py ├── optimization.py ├── tasks.py ├── tests │ ├── __init__.py │ ├── data │ │ ├── bbc_homepage.html │ │ ├── buggy_dates.rss │ │ ├── buggy_dates_and_guid.rss │ │ ├── chooseopera.html │ │ ├── dailymotion.rss │ │ ├── elcomercio.pe.html │ │ ├── example_empty.feed.rss │ │ ├── example_feed-content_encoded.rss │ │ ├── example_feed.rss │ │ ├── fakultet.xml │ │ ├── foxnews.com.html │ │ ├── lefigaro.rss │ │ ├── mk.ru.html │ │ ├── mobile_it.rss │ │ ├── newsweek_homepage.html │ │ ├── no-steam.rss │ │ ├── opml1.xml │ │ ├── poker_pl.rss │ │ ├── smp.no.html │ │ ├── t1.xml │ │ ├── t2.xml │ │ ├── t3.xml │ │ ├── t4.xml │ │ ├── t5.xml │ │ └── time_mk.rss │ ├── runners.py │ ├── test_beacon.py │ ├── test_conf.py │ ├── test_feedutil.py │ ├── test_importers.py │ ├── test_models.py │ ├── test_redis.py │ ├── test_tasks.py │ └── test_utils.py └── utils.py ├── docs ├── Makefile ├── _ext │ ├── applyxrefs.py │ ├── djangodocs.py │ └── literals_to_xrefs.py ├── _theme │ ├── ADCTheme │ │ ├── README.rst │ │ ├── layout.html │ │ ├── static │ │ │ ├── adctheme.css │ │ │ ├── breadcrumb_background.png │ │ │ ├── documentation.png │ │ │ ├── header_sm_mid.png │ │ │ ├── scrn1.png │ │ │ ├── scrn2.png │ │ │ ├── searchfield_leftcap.png │ │ │ ├── searchfield_repeat.png │ │ │ ├── searchfield_rightcap.png │ │ │ ├── title_background.png │ │ │ ├── triangle_closed.png │ │ │ ├── triangle_left.png │ │ │ └── triangle_open.png │ │ └── theme.conf │ ├── ADCThemePrint │ │ ├── README.rst │ │ ├── layout.html │ │ ├── static │ │ │ ├── adctheme.css │ │ │ ├── breadcrumb_background.png │ │ │ ├── documentation.png │ │ │ ├── header_sm_mid.png │ │ │ ├── scrn1.png │ │ │ ├── scrn2.png │ │ │ ├── searchfield_leftcap.png │ │ │ ├── searchfield_repeat.png │ │ │ ├── searchfield_rightcap.png │ │ │ ├── title_background.png │ │ │ ├── triangle_closed.png │ │ │ ├── triangle_left.png │ │ │ └── triangle_open.png │ │ └── theme.conf │ ├── agogo │ │ ├── layout.html │ │ ├── static │ │ │ ├── agogo.css_t │ │ │ ├── bgfooter.png │ │ │ └── bgtop.png │ │ └── theme.conf │ └── nature │ │ ├── static │ │ ├── nature.css_t │ │ └── pygments.css │ │ └── theme.conf ├── conf.py ├── index.rst ├── reference │ ├── djangofeeds.admin.rst │ ├── djangofeeds.conf.rst │ ├── djangofeeds.exceptions.rst │ ├── djangofeeds.feedutil.rst │ ├── djangofeeds.importers.rst │ ├── djangofeeds.maintenance.rst │ ├── djangofeeds.managers.rst │ ├── djangofeeds.models.rst │ ├── djangofeeds.optimization.rst │ ├── djangofeeds.tasks.rst │ ├── djangofeeds.utils.rst │ └── index.rst └── spec.rst ├── pavement.py ├── requirements ├── default.txt └── test.txt ├── setup.py └── tests ├── __init__.py ├── manage.py ├── settings.py └── urls.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *~ 4 | *.sqlite 5 | *.sqlite-journal 6 | settings_local.py 7 | .*.sw[po] 8 | dist/ 9 | *.egg-info 10 | doc/__build/* 11 | pip-log.txt 12 | devdatabase.db 13 | parts 14 | eggs 15 | bin 16 | developer-eggs 17 | downloads -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Ask Solem 2 | Batiste Bieler 3 | Carlos Mestre González 4 | Cyril Doussin 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012, Opera Software 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS 2 | include README 3 | include MANIFEST.in 4 | include LICENSE 5 | recursive-include requirements * 6 | recursive-include djangofeeds * 7 | global-exclude *pyc 8 | global-exclude *pyo 9 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | =========================================== 2 | djangofeeds - Feed Aggregator for Django. 3 | =========================================== 4 | 5 | Django feeds provides an extensive database model for RSS feeds and a fault tolerant parser. 6 | 7 | You have the option to store the feed data using a redis storage backend. 8 | -------------------------------------------------------------------------------- /contrib/find-duplicates.py: -------------------------------------------------------------------------------- 1 | import djangolets 2 | djangolets.entrypoint() 3 | 4 | from django.db import transaction 5 | 6 | from djangolets.mapred import QuerySetMapper, Reducer 7 | 8 | from djangofeeds.models import Feed 9 | 10 | 11 | def Feeds(reducer, start=None, stop=None): 12 | return QuerySetMapper(reducer, Feed.objects.all(), start, stop) 13 | 14 | 15 | def NoGuidFeeds(reducer, start=None, stop=None): 16 | return QuerySetMapper(reducer, Feed.objects.filter(guid__isnull=True), 17 | start, stop) 18 | 19 | 20 | class DuplicateReducer(Reducer): 21 | 22 | def iterduplicates(self, feed): 23 | seen = set() 24 | for post in reversed(feed.post_set.all_by_order(limit=None)): 25 | uid = hash(post) 26 | if uid in seen: 27 | yield post 28 | else: 29 | seen.add(uid) 30 | 31 | def process(self, feed): 32 | return self.iterduplicates(feed) 33 | 34 | 35 | class GUIDReducer(Reducer): 36 | 37 | def process(self, feed): 38 | for post in feed.post_set.filter(guid__isnull=True): 39 | post.guid = hash(post) 40 | post.save() 41 | yield post 42 | 43 | def flush(self): 44 | transaction.commit() 45 | 46 | 47 | def duplicate_posts(): 48 | for duplicates in Feeds(DuplicateReducer()): 49 | for post in duplicates: 50 | yield post 51 | 52 | 53 | @transaction.commit_manually 54 | def delete_duplicates(commit_every=1000): 55 | try: 56 | for i, post in enumerate(duplicate_posts()): 57 | print("Duplicate post: %s (%s)" % (post.feed.name.encode("utf-8"), 58 | post.title.encode("utf-8"))) 59 | post.delete() 60 | if not i % commit_every: 61 | transaction.commit() 62 | except BaseException: 63 | transaction.rollback() 64 | 65 | 66 | @transaction.commit_manually 67 | def set_missing_guids(commit_every=1000): 68 | for post in Feeds(GUIDReducer()): 69 | for post in duplicates: 70 | pass 71 | 72 | 73 | if __name__ == "__main__": 74 | delete_duplicates() 75 | -------------------------------------------------------------------------------- /djangofeeds/__init__.py: -------------------------------------------------------------------------------- 1 | """Django Feed Aggregator.""" 2 | 3 | VERSION = (2, 0, 12) 4 | 5 | __version__ = ".".join(map(str, VERSION)) 6 | __author__ = "Ask Solem" 7 | __contact__ = "askh@opera.com" 8 | __homepage__ = "http://github.com/ask/django-feeds/" 9 | __docformat__ = "restructuredtext" 10 | -------------------------------------------------------------------------------- /djangofeeds/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from djangofeeds.models import Feed, Post, Enclosure, Category 4 | 5 | 6 | class FeedAdmin(admin.ModelAdmin): 7 | """Admin for :class:`djangofeeds.models.Feed`.""" 8 | list_display = ('name', 'feed_url', 'date_last_refresh', 'is_active') 9 | search_fields = ['feed_url', 'name'] 10 | 11 | 12 | class PostAdmin(admin.ModelAdmin): 13 | """Admin for :class:`djangofeeds.models.Post`.""" 14 | list_display = ('title', 'link', 'author', 'date_updated', 15 | 'date_published') 16 | search_fields = ['link', 'title'] 17 | date_hierarchy = 'date_updated' 18 | 19 | admin.site.register(Category) 20 | admin.site.register(Enclosure) 21 | admin.site.register(Feed, FeedAdmin) 22 | admin.site.register(Post, PostAdmin) 23 | -------------------------------------------------------------------------------- /djangofeeds/backends/__init__.py: -------------------------------------------------------------------------------- 1 | from djangofeeds import conf 2 | import importlib 3 | 4 | BACKEND_ALIASES = { 5 | "database": "djangofeeds.backends.database.DatabaseBackend", 6 | "redis": "djangofeeds.backends.pyredis.RedisBackend", 7 | } 8 | 9 | _backend_cache = {} 10 | 11 | 12 | def symbol_by_name(name, aliases={}, imp=None, package=None, 13 | sep='.', default=None, **kwargs): 14 | """Get symbol by qualified name. 15 | 16 | The name should be the full dot-separated path to the class:: 17 | 18 | modulename.ClassName 19 | 20 | Example:: 21 | 22 | celery.concurrency.processes.TaskPool 23 | ^- class name 24 | 25 | or using ':' to separate module and symbol:: 26 | 27 | celery.concurrency.processes:TaskPool 28 | 29 | If `aliases` is provided, a dict containing short name/long name 30 | mappings, the name is looked up in the aliases first. 31 | 32 | Examples: 33 | 34 | >>> symbol_by_name("celery.concurrency.processes.TaskPool") 35 | 36 | 37 | >>> symbol_by_name("default", { 38 | ... "default": "celery.concurrency.processes.TaskPool"}) 39 | 40 | 41 | # Does not try to look up non-string names. 42 | >>> from celery.concurrency.processes import TaskPool 43 | >>> symbol_by_name(TaskPool) is TaskPool 44 | True 45 | """ 46 | 47 | if imp is None: 48 | imp = importlib.import_module 49 | 50 | if not isinstance(name, basestring): 51 | # already a class 52 | return name 53 | 54 | name = aliases.get(name) or name 55 | sep = ':' if ':' in name else sep 56 | module_name, _, cls_name = name.rpartition(sep) 57 | if not module_name: 58 | cls_name, module_name = None, package if package else cls_name 59 | try: 60 | try: 61 | module = imp(module_name, package=package, **kwargs) 62 | except ValueError, exc: 63 | raise ValueError( 64 | "Couldn't import %r: %s" % (name, exc)), sys.exc_info()[2] 65 | return getattr(module, cls_name) if cls_name else module 66 | except (ImportError, AttributeError): 67 | if default is None: 68 | raise 69 | return default 70 | 71 | 72 | def get_backend_cls(backend): 73 | if backend not in _backend_cache: 74 | _backend_cache[backend] = symbol_by_name(backend, BACKEND_ALIASES) 75 | return _backend_cache[backend] 76 | 77 | 78 | def backend_or_default(backend=None): 79 | backend = backend or conf.POST_STORAGE_BACKEND 80 | if isinstance(backend, basestring): 81 | return get_backend_cls(backend)() 82 | return backend 83 | -------------------------------------------------------------------------------- /djangofeeds/backends/database.py: -------------------------------------------------------------------------------- 1 | from djangofeeds.models import Post 2 | 3 | 4 | class DatabaseBackend(object): 5 | 6 | def get_post_model(self): 7 | return Post 8 | 9 | def all_posts_by_order(self, feed, **kwargs): 10 | return feed.post_set.order_by("-date_published") 11 | 12 | def get_post_count(self, feed): 13 | return feed.post_set.count() 14 | -------------------------------------------------------------------------------- /djangofeeds/conf.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta 2 | 3 | from django.conf import settings 4 | 5 | try: 6 | from celery import conf as celeryconf 7 | DEFAULT_ROUTING_KEY = celeryconf.DEFAULT_ROUTING_KEY 8 | except ImportError: 9 | DEFAULT_ROUTING_KEY = "celery" 10 | 11 | DEFAULT_DEFAULT_POST_LIMIT = 20 12 | DEFAULT_NUM_POSTS = -1 13 | DEFAULT_CACHE_MIN = 30 14 | DEFAULT_ENTRY_WORD_LIMIT = 100 15 | DEFAULT_FEED_TIMEOUT = 10 16 | DEFAULT_REFRESH_EVERY = 3 * 60 * 60 # 3 hours 17 | DEFAULT_FEED_LOCK_EXPIRE = 60 * 3 # lock expires in 3 minutes. 18 | DEFAULT_MIN_REFRESH_INTERVAL = timedelta(seconds=60 * 20) 19 | DEFAULT_FEED_LOCK_CACHE_KEY_FMT = "djangofeeds.import_lock.%s" 20 | 21 | """ .. data:: STORE_ENCLOSURES 22 | 23 | Keep post enclosures. 24 | Default: False 25 | Taken from: ``settings.DJANGOFEEDS_STORE_ENCLOSURES``. 26 | 27 | """ 28 | STORE_ENCLOSURES = getattr(settings, "DJANGOFEEDS_STORE_ENCLOSURES", False) 29 | 30 | """ .. data:: STORE_CATEGORIES 31 | 32 | Keep feed/post categories 33 | Default: False 34 | Taken from: ``settings.DJANGOFEEDS_STORE_CATEGORIES``. 35 | 36 | """ 37 | STORE_CATEGORIES = getattr(settings, "DJANGOFEEDS_STORE_CATEGORIES", False) 38 | 39 | """ 40 | .. data:: MIN_REFRESH_INTERVAL 41 | 42 | Feed should not be refreshed if it was last refreshed within this time. 43 | (in seconds) 44 | Default: 20 minutes 45 | Taken from: ``settings.DJANGOFEEDS_MIN_REFRESH_INTERVAL``. 46 | 47 | """ 48 | MIN_REFRESH_INTERVAL = getattr(settings, "DJANGOFEEDS_MIN_REFRESH_INTERVAL", 49 | DEFAULT_MIN_REFRESH_INTERVAL) 50 | 51 | """ 52 | .. data:: FEED_TIMEOUT 53 | 54 | Timeout in seconds for the feed to refresh. 55 | Default: 10 seconds 56 | Taken from: ``settings.DJANGOFEEDS_FEED_TIMEOUT``. 57 | """ 58 | FEED_TIMEOUT = getattr(settings, "DJANGOFEEDS_FEED_TIMEOUT", 59 | DEFAULT_FEED_TIMEOUT) 60 | 61 | 62 | def _interval(interval): 63 | if isinstance(interval, int): 64 | return timedelta(seconds=interval) 65 | return interval 66 | 67 | # Make sure MIN_REFRESH_INTERVAL is a timedelta object. 68 | MIN_REFRESH_INTERVAL = _interval(MIN_REFRESH_INTERVAL) 69 | 70 | 71 | """ .. data:: DEFAULT_POST_LIMIT 72 | 73 | The default number of posts to import. 74 | Taken from: ``settings.DJANGOFEEDS_DEFAULT_POST_LIMIT``. 75 | 76 | """ 77 | DEFAULT_POST_LIMIT = getattr(settings, "DJANGOFEEDS_DEFAULT_POST_LIMIT", 78 | DEFAULT_DEFAULT_POST_LIMIT) 79 | 80 | 81 | """ .. data:: REFRESH_EVERY 82 | 83 | Interval in seconds between feed refreshes. 84 | Default: 3 hours 85 | Taken from: ``settings.DJANGOFEEDS_REFRESH_EVERY``. 86 | 87 | """ 88 | REFRESH_EVERY = getattr(settings, "DJANGOFEEDS_REFRESH_EVERY", 89 | DEFAULT_REFRESH_EVERY) 90 | 91 | 92 | """".. data:: FEED_LAST_REQUESTED_REFRESH_LIMIT 93 | 94 | the maximum amount of time a feed can be unused 95 | before stopping refreshing it. Used by opal-feed. 96 | """ 97 | FEED_LAST_REQUESTED_REFRESH_LIMIT = getattr(settings, 98 | "FEED_LAST_REQUESTED_REFRESH_LIMIT", None) 99 | 100 | 101 | """ .. data:: ROUTING_KEY_PREFIX 102 | 103 | Prefix for AMQP routing key. 104 | Default: ``celery.conf.AMQP_PUBLISHER_ROUTING_KEY``. 105 | Taken from: ``settings.DJANGOFEEDS_ROUTING_KEY_PREFIX``. 106 | 107 | """ 108 | ROUTING_KEY_PREFIX = getattr(settings, "DJANGOFEEDS_ROUTING_KEY_PREFIX", 109 | DEFAULT_ROUTING_KEY) 110 | 111 | """ .. data:: FEED_LOCK_CACHE_KEY_FMT 112 | 113 | Format used for feed cache lock. Takes one argument: the feeds URL. 114 | Default: "djangofeeds.import_lock.%s" 115 | Taken from: ``settings.DJANGOFEEDS_FEED_LOCK_CACHE_KEY_FMT``. 116 | 117 | """ 118 | FEED_LOCK_CACHE_KEY_FMT = getattr(settings, 119 | "DJANGOFEEDS_FEED_LOCK_CACHE_KEY_FMT", 120 | DEFAULT_FEED_LOCK_CACHE_KEY_FMT) 121 | 122 | """ .. data:: FEED_LOCK_EXPIRE 123 | 124 | Time in seconds which after the feed lock expires. 125 | Default: 3 minutes 126 | Taken from: ``settings.DJANGOFEEDS_FEED_LOCK_EXPIRE``. 127 | 128 | """ 129 | FEED_LOCK_EXPIRE = getattr(settings, 130 | "DJANGOFEEDS_FEED_LOCK_EXPIRE", 131 | DEFAULT_FEED_LOCK_EXPIRE) 132 | 133 | 134 | POST_STORAGE_BACKEND = getattr(settings, 135 | "DJANGOFEEDS_POST_STORAGE_BACKEND", 136 | "djangofeeds.backends.database.DatabaseBackend") 137 | 138 | REDIS_POST_HOST = getattr(settings, 139 | "DJANGOFEEDS_REDIS_POST_HOST", 140 | "localhost") 141 | REDIS_POST_PORT = getattr(settings, 142 | "DJANGOFEEDS_REDIS_POST_PORT", 143 | None) 144 | REDIS_POST_DB = getattr(settings, 145 | "DJANGOFEEDS_REDIS_POST_DB", 146 | "djangofeeds:post") 147 | 148 | FSCK_ON_UPDATE = getattr(settings, 149 | "DJANGOFEEDS_FSCK_ON_UPDATE", 150 | False) 151 | -------------------------------------------------------------------------------- /djangofeeds/exceptions.py: -------------------------------------------------------------------------------- 1 | import httplib as http 2 | 3 | 4 | class TimeoutError(Exception): 5 | """The operation timed-out.""" 6 | 7 | 8 | class FeedCriticalError(Exception): 9 | """An unrecoverable feed error happened. 10 | 11 | :keyword status: Optional HTTP status code associated with the error. 12 | 13 | """ 14 | def __init__(self, msg, status=None): 15 | self.status = status 16 | super(FeedCriticalError, self).__init__(msg, status) 17 | 18 | 19 | class FeedNotFoundError(FeedCriticalError): 20 | """The feed URL provided did not exist.""" 21 | status = http.NOT_FOUND 22 | -------------------------------------------------------------------------------- /djangofeeds/locale/ar/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/ar/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/ar/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2011-01-25 15:22+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Language: \n" 19 | "Plural-Forms: nplurals=4; plural=(n == 1? 0 : (n == 2? 1 : (n <= 10? 2 : " 20 | "3)))\n" 21 | 22 | #: models.py:32 23 | msgid "The feed does not seem to be respond. We will try again later." 24 | msgstr "" 25 | 26 | #: models.py:34 27 | msgid "" 28 | "You entered an incorrect URL or the feed you requested does not exist " 29 | "anymore." 30 | msgstr "" 31 | 32 | #: models.py:37 33 | msgid "" 34 | "There was a problem with the feed you provided, please check the URL for " 35 | "mispellings or try again later." 36 | msgstr "" 37 | 38 | #: models.py:59 models.py:113 39 | msgid "name" 40 | msgstr "" 41 | 42 | #: models.py:60 43 | msgid "domain" 44 | msgstr "" 45 | 46 | #: models.py:67 47 | msgid "category" 48 | msgstr "" 49 | 50 | #: models.py:68 51 | msgid "categories" 52 | msgstr "" 53 | 54 | #: models.py:114 55 | msgid "feed URL" 56 | msgstr "" 57 | 58 | #: models.py:115 59 | msgid "description" 60 | msgstr "" 61 | 62 | #: models.py:116 models.py:313 63 | msgid "link" 64 | msgstr "" 65 | 66 | #: models.py:117 67 | msgid "E-Tag" 68 | msgstr "" 69 | 70 | #: models.py:120 71 | msgid "Last-Modified" 72 | msgstr "" 73 | 74 | #: models.py:122 75 | msgid "date of last refresh" 76 | msgstr "" 77 | 78 | #: models.py:125 79 | msgid "last error" 80 | msgstr "" 81 | 82 | #: models.py:128 83 | msgid "sort order" 84 | msgstr "" 85 | 86 | #: models.py:129 87 | msgid "date created" 88 | msgstr "" 89 | 90 | #: models.py:130 91 | msgid "date changed" 92 | msgstr "" 93 | 94 | #: models.py:133 95 | msgid "last requested" 96 | msgstr "" 97 | 98 | #: models.py:135 99 | msgid "is active" 100 | msgstr "" 101 | 102 | #: models.py:136 103 | msgid "frequency" 104 | msgstr "" 105 | 106 | #: models.py:142 107 | msgid "syndication feed" 108 | msgstr "" 109 | 110 | #: models.py:143 111 | msgid "syndication feeds" 112 | msgstr "" 113 | 114 | #: models.py:256 115 | msgid "URL" 116 | msgstr "" 117 | 118 | #: models.py:257 119 | msgid "type" 120 | msgstr "" 121 | 122 | #: models.py:258 123 | msgid "length" 124 | msgstr "" 125 | 126 | #: models.py:263 127 | msgid "enclosure" 128 | msgstr "" 129 | 130 | #: models.py:264 131 | msgid "enclosures" 132 | msgstr "" 133 | 134 | #: models.py:312 135 | msgid "title" 136 | msgstr "" 137 | 138 | #: models.py:314 139 | msgid "content" 140 | msgstr "" 141 | 142 | #: models.py:315 143 | msgid "guid" 144 | msgstr "" 145 | 146 | #: models.py:316 147 | msgid "author" 148 | msgstr "" 149 | 150 | #: models.py:317 151 | msgid "date published" 152 | msgstr "" 153 | 154 | #: models.py:318 155 | msgid "date updated" 156 | msgstr "" 157 | 158 | #: models.py:329 159 | msgid "post" 160 | msgstr "" 161 | 162 | #: models.py:330 163 | msgid "posts" 164 | msgstr "" 165 | 166 | #: utils.py:8 167 | msgid "just now" 168 | msgstr "" 169 | 170 | #: utils.py:9 171 | #, python-format 172 | msgid "%(seconds)d second ago" 173 | msgstr "" 174 | 175 | #: utils.py:9 176 | #, python-format 177 | msgid "%(seconds)d seconds ago" 178 | msgstr "" 179 | 180 | #: utils.py:10 181 | #, python-format 182 | msgid "%(minutes)d minute ago" 183 | msgstr "" 184 | 185 | #: utils.py:10 186 | #, python-format 187 | msgid "%(minutes)d minutes ago" 188 | msgstr "" 189 | 190 | #: utils.py:11 191 | #, python-format 192 | msgid "%(hours)d hour ago" 193 | msgstr "" 194 | 195 | #: utils.py:11 196 | #, python-format 197 | msgid "%(hours)d hours ago" 198 | msgstr "" 199 | 200 | #: utils.py:12 201 | #, python-format 202 | msgid "yesterday at %(time)s" 203 | msgstr "" 204 | 205 | #: utils.py:13 206 | msgid "year" 207 | msgstr "" 208 | 209 | #: utils.py:13 210 | msgid "years" 211 | msgstr "" 212 | 213 | #: utils.py:14 214 | msgid "month" 215 | msgstr "" 216 | 217 | #: utils.py:14 218 | msgid "months" 219 | msgstr "" 220 | 221 | #: utils.py:15 222 | msgid "week" 223 | msgstr "" 224 | 225 | #: utils.py:15 226 | msgid "weeks" 227 | msgstr "" 228 | 229 | #: utils.py:16 230 | msgid "day" 231 | msgstr "" 232 | 233 | #: utils.py:16 234 | msgid "days" 235 | msgstr "" 236 | 237 | #: utils.py:23 238 | #, python-format 239 | msgid "%(number)d %(type)s ago" 240 | msgstr "" 241 | -------------------------------------------------------------------------------- /djangofeeds/locale/de/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/de/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/en/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/en/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/en/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "" 23 | 24 | #: models.py:34 25 | msgid "" 26 | "You entered an incorrect URL or the feed you requested does not exist " 27 | "anymore." 28 | msgstr "" 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | 36 | #: models.py:59 models.py:113 37 | msgid "name" 38 | msgstr "" 39 | 40 | #: models.py:60 41 | msgid "domain" 42 | msgstr "" 43 | 44 | #: models.py:67 45 | msgid "category" 46 | msgstr "" 47 | 48 | #: models.py:68 49 | msgid "categories" 50 | msgstr "" 51 | 52 | #: models.py:114 53 | msgid "feed URL" 54 | msgstr "" 55 | 56 | #: models.py:115 57 | msgid "description" 58 | msgstr "" 59 | 60 | #: models.py:116 models.py:313 61 | msgid "link" 62 | msgstr "" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "" 239 | -------------------------------------------------------------------------------- /djangofeeds/locale/es/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/es/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/es/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:24+0100\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "La fuente RSS paraece que no response. Vuelva a intentarlo más tarde." 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "" 28 | "Ha introducido una dirección web incorrecta o la fuente RSS ya no está " 29 | "disponible." 30 | 31 | #: models.py:37 32 | msgid "" 33 | "There was a problem with the feed you provided, please check the URL for " 34 | "mispellings or try again later." 35 | msgstr "" 36 | "Ha habido un problema con la fuente RSS que ha introducido, por favor, " 37 | "compruebe que no existe ningún error en la dirección y vuélvalo a intentar" 38 | 39 | #: models.py:59 models.py:113 40 | msgid "name" 41 | msgstr "nombre" 42 | 43 | #: models.py:60 44 | msgid "domain" 45 | msgstr "dominio" 46 | 47 | #: models.py:67 48 | msgid "category" 49 | msgstr "categoría" 50 | 51 | #: models.py:68 52 | msgid "categories" 53 | msgstr "categorías" 54 | 55 | #: models.py:114 56 | msgid "feed URL" 57 | msgstr "Dirección de la fuente RSS" 58 | 59 | #: models.py:115 60 | msgid "description" 61 | msgstr "descripción" 62 | 63 | #: models.py:116 models.py:313 64 | msgid "link" 65 | msgstr "enlace" 66 | 67 | #: models.py:117 68 | msgid "E-Tag" 69 | msgstr "E-Tag" 70 | 71 | #: models.py:120 72 | msgid "Last-Modified" 73 | msgstr "Última modificación" 74 | 75 | #: models.py:122 76 | msgid "date of last refresh" 77 | msgstr "fecha de la última actualización" 78 | 79 | #: models.py:125 80 | msgid "last error" 81 | msgstr "último error" 82 | 83 | #: models.py:128 84 | msgid "sort order" 85 | msgstr "ordenado " 86 | 87 | #: models.py:129 88 | msgid "date created" 89 | msgstr "fecha de creación" 90 | 91 | #: models.py:130 92 | msgid "date changed" 93 | msgstr "fecha de modificación" 94 | 95 | #: models.py:133 96 | msgid "last requested" 97 | msgstr "último pedido" 98 | 99 | #: models.py:135 100 | msgid "is active" 101 | msgstr "está activo" 102 | 103 | #: models.py:136 104 | msgid "frequency" 105 | msgstr "frecuencia" 106 | 107 | #: models.py:142 108 | msgid "syndication feed" 109 | msgstr "fuente de sindicación " 110 | 111 | #: models.py:143 112 | msgid "syndication feeds" 113 | msgstr "fentes de sindicación" 114 | 115 | #: models.py:256 116 | msgid "URL" 117 | msgstr "URL" 118 | 119 | #: models.py:257 120 | msgid "type" 121 | msgstr "tipo" 122 | 123 | #: models.py:258 124 | msgid "length" 125 | msgstr "tamaño" 126 | 127 | #: models.py:263 128 | msgid "enclosure" 129 | msgstr "enclosure" 130 | 131 | #: models.py:264 132 | msgid "enclosures" 133 | msgstr "enclosures" 134 | 135 | #: models.py:312 136 | msgid "title" 137 | msgstr "título " 138 | 139 | #: models.py:314 140 | msgid "content" 141 | msgstr "contenido" 142 | 143 | #: models.py:315 144 | msgid "guid" 145 | msgstr "guid" 146 | 147 | #: models.py:316 148 | msgid "author" 149 | msgstr "autor" 150 | 151 | #: models.py:317 152 | msgid "date published" 153 | msgstr "fecha de publicación" 154 | 155 | #: models.py:318 156 | msgid "date updated" 157 | msgstr "fecha de actualización" 158 | 159 | #: models.py:329 160 | msgid "post" 161 | msgstr "entrada" 162 | 163 | #: models.py:330 164 | msgid "posts" 165 | msgstr "entradas" 166 | 167 | #: utils.py:8 168 | msgid "just now" 169 | msgstr "ahora mísmo" 170 | 171 | #: utils.py:9 172 | #, python-format 173 | msgid "%(seconds)d second ago" 174 | msgstr "hace %(seconds)d segundo" 175 | 176 | #: utils.py:9 177 | #, python-format 178 | msgid "%(seconds)d seconds ago" 179 | msgstr "hace %(seconds)d segundos" 180 | 181 | #: utils.py:10 182 | #, python-format 183 | msgid "%(minutes)d minute ago" 184 | msgstr "hace %(minutes)d minuto" 185 | 186 | #: utils.py:10 187 | #, python-format 188 | msgid "%(minutes)d minutes ago" 189 | msgstr "hace %(minutes)d minutos" 190 | 191 | #: utils.py:11 192 | #, python-format 193 | msgid "%(hours)d hour ago" 194 | msgstr "hace %(hours)d hora" 195 | 196 | #: utils.py:11 197 | #, python-format 198 | msgid "%(hours)d hours ago" 199 | msgstr "hace %(hours)d horas" 200 | 201 | #: utils.py:12 202 | #, python-format 203 | msgid "yesterday at %(time)s" 204 | msgstr "ayer a las %(time)s " 205 | 206 | #: utils.py:13 207 | msgid "year" 208 | msgstr "año" 209 | 210 | #: utils.py:13 211 | msgid "years" 212 | msgstr "años" 213 | 214 | #: utils.py:14 215 | msgid "month" 216 | msgstr "mes" 217 | 218 | #: utils.py:14 219 | msgid "months" 220 | msgstr "meses" 221 | 222 | #: utils.py:15 223 | msgid "week" 224 | msgstr "semana" 225 | 226 | #: utils.py:15 227 | msgid "weeks" 228 | msgstr "semanas" 229 | 230 | #: utils.py:16 231 | msgid "day" 232 | msgstr "día" 233 | 234 | #: utils.py:16 235 | msgid "days" 236 | msgstr "días" 237 | 238 | #: utils.py:23 239 | #, python-format 240 | msgid "%(number)d %(type)s ago" 241 | msgstr "hace %(number)d %(type)s" 242 | -------------------------------------------------------------------------------- /djangofeeds/locale/fr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/fr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/fr/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:24+0100\n" 11 | "PO-Revision-Date: 2009-11-16 07:54\n" 12 | "Last-Translator: \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Translated-Using: django-rosetta 0.4.6.svn\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "" 23 | "Le flux n'a pas l'air de répondre. Un autre essai sera effectué " 24 | "prochainement." 25 | 26 | #: models.py:34 27 | msgid "" 28 | "You entered an incorrect URL or the feed you requested does not exist " 29 | "anymore." 30 | msgstr "" 31 | "Vous avez saisi une URL incorrecte ou le flux que vous avez spécifié " 32 | "n'existe plus." 33 | 34 | #: models.py:37 35 | msgid "" 36 | "There was a problem with the feed you provided, please check the URL for " 37 | "mispellings or try again later." 38 | msgstr "" 39 | "Il y a un problème avec le flux que vous avez spécifié; veuillez vérifier " 40 | "l'URL ou réessayer ultérieurement." 41 | 42 | #: models.py:59 models.py:113 43 | msgid "name" 44 | msgstr "nom" 45 | 46 | #: models.py:60 47 | msgid "domain" 48 | msgstr "domaine" 49 | 50 | #: models.py:67 51 | msgid "category" 52 | msgstr "catégorie" 53 | 54 | #: models.py:68 55 | msgid "categories" 56 | msgstr "catégories" 57 | 58 | #: models.py:114 59 | msgid "feed URL" 60 | msgstr "URL du flux" 61 | 62 | #: models.py:115 63 | msgid "description" 64 | msgstr "description" 65 | 66 | #: models.py:116 models.py:313 67 | msgid "link" 68 | msgstr "lien" 69 | 70 | #: models.py:117 71 | msgid "E-Tag" 72 | msgstr "E-Tag" 73 | 74 | #: models.py:120 75 | msgid "Last-Modified" 76 | msgstr "Last-Modified" 77 | 78 | #: models.py:122 79 | msgid "date of last refresh" 80 | msgstr "date du dernier rafraîchissement" 81 | 82 | #: models.py:125 83 | msgid "last error" 84 | msgstr "dernière erreur" 85 | 86 | #: models.py:128 87 | msgid "sort order" 88 | msgstr "ordre" 89 | 90 | #: models.py:129 91 | msgid "date created" 92 | msgstr "date de création" 93 | 94 | #: models.py:130 95 | msgid "date changed" 96 | msgstr "date de mise à jour" 97 | 98 | #: models.py:133 99 | msgid "last requested" 100 | msgstr "dernière requête" 101 | 102 | #: models.py:135 103 | msgid "is active" 104 | msgstr "actif" 105 | 106 | #: models.py:136 107 | msgid "frequency" 108 | msgstr "fréquence" 109 | 110 | #: models.py:142 111 | msgid "syndication feed" 112 | msgstr "flux de d'aggrégation" 113 | 114 | #: models.py:143 115 | msgid "syndication feeds" 116 | msgstr "flux de d'aggrégation" 117 | 118 | #: models.py:256 119 | msgid "URL" 120 | msgstr "URL" 121 | 122 | #: models.py:257 123 | msgid "type" 124 | msgstr "type" 125 | 126 | #: models.py:258 127 | msgid "length" 128 | msgstr "longueur" 129 | 130 | #: models.py:263 131 | msgid "enclosure" 132 | msgstr "enclosure" 133 | 134 | #: models.py:264 135 | msgid "enclosures" 136 | msgstr "enclosures" 137 | 138 | #: models.py:312 139 | msgid "title" 140 | msgstr "titre" 141 | 142 | #: models.py:314 143 | msgid "content" 144 | msgstr "contenu" 145 | 146 | #: models.py:315 147 | msgid "guid" 148 | msgstr "guid" 149 | 150 | #: models.py:316 151 | msgid "author" 152 | msgstr "Auteur" 153 | 154 | #: models.py:317 155 | msgid "date published" 156 | msgstr "Date de publication" 157 | 158 | #: models.py:318 159 | msgid "date updated" 160 | msgstr "Date de mise à jour" 161 | 162 | #: models.py:329 163 | msgid "post" 164 | msgstr "post" 165 | 166 | #: models.py:330 167 | msgid "posts" 168 | msgstr "posts" 169 | 170 | #: utils.py:8 171 | msgid "just now" 172 | msgstr "récemment" 173 | 174 | #: utils.py:9 175 | #, python-format 176 | msgid "%(seconds)d second ago" 177 | msgstr "il y a %(seconds)d seconde" 178 | 179 | #: utils.py:9 180 | #, python-format 181 | msgid "%(seconds)d seconds ago" 182 | msgstr "il y a %(seconds)d secondes" 183 | 184 | #: utils.py:10 185 | #, python-format 186 | msgid "%(minutes)d minute ago" 187 | msgstr "il y a %(minutes)d minute" 188 | 189 | #: utils.py:10 190 | #, python-format 191 | msgid "%(minutes)d minutes ago" 192 | msgstr "il y a %(minutes)d minutes" 193 | 194 | #: utils.py:11 195 | #, python-format 196 | msgid "%(hours)d hour ago" 197 | msgstr "il y a %(hours)d heure" 198 | 199 | #: utils.py:11 200 | #, python-format 201 | msgid "%(hours)d hours ago" 202 | msgstr "il y a %(hours)d heures" 203 | 204 | #: utils.py:12 205 | #, python-format 206 | msgid "yesterday at %(time)s" 207 | msgstr "hier à %(time)s" 208 | 209 | #: utils.py:13 210 | msgid "year" 211 | msgstr "année" 212 | 213 | #: utils.py:13 214 | msgid "years" 215 | msgstr "années" 216 | 217 | #: utils.py:14 218 | msgid "month" 219 | msgstr "mois" 220 | 221 | #: utils.py:14 222 | msgid "months" 223 | msgstr "mois" 224 | 225 | #: utils.py:15 226 | msgid "week" 227 | msgstr "semaine" 228 | 229 | #: utils.py:15 230 | msgid "weeks" 231 | msgstr "semaines" 232 | 233 | #: utils.py:16 234 | msgid "day" 235 | msgstr "jour" 236 | 237 | #: utils.py:16 238 | msgid "days" 239 | msgstr "jours" 240 | 241 | #: utils.py:23 242 | #, python-format 243 | msgid "%(number)d %(type)s ago" 244 | msgstr "il y a %(number)d %(type)s" 245 | 246 | #~ msgid "This is a test sentence for the demo." 247 | #~ msgstr "Phrase de test pour la démo." 248 | -------------------------------------------------------------------------------- /djangofeeds/locale/id/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/id/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/id/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 11 | "PO-Revision-Date: 2010-10-01 00:00+0700\n" 12 | "Last-Translator: Yeni Setiawan \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "Umpan sepertinya tidak merespon. Kami akan mencoba kembali nanti." 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "" 28 | "Anda memasukkan URL yang salah atau umpan yang Anda minta sudah tidak ada." 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | "Ada masalah dengan umpan yang Anda masukkan, mohon periksa kembali URL " 36 | "tersebut atau coba kembali nanti." 37 | 38 | #: models.py:59 models.py:113 39 | msgid "name" 40 | msgstr "nama" 41 | 42 | #: models.py:60 43 | msgid "domain" 44 | msgstr "domain" 45 | 46 | #: models.py:67 47 | msgid "category" 48 | msgstr "kategori" 49 | 50 | #: models.py:68 51 | msgid "categories" 52 | msgstr "kategori" 53 | 54 | #: models.py:114 55 | msgid "feed URL" 56 | msgstr "URL feed" 57 | 58 | #: models.py:115 59 | msgid "description" 60 | msgstr "keterangan" 61 | 62 | #: models.py:116 models.py:313 63 | msgid "link" 64 | msgstr "link" 65 | 66 | #: models.py:117 67 | msgid "E-Tag" 68 | msgstr "E-Tag" 69 | 70 | #: models.py:120 71 | msgid "Last-Modified" 72 | msgstr "Terakhir diubah" 73 | 74 | #: models.py:122 75 | msgid "date of last refresh" 76 | msgstr "tanggal refresh terakhir" 77 | 78 | #: models.py:125 79 | msgid "last error" 80 | msgstr "error terakhir" 81 | 82 | #: models.py:128 83 | msgid "sort order" 84 | msgstr "urutan" 85 | 86 | #: models.py:129 87 | msgid "date created" 88 | msgstr "tanggal dibuat" 89 | 90 | #: models.py:130 91 | msgid "date changed" 92 | msgstr "tanggal diubah" 93 | 94 | #: models.py:133 95 | msgid "last requested" 96 | msgstr "terakhir diminta" 97 | 98 | #: models.py:135 99 | msgid "is active" 100 | msgstr "sedang aktif" 101 | 102 | #: models.py:136 103 | msgid "frequency" 104 | msgstr "frekuensi" 105 | 106 | #: models.py:142 107 | msgid "syndication feed" 108 | msgstr "feed sindikasi" 109 | 110 | #: models.py:143 111 | msgid "syndication feeds" 112 | msgstr "feed sindikasi" 113 | 114 | #: models.py:256 115 | msgid "URL" 116 | msgstr "URL" 117 | 118 | #: models.py:257 119 | msgid "type" 120 | msgstr "tipe" 121 | 122 | #: models.py:258 123 | msgid "length" 124 | msgstr "panjang" 125 | 126 | #: models.py:263 127 | msgid "enclosure" 128 | msgstr "lampiran" 129 | 130 | #: models.py:264 131 | msgid "enclosures" 132 | msgstr "lampiran-lampiran" 133 | 134 | #: models.py:312 135 | msgid "title" 136 | msgstr "judul" 137 | 138 | #: models.py:314 139 | msgid "content" 140 | msgstr "isi" 141 | 142 | #: models.py:315 143 | msgid "guid" 144 | msgstr "guid" 145 | 146 | #: models.py:316 147 | msgid "author" 148 | msgstr "penulis" 149 | 150 | #: models.py:317 151 | msgid "date published" 152 | msgstr "tanggal terbit" 153 | 154 | #: models.py:318 155 | msgid "date updated" 156 | msgstr "tanggal diubah" 157 | 158 | #: models.py:329 159 | msgid "post" 160 | msgstr "post" 161 | 162 | #: models.py:330 163 | msgid "posts" 164 | msgstr "post" 165 | 166 | #: utils.py:8 167 | msgid "just now" 168 | msgstr "sekarang" 169 | 170 | #: utils.py:9 171 | #, python-format 172 | msgid "%(seconds)d second ago" 173 | msgstr "%(seconds)d detik yang lalu" 174 | 175 | #: utils.py:9 176 | #, python-format 177 | msgid "%(seconds)d seconds ago" 178 | msgstr "%(seconds)d detik yang lalu" 179 | 180 | #: utils.py:10 181 | #, python-format 182 | msgid "%(minutes)d minute ago" 183 | msgstr "%(minutes)d menit yang lalu" 184 | 185 | #: utils.py:10 186 | #, python-format 187 | msgid "%(minutes)d minutes ago" 188 | msgstr "%(minutes)d menit yang lalu" 189 | 190 | #: utils.py:11 191 | #, python-format 192 | msgid "%(hours)d hour ago" 193 | msgstr "%(hours)d jam yang lalu" 194 | 195 | #: utils.py:11 196 | #, python-format 197 | msgid "%(hours)d hours ago" 198 | msgstr "%(hours)d jam yang lalu" 199 | 200 | #: utils.py:12 201 | #, python-format 202 | msgid "yesterday at %(time)s" 203 | msgstr "kemarin pada %(time)s" 204 | 205 | #: utils.py:13 206 | msgid "year" 207 | msgstr "tahun" 208 | 209 | #: utils.py:13 210 | msgid "years" 211 | msgstr "tahun" 212 | 213 | #: utils.py:14 214 | msgid "month" 215 | msgstr "bulan" 216 | 217 | #: utils.py:14 218 | msgid "months" 219 | msgstr "bulan" 220 | 221 | #: utils.py:15 222 | msgid "week" 223 | msgstr "minggu" 224 | 225 | #: utils.py:15 226 | msgid "weeks" 227 | msgstr "minggu" 228 | 229 | #: utils.py:16 230 | msgid "day" 231 | msgstr "hari" 232 | 233 | #: utils.py:16 234 | msgid "days" 235 | msgstr "hari" 236 | 237 | #: utils.py:23 238 | #, python-format 239 | msgid "%(number)d %(type)s ago" 240 | msgstr "%(number)d %(type)s yang lalu" 241 | -------------------------------------------------------------------------------- /djangofeeds/locale/ja/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/ja/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/ja/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "このニュースフィードから応答がないようです。しばらくしてから再試行します。" 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "入力した URL が誤っているか、リクエストしたニュースフィードが存在しません。" 28 | 29 | #: models.py:37 30 | msgid "" 31 | "There was a problem with the feed you provided, please check the URL for " 32 | "mispellings or try again later." 33 | msgstr "指定したニュースフィードに問題がありました。URL に入力ミスがないか確認した後、もう一度試してみてください。" 34 | 35 | #: models.py:59 models.py:113 36 | msgid "name" 37 | msgstr "名前" 38 | 39 | #: models.py:60 40 | msgid "domain" 41 | msgstr "ドメイン" 42 | 43 | #: models.py:67 44 | msgid "category" 45 | msgstr "カテゴリ" 46 | 47 | #: models.py:68 48 | msgid "categories" 49 | msgstr "カテゴリ" 50 | 51 | #: models.py:114 52 | msgid "feed URL" 53 | msgstr "ニュースフィードの URL" 54 | 55 | #: models.py:115 56 | msgid "description" 57 | msgstr "説明" 58 | 59 | #: models.py:116 models.py:313 60 | msgid "link" 61 | msgstr "リンク" 62 | 63 | #: models.py:117 64 | msgid "E-Tag" 65 | msgstr "ETag" 66 | 67 | #: models.py:120 68 | msgid "Last-Modified" 69 | msgstr "最終変更日時" 70 | 71 | #: models.py:122 72 | msgid "date of last refresh" 73 | msgstr "最終更新日" 74 | 75 | #: models.py:125 76 | msgid "last error" 77 | msgstr "最後に発生したエラー" 78 | 79 | #: models.py:128 80 | msgid "sort order" 81 | msgstr "表示順序" 82 | 83 | #: models.py:129 84 | msgid "date created" 85 | msgstr "作成日時" 86 | 87 | #: models.py:130 88 | msgid "date changed" 89 | msgstr "変更日時" 90 | 91 | #: models.py:133 92 | msgid "last requested" 93 | msgstr "最新リクエスト日時" 94 | 95 | #: models.py:135 96 | msgid "is active" 97 | msgstr ":アクティブ状態" 98 | 99 | #: models.py:136 100 | msgid "frequency" 101 | msgstr "頻度" 102 | 103 | #: models.py:142 104 | msgid "syndication feed" 105 | msgstr "配信フィード" 106 | 107 | #: models.py:143 108 | msgid "syndication feeds" 109 | msgstr "配信フィード" 110 | 111 | #: models.py:256 112 | msgid "URL" 113 | msgstr "URL" 114 | 115 | #: models.py:257 116 | msgid "type" 117 | msgstr "種類" 118 | 119 | #: models.py:258 120 | msgid "length" 121 | msgstr "長さ" 122 | 123 | #: models.py:263 124 | msgid "enclosure" 125 | msgstr "囲み" 126 | 127 | #: models.py:264 128 | msgid "enclosures" 129 | msgstr "囲み" 130 | 131 | #: models.py:312 132 | msgid "title" 133 | msgstr "タイトル" 134 | 135 | #: models.py:314 136 | msgid "content" 137 | msgstr "コンテンツ" 138 | 139 | #: models.py:315 140 | msgid "guid" 141 | msgstr "GUID" 142 | 143 | #: models.py:316 144 | msgid "author" 145 | msgstr "作成者" 146 | 147 | #: models.py:317 148 | msgid "date published" 149 | msgstr "発行日" 150 | 151 | #: models.py:318 152 | msgid "date updated" 153 | msgstr "更新日" 154 | 155 | #: models.py:329 156 | msgid "post" 157 | msgstr "投稿" 158 | 159 | #: models.py:330 160 | msgid "posts" 161 | msgstr "投稿" 162 | 163 | #: utils.py:8 164 | msgid "just now" 165 | msgstr "たった今" 166 | 167 | #: utils.py:9 168 | #, python-format 169 | msgid "%(seconds)d second ago" 170 | msgstr "%(seconds)d 秒前" 171 | 172 | #: utils.py:9 173 | #, python-format 174 | msgid "%(seconds)d seconds ago" 175 | msgstr "%(seconds)d 秒前" 176 | 177 | #: utils.py:10 178 | #, python-format 179 | msgid "%(minutes)d minute ago" 180 | msgstr "%(minutes)d 分前" 181 | 182 | #: utils.py:10 183 | #, python-format 184 | msgid "%(minutes)d minutes ago" 185 | msgstr "%(minutes)d 分前" 186 | 187 | #: utils.py:11 188 | #, python-format 189 | msgid "%(hours)d hour ago" 190 | msgstr "%(hours)d 時間前" 191 | 192 | #: utils.py:11 193 | #, python-format 194 | msgid "%(hours)d hours ago" 195 | msgstr "%(hours)d 時間前" 196 | 197 | #: utils.py:12 198 | #, python-format 199 | msgid "yesterday at %(time)s" 200 | msgstr "昨日の %(time)s" 201 | 202 | #: utils.py:13 203 | msgid "year" 204 | msgstr "年" 205 | 206 | #: utils.py:13 207 | msgid "years" 208 | msgstr "年" 209 | 210 | #: utils.py:14 211 | msgid "month" 212 | msgstr "月" 213 | 214 | #: utils.py:14 215 | msgid "months" 216 | msgstr "月" 217 | 218 | #: utils.py:15 219 | msgid "week" 220 | msgstr "週" 221 | 222 | #: utils.py:15 223 | msgid "weeks" 224 | msgstr "週" 225 | 226 | #: utils.py:16 227 | msgid "day" 228 | msgstr "日" 229 | 230 | #: utils.py:16 231 | msgid "days" 232 | msgstr "日" 233 | 234 | #: utils.py:23 235 | #, python-format 236 | msgid "%(number)d %(type)s ago" 237 | msgstr "%(number)d %(type)s 前" 238 | -------------------------------------------------------------------------------- /djangofeeds/locale/jp/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/jp/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/jp/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2010-12-06 12:24+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "" 23 | 24 | #: models.py:34 25 | msgid "" 26 | "You entered an incorrect URL or the feed you requested does not exist " 27 | "anymore." 28 | msgstr "" 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | 36 | #: models.py:59 models.py:113 37 | msgid "name" 38 | msgstr "" 39 | 40 | #: models.py:60 41 | msgid "domain" 42 | msgstr "" 43 | 44 | #: models.py:67 45 | msgid "category" 46 | msgstr "" 47 | 48 | #: models.py:68 49 | msgid "categories" 50 | msgstr "" 51 | 52 | #: models.py:114 53 | msgid "feed URL" 54 | msgstr "" 55 | 56 | #: models.py:115 57 | msgid "description" 58 | msgstr "" 59 | 60 | #: models.py:116 models.py:313 61 | msgid "link" 62 | msgstr "" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "" 239 | -------------------------------------------------------------------------------- /djangofeeds/locale/ko/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/ko/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/ko/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2010-12-06 12:27+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "" 23 | 24 | #: models.py:34 25 | msgid "" 26 | "You entered an incorrect URL or the feed you requested does not exist " 27 | "anymore." 28 | msgstr "" 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | 36 | #: models.py:59 models.py:113 37 | msgid "name" 38 | msgstr "" 39 | 40 | #: models.py:60 41 | msgid "domain" 42 | msgstr "" 43 | 44 | #: models.py:67 45 | msgid "category" 46 | msgstr "" 47 | 48 | #: models.py:68 49 | msgid "categories" 50 | msgstr "" 51 | 52 | #: models.py:114 53 | msgid "feed URL" 54 | msgstr "" 55 | 56 | #: models.py:115 57 | msgid "description" 58 | msgstr "" 59 | 60 | #: models.py:116 models.py:313 61 | msgid "link" 62 | msgstr "" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "" 239 | -------------------------------------------------------------------------------- /djangofeeds/locale/no/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/no/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/no/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:24+0100\n" 11 | "PO-Revision-Date: 2009-06-18 17:08+0100\n" 12 | "Last-Translator: Pål Eivind Jacobsen Nes \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "Denne kanalen ser ikke ut til å svare. Vi prøver igjen senere." 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "" 28 | "Du har skrevet feil adresse, eller kanalen du etterspurte finnes ikke lenger." 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | "Det var et problem med kanalen du angav, vennligst sjekk adressen for " 36 | "skrivefeil eller prøv igjen senere." 37 | 38 | #: models.py:59 models.py:113 39 | msgid "name" 40 | msgstr "navn" 41 | 42 | #: models.py:60 43 | msgid "domain" 44 | msgstr "domene" 45 | 46 | #: models.py:67 47 | msgid "category" 48 | msgstr "kategori" 49 | 50 | #: models.py:68 51 | msgid "categories" 52 | msgstr "kategorier" 53 | 54 | #: models.py:114 55 | msgid "feed URL" 56 | msgstr "kanal adresse" 57 | 58 | #: models.py:115 59 | msgid "description" 60 | msgstr "beskrivelse" 61 | 62 | #: models.py:116 models.py:313 63 | msgid "link" 64 | msgstr "lenke" 65 | 66 | #: models.py:117 67 | msgid "E-Tag" 68 | msgstr "E-Tag" 69 | 70 | #: models.py:120 71 | msgid "Last-Modified" 72 | msgstr "Last-Modified" 73 | 74 | #: models.py:122 75 | msgid "date of last refresh" 76 | msgstr "siste oppdatering" 77 | 78 | #: models.py:125 79 | msgid "last error" 80 | msgstr "siste feil" 81 | 82 | #: models.py:128 83 | msgid "sort order" 84 | msgstr "sorteringsrekkefølge" 85 | 86 | #: models.py:129 87 | msgid "date created" 88 | msgstr "dato opprettet" 89 | 90 | #: models.py:130 91 | msgid "date changed" 92 | msgstr "dato oppdatert" 93 | 94 | #: models.py:133 95 | msgid "last requested" 96 | msgstr "sist forespurt" 97 | 98 | #: models.py:135 99 | msgid "is active" 100 | msgstr "er aktiv" 101 | 102 | #: models.py:136 103 | msgid "frequency" 104 | msgstr "frekvens" 105 | 106 | #: models.py:142 107 | msgid "syndication feed" 108 | msgstr "syndikeringskanal" 109 | 110 | #: models.py:143 111 | msgid "syndication feeds" 112 | msgstr "syndikeringskanaler" 113 | 114 | #: models.py:256 115 | msgid "URL" 116 | msgstr "URL\t" 117 | 118 | #: models.py:257 119 | msgid "type" 120 | msgstr "type" 121 | 122 | #: models.py:258 123 | msgid "length" 124 | msgstr "lengde" 125 | 126 | #: models.py:263 127 | msgid "enclosure" 128 | msgstr "vedlegg" 129 | 130 | #: models.py:264 131 | msgid "enclosures" 132 | msgstr "vedlegg" 133 | 134 | #: models.py:312 135 | msgid "title" 136 | msgstr "tittel" 137 | 138 | #: models.py:314 139 | msgid "content" 140 | msgstr "innhold" 141 | 142 | #: models.py:315 143 | msgid "guid" 144 | msgstr "guid" 145 | 146 | #: models.py:316 147 | msgid "author" 148 | msgstr "forfatter" 149 | 150 | #: models.py:317 151 | msgid "date published" 152 | msgstr "dato publisert" 153 | 154 | #: models.py:318 155 | msgid "date updated" 156 | msgstr "dato oppdatert" 157 | 158 | #: models.py:329 159 | msgid "post" 160 | msgstr "artikkel" 161 | 162 | #: models.py:330 163 | msgid "posts" 164 | msgstr "artikler" 165 | 166 | #: utils.py:8 167 | msgid "just now" 168 | msgstr "akkurat nå" 169 | 170 | #: utils.py:9 171 | #, python-format 172 | msgid "%(seconds)d second ago" 173 | msgstr "%(seconds)d sekund siden" 174 | 175 | #: utils.py:9 176 | #, python-format 177 | msgid "%(seconds)d seconds ago" 178 | msgstr "%(seconds)d sekunder siden" 179 | 180 | #: utils.py:10 181 | #, python-format 182 | msgid "%(minutes)d minute ago" 183 | msgstr "%(minutes)d minutt siden" 184 | 185 | #: utils.py:10 186 | #, python-format 187 | msgid "%(minutes)d minutes ago" 188 | msgstr "%(minutes)d minutter siden" 189 | 190 | #: utils.py:11 191 | #, python-format 192 | msgid "%(hours)d hour ago" 193 | msgstr "%(hours)d time siden" 194 | 195 | #: utils.py:11 196 | #, python-format 197 | msgid "%(hours)d hours ago" 198 | msgstr "%(hours)d timer siden" 199 | 200 | #: utils.py:12 201 | #, python-format 202 | msgid "yesterday at %(time)s" 203 | msgstr "i går klokken %(time)s" 204 | 205 | #: utils.py:13 206 | msgid "year" 207 | msgstr "år" 208 | 209 | #: utils.py:13 210 | msgid "years" 211 | msgstr "år" 212 | 213 | #: utils.py:14 214 | msgid "month" 215 | msgstr "måned" 216 | 217 | #: utils.py:14 218 | msgid "months" 219 | msgstr "måneder" 220 | 221 | #: utils.py:15 222 | msgid "week" 223 | msgstr "uke" 224 | 225 | #: utils.py:15 226 | msgid "weeks" 227 | msgstr "uker" 228 | 229 | #: utils.py:16 230 | msgid "day" 231 | msgstr "dag" 232 | 233 | #: utils.py:16 234 | msgid "days" 235 | msgstr "dager" 236 | 237 | #: utils.py:23 238 | #, python-format 239 | msgid "%(number)d %(type)s ago" 240 | msgstr "%(number)d %(type)s siden" 241 | 242 | #~ msgid "This is a test sentence for the demo." 243 | #~ msgstr "Dette er en testsetning for demonstrasjonen." 244 | -------------------------------------------------------------------------------- /djangofeeds/locale/pl/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/pl/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/pl/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-11-26 15:59+0100\n" 11 | "PO-Revision-Date: 2010-12-02 12:58+0100\n" 12 | "Last-Translator: Slawek Sochaj \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "Kanał RSS nie odpowiada. Spróbujemy ponownie później." 23 | 24 | #: models.py:34 25 | msgid "You entered an incorrect URL or the feed you requested does not exist anymore." 26 | msgstr "Wprowadziłeś niepoprawny URL, albo ten kanał RSS już nie istnieje." 27 | 28 | #: models.py:37 29 | msgid "There was a problem with the feed you provided, please check the URL for mispellings or try again later." 30 | msgstr "Pojawił się problem z wprowadzonym kanałem RSS. Sprawdź dokładnie URL, albo spróbuj ponownie później." 31 | 32 | #: models.py:59 33 | #: models.py:113 34 | msgid "name" 35 | msgstr "nazwa" 36 | 37 | #: models.py:60 38 | msgid "domain" 39 | msgstr "domena" 40 | 41 | #: models.py:67 42 | msgid "category" 43 | msgstr "kategoria" 44 | 45 | #: models.py:68 46 | msgid "categories" 47 | msgstr "kategorie" 48 | 49 | #: models.py:114 50 | msgid "feed URL" 51 | msgstr "Adres kanału RSS" 52 | 53 | #: models.py:115 54 | msgid "description" 55 | msgstr "Opis" 56 | 57 | #: models.py:116 58 | #: models.py:313 59 | msgid "link" 60 | msgstr "link" 61 | 62 | #: models.py:117 63 | msgid "E-Tag" 64 | msgstr "E-Tag" 65 | 66 | #: models.py:120 67 | msgid "Last-Modified" 68 | msgstr "Ostatnio zmodyfikowane" 69 | 70 | #: models.py:122 71 | msgid "date of last refresh" 72 | msgstr "data ostatniego odświeżenia" 73 | 74 | #: models.py:125 75 | msgid "last error" 76 | msgstr "ostatni błąd" 77 | 78 | #: models.py:128 79 | msgid "sort order" 80 | msgstr "porządek sortowania" 81 | 82 | #: models.py:129 83 | msgid "date created" 84 | msgstr "data utworzenia" 85 | 86 | #: models.py:130 87 | msgid "date changed" 88 | msgstr "zmieniona data" 89 | 90 | #: models.py:133 91 | msgid "last requested" 92 | msgstr "ostatnio wywołany" 93 | 94 | #: models.py:135 95 | msgid "is active" 96 | msgstr "jest aktywny" 97 | 98 | #: models.py:136 99 | msgid "frequency" 100 | msgstr "częstotliwość" 101 | 102 | #: models.py:142 103 | msgid "syndication feed" 104 | msgstr "udostępniony kanał" 105 | 106 | #: models.py:143 107 | msgid "syndication feeds" 108 | msgstr "udostępnione kanały" 109 | 110 | #: models.py:256 111 | msgid "URL" 112 | msgstr "URL" 113 | 114 | #: models.py:257 115 | msgid "type" 116 | msgstr "typ" 117 | 118 | #: models.py:258 119 | msgid "length" 120 | msgstr "długość" 121 | 122 | #: models.py:263 123 | msgid "enclosure" 124 | msgstr "załącznik" 125 | 126 | #: models.py:264 127 | msgid "enclosures" 128 | msgstr "załączniki" 129 | 130 | #: models.py:312 131 | msgid "title" 132 | msgstr "tytuł" 133 | 134 | #: models.py:314 135 | msgid "content" 136 | msgstr "zawartość" 137 | 138 | #: models.py:315 139 | msgid "guid" 140 | msgstr "GUID" 141 | 142 | #: models.py:316 143 | msgid "author" 144 | msgstr "autor" 145 | 146 | #: models.py:317 147 | msgid "date published" 148 | msgstr "data publikacji" 149 | 150 | #: models.py:318 151 | msgid "date updated" 152 | msgstr "data zmiany" 153 | 154 | #: models.py:329 155 | msgid "post" 156 | msgstr "post" 157 | 158 | #: models.py:330 159 | msgid "posts" 160 | msgstr "posty" 161 | 162 | #: utils.py:8 163 | msgid "just now" 164 | msgstr "już teraz" 165 | 166 | #: utils.py:9 167 | #, python-format 168 | msgid "%(seconds)d second ago" 169 | msgstr "%(seconds)d sekund temu" 170 | 171 | #: utils.py:9 172 | #, python-format 173 | msgid "%(seconds)d seconds ago" 174 | msgstr "%(seconds)d sekund temu" 175 | 176 | #: utils.py:10 177 | #, python-format 178 | msgid "%(minutes)d minute ago" 179 | msgstr "%(minutes)d minut temu" 180 | 181 | #: utils.py:10 182 | #, python-format 183 | msgid "%(minutes)d minutes ago" 184 | msgstr "%(minutes)d minut temu" 185 | 186 | #: utils.py:11 187 | #, python-format 188 | msgid "%(hours)d hour ago" 189 | msgstr "%(hours)d hour ago" 190 | 191 | #: utils.py:11 192 | #, python-format 193 | msgid "%(hours)d hours ago" 194 | msgstr "%(hours)d hours ago" 195 | 196 | #: utils.py:12 197 | #, python-format 198 | msgid "yesterday at %(time)s" 199 | msgstr "yesterday at %(time)s" 200 | 201 | #: utils.py:13 202 | msgid "year" 203 | msgstr "rok" 204 | 205 | #: utils.py:13 206 | msgid "years" 207 | msgstr "lata" 208 | 209 | #: utils.py:14 210 | msgid "month" 211 | msgstr "miesiąc" 212 | 213 | #: utils.py:14 214 | msgid "months" 215 | msgstr "miesiące" 216 | 217 | #: utils.py:15 218 | msgid "week" 219 | msgstr "tydzień" 220 | 221 | #: utils.py:15 222 | msgid "weeks" 223 | msgstr "tygodnie" 224 | 225 | #: utils.py:16 226 | msgid "day" 227 | msgstr "dzień" 228 | 229 | #: utils.py:16 230 | msgid "days" 231 | msgstr "dni" 232 | 233 | #: utils.py:23 234 | #, python-format 235 | msgid "%(number)d %(type)s ago" 236 | msgstr "%(number)d %(type)s temu" 237 | 238 | -------------------------------------------------------------------------------- /djangofeeds/locale/pt/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/pt/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/pt/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "" 23 | 24 | #: models.py:34 25 | msgid "" 26 | "You entered an incorrect URL or the feed you requested does not exist " 27 | "anymore." 28 | msgstr "" 29 | 30 | #: models.py:37 31 | msgid "" 32 | "There was a problem with the feed you provided, please check the URL for " 33 | "mispellings or try again later." 34 | msgstr "" 35 | 36 | #: models.py:59 models.py:113 37 | msgid "name" 38 | msgstr "" 39 | 40 | #: models.py:60 41 | msgid "domain" 42 | msgstr "" 43 | 44 | #: models.py:67 45 | msgid "category" 46 | msgstr "" 47 | 48 | #: models.py:68 49 | msgid "categories" 50 | msgstr "" 51 | 52 | #: models.py:114 53 | msgid "feed URL" 54 | msgstr "" 55 | 56 | #: models.py:115 57 | msgid "description" 58 | msgstr "" 59 | 60 | #: models.py:116 models.py:313 61 | msgid "link" 62 | msgstr "" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "" 239 | -------------------------------------------------------------------------------- /djangofeeds/locale/pt_BR/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/pt_BR/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/pt_BR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "O feed parece não responder. Tentaremos novamente mais tarde." 23 | 24 | #: models.py:34 25 | msgid "" 26 | "You entered an incorrect URL or the feed you requested does not exist " 27 | "anymore." 28 | msgstr "" 29 | "Você digitou uma URL incorreta ou o feed que você quer acessar não existe" 30 | "mais." 31 | #: models.py:37 32 | msgid "" 33 | "There was a problem with the feed you provided, please check the URL for " 34 | "mispellings or try again later." 35 | msgstr "" 36 | "Há um problema com este feed, por favor verifique se a URL" 37 | "foi digitada corretamente ou tente novamente mais tarde." 38 | 39 | #: models.py:59 models.py:113 40 | msgid "name" 41 | msgstr "nome" 42 | 43 | #: models.py:60 44 | msgid "domain" 45 | msgstr "domínio" 46 | 47 | #: models.py:67 48 | msgid "category" 49 | msgstr "categoria" 50 | 51 | #: models.py:68 52 | msgid "categories" 53 | msgstr "categorias" 54 | 55 | #: models.py:114 56 | msgid "feed URL" 57 | msgstr "URL do feed" 58 | 59 | #: models.py:115 60 | msgid "description" 61 | msgstr "descrição" 62 | 63 | #: models.py:116 models.py:313 64 | msgid "link" 65 | msgstr "link" 66 | 67 | #: models.py:117 68 | msgid "E-Tag" 69 | msgstr "E-Tag" 70 | 71 | #: models.py:120 72 | msgid "Last-Modified" 73 | msgstr "Última Modificação" 74 | 75 | #: models.py:122 76 | msgid "date of last refresh" 77 | msgstr "data da última atualização" 78 | 79 | #: models.py:125 80 | msgid "last error" 81 | msgstr "último erro" 82 | 83 | #: models.py:128 84 | msgid "sort order" 85 | msgstr "ordem de classificação" 86 | 87 | #: models.py:129 88 | msgid "date created" 89 | msgstr "data de criação" 90 | 91 | #: models.py:130 92 | msgid "date changed" 93 | msgstr "data de alteração" 94 | 95 | #: models.py:133 96 | msgid "last requested" 97 | msgstr "última solicitação" 98 | 99 | #: models.py:135 100 | msgid "is active" 101 | msgstr "está ativo" 102 | 103 | #: models.py:136 104 | msgid "frequency" 105 | msgstr "frequencia" 106 | 107 | #: models.py:142 108 | msgid "syndication feed" 109 | msgstr "feed de distribuição" 110 | 111 | #: models.py:143 112 | msgid "syndication feeds" 113 | msgstr "feeds de distribuição" 114 | 115 | #: models.py:256 116 | msgid "URL" 117 | msgstr "URL" 118 | 119 | #: models.py:257 120 | msgid "type" 121 | msgstr "tipo" 122 | 123 | #: models.py:258 124 | msgid "length" 125 | msgstr "tamanho" 126 | 127 | #: models.py:263 128 | msgid "enclosure" 129 | msgstr "anexo" 130 | 131 | #: models.py:264 132 | msgid "enclosures" 133 | msgstr "anexos" 134 | 135 | #: models.py:312 136 | msgid "title" 137 | msgstr "título" 138 | 139 | #: models.py:314 140 | msgid "content" 141 | msgstr "conteúdo" 142 | 143 | #: models.py:315 144 | msgid "guid" 145 | msgstr "guia" 146 | 147 | #: models.py:316 148 | msgid "author" 149 | msgstr "autor" 150 | 151 | #: models.py:317 152 | msgid "date published" 153 | msgstr "data de publicação" 154 | 155 | #: models.py:318 156 | msgid "date updated" 157 | msgstr "data de atualização" 158 | 159 | #: models.py:329 160 | msgid "post" 161 | msgstr "post" 162 | 163 | #: models.py:330 164 | msgid "posts" 165 | msgstr "posts" 166 | 167 | #: utils.py:8 168 | msgid "just now" 169 | msgstr "agora" 170 | 171 | #: utils.py:9 172 | #, python-format 173 | msgid "%(seconds)d second ago" 174 | msgstr "%(seconds)d segundos atrás" 175 | 176 | #: utils.py:9 177 | #, python-format 178 | msgid "%(seconds)d seconds ago" 179 | msgstr "%(seconds)d segundos atrás" 180 | 181 | #: utils.py:10 182 | #, python-format 183 | msgid "%(minutes)d minute ago" 184 | msgstr "%(minutes)d minutos atrás" 185 | 186 | #: utils.py:10 187 | #, python-format 188 | msgid "%(minutes)d minutes ago" 189 | msgstr "%(minutes)d minutos atrás" 190 | 191 | #: utils.py:11 192 | #, python-format 193 | msgid "%(hours)d hour ago" 194 | msgstr "%(hours)d horas atrás" 195 | 196 | #: utils.py:11 197 | #, python-format 198 | msgid "%(hours)d hours ago" 199 | msgstr "%(hours)d horas atrás" 200 | 201 | #: utils.py:12 202 | #, python-format 203 | msgid "yesterday at %(time)s" 204 | msgstr "Ontem às %(time)s" 205 | 206 | #: utils.py:13 207 | msgid "year" 208 | msgstr "ano" 209 | 210 | #: utils.py:13 211 | msgid "years" 212 | msgstr "anos" 213 | 214 | #: utils.py:14 215 | msgid "month" 216 | msgstr "mês" 217 | 218 | #: utils.py:14 219 | msgid "months" 220 | msgstr "meses" 221 | 222 | #: utils.py:15 223 | msgid "week" 224 | msgstr "semana" 225 | 226 | #: utils.py:15 227 | msgid "weeks" 228 | msgstr "semanas" 229 | 230 | #: utils.py:16 231 | msgid "day" 232 | msgstr "dia" 233 | 234 | #: utils.py:16 235 | msgid "days" 236 | msgstr "dias" 237 | 238 | #: utils.py:23 239 | #, python-format 240 | msgid "%(number)d %(type)s ago" 241 | msgstr "%(number)d %(type)s atrás" 242 | -------------------------------------------------------------------------------- /djangofeeds/locale/ru/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/ru/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/sla/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/sla/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/sla/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Opera Portal\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2011-01-25 15:30+0100\n" 11 | "PO-Revision-Date: 2011-01-31 18:56+0100\n" 12 | "Last-Translator: Ivan \n" 13 | "Language-Team: Serbian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 18 | "X-Poedit-Language: Serbian\n" 19 | "X-Poedit-Country: YUGOSLAVIA\n" 20 | "X-Poedit-SourceCharset: utf-8\n" 21 | 22 | #: models.py:32 23 | msgid "The feed does not seem to be respond. We will try again later." 24 | msgstr "Trenutno je RSS izvor nedostupan. Pokušaćemo malo kasnije." 25 | 26 | #: models.py:34 27 | msgid "You entered an incorrect URL or the feed you requested does not exist anymore." 28 | msgstr "Upisali ste neispravan URL ili izvor koji ste zatražili više ne postoji." 29 | 30 | #: models.py:37 31 | msgid "There was a problem with the feed you provided, please check the URL for mispellings or try again later." 32 | msgstr "Postoji problem sa izvorom koji ste naveli. Molimo vas proverite URL za slovne greške ili pokušajte kasnije." 33 | 34 | #: models.py:59 35 | #: models.py:113 36 | msgid "name" 37 | msgstr "ime" 38 | 39 | #: models.py:60 40 | msgid "domain" 41 | msgstr "domen" 42 | 43 | #: models.py:67 44 | msgid "category" 45 | msgstr "kategorija" 46 | 47 | #: models.py:68 48 | msgid "categories" 49 | msgstr "kategorije" 50 | 51 | #: models.py:114 52 | msgid "feed URL" 53 | msgstr "URL RSS izvora" 54 | 55 | #: models.py:115 56 | msgid "description" 57 | msgstr "opis" 58 | 59 | #: models.py:116 60 | #: models.py:313 61 | msgid "link" 62 | msgstr "link" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "E-Tag" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "Poslednja izmena" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "datum poslednjeg osvežavanja" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "poslednja greška" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "redosled" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "datum kreiranja" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "datum izmene" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "poslednje zatraženo" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "je aktivan" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "učestalost" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "izvor sindikacije" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "izvori sindikacije" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "URL" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "tip" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "dužina" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "ograda" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "ograde" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "naslov" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "sadržaj" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "guid" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "autor" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "datum objave" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "datum osvežavanja" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "post" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "postovi" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "upravo" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "pre %(seconds)d sekund" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "pre %(seconds)d sekundi" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "pre %(minutes)d minut" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "pre %(minutes)d minuta" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "pre %(hours)d sat" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "pre %(hours)d sati" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "juče u %(time)s" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "godina" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "godine" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "mesec" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "meseci" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "nedelja" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "nedelje" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "dan" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "dani" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "pre %(number)d %(type)s" 239 | 240 | -------------------------------------------------------------------------------- /djangofeeds/locale/sr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/sr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/sr/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Opera Portal\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2011-01-25 15:30+0100\n" 11 | "PO-Revision-Date: 2011-01-31 18:56+0100\n" 12 | "Last-Translator: Ivan \n" 13 | "Language-Team: Serbian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 18 | "X-Poedit-Language: Serbian\n" 19 | "X-Poedit-Country: YUGOSLAVIA\n" 20 | "X-Poedit-SourceCharset: utf-8\n" 21 | 22 | #: models.py:32 23 | msgid "The feed does not seem to be respond. We will try again later." 24 | msgstr "Trenutno je RSS izvor nedostupan. Pokušaćemo malo kasnije." 25 | 26 | #: models.py:34 27 | msgid "You entered an incorrect URL or the feed you requested does not exist anymore." 28 | msgstr "Upisali ste neispravan URL ili izvor koji ste zatražili više ne postoji." 29 | 30 | #: models.py:37 31 | msgid "There was a problem with the feed you provided, please check the URL for mispellings or try again later." 32 | msgstr "Postoji problem sa izvorom koji ste naveli. Molimo vas proverite URL za slovne greške ili pokušajte kasnije." 33 | 34 | #: models.py:59 35 | #: models.py:113 36 | msgid "name" 37 | msgstr "ime" 38 | 39 | #: models.py:60 40 | msgid "domain" 41 | msgstr "domen" 42 | 43 | #: models.py:67 44 | msgid "category" 45 | msgstr "kategorija" 46 | 47 | #: models.py:68 48 | msgid "categories" 49 | msgstr "kategorije" 50 | 51 | #: models.py:114 52 | msgid "feed URL" 53 | msgstr "URL RSS izvora" 54 | 55 | #: models.py:115 56 | msgid "description" 57 | msgstr "opis" 58 | 59 | #: models.py:116 60 | #: models.py:313 61 | msgid "link" 62 | msgstr "link" 63 | 64 | #: models.py:117 65 | msgid "E-Tag" 66 | msgstr "E-Tag" 67 | 68 | #: models.py:120 69 | msgid "Last-Modified" 70 | msgstr "Poslednja izmena" 71 | 72 | #: models.py:122 73 | msgid "date of last refresh" 74 | msgstr "datum poslednjeg osvežavanja" 75 | 76 | #: models.py:125 77 | msgid "last error" 78 | msgstr "poslednja greška" 79 | 80 | #: models.py:128 81 | msgid "sort order" 82 | msgstr "redosled" 83 | 84 | #: models.py:129 85 | msgid "date created" 86 | msgstr "datum kreiranja" 87 | 88 | #: models.py:130 89 | msgid "date changed" 90 | msgstr "datum izmene" 91 | 92 | #: models.py:133 93 | msgid "last requested" 94 | msgstr "poslednje zatraženo" 95 | 96 | #: models.py:135 97 | msgid "is active" 98 | msgstr "je aktivan" 99 | 100 | #: models.py:136 101 | msgid "frequency" 102 | msgstr "učestalost" 103 | 104 | #: models.py:142 105 | msgid "syndication feed" 106 | msgstr "izvor sindikacije" 107 | 108 | #: models.py:143 109 | msgid "syndication feeds" 110 | msgstr "izvori sindikacije" 111 | 112 | #: models.py:256 113 | msgid "URL" 114 | msgstr "URL" 115 | 116 | #: models.py:257 117 | msgid "type" 118 | msgstr "tip" 119 | 120 | #: models.py:258 121 | msgid "length" 122 | msgstr "dužina" 123 | 124 | #: models.py:263 125 | msgid "enclosure" 126 | msgstr "ograda" 127 | 128 | #: models.py:264 129 | msgid "enclosures" 130 | msgstr "ograde" 131 | 132 | #: models.py:312 133 | msgid "title" 134 | msgstr "naslov" 135 | 136 | #: models.py:314 137 | msgid "content" 138 | msgstr "sadržaj" 139 | 140 | #: models.py:315 141 | msgid "guid" 142 | msgstr "guid" 143 | 144 | #: models.py:316 145 | msgid "author" 146 | msgstr "autor" 147 | 148 | #: models.py:317 149 | msgid "date published" 150 | msgstr "datum objave" 151 | 152 | #: models.py:318 153 | msgid "date updated" 154 | msgstr "datum osvežavanja" 155 | 156 | #: models.py:329 157 | msgid "post" 158 | msgstr "post" 159 | 160 | #: models.py:330 161 | msgid "posts" 162 | msgstr "postovi" 163 | 164 | #: utils.py:8 165 | msgid "just now" 166 | msgstr "upravo" 167 | 168 | #: utils.py:9 169 | #, python-format 170 | msgid "%(seconds)d second ago" 171 | msgstr "pre %(seconds)d sekund" 172 | 173 | #: utils.py:9 174 | #, python-format 175 | msgid "%(seconds)d seconds ago" 176 | msgstr "pre %(seconds)d sekundi" 177 | 178 | #: utils.py:10 179 | #, python-format 180 | msgid "%(minutes)d minute ago" 181 | msgstr "pre %(minutes)d minut" 182 | 183 | #: utils.py:10 184 | #, python-format 185 | msgid "%(minutes)d minutes ago" 186 | msgstr "pre %(minutes)d minuta" 187 | 188 | #: utils.py:11 189 | #, python-format 190 | msgid "%(hours)d hour ago" 191 | msgstr "pre %(hours)d sat" 192 | 193 | #: utils.py:11 194 | #, python-format 195 | msgid "%(hours)d hours ago" 196 | msgstr "pre %(hours)d sati" 197 | 198 | #: utils.py:12 199 | #, python-format 200 | msgid "yesterday at %(time)s" 201 | msgstr "juče u %(time)s" 202 | 203 | #: utils.py:13 204 | msgid "year" 205 | msgstr "godina" 206 | 207 | #: utils.py:13 208 | msgid "years" 209 | msgstr "godine" 210 | 211 | #: utils.py:14 212 | msgid "month" 213 | msgstr "mesec" 214 | 215 | #: utils.py:14 216 | msgid "months" 217 | msgstr "meseci" 218 | 219 | #: utils.py:15 220 | msgid "week" 221 | msgstr "nedelja" 222 | 223 | #: utils.py:15 224 | msgid "weeks" 225 | msgstr "nedelje" 226 | 227 | #: utils.py:16 228 | msgid "day" 229 | msgstr "dan" 230 | 231 | #: utils.py:16 232 | msgid "days" 233 | msgstr "dani" 234 | 235 | #: utils.py:23 236 | #, python-format 237 | msgid "%(number)d %(type)s ago" 238 | msgstr "pre %(number)d %(type)s" 239 | 240 | -------------------------------------------------------------------------------- /djangofeeds/locale/tr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/tr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/vi/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/vi/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/vi/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: Portal Vietnamese\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:23+0100\n" 11 | "PO-Revision-Date: 2010-11-29 16:25+0100\n" 12 | "Last-Translator: Van \n" 13 | "Language-Team: Vi\n" 14 | "Language: Vietnamese\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "Không kết nối được với feed. Chúng tôi sẽ thử lại sau." 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "Bạn đã cung cấp URL sai hoặc feed của bạn yêu cầu không còn tồn tại." 28 | 29 | #: models.py:37 30 | msgid "" 31 | "There was a problem with the feed you provided, please check the URL for " 32 | "mispellings or try again later." 33 | msgstr "" 34 | "Feed bạn cung cấp gặp phải lỗi, vui lòng kiểm tra URL hoặc thử lại trong " 35 | "chốc lát." 36 | 37 | #: models.py:59 models.py:113 38 | msgid "name" 39 | msgstr "tên" 40 | 41 | #: models.py:60 42 | msgid "domain" 43 | msgstr "tên miền" 44 | 45 | #: models.py:67 46 | msgid "category" 47 | msgstr "thể loại" 48 | 49 | #: models.py:68 50 | msgid "categories" 51 | msgstr "các thể loại" 52 | 53 | #: models.py:114 54 | msgid "feed URL" 55 | msgstr "feed URL" 56 | 57 | #: models.py:115 58 | msgid "description" 59 | msgstr "mô tả " 60 | 61 | #: models.py:116 models.py:313 62 | msgid "link" 63 | msgstr "đường dẫn" 64 | 65 | #: models.py:117 66 | msgid "E-Tag" 67 | msgstr "E-Tag" 68 | 69 | #: models.py:120 70 | msgid "Last-Modified" 71 | msgstr "Cập nhật lần cuối" 72 | 73 | #: models.py:122 74 | msgid "date of last refresh" 75 | msgstr "Lần cuối làm mới" 76 | 77 | #: models.py:125 78 | msgid "last error" 79 | msgstr "lỗi mới nhất" 80 | 81 | #: models.py:128 82 | msgid "sort order" 83 | msgstr "Sắp xếp theo thứ tự" 84 | 85 | #: models.py:129 86 | msgid "date created" 87 | msgstr "Ngày thiết lập" 88 | 89 | #: models.py:130 90 | msgid "date changed" 91 | msgstr "ngày sửa đôỉ" 92 | 93 | #: models.py:133 94 | msgid "last requested" 95 | msgstr "yêu cầu gần nhất" 96 | 97 | #: models.py:135 98 | msgid "is active" 99 | msgstr "đang hoạt động" 100 | 101 | #: models.py:136 102 | msgid "frequency" 103 | msgstr "tần số" 104 | 105 | #: models.py:142 106 | msgid "syndication feed" 107 | msgstr "syndication feed" 108 | 109 | #: models.py:143 110 | msgid "syndication feeds" 111 | msgstr "syndication feeds" 112 | 113 | #: models.py:256 114 | msgid "URL" 115 | msgstr "URL" 116 | 117 | #: models.py:257 118 | msgid "type" 119 | msgstr "loại" 120 | 121 | #: models.py:258 122 | msgid "length" 123 | msgstr "chiều dài" 124 | 125 | #: models.py:263 126 | msgid "enclosure" 127 | msgstr "tài liệu đính kèm" 128 | 129 | #: models.py:264 130 | msgid "enclosures" 131 | msgstr "tài liệu đính kèm" 132 | 133 | #: models.py:312 134 | msgid "title" 135 | msgstr "tiêu đề" 136 | 137 | #: models.py:314 138 | msgid "content" 139 | msgstr "nội dung" 140 | 141 | #: models.py:315 142 | msgid "guid" 143 | msgstr "hướng dẫn" 144 | 145 | #: models.py:316 146 | msgid "author" 147 | msgstr "tác giả" 148 | 149 | #: models.py:317 150 | msgid "date published" 151 | msgstr "ngày đăng tải" 152 | 153 | #: models.py:318 154 | msgid "date updated" 155 | msgstr "ngày cập nhật" 156 | 157 | #: models.py:329 158 | msgid "post" 159 | msgstr "bài viết" 160 | 161 | #: models.py:330 162 | msgid "posts" 163 | msgstr "các bài viết" 164 | 165 | #: utils.py:8 166 | msgid "just now" 167 | msgstr "vừa xong" 168 | 169 | #: utils.py:9 170 | #, python-format 171 | msgid "%(seconds)d second ago" 172 | msgstr "%(seconds)d giây trước" 173 | 174 | #: utils.py:9 175 | #, python-format 176 | msgid "%(seconds)d seconds ago" 177 | msgstr "%(seconds)d giây trước" 178 | 179 | #: utils.py:10 180 | #, python-format 181 | msgid "%(minutes)d minute ago" 182 | msgstr "%(minutes)d phút trước" 183 | 184 | #: utils.py:10 185 | #, python-format 186 | msgid "%(minutes)d minutes ago" 187 | msgstr "%(minutes)d phút trước" 188 | 189 | #: utils.py:11 190 | #, python-format 191 | msgid "%(hours)d hour ago" 192 | msgstr "%(hours)d giờ trước" 193 | 194 | #: utils.py:11 195 | #, python-format 196 | msgid "%(hours)d hours ago" 197 | msgstr "%(hours)d giờ trước" 198 | 199 | #: utils.py:12 200 | #, python-format 201 | msgid "yesterday at %(time)s" 202 | msgstr "hôm qua lúc %(time)s" 203 | 204 | #: utils.py:13 205 | msgid "year" 206 | msgstr "năm" 207 | 208 | #: utils.py:13 209 | msgid "years" 210 | msgstr "hàng năm" 211 | 212 | #: utils.py:14 213 | msgid "month" 214 | msgstr "tháng" 215 | 216 | #: utils.py:14 217 | msgid "months" 218 | msgstr "hàng tháng" 219 | 220 | #: utils.py:15 221 | msgid "week" 222 | msgstr "tuần" 223 | 224 | #: utils.py:15 225 | msgid "weeks" 226 | msgstr "hàng tuần" 227 | 228 | #: utils.py:16 229 | msgid "day" 230 | msgstr "ngày" 231 | 232 | #: utils.py:16 233 | msgid "days" 234 | msgstr "hàng ngày" 235 | 236 | #: utils.py:23 237 | #, python-format 238 | msgid "%(number)d %(type)s ago" 239 | msgstr "%(number)d %(type)s trước" 240 | -------------------------------------------------------------------------------- /djangofeeds/locale/zh/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/zh/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/zh/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-12-06 12:24+0100\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: models.py:32 20 | msgid "The feed does not seem to be respond. We will try again later." 21 | msgstr "Feed 无响应,我们将稍后再试。" 22 | 23 | #: models.py:34 24 | msgid "" 25 | "You entered an incorrect URL or the feed you requested does not exist " 26 | "anymore." 27 | msgstr "请求的 feed 不存在或您输入了错误的 URL" 28 | 29 | #: models.py:37 30 | msgid "" 31 | "There was a problem with the feed you provided, please check the URL for " 32 | "mispellings or try again later." 33 | msgstr "缝隙 feed 时遇到问题,请检查 URL 是否拼写正确或再试一次" 34 | 35 | #: models.py:59 models.py:113 36 | msgid "name" 37 | msgstr "名字" 38 | 39 | #: models.py:60 40 | msgid "domain" 41 | msgstr "域名" 42 | 43 | #: models.py:67 44 | msgid "category" 45 | msgstr "分类" 46 | 47 | #: models.py:68 48 | msgid "categories" 49 | msgstr "分类" 50 | 51 | #: models.py:114 52 | msgid "feed URL" 53 | msgstr "feed URL" 54 | 55 | #: models.py:115 56 | msgid "description" 57 | msgstr "描述" 58 | 59 | #: models.py:116 models.py:313 60 | msgid "link" 61 | msgstr "链接" 62 | 63 | #: models.py:117 64 | msgid "E-Tag" 65 | msgstr "E-Tag" 66 | 67 | #: models.py:120 68 | msgid "Last-Modified" 69 | msgstr "最后修改" 70 | 71 | #: models.py:122 72 | msgid "date of last refresh" 73 | msgstr "最后更新日期" 74 | 75 | #: models.py:125 76 | msgid "last error" 77 | msgstr "最后一次错误" 78 | 79 | #: models.py:128 80 | msgid "sort order" 81 | msgstr "排序次序" 82 | 83 | #: models.py:129 84 | msgid "date created" 85 | msgstr "创建日期" 86 | 87 | #: models.py:130 88 | msgid "date changed" 89 | msgstr "修改日期" 90 | 91 | #: models.py:133 92 | msgid "last requested" 93 | msgstr "最后请求" 94 | 95 | #: models.py:135 96 | msgid "is active" 97 | msgstr "是活跃的" 98 | 99 | #: models.py:136 100 | msgid "frequency" 101 | msgstr "频率" 102 | 103 | #: models.py:142 104 | msgid "syndication feed" 105 | msgstr "联合 feed" 106 | 107 | #: models.py:143 108 | msgid "syndication feeds" 109 | msgstr "联合 feed" 110 | 111 | #: models.py:256 112 | msgid "URL" 113 | msgstr "URL" 114 | 115 | #: models.py:257 116 | msgid "type" 117 | msgstr "类型" 118 | 119 | #: models.py:258 120 | msgid "length" 121 | msgstr "长度" 122 | 123 | #: models.py:263 124 | msgid "enclosure" 125 | msgstr "附件" 126 | 127 | #: models.py:264 128 | msgid "enclosures" 129 | msgstr "附件" 130 | 131 | #: models.py:312 132 | msgid "title" 133 | msgstr "标题" 134 | 135 | #: models.py:314 136 | msgid "content" 137 | msgstr "内容" 138 | 139 | #: models.py:315 140 | msgid "guid" 141 | msgstr "guid" 142 | 143 | #: models.py:316 144 | msgid "author" 145 | msgstr "作者" 146 | 147 | #: models.py:317 148 | msgid "date published" 149 | msgstr "发布日期" 150 | 151 | #: models.py:318 152 | msgid "date updated" 153 | msgstr "更新日期" 154 | 155 | #: models.py:329 156 | msgid "post" 157 | msgstr "文章" 158 | 159 | #: models.py:330 160 | msgid "posts" 161 | msgstr "文章" 162 | 163 | #: utils.py:8 164 | msgid "just now" 165 | msgstr "现在" 166 | 167 | #: utils.py:9 168 | #, python-format 169 | msgid "%(seconds)d second ago" 170 | msgstr "%(seconds)d 秒前" 171 | 172 | #: utils.py:9 173 | #, python-format 174 | msgid "%(seconds)d seconds ago" 175 | msgstr "%(seconds)d 秒前" 176 | 177 | #: utils.py:10 178 | #, python-format 179 | msgid "%(minutes)d minute ago" 180 | msgstr "%(minutes)d 分钟前" 181 | 182 | #: utils.py:10 183 | #, python-format 184 | msgid "%(minutes)d minutes ago" 185 | msgstr "%(minutes)d 分钟前" 186 | 187 | #: utils.py:11 188 | #, python-format 189 | msgid "%(hours)d hour ago" 190 | msgstr "%(hours)d 小时前" 191 | 192 | #: utils.py:11 193 | #, python-format 194 | msgid "%(hours)d hours ago" 195 | msgstr "%(hours)d 小时前" 196 | 197 | #: utils.py:12 198 | #, python-format 199 | msgid "yesterday at %(time)s" 200 | msgstr "昨天 %(time)s" 201 | 202 | #: utils.py:13 203 | msgid "year" 204 | msgstr "年" 205 | 206 | #: utils.py:13 207 | msgid "years" 208 | msgstr "年" 209 | 210 | #: utils.py:14 211 | msgid "month" 212 | msgstr "月" 213 | 214 | #: utils.py:14 215 | msgid "months" 216 | msgstr "月" 217 | 218 | #: utils.py:15 219 | msgid "week" 220 | msgstr "周" 221 | 222 | #: utils.py:15 223 | msgid "weeks" 224 | msgstr "周" 225 | 226 | #: utils.py:16 227 | msgid "day" 228 | msgstr "天" 229 | 230 | #: utils.py:16 231 | msgid "days" 232 | msgstr "天" 233 | 234 | #: utils.py:23 235 | #, python-format 236 | msgid "%(number)d %(type)s ago" 237 | msgstr "%(number)d %(type)s 之前" 238 | -------------------------------------------------------------------------------- /djangofeeds/locale/zh_CN/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/zh_CN/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/zh_CN/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-11-26 15:59+0100\n" 11 | "PO-Revision-Date: 2010-12-02 12:58+0100\n" 12 | "Last-Translator: Slawek Sochaj \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Language: \n" 18 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "这个订阅似乎没有回应,我们会稍后再试。" 23 | 24 | #: models.py:34 25 | msgid "You entered an incorrect URL or the feed you requested does not exist anymore." 26 | msgstr "您可能填写了一个错误的URL,或者这个订阅并不存在" 27 | 28 | #: models.py:37 29 | msgid "There was a problem with the feed you provided, please check the URL for mispellings or try again later." 30 | msgstr "您提供的订阅有一个错误,请检查一下您输入的URL是否出错,并稍后重试" 31 | 32 | #: models.py:59 models.py:113 33 | msgid "name" 34 | msgstr "名称" 35 | 36 | #: models.py:60 37 | msgid "domain" 38 | msgstr "域" 39 | 40 | #: models.py:67 41 | msgid "category" 42 | msgstr "目录" 43 | 44 | #: models.py:68 45 | msgid "categories" 46 | msgstr "目录" 47 | 48 | #: models.py:114 49 | msgid "feed URL" 50 | msgstr "订阅地址" 51 | 52 | #: models.py:115 53 | msgid "description" 54 | msgstr "介绍" 55 | 56 | #: models.py:116 models.py:313 57 | msgid "link" 58 | msgstr "链接" 59 | 60 | #: models.py:117 61 | msgid "E-Tag" 62 | msgstr "标签" 63 | 64 | #: models.py:120 65 | msgid "Last-Modified" 66 | msgstr "最后修改" 67 | 68 | #: models.py:122 69 | msgid "date of last refresh" 70 | msgstr "最后更新日期" 71 | 72 | #: models.py:125 73 | msgid "last error" 74 | msgstr "最后一个错误" 75 | 76 | #: models.py:128 77 | msgid "sort order" 78 | msgstr "排序" 79 | 80 | #: models.py:129 81 | msgid "date created" 82 | msgstr "创建日期" 83 | 84 | #: models.py:130 85 | msgid "date changed" 86 | msgstr "修改后的日期" 87 | 88 | #: models.py:133 89 | msgid "last requested" 90 | msgstr "最后一次请求" 91 | 92 | #: models.py:135 93 | msgid "is active" 94 | msgstr "活跃的" 95 | 96 | #: models.py:136 97 | msgid "frequency" 98 | msgstr "频率" 99 | 100 | #: models.py:142 101 | msgid "syndication feed" 102 | msgstr "聚合订阅" 103 | 104 | #: models.py:143 105 | msgid "syndication feeds" 106 | msgstr "聚合订阅" 107 | 108 | #: models.py:256 109 | msgid "URL" 110 | msgstr "URL" 111 | 112 | #: models.py:257 113 | msgid "type" 114 | msgstr "类型" 115 | 116 | #: models.py:258 117 | msgid "length" 118 | msgstr "长度" 119 | 120 | #: models.py:263 121 | msgid "enclosure" 122 | msgstr "附件" 123 | 124 | #: models.py:264 125 | msgid "enclosures" 126 | msgstr "附件" 127 | 128 | #: models.py:312 129 | msgid "title" 130 | msgstr "标题" 131 | 132 | #: models.py:314 133 | msgid "content" 134 | msgstr "内容" 135 | 136 | #: models.py:315 137 | msgid "guid" 138 | msgstr "引导" 139 | 140 | #: models.py:316 141 | msgid "author" 142 | msgstr "作者" 143 | 144 | #: models.py:317 145 | msgid "date published" 146 | msgstr "发布日期" 147 | 148 | #: models.py:318 149 | msgid "date updated" 150 | msgstr "更新日期" 151 | 152 | #: models.py:329 153 | msgid "post" 154 | msgstr "文章" 155 | 156 | #: models.py:330 157 | msgid "posts" 158 | msgstr "文章" 159 | 160 | #: utils.py:8 161 | msgid "just now" 162 | msgstr "刚才" 163 | 164 | #: utils.py:9 165 | #, python-format 166 | msgid "%(seconds)d second ago" 167 | msgstr "%(seconds)d 秒以前" 168 | 169 | #: utils.py:9 170 | #, python-format 171 | msgid "%(seconds)d seconds ago" 172 | msgstr "%(seconds)d 秒以前" 173 | 174 | #: utils.py:10 175 | #, python-format 176 | msgid "%(minutes)d minute ago" 177 | msgstr "%(minutes)d 分钟以前" 178 | 179 | #: utils.py:10 180 | #, python-format 181 | msgid "%(minutes)d minutes ago" 182 | msgstr "%(minutes)d 分钟以前" 183 | 184 | #: utils.py:11 185 | #, python-format 186 | msgid "%(hours)d hour ago" 187 | msgstr "%(hours)d 个小时以前" 188 | 189 | #: utils.py:11 190 | #, python-format 191 | msgid "%(hours)d hours ago" 192 | msgstr "%(hours)d 个小时以前" 193 | 194 | #: utils.py:12 195 | #, python-format 196 | msgid "yesterday at %(time)s" 197 | msgstr "在昨天的 %(time)s" 198 | 199 | #: utils.py:13 200 | msgid "year" 201 | msgstr "年" 202 | 203 | #: utils.py:13 204 | msgid "years" 205 | msgstr "年" 206 | 207 | #: utils.py:14 208 | msgid "month" 209 | msgstr "月" 210 | 211 | #: utils.py:14 212 | msgid "months" 213 | msgstr "月" 214 | 215 | #: utils.py:15 216 | msgid "week" 217 | msgstr "周" 218 | 219 | #: utils.py:15 220 | msgid "weeks" 221 | msgstr "周" 222 | 223 | #: utils.py:16 224 | msgid "day" 225 | msgstr "天" 226 | 227 | #: utils.py:16 228 | msgid "days" 229 | msgstr "天" 230 | 231 | #: utils.py:23 232 | #, python-format 233 | msgid "%(number)d %(type)s ago" 234 | msgstr "%(number)d %(type)s 以前" 235 | -------------------------------------------------------------------------------- /djangofeeds/locale/zh_TW/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/locale/zh_TW/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /djangofeeds/locale/zh_TW/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-11-26 15:59+0100\n" 11 | "PO-Revision-Date: 2010-12-02 12:58+0100\n" 12 | "Last-Translator: Slawek Sochaj \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Language: \n" 18 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 19 | 20 | #: models.py:32 21 | msgid "The feed does not seem to be respond. We will try again later." 22 | msgstr "這個訂閱似乎沒有回應,我們會稍後再試。" 23 | 24 | #: models.py:34 25 | msgid "You entered an incorrect URL or the feed you requested does not exist anymore." 26 | msgstr "您輸入了一個錯誤的網址,或是這個訂閱不存在。" 27 | 28 | #: models.py:37 29 | msgid "There was a problem with the feed you provided, please check the URL for mispellings or try again later." 30 | msgstr "您提供的訂閱發生了錯誤,請解茶一下您輸入的網址是否出錯並稍後再試。" 31 | 32 | #: models.py:59 models.py:113 33 | msgid "name" 34 | msgstr "名稱" 35 | 36 | #: models.py:60 37 | msgid "domain" 38 | msgstr "域名" 39 | 40 | #: models.py:67 41 | msgid "category" 42 | msgstr "目錄" 43 | 44 | #: models.py:68 45 | msgid "categories" 46 | msgstr "目錄" 47 | 48 | #: models.py:114 49 | msgid "feed URL" 50 | msgstr "訂閱位址" 51 | 52 | #: models.py:115 53 | msgid "description" 54 | msgstr "介紹" 55 | 56 | #: models.py:116 models.py:313 57 | msgid "link" 58 | msgstr "連結" 59 | 60 | #: models.py:117 61 | msgid "E-Tag" 62 | msgstr "標籤" 63 | 64 | #: models.py:120 65 | msgid "Last-Modified" 66 | msgstr "上次修改" 67 | 68 | #: models.py:122 69 | msgid "date of last refresh" 70 | msgstr "最後更新日期" 71 | 72 | #: models.py:125 73 | msgid "last error" 74 | msgstr "上一個錯誤" 75 | 76 | #: models.py:128 77 | msgid "sort order" 78 | msgstr "排序" 79 | 80 | #: models.py:129 81 | msgid "date created" 82 | msgstr "建立日期" 83 | 84 | #: models.py:130 85 | msgid "date changed" 86 | msgstr "修改的日期" 87 | 88 | #: models.py:133 89 | msgid "last requested" 90 | msgstr "上一次要求" 91 | 92 | #: models.py:135 93 | msgid "is active" 94 | msgstr "使用中" 95 | 96 | #: models.py:136 97 | msgid "frequency" 98 | msgstr "頻率" 99 | 100 | #: models.py:142 101 | msgid "syndication feed" 102 | msgstr "集合訂閱" 103 | 104 | #: models.py:143 105 | msgid "syndication feeds" 106 | msgstr "集合訂閱" 107 | 108 | #: models.py:256 109 | msgid "URL" 110 | msgstr "URL" 111 | 112 | #: models.py:257 113 | msgid "type" 114 | msgstr "類型" 115 | 116 | #: models.py:258 117 | msgid "length" 118 | msgstr "長度" 119 | 120 | #: models.py:263 121 | msgid "enclosure" 122 | msgstr "附件" 123 | 124 | #: models.py:264 125 | msgid "enclosures" 126 | msgstr "附件" 127 | 128 | #: models.py:312 129 | msgid "title" 130 | msgstr "標題" 131 | 132 | #: models.py:314 133 | msgid "content" 134 | msgstr "內容" 135 | 136 | #: models.py:315 137 | msgid "guid" 138 | msgstr "引言" 139 | 140 | #: models.py:316 141 | msgid "author" 142 | msgstr "作者" 143 | 144 | #: models.py:317 145 | msgid "date published" 146 | msgstr "發佈日期" 147 | 148 | #: models.py:318 149 | msgid "date updated" 150 | msgstr "更新日期" 151 | 152 | #: models.py:329 153 | msgid "post" 154 | msgstr "文章" 155 | 156 | #: models.py:330 157 | msgid "posts" 158 | msgstr "文章" 159 | 160 | #: utils.py:8 161 | msgid "just now" 162 | msgstr "剛才" 163 | 164 | #: utils.py:9 165 | #, python-format 166 | msgid "%(seconds)d second ago" 167 | msgstr "%(seconds)d 秒以前" 168 | 169 | #: utils.py:9 170 | #, python-format 171 | msgid "%(seconds)d seconds ago" 172 | msgstr "%(seconds)d 秒以前" 173 | 174 | #: utils.py:10 175 | #, python-format 176 | msgid "%(minutes)d minute ago" 177 | msgstr "%(minutes)d 分鐘以前" 178 | 179 | #: utils.py:10 180 | #, python-format 181 | msgid "%(minutes)d minutes ago" 182 | msgstr "%(minutes)d 分鐘以前" 183 | 184 | #: utils.py:11 185 | #, python-format 186 | msgid "%(hours)d hour ago" 187 | msgstr "%(hours)d 個小時以前" 188 | 189 | #: utils.py:11 190 | #, python-format 191 | msgid "%(hours)d hours ago" 192 | msgstr "%(hours)d 個小時以前" 193 | 194 | #: utils.py:12 195 | #, python-format 196 | msgid "yesterday at %(time)s" 197 | msgstr "於昨天的 %(time)s" 198 | 199 | #: utils.py:13 200 | msgid "year" 201 | msgstr "年" 202 | 203 | #: utils.py:13 204 | msgid "years" 205 | msgstr "年" 206 | 207 | #: utils.py:14 208 | msgid "month" 209 | msgstr "月" 210 | 211 | #: utils.py:14 212 | msgid "months" 213 | msgstr "月" 214 | 215 | #: utils.py:15 216 | msgid "week" 217 | msgstr "周" 218 | 219 | #: utils.py:15 220 | msgid "weeks" 221 | msgstr "周" 222 | 223 | #: utils.py:16 224 | msgid "day" 225 | msgstr "天" 226 | 227 | #: utils.py:16 228 | msgid "days" 229 | msgstr "天" 230 | 231 | #: utils.py:23 232 | #, python-format 233 | msgid "%(number)d %(type)s ago" 234 | msgstr "%(number)d %(type)s 以前" 235 | -------------------------------------------------------------------------------- /djangofeeds/maintenance.py: -------------------------------------------------------------------------------- 1 | from django.db import transaction 2 | 3 | from djangofeeds.models import Feed 4 | 5 | 6 | @transaction.commit_manually 7 | def expire_posts(min_posts=20, commit_every=10000): 8 | """Expire old posts for all feeds in the system. 9 | 10 | :keyword min_posts: Maximum number of posts to keep in a feed. 11 | Default is 20. 12 | :keyword commit_every: Commit transaction every ``n`` posts. 13 | Default is 10,000. 14 | 15 | """ 16 | total = 0 17 | for feed in Feed.objects.all(): 18 | print("Expiring posts for %s" % feed.feed_url) 19 | try: 20 | deleted = feed.expire_old_posts(min_posts=min_posts) 21 | except BaseException: 22 | transaction.rollback() 23 | else: 24 | total += deleted 25 | if not total % commit_every: 26 | transaction.commit() 27 | -------------------------------------------------------------------------------- /djangofeeds/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/management/__init__.py -------------------------------------------------------------------------------- /djangofeeds/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/management/commands/__init__.py -------------------------------------------------------------------------------- /djangofeeds/management/commands/refreshfeeds.py: -------------------------------------------------------------------------------- 1 | from __future__ import with_statement 2 | 3 | import sys 4 | from optparse import make_option 5 | 6 | from django.core.management.base import NoArgsCommand 7 | 8 | from djangofeeds.tasks import refresh_feed 9 | from djangofeeds.models import Feed 10 | from djangofeeds.importers import FeedImporter 11 | 12 | 13 | def print_feed_summary(feed_obj): 14 | """Dump a summary of the feed (how many posts etc.).""" 15 | posts = feed_obj.get_posts() 16 | enclosures_count = sum([post.enclosures.count() for post in posts]) 17 | categories_count = sum([post.categories.count() for post in posts]) \ 18 | + feed_obj.categories.count() 19 | sys.stderr.write("*** Total %d posts, %d categories, %d enclosures\n" % \ 20 | (len(posts), categories_count, enclosures_count)) 21 | 22 | 23 | def refresh_all(verbose=True): 24 | """ Refresh all feeds in the system. """ 25 | importer = FeedImporter() 26 | for feed_obj in importer.feed_model.objects.all(): 27 | sys.stderr.write(">>> Refreshing feed %s...\n" % \ 28 | (feed_obj.name)) 29 | feed_obj = importer.update_feed(feed_obj) 30 | 31 | if verbose: 32 | print_feed_summary(feed_obj) 33 | 34 | 35 | def refresh_all_feeds_delayed(from_file=None): 36 | urls = (feed.feed_url for feed in Feed.objects.all()) 37 | if from_file is not None: 38 | with file(from_file) as feedfile: 39 | urls = iter(feedfile.readlines()) 40 | 41 | map(refresh_feed.delay, urls) 42 | 43 | 44 | class Command(NoArgsCommand): 45 | option_list = NoArgsCommand.option_list + ( 46 | make_option('--lazy', '-l', 47 | action="store_true", dest="lazy", default=False, 48 | help="Delay the actual importing to celery"), 49 | make_option('--file', '-f', action="store", dest="file", 50 | help="Import all feeds from a file with feed URLs " 51 | "seperated by newline."), 52 | ) 53 | 54 | help = ("Refresh feeds", ) 55 | 56 | requires_model_validation = True 57 | can_import_settings = True 58 | 59 | def handle_noargs(self, **options): 60 | lazy = options.get("lazy") 61 | from_file = options.get("file") 62 | if from_file or lazy: 63 | refresh_all_feeds_delayed(from_file) 64 | else: 65 | refresh_all() 66 | -------------------------------------------------------------------------------- /djangofeeds/managers.py: -------------------------------------------------------------------------------- 1 | import pytz 2 | from datetime import timedelta, datetime 3 | 4 | from django.db import models 5 | from django.db.models.query import QuerySet 6 | from django.core.exceptions import MultipleObjectsReturned 7 | 8 | from djangofeeds.utils import truncate_field_data 9 | 10 | """ .. data:: DEFAULT_POST_LIMIT 11 | 12 | The default limit of number of posts to keep in a feed. 13 | Default is 5 posts. 14 | 15 | """ 16 | DEFAULT_POST_LIMIT = 25 17 | 18 | 19 | def update_with_dict(obj, fields): 20 | """Update and save a model from the values of a :class:`dict`.""" 21 | set_value = lambda (name, val): setattr(obj, name, val) 22 | map(set_value, fields.items()) 23 | obj.save() 24 | return obj 25 | 26 | 27 | class ExtendedQuerySet(QuerySet): 28 | 29 | def update_or_create(self, **kwargs): 30 | obj, created = self.get_or_create(**kwargs) 31 | 32 | if not created: 33 | fields = dict(kwargs.pop("defaults", {})) 34 | fields.update(kwargs) 35 | update_with_dict(obj, fields) 36 | 37 | return obj 38 | 39 | def since(self, interval): 40 | """Return all the feeds refreshed since a specified 41 | amount of seconds.""" 42 | threshold = datetime.now(pytz.utc) - timedelta(seconds=interval) 43 | return self.filter(date_last_refresh__lt=threshold) 44 | 45 | def ratio(self, min=None, max=None): 46 | """Select feeds based on ratio. 47 | 48 | :param min: Don't include feeds with a ratio lower than this. 49 | :param max: Don't include feeds with a ratio higher than this. 50 | 51 | """ 52 | query = {} 53 | if min is not None: 54 | query["ratio__gt"] = min 55 | if max is not None: 56 | query["ratio__lt"] = max 57 | return self.filter(**query) 58 | 59 | def frequency(self, min=None, max=None): 60 | """Select feeds based on update frequency. 61 | 62 | :param min: Don't include feeds with a frequency lower than this. 63 | :param max: Don't include feeds with a frequency higher than this. 64 | 65 | """ 66 | query = {} 67 | if min is not None: 68 | query["freq__gt"] = min 69 | if max is not None: 70 | query["freq__lt"] = max 71 | return self.filter(**query) 72 | 73 | 74 | class ExtendedManager(models.Manager): 75 | """Manager supporting :meth:`update_or_create`.""" 76 | 77 | def get_query_set(self): 78 | return ExtendedQuerySet(self.model) 79 | 80 | def update_or_create(self, **kwargs): 81 | return self.get_query_set().update_or_create(**kwargs) 82 | 83 | 84 | class FeedManager(ExtendedManager): 85 | """Manager for :class:`djangofeeds.models.Feed`.""" 86 | 87 | def since(self, interval): 88 | return self.get_query_set().since(interval) 89 | 90 | def ratio(self, *args, **kwargs): 91 | return self.get_query_set().ratio(*args, **kwargs) 92 | 93 | def frequency(self, *args, **kwargs): 94 | return self.get_query_set().frequency(*args, **kwargs) 95 | 96 | 97 | class PostManager(ExtendedManager): 98 | """Manager class for Posts""" 99 | 100 | def all_by_order(self, limit=DEFAULT_POST_LIMIT): 101 | """Get feeds using the default sort order.""" 102 | ordering = self.model._meta.ordering 103 | return self.all().order_by(*ordering)[:limit] 104 | 105 | def update_or_create(self, feed_obj, **fields): 106 | """Update post with new values.""" 107 | super_update = super(PostManager, self).update_or_create 108 | defaults = truncate_field_data(self.model, fields) 109 | try: 110 | return super_update(guid=defaults["guid"], feed=feed_obj, 111 | defaults=defaults) 112 | except MultipleObjectsReturned: 113 | self.filter(guid=defaults["guid"], feed=feed_obj).delete() 114 | super_update(guid=defaults["guid"], feed=feed_obj, 115 | defaults=defaults) 116 | 117 | 118 | class CategoryManager(ExtendedManager): 119 | pass 120 | 121 | 122 | class EnclosureManager(ExtendedManager): 123 | pass 124 | -------------------------------------------------------------------------------- /djangofeeds/optimization.py: -------------------------------------------------------------------------------- 1 | import BeautifulSoup 2 | from HTMLParser import HTMLParseError 3 | from django.conf import settings 4 | import re 5 | 6 | DJANGOFEEDS_REMOVE_TRACKERS = getattr(settings, 7 | "DJANGOFEEDS_REMOVE_TRACKERS", True) 8 | 9 | # The obvious tracker images 10 | DJANGOFEEDS_TRACKER_SERVICES = getattr(settings, 11 | "DJANGOFEEDS_TRACKER_SERVICES", [ 12 | 'http://feedads', 13 | 'http://feeds.feedburner.com/~r/', 14 | 'http://feeds.feedburner.com/~ff/', 15 | 'http://rss.feedsportal.com/c/', 16 | 'http://ads.pheedo.com/', 17 | 'http://a.rfihub.com/', 18 | 'http://segment-pixel.invitemedia.com/', 19 | 'http://pixel.quantserve.com/', 20 | 'http://feeds.newscientist.com/', 21 | 'http://mf.feeds.reuters.com/c/', 22 | 'http://telegraph.feedsportal.com/c/', 23 | ]) 24 | 25 | DJANGOFEEDS_SMALL_IMAGE_LIMIT = getattr(settings, 26 | "DJANGOFEEDS_SMALL_IMAGE_LIMIT", 50) 27 | 28 | 29 | class PostContentOptimizer(object): 30 | """Remove diverse abberation and annoying content in the posts. 31 | 32 | The idea is to remove some tracker images in the feeds because 33 | these images are a pollution to the user. 34 | 35 | Identified tools that add tracker images and tools into the feeds 36 | 37 | * Feedburner toolbar -- 4 toolbar images, 1 tracker image. 38 | * Pheedcontent.com toolbar -- 4 toolbar images, 1 advertisement image. 39 | * Digg/Reddit generic toolbar - 3 toolbar, no tracker image. 40 | * http://res.feedsportal.com/ -- 2 toolbar images, 1 tracker image. 41 | * http://a.rfihub.com/ -- associated with http://rocketfuelinc.com/, 42 | used for ads or tracking. Not quite sure. 43 | 44 | About 80% of them use feedburner. Few use cases of feeds: 45 | 46 | * feedburner toolbar and tracker 47 | 48 | * WULFMORGENSTALLER 49 | * MarketWatch.com - Top Stories 50 | * Hollywood.com - Recent News 51 | * Wired: entertainement 52 | * Livescience.com 53 | * Reader Digest 54 | 55 | * Pheedcontent.com toolbar 56 | 57 | * Sports News : CBSSports.com 58 | 59 | * Digg/Reddit toolbar 60 | 61 | * Abstruse goose 62 | 63 | * http://res.feedsportal.com/ 64 | 65 | * New scientist.com 66 | 67 | """ 68 | 69 | def looks_like_tracker(self, url): 70 | """Return True if the image URL has to be removed.""" 71 | for service in DJANGOFEEDS_TRACKER_SERVICES: 72 | if url.startswith(service): 73 | return True 74 | return False 75 | 76 | def optimize(self, html): 77 | """Remove unecessary spaces,
and image tracker.""" 78 | 79 | # Remove uneccesary white spaces 80 | html = html.strip() 81 | try: 82 | soup = BeautifulSoup.BeautifulSoup(html) 83 | self.remove_excessive_br(soup) 84 | if DJANGOFEEDS_REMOVE_TRACKERS: 85 | self.remove_trackers(soup) 86 | except HTMLParseError: 87 | return html 88 | 89 | return str(soup).strip() 90 | 91 | def remove_excessive_br(self, soup): 92 | # start with true to remove any starting br tag 93 | last_one_is_br = True 94 | children = soup.childGenerator() 95 | for el in children: 96 | if isinstance(el, BeautifulSoup.Tag): 97 | if el.name == 'br': 98 | if last_one_is_br: 99 | el.replaceWith("") 100 | last_one_is_br = True 101 | else: 102 | last_one_is_br = False 103 | 104 | def remove_trackers(self, soup): 105 | """Remove the trackers.""" 106 | stripped_count = 0 107 | for image in soup("img"): 108 | already_removed = False 109 | 110 | # remove images that looks like tracker 111 | image_source = image.get("src", "") 112 | if (len(image_source) == 0 or 113 | self.looks_like_tracker(image_source)): 114 | image.replaceWith("") 115 | already_removed = True 116 | 117 | # remove small images 118 | try: 119 | image_width = int(image.get("width", 120 | DJANGOFEEDS_SMALL_IMAGE_LIMIT)) 121 | except ValueError: 122 | image_width = None 123 | if (image_width is not None and 124 | image_width < DJANGOFEEDS_SMALL_IMAGE_LIMIT and 125 | not already_removed): 126 | image.replaceWith("") 127 | 128 | # remove links that looks like tracker 129 | for link in soup("a"): 130 | link_href = link.get("href") 131 | if link_href and "://" in link_href: 132 | if self.looks_like_tracker(link_href): 133 | link.replaceWith("") 134 | -------------------------------------------------------------------------------- /djangofeeds/tasks.py: -------------------------------------------------------------------------------- 1 | from django.core.cache import cache 2 | 3 | from celery.utils import noop, chunks 4 | from celery.decorators import task 5 | 6 | from djangofeeds import conf 7 | from djangofeeds.models import Feed 8 | from djangofeeds.importers import FeedImporter 9 | 10 | ENABLE_LOCKS = False 11 | 12 | 13 | @task(ignore_result=True) 14 | def refresh_feed(feed_url, feed_id=None, importer_cls=None, **kwargs): 15 | """Refresh a djangofeed feed, supports multiprocessing. 16 | 17 | :param feed_url: The URL of the feed to refresh. 18 | :keyword feed_id: Optional id of the feed, if not specified 19 | the ``feed_url`` is used instead. 20 | 21 | """ 22 | importer_cls = importer_cls or FeedImporter 23 | feed_id = feed_id or feed_url 24 | lock_id = conf.FEED_LOCK_CACHE_KEY_FMT % feed_id 25 | lock_expires = conf.FEED_LOCK_EXPIRE 26 | 27 | if ENABLE_LOCKS: 28 | is_locked = lambda: str(cache.get(lock_id)) == "true" 29 | acquire_lock = lambda: cache.set(lock_id, "true", lock_expires) 30 | release_lock = lambda: cache.set(lock_id, "nil", 1) 31 | else: 32 | acquire_lock = release_lock = noop 33 | is_locked = lambda: False 34 | 35 | logger = refresh_feed.get_logger(**kwargs) 36 | print("Importing feed %s" % feed_url) 37 | if is_locked(): 38 | logger.error("Feed is already being imported by another process.") 39 | return feed_url 40 | 41 | acquire_lock() 42 | try: 43 | importer = importer_cls(update_on_import=True, logger=logger) 44 | feed_obj = importer.import_feed(feed_url, force=True) 45 | if feed_obj is not None: 46 | feed_obj.expire_old_posts() 47 | finally: 48 | release_lock() 49 | 50 | return feed_url 51 | 52 | 53 | @task(ignore_result=True) 54 | def update_frequency_chunk(feeds, post_limit=10): 55 | for feed in feeds: 56 | feed.update_frequency(limit=post_limit) 57 | 58 | 59 | @task(ignore_result=True) 60 | def collect_frequencies(chunksize=10, post_limit=10): 61 | for chunk in chunks(Feed.objects.all().iterator(), chunksize): 62 | update_frequency_chunk.delay(chunk, post_limit=post_limit) 63 | -------------------------------------------------------------------------------- /djangofeeds/tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Django feeds test suite""" 2 | import unittest 3 | import os 4 | 5 | 6 | def suite(): 7 | loader = unittest.TestLoader() 8 | tests = loader.discover(os.path.dirname(__file__), 9 | pattern='test*.py', top_level_dir=None) 10 | 11 | suite = unittest.TestSuite() 12 | for test in tests: 13 | suite.addTest(test) 14 | 15 | return suite 16 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/bbc_homepage.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/tests/data/bbc_homepage.html -------------------------------------------------------------------------------- /djangofeeds/tests/data/buggy_dates.rss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monsieur Le Chien 6 | 7 | http://www.monsieur-le-chien.fr 8 | 9 | Réflexions vaines et assertions sans fondement d'un contribuable moyen. 10 | 11 | clebard@monsieur-le-chien.fr 12 | 13 | fr 14 | 15 | www.hugues.biz 16 | 17 | webmaster@monsieur-le-chien.fr 18 | 19 | 20 | Le blog de Monsieur le Chien 21 | 22 | http://www.monsieur-le-chien.fr/i/rss.jpg 23 | 24 | http://www.monsieur-le-chien.fr 25 | 26 | 27 | 28 | clebard@monsieur-le-chien.fr 29 | 30 | La dernière planche de Monsieur le Chien - 15/01/2010 31 | 32 | http://www.monsieur-le-chien.fr/index.php?planche=416 33 | 34 | 15/01/2010 CET 35 | 36 | http://www.monsieur-le-chien.fr/index.php?planche=416 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | clebard@monsieur-le-chien.fr 45 | 46 | La dernière planche de Monsieur le Chien - 14/01/2010 47 | 48 | http://www.monsieur-le-chien.fr/index.php?planche=415 49 | 50 | 14/01/2010 CET 51 | 52 | http://www.monsieur-le-chien.fr/index.php?planche=415 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | clebard@monsieur-le-chien.fr 61 | 62 | La dernière planche de Monsieur le Chien - 06/01/2010 63 | 64 | http://www.monsieur-le-chien.fr/index.php?planche=414 65 | 66 | 06/01/2010 CET 67 | 68 | http://www.monsieur-le-chien.fr/index.php?planche=414 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | clebard@monsieur-le-chien.fr 77 | 78 | La dernière planche de Monsieur le Chien - 23/12/2009 79 | 80 | http://www.monsieur-le-chien.fr/index.php?planche=413 81 | 82 | 23/12/2009 CET 83 | 84 | http://www.monsieur-le-chien.fr/index.php?planche=413 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | clebard@monsieur-le-chien.fr 93 | 94 | La dernière planche de Monsieur le Chien - 17/12/2009 95 | 96 | http://www.monsieur-le-chien.fr/index.php?planche=412 97 | 98 | 17/12/2009 CET 99 | 100 | http://www.monsieur-le-chien.fr/index.php?planche=412 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | clebard@monsieur-le-chien.fr 109 | 110 | La dernière planche de Monsieur le Chien - 04/12/2009 111 | 112 | http://www.monsieur-le-chien.fr/index.php?planche=411 113 | 114 | 04/12/2009 CET 115 | 116 | http://www.monsieur-le-chien.fr/index.php?planche=411 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | clebard@monsieur-le-chien.fr 125 | 126 | La dernière planche de Monsieur le Chien - 25/11/2009 127 | 128 | http://www.monsieur-le-chien.fr/index.php?planche=410 129 | 130 | 25/11/2009 CET 131 | 132 | http://www.monsieur-le-chien.fr/index.php?planche=410 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | clebard@monsieur-le-chien.fr 141 | 142 | La dernière planche de Monsieur le Chien - 16/11/2009 143 | 144 | http://www.monsieur-le-chien.fr/index.php?planche=409 145 | 146 | 16/11/2009 CET 147 | 148 | http://www.monsieur-le-chien.fr/index.php?planche=409 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | clebard@monsieur-le-chien.fr 157 | 158 | La dernière planche de Monsieur le Chien - 15/11/2009 159 | 160 | http://www.monsieur-le-chien.fr/index.php?planche=408 161 | 162 | 15/11/2009 CET 163 | 164 | http://www.monsieur-le-chien.fr/index.php?planche=408 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | clebard@monsieur-le-chien.fr 173 | 174 | La dernière planche de Monsieur le Chien - 11/11/2009 175 | 176 | http://www.monsieur-le-chien.fr/index.php?planche=407 177 | 178 | 11/11/2009 CET 179 | 180 | http://www.monsieur-le-chien.fr/index.php?planche=407 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/buggy_dates_and_guid.rss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monsieur Le Chien 6 | 7 | http://www.monsieur-le-chien.fr 8 | 9 | Réflexions vaines et assertions sans fondement d'un contribuable moyen. 10 | 11 | clebard@monsieur-le-chien.fr 12 | 13 | fr 14 | 15 | www.hugues.biz 16 | 17 | webmaster@monsieur-le-chien.fr 18 | 19 | 20 | Le blog de Monsieur le Chien 21 | 22 | http://www.monsieur-le-chien.fr/i/rss.jpg 23 | 24 | http://www.monsieur-le-chien.fr 25 | 26 | 27 | 28 | clebard@monsieur-le-chien.fr 29 | 30 | La dernière planche de Monsieur le Chien - 15/01/2010 31 | 32 | http://www.monsieur-le-chien.fr/index.php?planche=416 33 | 34 | 15/01/2010 CET 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | clebard@monsieur-le-chien.fr 44 | La dernière planche de Monsieur le Chien - 14/01/2010 45 | http://www.monsieur-le-chien.fr/index.php?planche=415 46 | 47 | 14/01/2010 CET 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | clebard@monsieur-le-chien.fr 57 | La dernière planche de Monsieur le Chien - 06/01/2010 58 | http://www.monsieur-le-chien.fr/index.php?planche=414 59 | 60 | 06/01/2010 CET 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | clebard@monsieur-le-chien.fr 70 | La dernière planche de Monsieur le Chien - 23/12/2009 71 | 72 | http://www.monsieur-le-chien.fr/index.php?planche=413 73 | 74 | 23/12/2009 CET 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | clebard@monsieur-le-chien.fr 84 | La dernière planche de Monsieur le Chien - 17/12/2009 85 | http://www.monsieur-le-chien.fr/index.php?planche=412 86 | 87 | 17/12/2009 CET 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/example_empty.feed.rss: -------------------------------------------------------------------------------- 1 | 7 | 8 | Comments for 笑来教育信息咨询有限公司 9 | 10 | http://www.xiaolai.net 11 | XiaoLai Educational Information Consulting Company 12 | 13 | http://wordpress.org/?v=2.8.4 14 | hourly 15 | 1 16 | 17 | 18 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/fakultet.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/tests/data/fakultet.xml -------------------------------------------------------------------------------- /djangofeeds/tests/data/no-steam.rss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/tests/data/no-steam.rss -------------------------------------------------------------------------------- /djangofeeds/tests/data/opml1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | OPML Tests 5 | Thu, 12 Sep 2009 23:35:52 GMT 6 | Fri, 12 Sep 2009 23:45:37 GMT 7 | Portal 8 | newsfor@news4humans.com 9 | http://news4humans.com/feedonfeeds.opml 10 | 11 | 12 | 13 | 15 | 17 | 18 | 19 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/poker_pl.rss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/djangofeeds/tests/data/poker_pl.rss -------------------------------------------------------------------------------- /djangofeeds/tests/data/t1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Saturday Morning Breakfast Cereal (updated daily) 5 | http://www.smbc-comics.com 6 | The Saturday Morning Breakfast Cereal Blog 7 | en-us 8 | 9 | http://www.smbc-comics.com/index.php?db=comics&id=1705 10 | November 20, 2009 11 |
12 | BAM! Comic on time!
13 |
14 | Can anyone explain to me why SMBC might get banned from being submitted on digg? I haven't had any luck getting through to a human, so I thought I'd ask the INTERNET. (PS: To be clear, I'm not looking for anyone to cause trouble or go for "Internet justice." Just thought I'd see if I could reach someone in the know)]]>
15 | Fri, 20 Nov 2009 00:00:00 -0500 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/t2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Saturday Morning Breakfast Cereal (updated daily) 5 | http://www.smbc-comics.com 6 | The Saturday Morning Breakfast Cereal Blog 7 | en-us 8 | 9 | http://www.smbc-comics.com/index.php?db=comics&id=1708 10 | November 23, 2009 11 |
12 | It's new video day! Featuring the debut of Felicity Doyle. Mark your calendars, lads. It's a date to remember.
13 |
14 | ]]>
15 | Mon, 23 Nov 2009 00:00:00 -0500 16 |
17 | 18 | http://www.smbc-comics.com/index.php?db=comics&id=1707 19 | November 22, 2009 20 |
21 | Oh man, I can't wait to show you guys tomorrow's vid. It's got EFFECTS.]]>
22 | Sun, 22 Nov 2009 00:00:00 -0500 23 |
24 | 25 | http://www.smbc-comics.com/index.php?db=comics&id=1706 26 | November 21, 2009 27 |
28 | Kelly and I had to sample food for wedding planning. This is the first act of wedding planning since deciding to have a wedding that I've actively enjoyed. Coincidentally, it's also the first act of wedding planning that involved free cookies.
29 |
30 | ]]>
31 | Sat, 21 Nov 2009 00:00:00 -0500 32 |
33 | 34 | http://www.smbc-comics.com/index.php?db=comics&id=1705 35 | November 20, 2009 36 |
37 | BAM! Comic on time!
38 |
39 | Can anyone explain to me why SMBC might get banned from being submitted on digg? I haven't had any luck getting through to a human, so I thought I'd ask the INTERNET. (PS: To be clear, I'm not looking for anyone to cause trouble or go for "Internet justice." Just thought I'd see if I could reach someone in the know)]]>
40 | Fri, 20 Nov 2009 00:00:00 -0500 41 |
42 |
43 |
44 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/t3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Saturday Morning Breakfast Cereal (updated daily) 5 | http://www.smbc-comics.com 6 | The Saturday Morning Breakfast Cereal Blog 7 | en-us 8 | 9 | http://www.smbc-comics.com/index.php?db=comics&id=1707 10 | November 22, 2009 11 |
12 | Oh man, I can't wait to show you guys tomorrow's vid. It's got EFFECTS.]]>
13 | Sun, 22 Nov 2009 00:00:00 -0500 14 |
15 | 16 | http://www.smbc-comics.com/index.php?db=comics&id=1706 17 | November 21, 2009 18 |
19 | Kelly and I had to sample food for wedding planning. This is the first act of wedding planning since deciding to have a wedding that I've actively enjoyed. Coincidentally, it's also the first act of wedding planning that involved free cookies.
20 |
21 | ]]>
22 | Sat, 21 Nov 2009 00:00:00 -0500 23 |
24 | 25 | http://www.smbc-comics.com/index.php?db=comics&id=1705 26 | November 20, 2009 27 |
28 | BAM! Comic on time!
29 |
30 | Can anyone explain to me why SMBC might get banned from being submitted on digg? I haven't had any luck getting through to a human, so I thought I'd ask the INTERNET. (PS: To be clear, I'm not looking for anyone to cause trouble or go for "Internet justice." Just thought I'd see if I could reach someone in the know)]]>
31 | Fri, 20 Nov 2009 00:00:00 -0500 32 |
33 |
34 |
35 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/t4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Saturday Morning Breakfast Cereal (updated daily) 5 | http://www.smbc-comics.com 6 | The Saturday Morning Breakfast Cereal Blog 7 | en-us 8 | 9 | http://www.smbc-comics.com/index.php?db=comics&id=1706 10 | November 21, 2009 11 |
12 | Kelly and I had to sample food for wedding planning. This is the first act of wedding planning since deciding to have a wedding that I've actively enjoyed. Coincidentally, it's also the first act of wedding planning that involved free cookies.
13 |
14 | ]]>
15 | Sat, 21 Nov 2009 00:00:00 -0500 16 |
17 | 18 | http://www.smbc-comics.com/index.php?db=comics&id=1705 19 | November 20, 2009 20 |
21 | BAM! Comic on time!
22 |
23 | Can anyone explain to me why SMBC might get banned from being submitted on digg? I haven't had any luck getting through to a human, so I thought I'd ask the INTERNET. (PS: To be clear, I'm not looking for anyone to cause trouble or go for "Internet justice." Just thought I'd see if I could reach someone in the know)]]>
24 | Fri, 20 Nov 2009 00:00:00 -0500 25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /djangofeeds/tests/data/t5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Saturday Morning Breakfast Cereal (updated daily) 5 | http://www.smbc-comics.com 6 | The Saturday Morning Breakfast Cereal Blog 7 | en-us 8 | 9 | http://www.smbc-comics.com/index.php?db=comics&id=1705 10 | November 20, 2009 11 |
12 | BAM! Comic on time!
13 |
14 | Can anyone explain to me why SMBC might get banned from being submitted on digg? I haven't had any luck getting through to a human, so I thought I'd ask the INTERNET. (PS: To be clear, I'm not looking for anyone to cause trouble or go for "Internet justice." Just thought I'd see if I could reach someone in the know)]]>
15 | Fri, 20 Nov 2009 00:00:00 -0500 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /djangofeeds/tests/runners.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.test.simple import run_tests as django_test_runner 3 | 4 | 5 | def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=None, 6 | **kwargs): 7 | """ Test runner that only runs tests for the apps 8 | listed in ``settings.TEST_APPS``. 9 | """ 10 | extra_tests = extra_tests or [] 11 | app_labels = getattr(settings, "TEST_APPS", test_labels) 12 | return django_test_runner(app_labels, 13 | verbosity=verbosity, interactive=interactive, 14 | extra_tests=extra_tests, **kwargs) 15 | -------------------------------------------------------------------------------- /djangofeeds/tests/test_beacon.py: -------------------------------------------------------------------------------- 1 | import unittest2 as unittest 2 | 3 | from djangofeeds import optimization 4 | 5 | IMG1 = "http://feeds.feedburner.com/~r/Wulffmorgenthaler/~4/aFiizovyBmA" 6 | IMG2 = IMG1 + ":qUKuBzXJMEQ:V_sGLiPBpWU" 7 | IMG3 = "http://a.rfihub.com/eus.gif?eui=2224" 8 | 9 | SERVICE_URLS = [IMG3, IMG1] 10 | 11 | IMG_LIMIT = optimization.DJANGOFEEDS_SMALL_IMAGE_LIMIT 12 | 13 | 14 | class test_BeaconRemover(unittest.TestCase): 15 | 16 | def setUp(self): 17 | self.tracker_remover = optimization.PostContentOptimizer() 18 | 19 | def test_01_urls(self): 20 | self.assertIsBeacons(SERVICE_URLS + [IMG2]) 21 | 22 | def test_strip_tracker(self): 23 | some_text = """test %s %s""" 24 | to_img_tag = """""" 25 | img1 = to_img_tag % IMG2 26 | img2 = to_img_tag % "http://feeds.feedburner.com/" 27 | 28 | content = some_text % (img1, img2) 29 | expected_result = some_text % ("", img2) 30 | 31 | self.assertEqual(self.tracker_remover.optimize(content), 32 | expected_result) 33 | 34 | def test_no_optimization(self): 35 | self.assertEqual(self.tracker_remover.optimize(" test "), "test") 36 | 37 | def test_parse_borken_html(self): 38 | broken_html = """""" 39 | self.assertEqual(self.tracker_remover.optimize(broken_html), 40 | """< """) 41 | 42 | def test_remove_extra_br(self): 43 | extra = """



toto 44 |


""" 45 | ecpected_result = """toto\n
""" 46 | self.assertEqual(self.tracker_remover.optimize(extra), 47 | ecpected_result) 48 | 49 | def test_remove_small_image(self): 50 | small_image = """""" % (IMG_LIMIT - 1) 51 | self.assertEqual( 52 | self.tracker_remover.optimize(small_image), 53 | "") 54 | 55 | def test_big_enough_image(self): 56 | big_enough_image = """""" % IMG_LIMIT 57 | self.assertEqual( 58 | self.tracker_remover.optimize(big_enough_image), 59 | '' % IMG_LIMIT) 60 | 61 | def test_remove_tracker(self): 62 | tracker_src = [ 63 | 'http://telegraph.feedsportal.com/c/test', 64 | 'http://rss.feedsportal.com/c/32495/f/479227/s/20113027/mf.gif', 65 | 'http://feeds.newscientist.com/c/749/f/10901/s/1fee0bac/mf.gif' 66 | 'http://ads.pheedo.com/random', 67 | 'http://a.rfihub.com/random', 68 | 'http://segment-pixel.invitemedia.com/random', 69 | ] 70 | for src in tracker_src: 71 | tracker = """""" % (src, IMG_LIMIT + 1) 72 | self.assertEqual(self.tracker_remover.optimize(tracker), '') 73 | 74 | def test_settings(self): 75 | prev = optimization.DJANGOFEEDS_REMOVE_TRACKERS 76 | optimization.DJANGOFEEDS_REMOVE_TRACKERS = False 77 | try: 78 | to_img_tag = """""" 79 | 80 | for url in SERVICE_URLS: 81 | self.assertEqual( 82 | self.tracker_remover.optimize(to_img_tag % url), 83 | to_img_tag % url) 84 | finally: 85 | optimization.DJANGOFEEDS_REMOVE_TRACKERS = prev 86 | 87 | def assertIsBeacon(self, url): 88 | self.assertTrue(self.tracker_remover.looks_like_tracker(url)) 89 | 90 | def assertIsBeacons(self, urls): 91 | map(self.assertIsBeacon, urls) 92 | -------------------------------------------------------------------------------- /djangofeeds/tests/test_conf.py: -------------------------------------------------------------------------------- 1 | import unittest2 as unittest 2 | from datetime import timedelta 3 | 4 | from djangofeeds import conf 5 | 6 | 7 | class TestConf(unittest.TestCase): 8 | 9 | def test_interval(self): 10 | self.assertEqual(conf._interval(timedelta(seconds=10)), 11 | timedelta(seconds=10)) 12 | self.assertEqual(conf._interval(30), timedelta(seconds=30)) 13 | -------------------------------------------------------------------------------- /djangofeeds/tests/test_redis.py: -------------------------------------------------------------------------------- 1 | from __future__ import with_statement 2 | 3 | import unittest2 as unittest 4 | import pytz 5 | from datetime import datetime, timedelta 6 | from functools import wraps 7 | from itertools import count 8 | import socket 9 | 10 | from nose import SkipTest 11 | 12 | 13 | try: 14 | from redis.exceptions import ConnectionError 15 | except ImportError: 16 | class ConnectionError(socket.error): 17 | pass 18 | 19 | try: 20 | import redis 21 | except ImportError: 22 | Entries = None 23 | else: 24 | from djangofeeds.backends.pyredis import Entries 25 | 26 | 27 | def skip_if_redis_not_running(fun): 28 | 29 | @wraps(fun) 30 | def _inner(*args, **kwargs): 31 | if Entries is None: 32 | raise SkipTest("The redis library is not installed.") 33 | try: 34 | return fun(*args, **kwargs) 35 | except ConnectionError, exc: 36 | raise SkipTest("Can't connect to redis server: %s" % (exc, )) 37 | 38 | 39 | class TestRedisBackend(unittest.TestCase): 40 | next_id = count(1).next 41 | 42 | test_data = dict(feed_url="http://rss.com/example/%d", 43 | title="Example Post", 44 | guid="http://rss.com/example/%d", 45 | link="http://rss.com/example/%d", 46 | content="This is an example", 47 | timestamp=datetime.now(pytz.utc)) 48 | 49 | def setUp(self): 50 | self.b = Entries() 51 | self.b.clear() 52 | 53 | def create_post(self, delta=None, **fields): 54 | id = self.next_id() 55 | fields.setdefault("guid", self.test_data["guid"] % (id, )) 56 | fields.setdefault("link", self.test_data["link"] % (id, )) 57 | fields.setdefault("feed_url", self.test_data["feed_url"] % (id, )) 58 | fields.setdefault("timestamp", datetime.now(pytz.utc)) 59 | fields.setdefault("date_updated", fields["timestamp"]) 60 | if delta is not None: 61 | fields["timestamp"] = fields["timestamp"] + delta 62 | ret = dict(self.test_data, **fields) 63 | return ret 64 | 65 | @skip_if_redis_not_running 66 | def test_is_sorted(self): 67 | f = "http://google.com/reader/rss/123" 68 | posts = [self.create_post(feed_url=f, delta=timedelta(hours=-1)), 69 | self.create_post(feed_url=f, delta=timedelta(hours=-2)), 70 | self.create_post(feed_url=f, delta=timedelta(hours=-3)), 71 | self.create_post(feed_url=f, delta=timedelta(hours=-4)), 72 | self.create_post(feed_url=f, delta=timedelta(hours=-5))] 73 | 74 | class MockFeed(object): 75 | def __init__(self, feed_url): 76 | self.feed_url = feed_url 77 | 78 | entries = [self.b.update_or_create(MockFeed(f), **fields) 79 | for fields in posts] 80 | 81 | ordered = self.b.all_by_order(entries[0].feed_url) 82 | self.assertEqual(len(ordered), len(posts)) 83 | 84 | @skip_if_redis_not_running 85 | def test_entry_lifecycle(self): 86 | data = self.create_post() 87 | posts = self.b 88 | entry = posts.Entry(**data) 89 | entry_id = entry.save() 90 | self.assertEqual(entry_id, entry.id) 91 | 92 | lookup = posts.get_by_guid(data["feed_url"], data["guid"]) 93 | self.assertEqual(lookup.id, entry.id) 94 | 95 | stored = posts.get(entry_id) 96 | self.assertDictContainsSubset(data, stored) 97 | 98 | stored.content = "Content has been changed" 99 | changed_data = dict(stored) 100 | new_id = stored.save() 101 | self.assertEqual(stored.id, new_id) 102 | again = posts.get(new_id) 103 | self.assertDictContainsSubset(changed_data, again) 104 | self.assertEqual(again.content, "Content has been changed") 105 | 106 | with self.assertRaises(KeyError): 107 | posts.get("does-not-exist") 108 | 109 | stored.delete() 110 | with self.assertRaises(KeyError): 111 | posts.get(stored.id) 112 | -------------------------------------------------------------------------------- /djangofeeds/tests/test_tasks.py: -------------------------------------------------------------------------------- 1 | import unittest2 as unittest 2 | 3 | CELERY_MISSING = False 4 | try: 5 | from djangofeeds import tasks 6 | except ImportError: 7 | CELERY_MISSING = True 8 | 9 | 10 | class MockImporter(object): 11 | imported = [] 12 | 13 | def __init__(self, *args, **kwargs): 14 | pass 15 | 16 | def import_feed(self, url, **kwargs): 17 | self.__class__.imported.append(url) 18 | 19 | 20 | class TestRefreshFeed(unittest.TestCase): 21 | 22 | @unittest.skipIf(CELERY_MISSING, "Celery is missing") 23 | def test_refresh(self): 24 | tasks.refresh_feed.apply(args=["http://example.com/t.rss"], 25 | kwargs={"importer_cls": MockImporter}).get() 26 | 27 | self.assertIn("http://example.com/t.rss", MockImporter.imported) 28 | 29 | @unittest.skipIf(CELERY_MISSING, "Celery is missing") 30 | def test_refresh_with_locks(self): 31 | prev = tasks.ENABLE_LOCKS 32 | tasks.ENABLE_LOCKS = True 33 | try: 34 | tasks.refresh_feed.apply(args=["http://example.com/t.rss"], 35 | kwargs={"importer_cls": MockImporter}).get() 36 | 37 | self.assertIn("http://example.com/t.rss", MockImporter.imported) 38 | finally: 39 | tasks.ENABLE_LOCKS = prev 40 | 41 | @unittest.skipIf(CELERY_MISSING, "Celery is not installed") 42 | def test_refresh_with_locked(self): 43 | 44 | class MockCache(tasks.cache.__class__): 45 | 46 | def __init__(self): 47 | pass 48 | 49 | def get(self, key, *args, **kwargs): 50 | return "true" 51 | 52 | prev = tasks.cache 53 | tasks.cache = MockCache() 54 | try: 55 | tasks.refresh_feed.apply(args=["http://example.com/t.rss"], 56 | kwargs={"importer_cls": MockImporter}).get() 57 | self.assertIn( 58 | "http://example.com/t.rss", MockImporter.imported) 59 | finally: 60 | tasks.cache = prev 61 | -------------------------------------------------------------------------------- /djangofeeds/utils.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import pytz 3 | from datetime import datetime 4 | from django.utils.timezone import utc 5 | 6 | from django.utils.translation import ungettext, ugettext as _ 7 | 8 | _logger = None 9 | 10 | JUST_NOW = _("just now") 11 | SECONDS_AGO = (_("%(seconds)d second ago"), _("%(seconds)d seconds ago")) 12 | MINUTES_AGO = (_("%(minutes)d minute ago"), _("%(minutes)d minutes ago")) 13 | HOURS_AGO = (_("%(hours)d hour ago"), _("%(hours)d hours ago")) 14 | YESTERDAY_AT = _("yesterday at %(time)s") 15 | OLDER_YEAR = (_("year"), _("years")) 16 | OLDER_MONTH = (_("month"), _("months")) 17 | OLDER_WEEK = (_("week"), _("weeks")) 18 | OLDER_DAY = (_("day"), _("days")) 19 | OLDER_CHUNKS = ( 20 | (365.0, OLDER_YEAR), 21 | (30.0, OLDER_MONTH), 22 | (7.0, OLDER_WEEK), 23 | (1.0, OLDER_DAY), 24 | ) 25 | OLDER_AGO = _("%(number)d %(type)s ago") 26 | 27 | 28 | def _un(singular__plural, n=None): 29 | singular, plural = singular__plural 30 | return ungettext(singular, plural, n) 31 | 32 | 33 | def naturaldate(date): 34 | """Convert datetime into a human natural date string.""" 35 | 36 | if not date: 37 | return '' 38 | 39 | now = datetime.now(pytz.utc) 40 | today = datetime(now.year, now.month, now.day, tzinfo=utc) 41 | delta = now - date 42 | delta_midnight = today - date 43 | 44 | days = delta.days 45 | hours = round(delta.seconds / 3600, 0) 46 | minutes = delta.seconds / 60 47 | 48 | if days < 0: 49 | return JUST_NOW 50 | 51 | if days == 0: 52 | if hours == 0: 53 | if minutes > 0: 54 | return _un(MINUTES_AGO, n=minutes) % {"minutes": minutes} 55 | else: 56 | return JUST_NOW 57 | else: 58 | return _un(HOURS_AGO, n=hours) % {"hours": hours} 59 | 60 | if delta_midnight.days == 0: 61 | return YESTERDAY_AT % {"time": date.strftime("%H:%M")} 62 | 63 | count = 0 64 | for chunk, singular_plural in OLDER_CHUNKS: 65 | if days >= chunk: 66 | count = round((delta_midnight.days + 1) / chunk, 0) 67 | type_ = _un(singular_plural, n=count) 68 | break 69 | 70 | return OLDER_AGO % {"number": count, "type": type_} 71 | 72 | 73 | def truncate_by_field(field, value): 74 | """Truncate string value by the model fields ``max_length`` attribute. 75 | 76 | :param field: A Django model field instance. 77 | :param value: The value to truncate. 78 | 79 | """ 80 | if isinstance(value, basestring) and \ 81 | hasattr(field, "max_length") and value > field.max_length: 82 | return value[:field.max_length] 83 | return value 84 | 85 | 86 | def truncate_field_data(model, data): 87 | """Truncate all data fields for model by its ``max_length`` field 88 | attributes. 89 | 90 | :param model: Kind of data (A Django Model instance). 91 | :param data: The data to truncate. 92 | 93 | """ 94 | fields = dict((field.name, field) for field in model._meta.fields) 95 | return dict((name, truncate_by_field(fields[name], value)) 96 | for name, value in data.items()) 97 | 98 | 99 | def get_default_logger(): 100 | """Get the default logger for this application.""" 101 | global _logger 102 | 103 | if _logger is None: 104 | _logger = logging.getLogger("djangofeeds") 105 | channel = logging.StreamHandler() 106 | _logger.addHandler(channel) 107 | _logger.setLevel(logging.WARNING) 108 | return _logger 109 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | 9 | # Internal variables. 10 | PAPEROPT_a4 = -D latex_paper_size=a4 11 | PAPEROPT_letter = -D latex_paper_size=letter 12 | ALLSPHINXOPTS = -d .build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 13 | 14 | .PHONY: help clean html web pickle htmlhelp latex changes linkcheck 15 | 16 | help: 17 | @echo "Please use \`make ' where is one of" 18 | @echo " html to make standalone HTML files" 19 | @echo " pickle to make pickle files" 20 | @echo " json to make JSON files" 21 | @echo " htmlhelp to make HTML files and a HTML help project" 22 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 23 | @echo " changes to make an overview over all changed/added/deprecated items" 24 | @echo " linkcheck to check all external links for integrity" 25 | 26 | clean: 27 | -rm -rf .build/* 28 | 29 | html: 30 | mkdir -p .build/html .build/doctrees 31 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) .build/html 32 | @echo 33 | @echo "Build finished. The HTML pages are in .build/html." 34 | 35 | coverage: 36 | mkdir -p .build/coverage .build/doctrees 37 | $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) .build/coverage 38 | @echo 39 | @echo "Build finished." 40 | 41 | pickle: 42 | mkdir -p .build/pickle .build/doctrees 43 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) .build/pickle 44 | @echo 45 | @echo "Build finished; now you can process the pickle files." 46 | 47 | web: pickle 48 | 49 | json: 50 | mkdir -p .build/json .build/doctrees 51 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) .build/json 52 | @echo 53 | @echo "Build finished; now you can process the JSON files." 54 | 55 | htmlhelp: 56 | mkdir -p .build/htmlhelp .build/doctrees 57 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) .build/htmlhelp 58 | @echo 59 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 60 | ".hhp project file in .build/htmlhelp." 61 | 62 | latex: 63 | mkdir -p .build/latex .build/doctrees 64 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) .build/latex 65 | @echo 66 | @echo "Build finished; the LaTeX files are in .build/latex." 67 | @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ 68 | "run these through (pdf)latex." 69 | 70 | changes: 71 | mkdir -p .build/changes .build/doctrees 72 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) .build/changes 73 | @echo 74 | @echo "The overview file is in .build/changes." 75 | 76 | linkcheck: 77 | mkdir -p .build/linkcheck .build/doctrees 78 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) .build/linkcheck 79 | @echo 80 | @echo "Link check complete; look for any errors in the above output " \ 81 | "or in .build/linkcheck/output.txt." 82 | -------------------------------------------------------------------------------- /docs/_ext/applyxrefs.py: -------------------------------------------------------------------------------- 1 | """Adds xref targets to the top of files.""" 2 | 3 | import sys 4 | import os 5 | 6 | testing = False 7 | 8 | DONT_TOUCH = ( 9 | './index.txt', 10 | ) 11 | 12 | 13 | def target_name(fn): 14 | if fn.endswith('.txt'): 15 | fn = fn[:-4] 16 | return '_' + fn.lstrip('./').replace('/', '-') 17 | 18 | 19 | def process_file(fn, lines): 20 | lines.insert(0, '\n') 21 | lines.insert(0, '.. %s:\n' % target_name(fn)) 22 | try: 23 | f = open(fn, 'w') 24 | except IOError: 25 | print("Can't open %s for writing. Not touching it." % fn) 26 | return 27 | try: 28 | f.writelines(lines) 29 | except IOError: 30 | print("Can't write to %s. Not touching it." % fn) 31 | finally: 32 | f.close() 33 | 34 | 35 | def has_target(fn): 36 | try: 37 | f = open(fn, 'r') 38 | except IOError: 39 | print("Can't open %s. Not touching it." % fn) 40 | return (True, None) 41 | readok = True 42 | try: 43 | lines = f.readlines() 44 | except IOError: 45 | print("Can't read %s. Not touching it." % fn) 46 | readok = False 47 | finally: 48 | f.close() 49 | if not readok: 50 | return (True, None) 51 | 52 | #print fn, len(lines) 53 | if len(lines) < 1: 54 | print("Not touching empty file %s." % fn) 55 | return (True, None) 56 | if lines[0].startswith('.. _'): 57 | return (True, None) 58 | return (False, lines) 59 | 60 | 61 | def main(argv=None): 62 | if argv is None: 63 | argv = sys.argv 64 | 65 | if len(argv) == 1: 66 | argv.extend('.') 67 | 68 | files = [] 69 | for root in argv[1:]: 70 | for (dirpath, dirnames, filenames) in os.walk(root): 71 | files.extend([(dirpath, f) for f in filenames]) 72 | files.sort() 73 | files = [os.path.join(p, fn) for p, fn in files if fn.endswith('.txt')] 74 | #print files 75 | 76 | for fn in files: 77 | if fn in DONT_TOUCH: 78 | print("Skipping blacklisted file %s." % fn) 79 | continue 80 | 81 | target_found, lines = has_target(fn) 82 | if not target_found: 83 | if testing: 84 | print '%s: %s' % (fn, lines[0]), 85 | else: 86 | print "Adding xref to %s" % fn 87 | process_file(fn, lines) 88 | else: 89 | print "Skipping %s: already has a xref" % fn 90 | 91 | if __name__ == '__main__': 92 | sys.exit(main()) 93 | -------------------------------------------------------------------------------- /docs/_ext/djangodocs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Sphinx plugins for Django documentation. 3 | """ 4 | 5 | import docutils.nodes 6 | import docutils.transforms 7 | import sphinx 8 | import sphinx.addnodes 9 | import sphinx.directives 10 | import sphinx.environment 11 | import sphinx.roles 12 | from docutils import nodes 13 | 14 | 15 | def setup(app): 16 | app.add_crossref_type( 17 | directivename="setting", 18 | rolename="setting", 19 | indextemplate="pair: %s; setting", 20 | ) 21 | app.add_crossref_type( 22 | directivename="templatetag", 23 | rolename="ttag", 24 | indextemplate="pair: %s; template tag", 25 | ) 26 | app.add_crossref_type( 27 | directivename="templatefilter", 28 | rolename="tfilter", 29 | indextemplate="pair: %s; template filter", 30 | ) 31 | app.add_crossref_type( 32 | directivename="fieldlookup", 33 | rolename="lookup", 34 | indextemplate="pair: %s, field lookup type", 35 | ) 36 | app.add_description_unit( 37 | directivename="django-admin", 38 | rolename="djadmin", 39 | indextemplate="pair: %s; django-admin command", 40 | parse_node=parse_django_admin_node, 41 | ) 42 | app.add_description_unit( 43 | directivename="django-admin-option", 44 | rolename="djadminopt", 45 | indextemplate="pair: %s; django-admin command-line option", 46 | parse_node=lambda env, sig, signode: \ 47 | sphinx.directives.parse_option_desc(signode, sig), 48 | ) 49 | app.add_config_value('django_next_version', '0.0', True) 50 | app.add_directive('versionadded', parse_version_directive, 1, (1, 1, 1)) 51 | app.add_directive('versionchanged', parse_version_directive, 1, (1, 1, 1)) 52 | app.add_transform(SuppressBlockquotes) 53 | 54 | 55 | def parse_version_directive(name, arguments, options, content, lineno, 56 | content_offset, block_text, state, state_machine): 57 | env = state.document.settings.env 58 | is_nextversion = env.config.django_next_version == arguments[0] 59 | ret = [] 60 | node = sphinx.addnodes.versionmodified() 61 | ret.append(node) 62 | if not is_nextversion: 63 | if len(arguments) == 1: 64 | linktext = 'Please, see the release notes ' % ( 65 | arguments[0]) 66 | xrefs = sphinx.roles.xfileref_role('ref', linktext, linktext, 67 | lineno, state) 68 | node.extend(xrefs[0]) 69 | node['version'] = arguments[0] 70 | else: 71 | node['version'] = "Development version" 72 | node['type'] = name 73 | if len(arguments) == 2: 74 | inodes, messages = state.inline_text(arguments[1], lineno + 1) 75 | node.extend(inodes) 76 | if content: 77 | state.nested_parse(content, content_offset, node) 78 | ret = ret + messages 79 | env.note_versionchange(node['type'], node['version'], node, lineno) 80 | return ret 81 | 82 | 83 | class SuppressBlockquotes(docutils.transforms.Transform): 84 | """ 85 | Remove the default blockquotes that encase indented list, tables, etc. 86 | """ 87 | default_priority = 300 88 | 89 | suppress_blockquote_child_nodes = ( 90 | docutils.nodes.bullet_list, 91 | docutils.nodes.enumerated_list, 92 | docutils.nodes.definition_list, 93 | docutils.nodes.literal_block, 94 | docutils.nodes.doctest_block, 95 | docutils.nodes.line_block, 96 | docutils.nodes.table, 97 | ) 98 | 99 | def apply(self): 100 | for node in self.document.traverse(docutils.nodes.block_quote): 101 | if len(node.children) == 1 and \ 102 | isinstance(node.children[0], 103 | self.suppress_blockquote_child_nodes): 104 | node.replace_self(node.children[0]) 105 | 106 | 107 | def parse_django_admin_node(env, sig, signode): 108 | command = sig.split(' ')[0] 109 | env._django_curr_admin_command = command 110 | title = "django-admin.py %s" % sig 111 | signode += sphinx.addnodes.desc_name(title, title) 112 | return sig 113 | -------------------------------------------------------------------------------- /docs/_ext/literals_to_xrefs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Runs through a reST file looking for old-style literals, and helps replace them 3 | with new-style references. 4 | """ 5 | 6 | import re 7 | import sys 8 | import shelve 9 | 10 | refre = re.compile(r'``([^`\s]+?)``') 11 | 12 | ROLES = ( 13 | 'attr', 14 | 'class', 15 | "djadmin", 16 | 'data', 17 | 'exc', 18 | 'file', 19 | 'func', 20 | 'lookup', 21 | 'meth', 22 | 'mod', 23 | "djadminopt", 24 | "ref", 25 | "setting", 26 | "term", 27 | "tfilter", 28 | "ttag", 29 | 30 | # special 31 | "skip", 32 | ) 33 | 34 | ALWAYS_SKIP = [ 35 | "NULL", 36 | "True", 37 | "False", 38 | ] 39 | 40 | 41 | def fixliterals(fname): 42 | data = open(fname).read() 43 | 44 | last = 0 45 | new = [] 46 | storage = shelve.open("/tmp/literals_to_xref.shelve") 47 | lastvalues = storage.get("lastvalues", {}) 48 | 49 | for m in refre.finditer(data): 50 | 51 | new.append(data[last:m.start()]) 52 | last = m.end() 53 | 54 | line_start = data.rfind("\n", 0, m.start()) 55 | line_end = data.find("\n", m.end()) 56 | prev_start = data.rfind("\n", 0, line_start) 57 | next_end = data.find("\n", line_end + 1) 58 | 59 | # Skip always-skip stuff 60 | if m.group(1) in ALWAYS_SKIP: 61 | new.append(m.group(0)) 62 | continue 63 | 64 | # skip when the next line is a title 65 | next_line = data[m.end():next_end].strip() 66 | if next_line[0] in "!-/:-@[-`{-~" and \ 67 | all(c == next_line[0] for c in next_line): 68 | new.append(m.group(0)) 69 | continue 70 | 71 | sys.stdout.write("\n" + "-" * 80 + "\n") 72 | sys.stdout.write(data[prev_start + 1:m.start()]) 73 | sys.stdout.write(colorize(m.group(0), fg="red")) 74 | sys.stdout.write(data[m.end():next_end]) 75 | sys.stdout.write("\n\n") 76 | 77 | replace_type = None 78 | while replace_type is None: 79 | replace_type = raw_input( 80 | colorize("Replace role: ", fg="yellow")).strip().lower() 81 | if replace_type and replace_type not in ROLES: 82 | replace_type = None 83 | 84 | if replace_type == "": 85 | new.append(m.group(0)) 86 | continue 87 | 88 | if replace_type == "skip": 89 | new.append(m.group(0)) 90 | ALWAYS_SKIP.append(m.group(1)) 91 | continue 92 | 93 | default = lastvalues.get(m.group(1), m.group(1)) 94 | if default.endswith("()") and \ 95 | replace_type in ("class", "func", "meth"): 96 | default = default[:-2] 97 | replace_value = raw_input( 98 | colorize("Text [", fg="yellow") + default + \ 99 | colorize("]: ", fg="yellow")).strip() 100 | if not replace_value: 101 | replace_value = default 102 | new.append(":%s:`%s`" % (replace_type, replace_value)) 103 | lastvalues[m.group(1)] = replace_value 104 | 105 | new.append(data[last:]) 106 | open(fname, "w").write("".join(new)) 107 | 108 | storage["lastvalues"] = lastvalues 109 | storage.close() 110 | 111 | 112 | def colorize(text='', opts=(), **kwargs): 113 | """ 114 | Returns your text, enclosed in ANSI graphics codes. 115 | 116 | Depends on the keyword arguments 'fg' and 'bg', and the contents of 117 | the opts tuple/list. 118 | 119 | Returns the RESET code if no parameters are given. 120 | 121 | Valid colors: 122 | 'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white' 123 | 124 | Valid options: 125 | 'bold' 126 | 'underscore' 127 | 'blink' 128 | 'reverse' 129 | 'conceal' 130 | 'noreset' - string will not be auto-terminated with the RESET code 131 | 132 | Examples: 133 | colorize('hello', fg='red', bg='blue', opts=('blink',)) 134 | colorize() 135 | colorize('goodbye', opts=('underscore',)) 136 | print colorize('first line', fg='red', opts=('noreset',)) 137 | print 'this should be red too' 138 | print colorize('and so should this') 139 | print 'this should not be red' 140 | """ 141 | color_names = ('black', 'red', 'green', 'yellow', 142 | 'blue', 'magenta', 'cyan', 'white') 143 | foreground = dict([(color_names[x], '3%s' % x) for x in range(8)]) 144 | background = dict([(color_names[x], '4%s' % x) for x in range(8)]) 145 | 146 | RESET = '0' 147 | opt_dict = {'bold': '1', 148 | 'underscore': '4', 149 | 'blink': '5', 150 | 'reverse': '7', 151 | 'conceal': '8'} 152 | 153 | text = str(text) 154 | code_list = [] 155 | if text == '' and len(opts) == 1 and opts[0] == 'reset': 156 | return '\x1b[%sm' % RESET 157 | for k, v in kwargs.iteritems(): 158 | if k == 'fg': 159 | code_list.append(foreground[v]) 160 | elif k == 'bg': 161 | code_list.append(background[v]) 162 | for o in opts: 163 | if o in opt_dict: 164 | code_list.append(opt_dict[o]) 165 | if 'noreset' not in opts: 166 | text = text + '\x1b[%sm' % RESET 167 | return ('\x1b[%sm' % ';'.join(code_list)) + text 168 | 169 | if __name__ == '__main__': 170 | try: 171 | fixliterals(sys.argv[1]) 172 | except (KeyboardInterrupt, SystemExit): 173 | print 174 | -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/README.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | How To Install 3 | ============== 4 | 5 | Install in Sphinx 6 | ----------------- 7 | 8 | Copy this directory into the ``sphinx/templates`` directory where Shpinx is installed. For example, a standard install of sphinx on Mac OS X is at ``/Library/Python/2.6/site-packages/Sphinx-0.6.3-py2.6.egg/`` 9 | 10 | Install Somewhere Else 11 | ---------------------- 12 | 13 | If you want to install this theme somewhere else, you will have to modify the ``conf.py`` file. :: 14 | 15 | templates_path = ['/absolute/path/to/dir/','relative/path/'] 16 | 17 | Making Sphinx Use the Theme 18 | --------------------------- 19 | 20 | Edit the ``conf.py`` file and make the following setting: :: 21 | 22 | html_theme = 'ADCtheme' 23 | 24 | Screen Shots 25 | ------------ 26 | 27 | .. image:: http://github.com/coordt/ADCtheme/raw/master/static/scrn1.png 28 | 29 | .. image:: http://github.com/coordt/ADCtheme/raw/master/static/scrn2.png 30 | 31 | To Do 32 | ----- 33 | 34 | * Gotta get the javascript working so the Table of Contents is hide-able. 35 | * Probably lots of css cleanup. -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/breadcrumb_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/breadcrumb_background.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/documentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/documentation.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/header_sm_mid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/header_sm_mid.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/scrn1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/scrn1.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/scrn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/scrn2.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/searchfield_leftcap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/searchfield_leftcap.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/searchfield_repeat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/searchfield_repeat.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/searchfield_rightcap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/searchfield_rightcap.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/title_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/title_background.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/triangle_closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/triangle_closed.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/triangle_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/triangle_left.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/static/triangle_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCTheme/static/triangle_open.png -------------------------------------------------------------------------------- /docs/_theme/ADCTheme/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = adctheme.css 4 | pygments_style = friendly 5 | 6 | -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/README.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | How To Install 3 | ============== 4 | 5 | Install in Sphinx 6 | ----------------- 7 | 8 | Copy this directory into the ``sphinx/templates`` directory where Shpinx is installed. For example, a standard install of sphinx on Mac OS X is at ``/Library/Python/2.6/site-packages/Sphinx-0.6.3-py2.6.egg/`` 9 | 10 | Install Somewhere Else 11 | ---------------------- 12 | 13 | If you want to install this theme somewhere else, you will have to modify the ``conf.py`` file. :: 14 | 15 | templates_path = ['/absolute/path/to/dir/','relative/path/'] 16 | 17 | Making Sphinx Use the Theme 18 | --------------------------- 19 | 20 | Edit the ``conf.py`` file and make the following setting: :: 21 | 22 | html_theme = 'ADCtheme' 23 | 24 | Screen Shots 25 | ------------ 26 | 27 | .. image:: http://github.com/coordt/ADCtheme/raw/master/static/scrn1.png 28 | 29 | .. image:: http://github.com/coordt/ADCtheme/raw/master/static/scrn2.png 30 | 31 | To Do 32 | ----- 33 | 34 | * Gotta get the javascript working so the Table of Contents is hide-able. 35 | * Probably lots of css cleanup. -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "basic/layout.html" %} 2 | {%- block doctype -%} 3 | 5 | {%- endblock %} 6 | {%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} 7 | {%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} 8 | {%- block linktags %} 9 | {%- endblock %} 10 | {%- block extrahead %} {% endblock %} 11 | {%- block header %}{% endblock %} 12 | {%- block relbar1 %} 13 | {% endblock %} 14 | 15 | {%- block sidebar1 %} 16 | {% endblock %} 17 | {%- block document %} 18 |
19 | {%- if not embedded %}{% if not theme_nosidebar|tobool %} 20 |
21 | {%- endif %}{% endif %} 22 |
23 | {% block body %} {% endblock %} 24 |
25 | {%- if not embedded %}{% if not theme_nosidebar|tobool %} 26 |
27 | {%- endif %}{% endif %} 28 |
29 | 43 | {%- endblock %} 44 | {%- block sidebar2 %}{% endblock %} 45 | {%- block relbar2 %}{% endblock %} 46 | {%- block footer %} 47 | {%- endblock %} 48 | -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/breadcrumb_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/breadcrumb_background.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/documentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/documentation.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/header_sm_mid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/header_sm_mid.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/scrn1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/scrn1.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/scrn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/scrn2.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/searchfield_leftcap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/searchfield_leftcap.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/searchfield_repeat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/searchfield_repeat.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/searchfield_rightcap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/searchfield_rightcap.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/title_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/title_background.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/triangle_closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/triangle_closed.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/triangle_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/triangle_left.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/static/triangle_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/ADCThemePrint/static/triangle_open.png -------------------------------------------------------------------------------- /docs/_theme/ADCThemePrint/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = adctheme.css 4 | pygments_style = friendly 5 | 6 | -------------------------------------------------------------------------------- /docs/_theme/agogo/static/bgfooter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/agogo/static/bgfooter.png -------------------------------------------------------------------------------- /docs/_theme/agogo/static/bgtop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/docs/_theme/agogo/static/bgtop.png -------------------------------------------------------------------------------- /docs/_theme/agogo/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = agogo.css 4 | pygments_style = tango 5 | 6 | [options] 7 | bodyfont = "Verdana", Arial, sans-serif 8 | headerfont = "Georgia", "Times New Roman", serif 9 | pagewidth = 70em 10 | documentwidth = 50em 11 | sidebarwidth = 20em 12 | bgcolor = #eeeeec 13 | headerbg = url(bgtop.png) top left repeat-x 14 | footerbg = url(bgfooter.png) top left repeat-x 15 | linkcolor = #ce5c00 16 | headercolor1 = #204a87 17 | headercolor2 = #3465a4 18 | headerlinkcolor = #fcaf3e 19 | -------------------------------------------------------------------------------- /docs/_theme/nature/static/nature.css_t: -------------------------------------------------------------------------------- 1 | /** 2 | * Sphinx stylesheet -- default theme 3 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 | */ 5 | 6 | @import url("basic.css"); 7 | 8 | /* -- page layout ----------------------------------------------------------- */ 9 | 10 | body { 11 | font-family: Arial, sans-serif; 12 | font-size: 100%; 13 | background-color: #111; 14 | color: #555; 15 | margin: 0; 16 | padding: 0; 17 | } 18 | 19 | hr{ 20 | border: 1px solid #B1B4B6; 21 | } 22 | 23 | div.document { 24 | background-color: #eee; 25 | } 26 | 27 | div.body { 28 | background-color: #ffffff; 29 | color: #3E4349; 30 | padding: 0 30px 30px 30px; 31 | font-size: 0.8em; 32 | } 33 | 34 | div.footer { 35 | color: #555; 36 | width: 100%; 37 | padding: 13px 0; 38 | text-align: center; 39 | font-size: 75%; 40 | } 41 | 42 | div.footer a { 43 | color: #444; 44 | text-decoration: underline; 45 | } 46 | 47 | div.related { 48 | background-color: #6BA81E; 49 | line-height: 32px; 50 | color: #fff; 51 | text-shadow: 0px 1px 0 #444; 52 | font-size: 0.80em; 53 | } 54 | 55 | div.related a { 56 | color: #E2F3CC; 57 | } 58 | 59 | div.sphinxsidebar { 60 | font-size: 0.75em; 61 | line-height: 1.5em; 62 | } 63 | 64 | div.sphinxsidebarwrapper{ 65 | padding: 20px 0; 66 | } 67 | 68 | div.sphinxsidebar h3, 69 | div.sphinxsidebar h4 { 70 | font-family: Arial, sans-serif; 71 | color: #222; 72 | font-size: 1.2em; 73 | font-weight: normal; 74 | margin: 0; 75 | padding: 5px 10px; 76 | background-color: #ddd; 77 | text-shadow: 1px 1px 0 white 78 | } 79 | 80 | div.sphinxsidebar h4{ 81 | font-size: 1.1em; 82 | } 83 | 84 | div.sphinxsidebar h3 a { 85 | color: #444; 86 | } 87 | 88 | 89 | div.sphinxsidebar p { 90 | color: #888; 91 | padding: 5px 20px; 92 | } 93 | 94 | div.sphinxsidebar p.topless { 95 | } 96 | 97 | div.sphinxsidebar ul { 98 | margin: 10px 20px; 99 | padding: 0; 100 | color: #000; 101 | } 102 | 103 | div.sphinxsidebar a { 104 | color: #444; 105 | } 106 | 107 | div.sphinxsidebar input { 108 | border: 1px solid #ccc; 109 | font-family: sans-serif; 110 | font-size: 1em; 111 | } 112 | 113 | div.sphinxsidebar input[type=text]{ 114 | margin-left: 20px; 115 | } 116 | 117 | /* -- body styles ----------------------------------------------------------- */ 118 | 119 | a { 120 | color: #005B81; 121 | text-decoration: none; 122 | } 123 | 124 | a:hover { 125 | color: #E32E00; 126 | text-decoration: underline; 127 | } 128 | 129 | div.body h1, 130 | div.body h2, 131 | div.body h3, 132 | div.body h4, 133 | div.body h5, 134 | div.body h6 { 135 | font-family: Arial, sans-serif; 136 | background-color: #BED4EB; 137 | font-weight: normal; 138 | color: #212224; 139 | margin: 30px 0px 10px 0px; 140 | padding: 5px 0 5px 10px; 141 | text-shadow: 0px 1px 0 white 142 | } 143 | 144 | div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; } 145 | div.body h2 { font-size: 150%; background-color: #C8D5E3; } 146 | div.body h3 { font-size: 120%; background-color: #D8DEE3; } 147 | div.body h4 { font-size: 110%; background-color: #D8DEE3; } 148 | div.body h5 { font-size: 100%; background-color: #D8DEE3; } 149 | div.body h6 { font-size: 100%; background-color: #D8DEE3; } 150 | 151 | a.headerlink { 152 | color: #c60f0f; 153 | font-size: 0.8em; 154 | padding: 0 4px 0 4px; 155 | text-decoration: none; 156 | } 157 | 158 | a.headerlink:hover { 159 | background-color: #c60f0f; 160 | color: white; 161 | } 162 | 163 | div.body p, div.body dd, div.body li { 164 | text-align: justify; 165 | line-height: 1.5em; 166 | } 167 | 168 | div.admonition p.admonition-title + p { 169 | display: inline; 170 | } 171 | 172 | div.highlight{ 173 | background-color: white; 174 | } 175 | 176 | div.note { 177 | background-color: #eee; 178 | border: 1px solid #ccc; 179 | } 180 | 181 | div.seealso { 182 | background-color: #ffc; 183 | border: 1px solid #ff6; 184 | } 185 | 186 | div.topic { 187 | background-color: #eee; 188 | } 189 | 190 | div.warning { 191 | background-color: #ffe4e4; 192 | border: 1px solid #f66; 193 | } 194 | 195 | p.admonition-title { 196 | display: inline; 197 | } 198 | 199 | p.admonition-title:after { 200 | content: ":"; 201 | } 202 | 203 | pre { 204 | padding: 10px; 205 | background-color: White; 206 | color: #222; 207 | line-height: 1.2em; 208 | border: 1px solid #C6C9CB; 209 | font-size: 1.2em; 210 | margin: 1.5em 0 1.5em 0; 211 | -webkit-box-shadow: 1px 1px 1px #d8d8d8; 212 | -moz-box-shadow: 1px 1px 1px #d8d8d8; 213 | } 214 | 215 | tt { 216 | background-color: #ecf0f3; 217 | color: #222; 218 | padding: 1px 2px; 219 | font-size: 1.2em; 220 | font-family: monospace; 221 | } -------------------------------------------------------------------------------- /docs/_theme/nature/static/pygments.css: -------------------------------------------------------------------------------- 1 | .c { color: #999988; font-style: italic } /* Comment */ 2 | .k { font-weight: bold } /* Keyword */ 3 | .o { font-weight: bold } /* Operator */ 4 | .cm { color: #999988; font-style: italic } /* Comment.Multiline */ 5 | .cp { color: #999999; font-weight: bold } /* Comment.preproc */ 6 | .c1 { color: #999988; font-style: italic } /* Comment.Single */ 7 | .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ 8 | .ge { font-style: italic } /* Generic.Emph */ 9 | .gr { color: #aa0000 } /* Generic.Error */ 10 | .gh { color: #999999 } /* Generic.Heading */ 11 | .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ 12 | .go { color: #111 } /* Generic.Output */ 13 | .gp { color: #555555 } /* Generic.Prompt */ 14 | .gs { font-weight: bold } /* Generic.Strong */ 15 | .gu { color: #aaaaaa } /* Generic.Subheading */ 16 | .gt { color: #aa0000 } /* Generic.Traceback */ 17 | .kc { font-weight: bold } /* Keyword.Constant */ 18 | .kd { font-weight: bold } /* Keyword.Declaration */ 19 | .kp { font-weight: bold } /* Keyword.Pseudo */ 20 | .kr { font-weight: bold } /* Keyword.Reserved */ 21 | .kt { color: #445588; font-weight: bold } /* Keyword.Type */ 22 | .m { color: #009999 } /* Literal.Number */ 23 | .s { color: #bb8844 } /* Literal.String */ 24 | .na { color: #008080 } /* Name.Attribute */ 25 | .nb { color: #999999 } /* Name.Builtin */ 26 | .nc { color: #445588; font-weight: bold } /* Name.Class */ 27 | .no { color: #ff99ff } /* Name.Constant */ 28 | .ni { color: #800080 } /* Name.Entity */ 29 | .ne { color: #990000; font-weight: bold } /* Name.Exception */ 30 | .nf { color: #990000; font-weight: bold } /* Name.Function */ 31 | .nn { color: #555555 } /* Name.Namespace */ 32 | .nt { color: #000080 } /* Name.Tag */ 33 | .nv { color: purple } /* Name.Variable */ 34 | .ow { font-weight: bold } /* Operator.Word */ 35 | .mf { color: #009999 } /* Literal.Number.Float */ 36 | .mh { color: #009999 } /* Literal.Number.Hex */ 37 | .mi { color: #009999 } /* Literal.Number.Integer */ 38 | .mo { color: #009999 } /* Literal.Number.Oct */ 39 | .sb { color: #bb8844 } /* Literal.String.Backtick */ 40 | .sc { color: #bb8844 } /* Literal.String.Char */ 41 | .sd { color: #bb8844 } /* Literal.String.Doc */ 42 | .s2 { color: #bb8844 } /* Literal.String.Double */ 43 | .se { color: #bb8844 } /* Literal.String.Escape */ 44 | .sh { color: #bb8844 } /* Literal.String.Heredoc */ 45 | .si { color: #bb8844 } /* Literal.String.Interpol */ 46 | .sx { color: #bb8844 } /* Literal.String.Other */ 47 | .sr { color: #808000 } /* Literal.String.Regex */ 48 | .s1 { color: #bb8844 } /* Literal.String.Single */ 49 | .ss { color: #bb8844 } /* Literal.String.Symbol */ 50 | .bp { color: #999999 } /* Name.Builtin.Pseudo */ 51 | .vc { color: #ff99ff } /* Name.Variable.Class */ 52 | .vg { color: #ff99ff } /* Name.Variable.Global */ 53 | .vi { color: #ff99ff } /* Name.Variable.Instance */ 54 | .il { color: #009999 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /docs/_theme/nature/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = basic 3 | stylesheet = nature.css 4 | pygments_style = tango 5 | 6 | [options] 7 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import sys 4 | import os 5 | 6 | # If your extensions are in another directory, add it here. If the directory 7 | # is relative to the documentation root, use os.path.abspath to make it 8 | # absolute, like shown here. 9 | sys.path.append("../djangofeeds") 10 | sys.path.append("../tests") 11 | import settings 12 | from django.core.management import setup_environ 13 | from django.conf import settings as dsettings 14 | setup_environ(settings) 15 | dsettings.configure() 16 | import djangofeeds 17 | sys.path.append(os.path.join(os.path.dirname(__file__), "_ext")) 18 | 19 | # General configuration 20 | # --------------------- 21 | 22 | extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'djangodocs'] 23 | 24 | # Add any paths that contain templates here, relative to this directory. 25 | templates_path = ['.templates'] 26 | 27 | # The suffix of source filenames. 28 | source_suffix = '.rst' 29 | 30 | # The master toctree document. 31 | master_doc = 'index' 32 | 33 | # General information about the project. 34 | project = u'django-feeds' 35 | copyright = u'2009, Web Team, Opera Software' 36 | 37 | # The version info for the project you're documenting, acts as replacement for 38 | # |version| and |release|, also used in various other places throughout the 39 | # built documents. 40 | # 41 | # The short X.Y version. 42 | version = ".".join(map(str, djangofeeds.VERSION[0:2])) 43 | # The full version, including alpha/beta/rc tags. 44 | release = djangofeeds.__version__ 45 | 46 | exclude_trees = ['.build'] 47 | 48 | # If true, '()' will be appended to :func: etc. cross-reference text. 49 | add_function_parentheses = True 50 | 51 | # The name of the Pygments (syntax highlighting) style to use. 52 | pygments_style = 'trac' 53 | 54 | # Add any paths that contain custom static files (such as style sheets) here, 55 | # relative to this directory. They are copied after the builtin static files, 56 | # so a file named "default.css" will overwrite the builtin "default.css". 57 | html_static_path = ['.static'] 58 | 59 | html_use_smartypants = True 60 | 61 | # If false, no module index is generated. 62 | html_use_modindex = True 63 | 64 | # If false, no index is generated. 65 | html_use_index = True 66 | 67 | latex_documents = [ 68 | ('index', 'djangofeeds.tex', ur'djangofeeds Documentation', 69 | ur'Web Team', 'manual'), 70 | ] 71 | 72 | html_theme = "ADCTheme" 73 | html_theme_path = ["_theme"] 74 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | ===================================================== 2 | Django-Feeds - Forgiving Feed Aggregator for Django 3 | ===================================================== 4 | 5 | Contents: 6 | 7 | .. toctree:: 8 | :maxdepth: 2 9 | 10 | reference/index 11 | 12 | 13 | Indices and tables 14 | ================== 15 | 16 | * :ref:`genindex` 17 | * :ref:`modindex` 18 | * :ref:`search` 19 | 20 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.admin.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | djangofeeds.admin 3 | =================== 4 | 5 | .. currentmodule:: djangofeeds.admin 6 | 7 | .. automodule:: djangofeeds.admin 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.conf.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | djangofeeds.conf 3 | ================== 4 | 5 | .. currentmodule:: djangofeeds.conf 6 | 7 | .. automodule:: djangofeeds.conf 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.exceptions.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | djangofeeds.exceptions 3 | ======================== 4 | 5 | .. currentmodule:: djangofeeds.exceptions 6 | 7 | .. automodule:: djangofeeds.exceptions 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.feedutil.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | djangofeeds.feedutil 3 | ====================== 4 | 5 | .. currentmodule:: djangofeeds.feedutil 6 | 7 | .. automodule:: djangofeeds.feedutil 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.importers.rst: -------------------------------------------------------------------------------- 1 | ======================= 2 | djangofeeds.importers 3 | ======================= 4 | 5 | .. currentmodule:: djangofeeds.importers 6 | 7 | .. automodule:: djangofeeds.importers 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.maintenance.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | djangofeeds.maintenance 3 | ========================= 4 | 5 | .. currentmodule:: djangofeeds.maintenance 6 | 7 | .. automodule:: djangofeeds.maintenance 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.managers.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | djangofeeds.managers 3 | ====================== 4 | 5 | .. currentmodule:: djangofeeds.managers 6 | 7 | .. automodule:: djangofeeds.managers 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.models.rst: -------------------------------------------------------------------------------- 1 | ==================== 2 | djangofeeds.models 3 | ==================== 4 | 5 | .. currentmodule:: djangofeeds.models 6 | 7 | .. automodule:: djangofeeds.models 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.optimization.rst: -------------------------------------------------------------------------------- 1 | ========================== 2 | djangofeeds.optimization 3 | ========================== 4 | 5 | .. currentmodule:: djangofeeds.optimization 6 | 7 | .. automodule:: djangofeeds.optimization 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.tasks.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | djangofeeds.tasks 3 | =================== 4 | 5 | .. currentmodule:: djangofeeds.tasks 6 | 7 | .. automodule:: djangofeeds.tasks 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/djangofeeds.utils.rst: -------------------------------------------------------------------------------- 1 | =================== 2 | djangofeeds.utils 3 | =================== 4 | 5 | .. currentmodule:: djangofeeds.utils 6 | 7 | .. automodule:: djangofeeds.utils 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/reference/index.rst: -------------------------------------------------------------------------------- 1 | =============== 2 | API Reference 3 | =============== 4 | 5 | :Release: |version| 6 | :Date: |today| 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | 11 | djangofeeds.importers 12 | djangofeeds.models 13 | djangofeeds.managers 14 | djangofeeds.tasks 15 | djangofeeds.conf 16 | djangofeeds.maintenance 17 | djangofeeds.optimization 18 | djangofeeds.exceptions 19 | djangofeeds.feedutil 20 | djangofeeds.admin 21 | djangofeeds.utils 22 | -------------------------------------------------------------------------------- /docs/spec.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Feed Service 3 | ========================================== 4 | 5 | 6 | Support for storing posts in Redis 7 | ================================== 8 | 9 | * post.save() 10 | 11 | Create/modify post. **IMPLEMENTED** 12 | 13 | * post.delete() 14 | 15 | Delete a post. **IMPLEMENTED** 16 | 17 | * post.objects.get(id) 18 | 19 | Get post by id. **IMPLEMENTED** 20 | 21 | * post.objects.get_by_guid(feed_url, guid) 22 | 23 | Get post by guid **IMPLEMENTED** 24 | 25 | * post.objects.all_by_order(feed_url, limit=20) 26 | 27 | Get a list of a feeds posts, sorted by timestamp. **IMPLEMENTED** 28 | 29 | * post.objects.update_or_create(feed_obj, \*\*fields) 30 | 31 | Update post by guid, or create new post if guid does not 32 | already exist. **IMPLEMENTED** 33 | 34 | * post.objects.expire(feed_url, limit=50) 35 | 36 | Expire old posts in a feed. *NOT IMPLEMENTED* 37 | 38 | Data structure 39 | ============== 40 | 41 | Ids 42 | --- 43 | 44 | The key of a post is the term "Entry" followed by a unique id, 45 | the unique id is created by incrementing the key "ids:Entry". 46 | 47 | Example keys:: 48 | 49 | Entry:1 50 | Entry:2 51 | Entry:3 52 | 53 | 54 | Pseudocode for creating a new id:: 55 | 56 | new_id = "Entry:%s" % (db.incr("ids:Entry"), ) 57 | 58 | 59 | Posts 60 | ----- 61 | 62 | Posts must have the following required fields: 63 | 64 | * feed_url (:class:`str`) 65 | 66 | Url of the parent feed. To be able to point back to which feed 67 | an entry belongs to. 68 | 69 | * guid (:class:`str`) 70 | 71 | The unique id of the post. This is only unique per post, so can 72 | not be used as a primary key (see `Ids`_ above). 73 | 74 | * timestamp (:class:`datetime.datetime`) 75 | 76 | The timestamp corresponding to the date and time this entry 77 | was last updated. 78 | 79 | The rest of the fields are arbitrary, but usually includes: 80 | 81 | ``title``, ``link``, ``content``, ``author``, ``date_published``, 82 | ``date_updated``. 83 | 84 | Indexes 85 | ------- 86 | 87 | * $feed_url:sort -> SortedSet(entry_id, timestamp) 88 | 89 | A sorted set (:class:`redish.types.SortedSet`) that stores the 90 | ordering of posts in a feed. 91 | 92 | The members of the sets are entry ids, and the score of the members is the 93 | timestamp (as a 32-bit int, unix timestamp) the post was last updated. 94 | 95 | Used to retreive posts in order, and to easily find older items to expire. 96 | 97 | * $feed_url:guidmap -> Hash(guid, id) 98 | 99 | A mapping of guids and their entry ids, used to check for the existence 100 | of a post by guid, and to update existing posts by guid. 101 | 102 | Missing features 103 | ---------------- 104 | 105 | Redis posts will not support categories or enclosures, 106 | as this is not strictly required by us and makes the implementation 107 | a lot more complex. It may be supported in the future, if requirements change. 108 | 109 | 110 | New signals 111 | ----------- 112 | 113 | * feed_created(sender=feed_url) 114 | 115 | A new feed url has been introduced to the system. 116 | 117 | * feed_modified(sender=feed_url, changed=diff) 118 | 119 | A feed has been modified (title, description) 120 | 121 | * post_created(feed_url, post, guid) 122 | 123 | New post available in a feed. 124 | 125 | * post_modified(sender=guid, feed_url, post, changed=diff) 126 | 127 | Previously existing post has been modified 128 | -------------------------------------------------------------------------------- /pavement.py: -------------------------------------------------------------------------------- 1 | from paver.easy import * 2 | from paver import doctools 3 | from paver.setuputils import setup 4 | 5 | DIST = "djangofeeds" 6 | 7 | options( 8 | sphinx=Bunch(builddir=".build"), 9 | ) 10 | 11 | 12 | def sphinx_builddir(options): 13 | return path("docs") / options.sphinx.builddir / "html" 14 | 15 | 16 | @task 17 | def clean_docs(options): 18 | sphinx_builddir(options).rmtree() 19 | 20 | 21 | @task 22 | @needs("clean_docs", "paver.doctools.html") 23 | def html(options): 24 | destdir = path("Documentation") 25 | destdir.rmtree() 26 | builtdocs = sphinx_builddir(options) 27 | builtdocs.move(destdir) 28 | 29 | 30 | @task 31 | @needs("clean_docs", "paver.doctools.html") 32 | def upload_pypi_docs(options): 33 | builtdocs = path("docs") / options.builddir / "html" 34 | sh("python setup.py upload_sphinx --upload-dir='%s'" % (builtdocs)) 35 | 36 | 37 | @task 38 | @needs("upload_pypi_docs", "ghdocs") 39 | def upload_docs(options): 40 | pass 41 | 42 | 43 | @task 44 | def flakes(options): 45 | sh("find %s -name '*.py' | xargs pyflakes" % (DIST, )) 46 | 47 | 48 | @task 49 | def bump(options): 50 | sh("bump -c %s" % (DIST, )) 51 | 52 | 53 | @task 54 | @cmdopts([ 55 | ("coverage", "c", "Enable coverage"), 56 | ("quick", "q", "Quick test"), 57 | ("verbose", "V", "Make more noise"), 58 | ]) 59 | def test(options): 60 | cmd = "python manage.py test" 61 | if getattr(options, "coverage", False): 62 | cmd += " --with-coverage3 --cover3-html" 63 | if getattr(options, "quick", False): 64 | cmd = "env QUICKTEST=1" 65 | if getattr(options, "verbose", False): 66 | cmd += " --verbosity=2" 67 | sh(cmd, cwd="tests") 68 | 69 | 70 | @task 71 | @cmdopts([ 72 | ("noerror", "E", "Ignore errors"), 73 | ]) 74 | def pep8(options): 75 | noerror = getattr(options, "noerror", False) 76 | return sh("""find djangofeeds -name "*.py" | xargs pep8 | perl -nle'\ 77 | print; $a=1 if $_}{exit($a)'""", ignore_error=noerror) 78 | 79 | 80 | @task 81 | def removepyc(options): 82 | sh("find . -name '*.pyc' | xargs rm") 83 | 84 | 85 | @task 86 | @needs("removepyc") 87 | def gitclean(options): 88 | sh("git clean -xdn") 89 | 90 | 91 | @task 92 | @needs("removepyc") 93 | def gitcleanforce(options): 94 | sh("git clean -xdf") 95 | 96 | 97 | @task 98 | @needs("pep8", "autodoc", "verifyindex", "test", "gitclean") 99 | def releaseok(options): 100 | pass 101 | 102 | 103 | @task 104 | @needs("releaseok", "removepyc", "upload_docs") 105 | def release(options): 106 | pass 107 | -------------------------------------------------------------------------------- /requirements/default.txt: -------------------------------------------------------------------------------- 1 | feedparser 2 | celery 3 | django-celery 4 | BeautifulSoup 5 | httplib2 6 | html5lib 7 | pytz 8 | -------------------------------------------------------------------------------- /requirements/test.txt: -------------------------------------------------------------------------------- 1 | unittest2 2 | nose 3 | nose-cover3 4 | coverage 5 | django-nose 6 | redish 7 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | from __future__ import with_statement 4 | import codecs 5 | import os 6 | 7 | try: 8 | from setuptools import setup, find_packages, Command 9 | except ImportError: 10 | from ez_setup import use_setuptools 11 | use_setuptools() 12 | from setuptools import setup, find_packages, Command 13 | 14 | from distutils.command.install_data import install_data 15 | from distutils.command.install import INSTALL_SCHEMES 16 | import sys 17 | 18 | import djangofeeds 19 | 20 | packages, data_files = [], [] 21 | root_dir = os.path.dirname(__file__) 22 | if root_dir != "": 23 | os.chdir(root_dir) 24 | src_dir = "djangofeeds" 25 | 26 | 27 | def osx_install_data(install_data): 28 | def finalize_options(self): 29 | self.set_undefined_options("install", ("install_lib", "install_dir")) 30 | install_data.finalize_options(self) 31 | 32 | 33 | class RunTests(Command): 34 | description = "Run the django test suite from the tests dir." 35 | 36 | user_options = [] 37 | 38 | def initialize_options(self): 39 | pass 40 | 41 | def finalize_options(self): 42 | pass 43 | 44 | def run(self): 45 | this_dir = os.getcwd() 46 | testproj_dir = os.path.join(this_dir, "tests") 47 | os.chdir(testproj_dir) 48 | sys.path.insert(0, testproj_dir) 49 | from django.core.management import execute_manager 50 | os.environ["DJANGO_SETTINGS_MODULE"] = os.environ.get( 51 | "DJANGO_SETTINGS_MODULE", "settings") 52 | settings_file = os.environ["DJANGO_SETTINGS_MODULE"] 53 | settings_mod = __import__(settings_file, {}, {}, [""]) 54 | execute_manager(settings_mod, argv=[ 55 | __file__, "test"]) 56 | os.chdir(this_dir) 57 | 58 | 59 | def fullsplit(path, result=None): 60 | if result is None: 61 | result = [] 62 | head, tail = os.path.split(path) 63 | if head == "": 64 | return [tail] + result 65 | if head == path: 66 | return result 67 | return fullsplit(head, [tail] + result) 68 | 69 | 70 | for scheme in INSTALL_SCHEMES.values(): 71 | scheme["data"] = scheme["purelib"] 72 | 73 | 74 | for dirpath, dirnames, filenames in os.walk(src_dir): 75 | # Ignore dirnames that start with "." 76 | for i, dirname in enumerate(dirnames): 77 | if dirname.startswith("."): 78 | del dirnames[i] 79 | for filename in filenames: 80 | if filename.endswith(".py"): 81 | packages.append(".".join(fullsplit(dirpath))) 82 | else: 83 | data_files.append([dirpath, [os.path.join(dirpath, f) for f in 84 | filenames]]) 85 | 86 | 87 | def requirements(fh): 88 | for line in fh: 89 | entry = line.strip() 90 | if not entry.startswith("#"): 91 | yield entry 92 | 93 | install_requires = [] 94 | for req in ("requirements/default.txt", ): 95 | with file(req) as reqfh: 96 | install_requires.extend(list(requirements(reqfh))) 97 | 98 | setup( 99 | name="django-feeds", 100 | version=djangofeeds.__version__, 101 | description=djangofeeds.__doc__, 102 | author=djangofeeds.__author__, 103 | author_email=djangofeeds.__contact__, 104 | packages=packages, 105 | url=djangofeeds.__homepage__, 106 | cmdclass={"test": RunTests}, 107 | zip_safe=False, 108 | data_files=data_files, 109 | install_requires=install_requires, 110 | classifiers=[ 111 | "Framework :: Django", 112 | "Development Status :: 3 - Alpha", 113 | "Intended Audience :: Developers", 114 | "License :: OSI Approved :: BSD License", 115 | "Operating System :: OS Independent", 116 | "Programming Language :: Python", 117 | ], 118 | long_description=codecs.open("README", "r", "utf-8").read(), 119 | ) 120 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/operasoftware/django-feeds/d5183277ce65de263229c9762d0f380e1ce1da9f/tests/__init__.py -------------------------------------------------------------------------------- /tests/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | try: 4 | import settings # Assumed to be in the same directory. 5 | except ImportError: 6 | import sys 7 | sys.stderr.write( 8 | "Error: Can't find the file 'settings.py' in the directory \ 9 | containing %r. It appears you've customized things.\n\ 10 | You'll have to run django-admin.py, passing it your settings\ 11 | module.\n(If the file settings.py does indeed exist, it's\ 12 | causing an ImportError somehow.)\n" % __file__) 13 | sys.exit(1) 14 | 15 | if __name__ == "__main__": 16 | execute_manager(settings) 17 | -------------------------------------------------------------------------------- /tests/settings.py: -------------------------------------------------------------------------------- 1 | # Django settings for testproj project. 2 | 3 | import os 4 | import sys 5 | # import source code dir 6 | sys.path.insert(0, os.path.join(os.getcwd(), os.pardir)) 7 | 8 | SITE_ID = 69932 9 | 10 | DEBUG = True 11 | TEMPLATE_DEBUG = DEBUG 12 | SECRET_KEY = "mysecretkeytest" 13 | USE_TZ = True 14 | 15 | ROOT_URLCONF = "urls" 16 | 17 | ADMINS = ( 18 | # ('Your Name', 'your_email@domain.com'), 19 | ) 20 | 21 | #TEST_RUNNER = "django_nose.NoseTestSuiteRunner" 22 | 23 | COVERAGE_EXCLUDE_MODULES = ("djangofeeds", 24 | "djangofeeds.admin", 25 | "djangofeeds.maintenance", 26 | "djangofeeds.management*", 27 | "djangofeeds.tests*", 28 | "djangofeeds.models", 29 | "djangofeeds.managers", 30 | "djangofeeds.utils", 31 | ) 32 | 33 | here = os.path.abspath(os.path.dirname(__file__)) 34 | 35 | BROKER_HOST = "localhost" 36 | BROKER_PORT = 5672 37 | BROKER_VHOST = "/" 38 | BROKER_USER = "guest" 39 | BROKER_PASSWORD = "guest" 40 | 41 | CELERY_DEFAULT_EXCHANGE = "testdjangofeeds" 42 | CELERY_DEFAULT_QUEUE = "testdjangofeeds" 43 | CELERY_QUEUES = { 44 | "testdjangofeeds": { 45 | "binding_key": "testdjangofeeds", 46 | } 47 | } 48 | CELERY_DEFAULT_ROUTING_KEY = "testdjangofeeds" 49 | 50 | MANAGERS = ADMINS 51 | 52 | DATABASES = { 53 | 'default': { 54 | 'ENGINE': 'django.db.backends.sqlite3', 55 | 'NAME': 'testdb.sqlite', 56 | } 57 | } 58 | 59 | USE_TZ = True 60 | 61 | INSTALLED_APPS = ( 62 | 'django.contrib.auth', 63 | 'django.contrib.contenttypes', 64 | 'django.contrib.sessions', 65 | 'django.contrib.sites', 66 | 'django_nose', 67 | #'djcelery', 68 | 'djangofeeds', 69 | 'pytz', 70 | ) 71 | 72 | 73 | SEND_CELERY_TASK_ERROR_EMAILS = False 74 | 75 | if os.environ.get("TEST_REDIS_POSTS"): 76 | DJANGOFEEDS_POST_STORAGE_BACKEND = "redis" 77 | -------------------------------------------------------------------------------- /tests/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | # from django.contrib import admin 5 | # admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | # Example: 9 | # (r'^testproj/', include('tests.foo.urls')), 10 | 11 | # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 12 | # to INSTALLED_APPS to enable admin documentation: 13 | # (r'^admin/doc/', include('django.contrib.admindocs.urls')), 14 | 15 | # Uncomment the next line to enable the admin: 16 | # (r'^admin/(.*)', admin.site.root), 17 | ) 18 | --------------------------------------------------------------------------------