docker setup
This commit is contained in:
		| @ -0,0 +1,7 @@ | ||||
| from django.apps import AppConfig | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
|  | ||||
|  | ||||
| class SessionsConfig(AppConfig): | ||||
|     name = "django.contrib.sessions" | ||||
|     verbose_name = _("Sessions") | ||||
| @ -0,0 +1,365 @@ | ||||
| import logging | ||||
| import string | ||||
| from datetime import datetime, timedelta | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.core import signing | ||||
| from django.utils import timezone | ||||
| from django.utils.crypto import get_random_string | ||||
| from django.utils.module_loading import import_string | ||||
|  | ||||
| # session_key should not be case sensitive because some backends can store it | ||||
| # on case insensitive file systems. | ||||
| VALID_KEY_CHARS = string.ascii_lowercase + string.digits | ||||
|  | ||||
|  | ||||
| class CreateError(Exception): | ||||
|     """ | ||||
|     Used internally as a consistent exception type to catch from save (see the | ||||
|     docstring for SessionBase.save() for details). | ||||
|     """ | ||||
|  | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class UpdateError(Exception): | ||||
|     """ | ||||
|     Occurs if Django tries to update a session that was deleted. | ||||
|     """ | ||||
|  | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class SessionBase: | ||||
|     """ | ||||
|     Base class for all Session classes. | ||||
|     """ | ||||
|  | ||||
|     TEST_COOKIE_NAME = "testcookie" | ||||
|     TEST_COOKIE_VALUE = "worked" | ||||
|  | ||||
|     __not_given = object() | ||||
|  | ||||
|     def __init__(self, session_key=None): | ||||
|         self._session_key = session_key | ||||
|         self.accessed = False | ||||
|         self.modified = False | ||||
|         self.serializer = import_string(settings.SESSION_SERIALIZER) | ||||
|  | ||||
|     def __contains__(self, key): | ||||
|         return key in self._session | ||||
|  | ||||
|     def __getitem__(self, key): | ||||
|         return self._session[key] | ||||
|  | ||||
|     def __setitem__(self, key, value): | ||||
|         self._session[key] = value | ||||
|         self.modified = True | ||||
|  | ||||
|     def __delitem__(self, key): | ||||
|         del self._session[key] | ||||
|         self.modified = True | ||||
|  | ||||
|     @property | ||||
|     def key_salt(self): | ||||
|         return "django.contrib.sessions." + self.__class__.__qualname__ | ||||
|  | ||||
|     def get(self, key, default=None): | ||||
|         return self._session.get(key, default) | ||||
|  | ||||
|     def pop(self, key, default=__not_given): | ||||
|         self.modified = self.modified or key in self._session | ||||
|         args = () if default is self.__not_given else (default,) | ||||
|         return self._session.pop(key, *args) | ||||
|  | ||||
|     def setdefault(self, key, value): | ||||
|         if key in self._session: | ||||
|             return self._session[key] | ||||
|         else: | ||||
|             self.modified = True | ||||
|             self._session[key] = value | ||||
|             return value | ||||
|  | ||||
|     def set_test_cookie(self): | ||||
|         self[self.TEST_COOKIE_NAME] = self.TEST_COOKIE_VALUE | ||||
|  | ||||
|     def test_cookie_worked(self): | ||||
|         return self.get(self.TEST_COOKIE_NAME) == self.TEST_COOKIE_VALUE | ||||
|  | ||||
|     def delete_test_cookie(self): | ||||
|         del self[self.TEST_COOKIE_NAME] | ||||
|  | ||||
|     def encode(self, session_dict): | ||||
|         "Return the given session dictionary serialized and encoded as a string." | ||||
|         return signing.dumps( | ||||
|             session_dict, | ||||
|             salt=self.key_salt, | ||||
|             serializer=self.serializer, | ||||
|             compress=True, | ||||
|         ) | ||||
|  | ||||
|     def decode(self, session_data): | ||||
|         try: | ||||
|             return signing.loads( | ||||
|                 session_data, salt=self.key_salt, serializer=self.serializer | ||||
|             ) | ||||
|         except signing.BadSignature: | ||||
|             logger = logging.getLogger("django.security.SuspiciousSession") | ||||
|             logger.warning("Session data corrupted") | ||||
|         except Exception: | ||||
|             # ValueError, unpickling exceptions. If any of these happen, just | ||||
|             # return an empty dictionary (an empty session). | ||||
|             pass | ||||
|         return {} | ||||
|  | ||||
|     def update(self, dict_): | ||||
|         self._session.update(dict_) | ||||
|         self.modified = True | ||||
|  | ||||
|     def has_key(self, key): | ||||
|         return key in self._session | ||||
|  | ||||
|     def keys(self): | ||||
|         return self._session.keys() | ||||
|  | ||||
|     def values(self): | ||||
|         return self._session.values() | ||||
|  | ||||
|     def items(self): | ||||
|         return self._session.items() | ||||
|  | ||||
|     def clear(self): | ||||
|         # To avoid unnecessary persistent storage accesses, we set up the | ||||
|         # internals directly (loading data wastes time, since we are going to | ||||
|         # set it to an empty dict anyway). | ||||
|         self._session_cache = {} | ||||
|         self.accessed = True | ||||
|         self.modified = True | ||||
|  | ||||
|     def is_empty(self): | ||||
|         "Return True when there is no session_key and the session is empty." | ||||
|         try: | ||||
|             return not self._session_key and not self._session_cache | ||||
|         except AttributeError: | ||||
|             return True | ||||
|  | ||||
|     def _get_new_session_key(self): | ||||
|         "Return session key that isn't being used." | ||||
|         while True: | ||||
|             session_key = get_random_string(32, VALID_KEY_CHARS) | ||||
|             if not self.exists(session_key): | ||||
|                 return session_key | ||||
|  | ||||
|     def _get_or_create_session_key(self): | ||||
|         if self._session_key is None: | ||||
|             self._session_key = self._get_new_session_key() | ||||
|         return self._session_key | ||||
|  | ||||
|     def _validate_session_key(self, key): | ||||
|         """ | ||||
|         Key must be truthy and at least 8 characters long. 8 characters is an | ||||
|         arbitrary lower bound for some minimal key security. | ||||
|         """ | ||||
|         return key and len(key) >= 8 | ||||
|  | ||||
|     def _get_session_key(self): | ||||
|         return self.__session_key | ||||
|  | ||||
|     def _set_session_key(self, value): | ||||
|         """ | ||||
|         Validate session key on assignment. Invalid values will set to None. | ||||
|         """ | ||||
|         if self._validate_session_key(value): | ||||
|             self.__session_key = value | ||||
|         else: | ||||
|             self.__session_key = None | ||||
|  | ||||
|     session_key = property(_get_session_key) | ||||
|     _session_key = property(_get_session_key, _set_session_key) | ||||
|  | ||||
|     def _get_session(self, no_load=False): | ||||
|         """ | ||||
|         Lazily load session from storage (unless "no_load" is True, when only | ||||
|         an empty dict is stored) and store it in the current instance. | ||||
|         """ | ||||
|         self.accessed = True | ||||
|         try: | ||||
|             return self._session_cache | ||||
|         except AttributeError: | ||||
|             if self.session_key is None or no_load: | ||||
|                 self._session_cache = {} | ||||
|             else: | ||||
|                 self._session_cache = self.load() | ||||
|         return self._session_cache | ||||
|  | ||||
|     _session = property(_get_session) | ||||
|  | ||||
|     def get_session_cookie_age(self): | ||||
|         return settings.SESSION_COOKIE_AGE | ||||
|  | ||||
|     def get_expiry_age(self, **kwargs): | ||||
|         """Get the number of seconds until the session expires. | ||||
|  | ||||
|         Optionally, this function accepts `modification` and `expiry` keyword | ||||
|         arguments specifying the modification and expiry of the session. | ||||
|         """ | ||||
|         try: | ||||
|             modification = kwargs["modification"] | ||||
|         except KeyError: | ||||
|             modification = timezone.now() | ||||
|         # Make the difference between "expiry=None passed in kwargs" and | ||||
|         # "expiry not passed in kwargs", in order to guarantee not to trigger | ||||
|         # self.load() when expiry is provided. | ||||
|         try: | ||||
|             expiry = kwargs["expiry"] | ||||
|         except KeyError: | ||||
|             expiry = self.get("_session_expiry") | ||||
|  | ||||
|         if not expiry:  # Checks both None and 0 cases | ||||
|             return self.get_session_cookie_age() | ||||
|         if not isinstance(expiry, (datetime, str)): | ||||
|             return expiry | ||||
|         if isinstance(expiry, str): | ||||
|             expiry = datetime.fromisoformat(expiry) | ||||
|         delta = expiry - modification | ||||
|         return delta.days * 86400 + delta.seconds | ||||
|  | ||||
|     def get_expiry_date(self, **kwargs): | ||||
|         """Get session the expiry date (as a datetime object). | ||||
|  | ||||
|         Optionally, this function accepts `modification` and `expiry` keyword | ||||
|         arguments specifying the modification and expiry of the session. | ||||
|         """ | ||||
|         try: | ||||
|             modification = kwargs["modification"] | ||||
|         except KeyError: | ||||
|             modification = timezone.now() | ||||
|         # Same comment as in get_expiry_age | ||||
|         try: | ||||
|             expiry = kwargs["expiry"] | ||||
|         except KeyError: | ||||
|             expiry = self.get("_session_expiry") | ||||
|  | ||||
|         if isinstance(expiry, datetime): | ||||
|             return expiry | ||||
|         elif isinstance(expiry, str): | ||||
|             return datetime.fromisoformat(expiry) | ||||
|         expiry = expiry or self.get_session_cookie_age() | ||||
|         return modification + timedelta(seconds=expiry) | ||||
|  | ||||
|     def set_expiry(self, value): | ||||
|         """ | ||||
|         Set a custom expiration for the session. ``value`` can be an integer, | ||||
|         a Python ``datetime`` or ``timedelta`` object or ``None``. | ||||
|  | ||||
|         If ``value`` is an integer, the session will expire after that many | ||||
|         seconds of inactivity. If set to ``0`` then the session will expire on | ||||
|         browser close. | ||||
|  | ||||
|         If ``value`` is a ``datetime`` or ``timedelta`` object, the session | ||||
|         will expire at that specific future time. | ||||
|  | ||||
|         If ``value`` is ``None``, the session uses the global session expiry | ||||
|         policy. | ||||
|         """ | ||||
|         if value is None: | ||||
|             # Remove any custom expiration for this session. | ||||
|             try: | ||||
|                 del self["_session_expiry"] | ||||
|             except KeyError: | ||||
|                 pass | ||||
|             return | ||||
|         if isinstance(value, timedelta): | ||||
|             value = timezone.now() + value | ||||
|         if isinstance(value, datetime): | ||||
|             value = value.isoformat() | ||||
|         self["_session_expiry"] = value | ||||
|  | ||||
|     def get_expire_at_browser_close(self): | ||||
|         """ | ||||
|         Return ``True`` if the session is set to expire when the browser | ||||
|         closes, and ``False`` if there's an expiry date. Use | ||||
|         ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry | ||||
|         date/age, if there is one. | ||||
|         """ | ||||
|         if (expiry := self.get("_session_expiry")) is None: | ||||
|             return settings.SESSION_EXPIRE_AT_BROWSER_CLOSE | ||||
|         return expiry == 0 | ||||
|  | ||||
|     def flush(self): | ||||
|         """ | ||||
|         Remove the current session data from the database and regenerate the | ||||
|         key. | ||||
|         """ | ||||
|         self.clear() | ||||
|         self.delete() | ||||
|         self._session_key = None | ||||
|  | ||||
|     def cycle_key(self): | ||||
|         """ | ||||
|         Create a new session key, while retaining the current session data. | ||||
|         """ | ||||
|         data = self._session | ||||
|         key = self.session_key | ||||
|         self.create() | ||||
|         self._session_cache = data | ||||
|         if key: | ||||
|             self.delete(key) | ||||
|  | ||||
|     # Methods that child classes must implement. | ||||
|  | ||||
|     def exists(self, session_key): | ||||
|         """ | ||||
|         Return True if the given session_key already exists. | ||||
|         """ | ||||
|         raise NotImplementedError( | ||||
|             "subclasses of SessionBase must provide an exists() method" | ||||
|         ) | ||||
|  | ||||
|     def create(self): | ||||
|         """ | ||||
|         Create a new session instance. Guaranteed to create a new object with | ||||
|         a unique key and will have saved the result once (with empty data) | ||||
|         before the method returns. | ||||
|         """ | ||||
|         raise NotImplementedError( | ||||
|             "subclasses of SessionBase must provide a create() method" | ||||
|         ) | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         """ | ||||
|         Save the session data. If 'must_create' is True, create a new session | ||||
|         object (or raise CreateError). Otherwise, only update an existing | ||||
|         object and don't create one (raise UpdateError if needed). | ||||
|         """ | ||||
|         raise NotImplementedError( | ||||
|             "subclasses of SessionBase must provide a save() method" | ||||
|         ) | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         """ | ||||
|         Delete the session data under this key. If the key is None, use the | ||||
|         current session key value. | ||||
|         """ | ||||
|         raise NotImplementedError( | ||||
|             "subclasses of SessionBase must provide a delete() method" | ||||
|         ) | ||||
|  | ||||
|     def load(self): | ||||
|         """ | ||||
|         Load the session data and return a dictionary. | ||||
|         """ | ||||
|         raise NotImplementedError( | ||||
|             "subclasses of SessionBase must provide a load() method" | ||||
|         ) | ||||
|  | ||||
|     @classmethod | ||||
|     def clear_expired(cls): | ||||
|         """ | ||||
|         Remove expired sessions from the session store. | ||||
|  | ||||
|         If this operation isn't possible on a given backend, it should raise | ||||
|         NotImplementedError. If it isn't necessary, because the backend has | ||||
|         a built-in expiration mechanism, it should be a no-op. | ||||
|         """ | ||||
|         raise NotImplementedError("This backend does not support clear_expired().") | ||||
| @ -0,0 +1,85 @@ | ||||
| from django.conf import settings | ||||
| from django.contrib.sessions.backends.base import CreateError, SessionBase, UpdateError | ||||
| from django.core.cache import caches | ||||
|  | ||||
| KEY_PREFIX = "django.contrib.sessions.cache" | ||||
|  | ||||
|  | ||||
| class SessionStore(SessionBase): | ||||
|     """ | ||||
|     A cache-based session store. | ||||
|     """ | ||||
|  | ||||
|     cache_key_prefix = KEY_PREFIX | ||||
|  | ||||
|     def __init__(self, session_key=None): | ||||
|         self._cache = caches[settings.SESSION_CACHE_ALIAS] | ||||
|         super().__init__(session_key) | ||||
|  | ||||
|     @property | ||||
|     def cache_key(self): | ||||
|         return self.cache_key_prefix + self._get_or_create_session_key() | ||||
|  | ||||
|     def load(self): | ||||
|         try: | ||||
|             session_data = self._cache.get(self.cache_key) | ||||
|         except Exception: | ||||
|             # Some backends (e.g. memcache) raise an exception on invalid | ||||
|             # cache keys. If this happens, reset the session. See #17810. | ||||
|             session_data = None | ||||
|         if session_data is not None: | ||||
|             return session_data | ||||
|         self._session_key = None | ||||
|         return {} | ||||
|  | ||||
|     def create(self): | ||||
|         # Because a cache can fail silently (e.g. memcache), we don't know if | ||||
|         # we are failing to create a new session because of a key collision or | ||||
|         # because the cache is missing. So we try for a (large) number of times | ||||
|         # and then raise an exception. That's the risk you shoulder if using | ||||
|         # cache backing. | ||||
|         for i in range(10000): | ||||
|             self._session_key = self._get_new_session_key() | ||||
|             try: | ||||
|                 self.save(must_create=True) | ||||
|             except CreateError: | ||||
|                 continue | ||||
|             self.modified = True | ||||
|             return | ||||
|         raise RuntimeError( | ||||
|             "Unable to create a new session key. " | ||||
|             "It is likely that the cache is unavailable." | ||||
|         ) | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         if self.session_key is None: | ||||
|             return self.create() | ||||
|         if must_create: | ||||
|             func = self._cache.add | ||||
|         elif self._cache.get(self.cache_key) is not None: | ||||
|             func = self._cache.set | ||||
|         else: | ||||
|             raise UpdateError | ||||
|         result = func( | ||||
|             self.cache_key, | ||||
|             self._get_session(no_load=must_create), | ||||
|             self.get_expiry_age(), | ||||
|         ) | ||||
|         if must_create and not result: | ||||
|             raise CreateError | ||||
|  | ||||
|     def exists(self, session_key): | ||||
|         return ( | ||||
|             bool(session_key) and (self.cache_key_prefix + session_key) in self._cache | ||||
|         ) | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         if session_key is None: | ||||
|             if self.session_key is None: | ||||
|                 return | ||||
|             session_key = self.session_key | ||||
|         self._cache.delete(self.cache_key_prefix + session_key) | ||||
|  | ||||
|     @classmethod | ||||
|     def clear_expired(cls): | ||||
|         pass | ||||
| @ -0,0 +1,72 @@ | ||||
| """ | ||||
| Cached, database-backed sessions. | ||||
| """ | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.contrib.sessions.backends.db import SessionStore as DBStore | ||||
| from django.core.cache import caches | ||||
|  | ||||
| KEY_PREFIX = "django.contrib.sessions.cached_db" | ||||
|  | ||||
|  | ||||
| class SessionStore(DBStore): | ||||
|     """ | ||||
|     Implement cached, database backed sessions. | ||||
|     """ | ||||
|  | ||||
|     cache_key_prefix = KEY_PREFIX | ||||
|  | ||||
|     def __init__(self, session_key=None): | ||||
|         self._cache = caches[settings.SESSION_CACHE_ALIAS] | ||||
|         super().__init__(session_key) | ||||
|  | ||||
|     @property | ||||
|     def cache_key(self): | ||||
|         return self.cache_key_prefix + self._get_or_create_session_key() | ||||
|  | ||||
|     def load(self): | ||||
|         try: | ||||
|             data = self._cache.get(self.cache_key) | ||||
|         except Exception: | ||||
|             # Some backends (e.g. memcache) raise an exception on invalid | ||||
|             # cache keys. If this happens, reset the session. See #17810. | ||||
|             data = None | ||||
|  | ||||
|         if data is None: | ||||
|             s = self._get_session_from_db() | ||||
|             if s: | ||||
|                 data = self.decode(s.session_data) | ||||
|                 self._cache.set( | ||||
|                     self.cache_key, data, self.get_expiry_age(expiry=s.expire_date) | ||||
|                 ) | ||||
|             else: | ||||
|                 data = {} | ||||
|         return data | ||||
|  | ||||
|     def exists(self, session_key): | ||||
|         return ( | ||||
|             session_key | ||||
|             and (self.cache_key_prefix + session_key) in self._cache | ||||
|             or super().exists(session_key) | ||||
|         ) | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         super().save(must_create) | ||||
|         self._cache.set(self.cache_key, self._session, self.get_expiry_age()) | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         super().delete(session_key) | ||||
|         if session_key is None: | ||||
|             if self.session_key is None: | ||||
|                 return | ||||
|             session_key = self.session_key | ||||
|         self._cache.delete(self.cache_key_prefix + session_key) | ||||
|  | ||||
|     def flush(self): | ||||
|         """ | ||||
|         Remove the current session data from the database and regenerate the | ||||
|         key. | ||||
|         """ | ||||
|         self.clear() | ||||
|         self.delete(self.session_key) | ||||
|         self._session_key = None | ||||
| @ -0,0 +1,110 @@ | ||||
| import logging | ||||
|  | ||||
| from django.contrib.sessions.backends.base import CreateError, SessionBase, UpdateError | ||||
| from django.core.exceptions import SuspiciousOperation | ||||
| from django.db import DatabaseError, IntegrityError, router, transaction | ||||
| from django.utils import timezone | ||||
| from django.utils.functional import cached_property | ||||
|  | ||||
|  | ||||
| class SessionStore(SessionBase): | ||||
|     """ | ||||
|     Implement database session store. | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, session_key=None): | ||||
|         super().__init__(session_key) | ||||
|  | ||||
|     @classmethod | ||||
|     def get_model_class(cls): | ||||
|         # Avoids a circular import and allows importing SessionStore when | ||||
|         # django.contrib.sessions is not in INSTALLED_APPS. | ||||
|         from django.contrib.sessions.models import Session | ||||
|  | ||||
|         return Session | ||||
|  | ||||
|     @cached_property | ||||
|     def model(self): | ||||
|         return self.get_model_class() | ||||
|  | ||||
|     def _get_session_from_db(self): | ||||
|         try: | ||||
|             return self.model.objects.get( | ||||
|                 session_key=self.session_key, expire_date__gt=timezone.now() | ||||
|             ) | ||||
|         except (self.model.DoesNotExist, SuspiciousOperation) as e: | ||||
|             if isinstance(e, SuspiciousOperation): | ||||
|                 logger = logging.getLogger("django.security.%s" % e.__class__.__name__) | ||||
|                 logger.warning(str(e)) | ||||
|             self._session_key = None | ||||
|  | ||||
|     def load(self): | ||||
|         s = self._get_session_from_db() | ||||
|         return self.decode(s.session_data) if s else {} | ||||
|  | ||||
|     def exists(self, session_key): | ||||
|         return self.model.objects.filter(session_key=session_key).exists() | ||||
|  | ||||
|     def create(self): | ||||
|         while True: | ||||
|             self._session_key = self._get_new_session_key() | ||||
|             try: | ||||
|                 # Save immediately to ensure we have a unique entry in the | ||||
|                 # database. | ||||
|                 self.save(must_create=True) | ||||
|             except CreateError: | ||||
|                 # Key wasn't unique. Try again. | ||||
|                 continue | ||||
|             self.modified = True | ||||
|             return | ||||
|  | ||||
|     def create_model_instance(self, data): | ||||
|         """ | ||||
|         Return a new instance of the session model object, which represents the | ||||
|         current session state. Intended to be used for saving the session data | ||||
|         to the database. | ||||
|         """ | ||||
|         return self.model( | ||||
|             session_key=self._get_or_create_session_key(), | ||||
|             session_data=self.encode(data), | ||||
|             expire_date=self.get_expiry_date(), | ||||
|         ) | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         """ | ||||
|         Save the current session data to the database. If 'must_create' is | ||||
|         True, raise a database error if the saving operation doesn't create a | ||||
|         new entry (as opposed to possibly updating an existing entry). | ||||
|         """ | ||||
|         if self.session_key is None: | ||||
|             return self.create() | ||||
|         data = self._get_session(no_load=must_create) | ||||
|         obj = self.create_model_instance(data) | ||||
|         using = router.db_for_write(self.model, instance=obj) | ||||
|         try: | ||||
|             with transaction.atomic(using=using): | ||||
|                 obj.save( | ||||
|                     force_insert=must_create, force_update=not must_create, using=using | ||||
|                 ) | ||||
|         except IntegrityError: | ||||
|             if must_create: | ||||
|                 raise CreateError | ||||
|             raise | ||||
|         except DatabaseError: | ||||
|             if not must_create: | ||||
|                 raise UpdateError | ||||
|             raise | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         if session_key is None: | ||||
|             if self.session_key is None: | ||||
|                 return | ||||
|             session_key = self.session_key | ||||
|         try: | ||||
|             self.model.objects.get(session_key=session_key).delete() | ||||
|         except self.model.DoesNotExist: | ||||
|             pass | ||||
|  | ||||
|     @classmethod | ||||
|     def clear_expired(cls): | ||||
|         cls.get_model_class().objects.filter(expire_date__lt=timezone.now()).delete() | ||||
| @ -0,0 +1,210 @@ | ||||
| import datetime | ||||
| import logging | ||||
| import os | ||||
| import shutil | ||||
| import tempfile | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.contrib.sessions.backends.base import ( | ||||
|     VALID_KEY_CHARS, | ||||
|     CreateError, | ||||
|     SessionBase, | ||||
|     UpdateError, | ||||
| ) | ||||
| from django.contrib.sessions.exceptions import InvalidSessionKey | ||||
| from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation | ||||
|  | ||||
|  | ||||
| class SessionStore(SessionBase): | ||||
|     """ | ||||
|     Implement a file based session store. | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, session_key=None): | ||||
|         self.storage_path = self._get_storage_path() | ||||
|         self.file_prefix = settings.SESSION_COOKIE_NAME | ||||
|         super().__init__(session_key) | ||||
|  | ||||
|     @classmethod | ||||
|     def _get_storage_path(cls): | ||||
|         try: | ||||
|             return cls._storage_path | ||||
|         except AttributeError: | ||||
|             storage_path = ( | ||||
|                 getattr(settings, "SESSION_FILE_PATH", None) or tempfile.gettempdir() | ||||
|             ) | ||||
|             # Make sure the storage path is valid. | ||||
|             if not os.path.isdir(storage_path): | ||||
|                 raise ImproperlyConfigured( | ||||
|                     "The session storage path %r doesn't exist. Please set your" | ||||
|                     " SESSION_FILE_PATH setting to an existing directory in which" | ||||
|                     " Django can store session data." % storage_path | ||||
|                 ) | ||||
|  | ||||
|             cls._storage_path = storage_path | ||||
|             return storage_path | ||||
|  | ||||
|     def _key_to_file(self, session_key=None): | ||||
|         """ | ||||
|         Get the file associated with this session key. | ||||
|         """ | ||||
|         if session_key is None: | ||||
|             session_key = self._get_or_create_session_key() | ||||
|  | ||||
|         # Make sure we're not vulnerable to directory traversal. Session keys | ||||
|         # should always be md5s, so they should never contain directory | ||||
|         # components. | ||||
|         if not set(session_key).issubset(VALID_KEY_CHARS): | ||||
|             raise InvalidSessionKey("Invalid characters in session key") | ||||
|  | ||||
|         return os.path.join(self.storage_path, self.file_prefix + session_key) | ||||
|  | ||||
|     def _last_modification(self): | ||||
|         """ | ||||
|         Return the modification time of the file storing the session's content. | ||||
|         """ | ||||
|         modification = os.stat(self._key_to_file()).st_mtime | ||||
|         tz = datetime.timezone.utc if settings.USE_TZ else None | ||||
|         return datetime.datetime.fromtimestamp(modification, tz=tz) | ||||
|  | ||||
|     def _expiry_date(self, session_data): | ||||
|         """ | ||||
|         Return the expiry time of the file storing the session's content. | ||||
|         """ | ||||
|         return session_data.get("_session_expiry") or ( | ||||
|             self._last_modification() | ||||
|             + datetime.timedelta(seconds=self.get_session_cookie_age()) | ||||
|         ) | ||||
|  | ||||
|     def load(self): | ||||
|         session_data = {} | ||||
|         try: | ||||
|             with open(self._key_to_file(), encoding="ascii") as session_file: | ||||
|                 file_data = session_file.read() | ||||
|             # Don't fail if there is no data in the session file. | ||||
|             # We may have opened the empty placeholder file. | ||||
|             if file_data: | ||||
|                 try: | ||||
|                     session_data = self.decode(file_data) | ||||
|                 except (EOFError, SuspiciousOperation) as e: | ||||
|                     if isinstance(e, SuspiciousOperation): | ||||
|                         logger = logging.getLogger( | ||||
|                             "django.security.%s" % e.__class__.__name__ | ||||
|                         ) | ||||
|                         logger.warning(str(e)) | ||||
|                     self.create() | ||||
|  | ||||
|                 # Remove expired sessions. | ||||
|                 expiry_age = self.get_expiry_age(expiry=self._expiry_date(session_data)) | ||||
|                 if expiry_age <= 0: | ||||
|                     session_data = {} | ||||
|                     self.delete() | ||||
|                     self.create() | ||||
|         except (OSError, SuspiciousOperation): | ||||
|             self._session_key = None | ||||
|         return session_data | ||||
|  | ||||
|     def create(self): | ||||
|         while True: | ||||
|             self._session_key = self._get_new_session_key() | ||||
|             try: | ||||
|                 self.save(must_create=True) | ||||
|             except CreateError: | ||||
|                 continue | ||||
|             self.modified = True | ||||
|             return | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         if self.session_key is None: | ||||
|             return self.create() | ||||
|         # Get the session data now, before we start messing | ||||
|         # with the file it is stored within. | ||||
|         session_data = self._get_session(no_load=must_create) | ||||
|  | ||||
|         session_file_name = self._key_to_file() | ||||
|  | ||||
|         try: | ||||
|             # Make sure the file exists.  If it does not already exist, an | ||||
|             # empty placeholder file is created. | ||||
|             flags = os.O_WRONLY | getattr(os, "O_BINARY", 0) | ||||
|             if must_create: | ||||
|                 flags |= os.O_EXCL | os.O_CREAT | ||||
|             fd = os.open(session_file_name, flags) | ||||
|             os.close(fd) | ||||
|         except FileNotFoundError: | ||||
|             if not must_create: | ||||
|                 raise UpdateError | ||||
|         except FileExistsError: | ||||
|             if must_create: | ||||
|                 raise CreateError | ||||
|  | ||||
|         # Write the session file without interfering with other threads | ||||
|         # or processes.  By writing to an atomically generated temporary | ||||
|         # file and then using the atomic os.rename() to make the complete | ||||
|         # file visible, we avoid having to lock the session file, while | ||||
|         # still maintaining its integrity. | ||||
|         # | ||||
|         # Note: Locking the session file was explored, but rejected in part | ||||
|         # because in order to be atomic and cross-platform, it required a | ||||
|         # long-lived lock file for each session, doubling the number of | ||||
|         # files in the session storage directory at any given time.  This | ||||
|         # rename solution is cleaner and avoids any additional overhead | ||||
|         # when reading the session data, which is the more common case | ||||
|         # unless SESSION_SAVE_EVERY_REQUEST = True. | ||||
|         # | ||||
|         # See ticket #8616. | ||||
|         dir, prefix = os.path.split(session_file_name) | ||||
|  | ||||
|         try: | ||||
|             output_file_fd, output_file_name = tempfile.mkstemp( | ||||
|                 dir=dir, prefix=prefix + "_out_" | ||||
|             ) | ||||
|             renamed = False | ||||
|             try: | ||||
|                 try: | ||||
|                     os.write(output_file_fd, self.encode(session_data).encode()) | ||||
|                 finally: | ||||
|                     os.close(output_file_fd) | ||||
|  | ||||
|                 # This will atomically rename the file (os.rename) if the OS | ||||
|                 # supports it. Otherwise this will result in a shutil.copy2 | ||||
|                 # and os.unlink (for example on Windows). See #9084. | ||||
|                 shutil.move(output_file_name, session_file_name) | ||||
|                 renamed = True | ||||
|             finally: | ||||
|                 if not renamed: | ||||
|                     os.unlink(output_file_name) | ||||
|         except (EOFError, OSError): | ||||
|             pass | ||||
|  | ||||
|     def exists(self, session_key): | ||||
|         return os.path.exists(self._key_to_file(session_key)) | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         if session_key is None: | ||||
|             if self.session_key is None: | ||||
|                 return | ||||
|             session_key = self.session_key | ||||
|         try: | ||||
|             os.unlink(self._key_to_file(session_key)) | ||||
|         except OSError: | ||||
|             pass | ||||
|  | ||||
|     def clean(self): | ||||
|         pass | ||||
|  | ||||
|     @classmethod | ||||
|     def clear_expired(cls): | ||||
|         storage_path = cls._get_storage_path() | ||||
|         file_prefix = settings.SESSION_COOKIE_NAME | ||||
|  | ||||
|         for session_file in os.listdir(storage_path): | ||||
|             if not session_file.startswith(file_prefix): | ||||
|                 continue | ||||
|             session_key = session_file[len(file_prefix) :] | ||||
|             session = cls(session_key) | ||||
|             # When an expired session is loaded, its file is removed, and a | ||||
|             # new file is immediately created. Prevent this by disabling | ||||
|             # the create() method. | ||||
|             session.create = lambda: None | ||||
|             session.load() | ||||
| @ -0,0 +1,81 @@ | ||||
| from django.contrib.sessions.backends.base import SessionBase | ||||
| from django.core import signing | ||||
|  | ||||
|  | ||||
| class SessionStore(SessionBase): | ||||
|     def load(self): | ||||
|         """ | ||||
|         Load the data from the key itself instead of fetching from some | ||||
|         external data store. Opposite of _get_session_key(), raise BadSignature | ||||
|         if signature fails. | ||||
|         """ | ||||
|         try: | ||||
|             return signing.loads( | ||||
|                 self.session_key, | ||||
|                 serializer=self.serializer, | ||||
|                 # This doesn't handle non-default expiry dates, see #19201 | ||||
|                 max_age=self.get_session_cookie_age(), | ||||
|                 salt="django.contrib.sessions.backends.signed_cookies", | ||||
|             ) | ||||
|         except Exception: | ||||
|             # BadSignature, ValueError, or unpickling exceptions. If any of | ||||
|             # these happen, reset the session. | ||||
|             self.create() | ||||
|         return {} | ||||
|  | ||||
|     def create(self): | ||||
|         """ | ||||
|         To create a new key, set the modified flag so that the cookie is set | ||||
|         on the client for the current request. | ||||
|         """ | ||||
|         self.modified = True | ||||
|  | ||||
|     def save(self, must_create=False): | ||||
|         """ | ||||
|         To save, get the session key as a securely signed string and then set | ||||
|         the modified flag so that the cookie is set on the client for the | ||||
|         current request. | ||||
|         """ | ||||
|         self._session_key = self._get_session_key() | ||||
|         self.modified = True | ||||
|  | ||||
|     def exists(self, session_key=None): | ||||
|         """ | ||||
|         This method makes sense when you're talking to a shared resource, but | ||||
|         it doesn't matter when you're storing the information in the client's | ||||
|         cookie. | ||||
|         """ | ||||
|         return False | ||||
|  | ||||
|     def delete(self, session_key=None): | ||||
|         """ | ||||
|         To delete, clear the session key and the underlying data structure | ||||
|         and set the modified flag so that the cookie is set on the client for | ||||
|         the current request. | ||||
|         """ | ||||
|         self._session_key = "" | ||||
|         self._session_cache = {} | ||||
|         self.modified = True | ||||
|  | ||||
|     def cycle_key(self): | ||||
|         """ | ||||
|         Keep the same data but with a new key. Call save() and it will | ||||
|         automatically save a cookie with a new key at the end of the request. | ||||
|         """ | ||||
|         self.save() | ||||
|  | ||||
|     def _get_session_key(self): | ||||
|         """ | ||||
|         Instead of generating a random string, generate a secure url-safe | ||||
|         base64-encoded string of data as our session key. | ||||
|         """ | ||||
|         return signing.dumps( | ||||
|             self._session, | ||||
|             compress=True, | ||||
|             salt="django.contrib.sessions.backends.signed_cookies", | ||||
|             serializer=self.serializer, | ||||
|         ) | ||||
|  | ||||
|     @classmethod | ||||
|     def clear_expired(cls): | ||||
|         pass | ||||
| @ -0,0 +1,47 @@ | ||||
| """ | ||||
| This module allows importing AbstractBaseSession even | ||||
| when django.contrib.sessions is not in INSTALLED_APPS. | ||||
| """ | ||||
| from django.db import models | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
|  | ||||
|  | ||||
| class BaseSessionManager(models.Manager): | ||||
|     def encode(self, session_dict): | ||||
|         """ | ||||
|         Return the given session dictionary serialized and encoded as a string. | ||||
|         """ | ||||
|         session_store_class = self.model.get_session_store_class() | ||||
|         return session_store_class().encode(session_dict) | ||||
|  | ||||
|     def save(self, session_key, session_dict, expire_date): | ||||
|         s = self.model(session_key, self.encode(session_dict), expire_date) | ||||
|         if session_dict: | ||||
|             s.save() | ||||
|         else: | ||||
|             s.delete()  # Clear sessions with no data. | ||||
|         return s | ||||
|  | ||||
|  | ||||
| class AbstractBaseSession(models.Model): | ||||
|     session_key = models.CharField(_("session key"), max_length=40, primary_key=True) | ||||
|     session_data = models.TextField(_("session data")) | ||||
|     expire_date = models.DateTimeField(_("expire date"), db_index=True) | ||||
|  | ||||
|     objects = BaseSessionManager() | ||||
|  | ||||
|     class Meta: | ||||
|         abstract = True | ||||
|         verbose_name = _("session") | ||||
|         verbose_name_plural = _("sessions") | ||||
|  | ||||
|     def __str__(self): | ||||
|         return self.session_key | ||||
|  | ||||
|     @classmethod | ||||
|     def get_session_store_class(cls): | ||||
|         raise NotImplementedError | ||||
|  | ||||
|     def get_decoded(self): | ||||
|         session_store_class = self.get_session_store_class() | ||||
|         return session_store_class().decode(self.session_data) | ||||
| @ -0,0 +1,19 @@ | ||||
| from django.core.exceptions import BadRequest, SuspiciousOperation | ||||
|  | ||||
|  | ||||
| class InvalidSessionKey(SuspiciousOperation): | ||||
|     """Invalid characters in session key""" | ||||
|  | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class SuspiciousSession(SuspiciousOperation): | ||||
|     """The session may be tampered with""" | ||||
|  | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class SessionInterrupted(BadRequest): | ||||
|     """The session was interrupted.""" | ||||
|  | ||||
|     pass | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # F Wolff <friedel@translate.org.za>, 2019 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2019-01-04 18:57+0000\n" | ||||
| "Last-Translator: F Wolff <friedel@translate.org.za>\n" | ||||
| "Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" | ||||
| "af/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: af\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessies" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "sessiesleutel" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "sessiedata" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "vervaldatum" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sessie" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessies" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Bashar Al-Abdulhadi, 2014 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ar\n" | ||||
| "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " | ||||
| "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "جلسات" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "مفتاح الجلسة" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "بيانات الجلسة" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "تاريخ الانتهاء" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "جلسة" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "جلسات" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Riterix <infosrabah@gmail.com>, 2019 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2019-12-14 22:50+0000\n" | ||||
| "Last-Translator: Riterix <infosrabah@gmail.com>\n" | ||||
| "Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" | ||||
| "language/ar_DZ/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ar_DZ\n" | ||||
| "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " | ||||
| "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "جلسات" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "مفتاح الجلسة" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "بيانات الجلسة" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "تاريخ الانتهاء" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "جلسة" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "جلسات" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Ḷḷumex03 <tornes@opmbx.org>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 19:51+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Asturian (http://www.transifex.com/django/django/language/" | ||||
| "ast/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ast\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "data de caducidá" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesión" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Ali Ismayilov <ali@ismailov.info>, 2011 | ||||
| # Emin Mastizada <emin@linux.com>, 2018 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2018-04-27 13:19+0000\n" | ||||
| "Last-Translator: Emin Mastizada <emin@linux.com>\n" | ||||
| "Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" | ||||
| "az/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: az\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Seanslar" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "seans açarı" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "seansın məlumatları" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "bitmə tarixi" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "seans" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "seanslar" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Viktar Palstsiuk <vipals@gmail.com>, 2015 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Viktar Palstsiuk <vipals@gmail.com>\n" | ||||
| "Language-Team: Belarusian (http://www.transifex.com/django/django/language/" | ||||
| "be/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: be\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | ||||
| "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" | ||||
| "%100>=11 && n%100<=14)? 2 : 3);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Сесіі" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "ключ сэансу" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "зьвесткі сэансу" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "тэрмін" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "сэсія" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "сэсіі" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # arneatec <arneatec@gmail.com>, 2022 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # vestimir <vestimir@gmail.com>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2022-01-14 11:56+0000\n" | ||||
| "Last-Translator: arneatec <arneatec@gmail.com>\n" | ||||
| "Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" | ||||
| "bg/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: bg\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Сесии" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "ключ на сесията" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "данни от сесията" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "дата на изтичане на валидност" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "сесия" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "сесии" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Bengali (http://www.transifex.com/django/django/language/" | ||||
| "bn/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: bn\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "সেশন কি" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "সেশন ডাটা" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "মেয়াদ শেষের তারিখ" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "সেশন" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "সেশনসমূহ" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,40 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Fulup <fulup.jakez@gmail.com>, 2012 | ||||
| # Irriep Nala Novram <allannkorh@yahoo.fr>, 2018 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2018-10-19 23:05+0000\n" | ||||
| "Last-Translator: Irriep Nala Novram <allannkorh@yahoo.fr>\n" | ||||
| "Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: br\n" | ||||
| "Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" | ||||
| "=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" | ||||
| "%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " | ||||
| "19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " | ||||
| "&& n % 1000000 == 0) ? 3 : 4);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Dalc'hoù" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "alc'hwez dalc'h" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "roadennoù an dalc'h" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "deiziad fin" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "dalc'h" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "dalc'hoù" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Bosnian (http://www.transifex.com/django/django/language/" | ||||
| "bs/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: bs\n" | ||||
| "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" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "ključ sesije" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "podaci sesije" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "datum isteka" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesija" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesije" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Carles Barrobés <carles@barrobes.com>, 2014 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Catalan (http://www.transifex.com/django/django/language/" | ||||
| "ca/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ca\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessions" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clau de la sessió" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "dades de la sessió" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "data de caducitat" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sessió" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessions" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # kosar tofiq <kosar.belana@gmail.com>, 2020 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2023-04-24 18:26+0000\n" | ||||
| "Last-Translator: kosar tofiq <kosar.belana@gmail.com>, 2020\n" | ||||
| "Language-Team: Central Kurdish (http://www.transifex.com/django/django/" | ||||
| "language/ckb/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ckb\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "کۆڕەکان" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "کلیلی کۆڕ" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "دراوەی کۆڕ" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "بەرواری بەسەرچوون" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "کۆڕ" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "کۆڕەکان" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Vláďa Macek <macek@sandbox.cz>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: cs\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " | ||||
| "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sezení" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "klíč sezení" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "data sezení" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "datum expirace" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sezení" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sezení" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Maredudd ap Gwyndaf <maredudd@maredudd.com>, 2013-2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Maredudd ap Gwyndaf <maredudd@maredudd.com>\n" | ||||
| "Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: cy\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " | ||||
| "11) ? 2 : 3;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesiynau" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "allwedd sesiwn" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "data sesiwn" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "dyddiad terfyn" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesiwn" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiynau" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Erik Wognsen <r4mses@gmail.com>, 2014 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: da\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessioner" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "sessionsnøgle" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "sessionsdata" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "udløbsdato" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessioner" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,35 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011,2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: de\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessions" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "Sitzungs-ID" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "Sitzungsdaten" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "Verfallsdatum" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "Sitzung" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "Sitzungen" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Michael Wolf <milupo@sorbzilla.de>, 2016 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 00:02+0000\n" | ||||
| "Last-Translator: Michael Wolf <milupo@sorbzilla.de>\n" | ||||
| "Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" | ||||
| "language/dsb/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: dsb\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" | ||||
| "%100==4 ? 2 : 3);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Póseźenja" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "pósejźeński kluc" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "pósejźeńske daty" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "datum spadnjenja" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "pósejźenje" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "pósejźenja" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Pãnoș <panos.laganakos@gmail.com>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Pãnoș <panos.laganakos@gmail.com>\n" | ||||
| "Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: el\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Συνεδρίες" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "κλειδί συνεδρίας" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "δεδομένα συνεδρίας" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "ημερομηνία λήξης" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "συνεδρία" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "συνεδρίες" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: Django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2010-05-13 15:35+0200\n" | ||||
| "Last-Translator: Django team\n" | ||||
| "Language-Team: English <en@li.org>\n" | ||||
| "Language: en\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
|  | ||||
| #: contrib/sessions/apps.py:8 | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| #: contrib/sessions/models.py:44 | ||||
| msgid "session key" | ||||
| msgstr "" | ||||
|  | ||||
| #: contrib/sessions/models.py:46 | ||||
| msgid "session data" | ||||
| msgstr "" | ||||
|  | ||||
| #: contrib/sessions/models.py:47 | ||||
| msgid "expire date" | ||||
| msgstr "" | ||||
|  | ||||
| #: contrib/sessions/models.py:52 | ||||
| msgid "session" | ||||
| msgstr "" | ||||
|  | ||||
| #: contrib/sessions/models.py:53 | ||||
| msgid "sessions" | ||||
| msgstr "" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Tom Fifield <tom@tomfifield.net>, 2021 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2021-04-11 13:15+0000\n" | ||||
| "Last-Translator: Tom Fifield <tom@tomfifield.net>\n" | ||||
| "Language-Team: English (Australia) (http://www.transifex.com/django/django/" | ||||
| "language/en_AU/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: en_AU\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessions" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "session key" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "session data" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "expire date" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessions" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Ross Poulton <ross@rossp.org>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: English (United Kingdom) (http://www.transifex.com/django/" | ||||
| "django/language/en_GB/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: en_GB\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "session key" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "session data" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "expire date" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessions" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2014 | ||||
| # kristjan <kristjan.schmidt@googlemail.com>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Esperanto (http://www.transifex.com/django/django/language/" | ||||
| "eo/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: eo\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Seancoj" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "seanco-ŝlosilo" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "seanco-datumo" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "senvalidiĝ-dato" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "seanco" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "seancoj" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Ernesto Avilés Vázquez <whippiii@gmail.com>, 2014 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Spanish (http://www.transifex.com/django/django/language/" | ||||
| "es/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: es\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesiones" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "fecha de caducidad" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesión" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Ramiro Morales, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Ramiro Morales\n" | ||||
| "Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" | ||||
| "language/es_AR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: es_AR\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesiones" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de la sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "fecha de caducidad" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesión" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Carlos Muñoz <cmuozdiaz@outlook.com>, 2015 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 22:00+0000\n" | ||||
| "Last-Translator: Carlos Muñoz <cmuozdiaz@outlook.com>\n" | ||||
| "Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" | ||||
| "language/es_CO/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: es_CO\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesiones" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "fecha de caducidad" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesión" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Abraham Estrada, 2011 | ||||
| # zodman <zodman@gmail.com>, 2015 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: zodman <zodman@gmail.com>\n" | ||||
| "Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" | ||||
| "language/es_MX/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: es_MX\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesiones" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de la sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "fecha de caducidad" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "período de sesiones" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,35 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2014-10-05 20:12+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" | ||||
| "django/language/es_VE/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: es_VE\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Marti Raudsepp <marti@juffo.org>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Estonian (http://www.transifex.com/django/django/language/" | ||||
| "et/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: et\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessioonid" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "sessioonivõti" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "sessiooni andmed" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "kehtivusaja lõpp" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sessioon" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessioonid" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Eneko Illarramendi <eneko@illarra.com>, 2017 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Eneko Illarramendi <eneko@illarra.com>\n" | ||||
| "Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: eu\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesioak" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "sesioaren giltza" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "sesioaren datuak" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "amaiera data" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesioa" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesioak" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Reza Mohammadi <reza@teeleh.ir>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Persian (http://www.transifex.com/django/django/language/" | ||||
| "fa/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: fa\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "نشستها" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "کلید نشست" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "اطلاعات نشست" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "تاریخ انقضاء" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "نشست" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "نشستها" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Klaus Dahlén <klaus.dahlen@gmail.com>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Finnish (http://www.transifex.com/django/django/language/" | ||||
| "fi/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: fi\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Istunnot" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "istunnon avain" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "istunnon tiedot" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "vanhenee" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "istunto" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "istunnot" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Claude Paroz <claude@2xlibre.net>, 2014 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: fr\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessions" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clé de session" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "données de session" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "date d'expiration" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessions" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,35 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2014-10-05 20:13+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" | ||||
| "language/fy/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: fy\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Luke Blaney <transifex@lukeblaney.co.uk>, 2019 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2019-06-22 21:45+0000\n" | ||||
| "Last-Translator: Luke Blaney <transifex@lukeblaney.co.uk>\n" | ||||
| "Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ga\n" | ||||
| "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " | ||||
| "4);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Seisiúin" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "eochair an seisiún" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "sonraíocht an seisiún" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "Data dul as feidhm" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "seisiún" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "seisúin" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # GunChleoc, 2015 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-22 17:29+0000\n" | ||||
| "Last-Translator: GunChleoc\n" | ||||
| "Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" | ||||
| "language/gd/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: gd\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " | ||||
| "(n > 2 && n < 20) ? 2 : 3;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Seiseanan" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "iuchair an t-seisein" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "dàta an t-seisein" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "falbhaidh an ùine air" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "seisean" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "seiseanan" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Leandro Regueiro <leandro.regueiro@gmail.com>, 2013 | ||||
| # X Bello <xbello@gmail.com>, 2023 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2023-04-24 18:26+0000\n" | ||||
| "Last-Translator: X Bello <xbello@gmail.com>, 2023\n" | ||||
| "Language-Team: Galician (http://www.transifex.com/django/django/language/" | ||||
| "gl/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: gl\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesións" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "chave da sesión" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos da sesión" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "data de caducidade" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesión" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesións" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Meir Kriheli <mkriheli@gmail.com>, 2014 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: he\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " | ||||
| "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "התחברויות" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "מפתח התחברות (session key)" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "מידע התחברות (session data)" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "תאריך פג תוקף" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "התחברות" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "התחברויות" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Sandeep Satavlekar <sandysat@gmail.com>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Jannis Leidel <jannis@leidel.info>\n" | ||||
| "Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: hi\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "सत्र कुंजी" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "सत्र सामग्री" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "समाप्ति तिथी" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "सत्र" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "सत्रें" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # Mislav Cimperšak <mislav.cimpersak@gmail.com>, 2015 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 16:40+0000\n" | ||||
| "Last-Translator: Mislav Cimperšak <mislav.cimpersak@gmail.com>\n" | ||||
| "Language-Team: Croatian (http://www.transifex.com/django/django/language/" | ||||
| "hr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: hr\n" | ||||
| "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" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessions" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "session ključ (key)" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "session podaci" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "ističe na datum" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessions" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Michael Wolf <milupo@sorbzilla.de>, 2016 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 00:02+0000\n" | ||||
| "Last-Translator: Michael Wolf <milupo@sorbzilla.de>\n" | ||||
| "Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" | ||||
| "language/hsb/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: hsb\n" | ||||
| "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" | ||||
| "%100==4 ? 2 : 3);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Posedźenja" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "posedźenski kluč" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "posedźenske daty" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "datum spadnjenja" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "posedźenje" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "posedźenja" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,37 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # András Veres-Szentkirályi, 2016 | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: János R (Hangya)\n" | ||||
| "Language-Team: Hungarian (http://www.transifex.com/django/django/language/" | ||||
| "hu/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: hu\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Munkamenetek" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "munkamenet kulcs" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "munkamenet adat" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "lejárat dátuma" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "munkamenet" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "munkamenetek" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,35 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2018-11-01 20:47+0000\n" | ||||
| "Last-Translator: Ruben Harutyunov <rharutyunov@mail.ru>\n" | ||||
| "Language-Team: Armenian (http://www.transifex.com/django/django/language/" | ||||
| "hy/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: hy\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Սեսսիաներ" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "սեսսիայի բանալի" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "սեսսիայի տվյալներ" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "պիտանիության ժամկետը" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "սեսսիա" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "սեսսիաներ" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,36 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Martijn Dekker <mcdutchie@hotmail.com>, 2016 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-19 22:00+0000\n" | ||||
| "Last-Translator: Martijn Dekker <mcdutchie@hotmail.com>\n" | ||||
| "Language-Team: Interlingua (http://www.transifex.com/django/django/language/" | ||||
| "ia/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: ia\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sessiones" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "clave de session" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "datos de session" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "data de expiration" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "session" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sessiones" | ||||
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,38 @@ | ||||
| # This file is distributed under the same license as the Django package. | ||||
| # | ||||
| # Translators: | ||||
| # Jannis Leidel <jannis@leidel.info>, 2011 | ||||
| # M Asep Indrayana <me@drayanaindra.com>, 2015 | ||||
| # rodin <romihardiyanto@gmail.com>, 2011 | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: django\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-01-17 11:07+0100\n" | ||||
| "PO-Revision-Date: 2017-09-23 18:54+0000\n" | ||||
| "Last-Translator: rodin <romihardiyanto@gmail.com>\n" | ||||
| "Language-Team: Indonesian (http://www.transifex.com/django/django/language/" | ||||
| "id/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Language: id\n" | ||||
| "Plural-Forms: nplurals=1; plural=0;\n" | ||||
|  | ||||
| msgid "Sessions" | ||||
| msgstr "Sesi" | ||||
|  | ||||
| msgid "session key" | ||||
| msgstr "kunci sesi" | ||||
|  | ||||
| msgid "session data" | ||||
| msgstr "data sesi" | ||||
|  | ||||
| msgid "expire date" | ||||
| msgstr "tanggal kedaluwarsa" | ||||
|  | ||||
| msgid "session" | ||||
| msgstr "sesi" | ||||
|  | ||||
| msgid "sessions" | ||||
| msgstr "sesi" | ||||
										
											Binary file not shown.
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user