diff --git a/.travis.yml b/.travis.yml
index 7073c3d0c..c9d9a1648 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,9 +19,16 @@ env:
- TOX_ENV=py27-django110
- TOX_ENV=py35-django110
- TOX_ENV=py34-django110
+ - TOX_ENV=py27-djangomaster
+ - TOX_ENV=py34-djangomaster
+ - TOX_ENV=py35-djangomaster
matrix:
fast_finish: true
+ allow_failures:
+ - env: TOX_ENV=py27-djangomaster
+ - env: TOX_ENV=py34-djangomaster
+ - env: TOX_ENV=py35-djangomaster
install:
# Virtualenv < 14 is required to keep the Python 3.2 builds running.
diff --git a/README.md b/README.md
index 0068df61f..a8e1afbf1 100644
--- a/README.md
+++ b/README.md
@@ -11,8 +11,23 @@ Full documentation for the project is available at [http://www.django-rest-frame
---
-**Funding**: If you use REST framework commercially we strongly encourage you to
-invest in its continued development by [signing up for paid plan](https://fund.django-rest-framework.org/topics/funding/).
+# Funding
+
+REST framework is a *collaboratively funded project*. If you use
+REST framework commercially we strongly encourage you to invest in its
+continued development by **[signing up for a paid plan][funding]**.
+
+The initial aim is to provide a single full-time position on REST framework.
+Right now we're over 58% of the way towards achieving that.
+*Every single sign-up makes a significant impact.*
+
+
+
+
+
+
+
+*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), and [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf).*
---
@@ -37,7 +52,7 @@ There is a live example API for testing purposes, [available here][sandbox].
# Requirements
* Python (2.7, 3.2, 3.3, 3.4, 3.5)
-* Django (1.8, 1.9)
+* Django (1.8, 1.9, 1.10)
# Installation
@@ -169,6 +184,9 @@ Send a description of the issue via email to [rest-framework-security@googlegrou
[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework
[sandbox]: http://restframework.herokuapp.com/
+[funding]: https://fund.django-rest-framework.org/topics/funding/
+[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
+
[oauth1-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-rest-framework-oauth
[oauth2-section]: http://www.django-rest-framework.org/api-guide/authentication/#django-oauth-toolkit
[serializer-section]: http://www.django-rest-framework.org/api-guide/serializers/#serializers
diff --git a/docs/api-guide/authentication.md b/docs/api-guide/authentication.md
index 81f0e12d5..8d880b037 100644
--- a/docs/api-guide/authentication.md
+++ b/docs/api-guide/authentication.md
@@ -44,7 +44,7 @@ The default authentication schemes may be set globally, using the `DEFAULT_AUTHE
}
You can also set the authentication scheme on a per-view or per-viewset basis,
-using the `APIView` class based views.
+using the `APIView` class-based views.
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
@@ -207,6 +207,10 @@ The `obtain_auth_token` view will return a JSON response when valid `username` a
Note that the default `obtain_auth_token` view explicitly uses JSON requests and responses, rather than using default renderer and parser classes in your settings. If you need a customized version of the `obtain_auth_token` view, you can do so by overriding the `ObtainAuthToken` view class, and using that in your url conf instead.
+By default there are no permissions or throttling applied to the `obtain_auth_token` view. If you do wish to apply throttling you'll need to override the view class,
+and include them using the `throttle_classes` attribute.
+
+
##### With Django admin
It is also possible to create Tokens manually through admin interface. In case you are using a large user base, we recommend that you monkey patch the `TokenAdmin` class to customize it to your needs, more specifically by declaring the `user` field as `raw_field`.
diff --git a/docs/api-guide/content-negotiation.md b/docs/api-guide/content-negotiation.md
index bc3b09fb7..bd408feba 100644
--- a/docs/api-guide/content-negotiation.md
+++ b/docs/api-guide/content-negotiation.md
@@ -77,7 +77,7 @@ The default content negotiation class may be set globally, using the `DEFAULT_CO
'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.negotiation.IgnoreClientContentNegotiation',
}
-You can also set the content negotiation used for an individual view, or viewset, using the `APIView` class based views.
+You can also set the content negotiation used for an individual view, or viewset, using the `APIView` class-based views.
from myapp.negotiation import IgnoreClientContentNegotiation
from rest_framework.response import Response
diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md
index b58d02898..f95608afb 100644
--- a/docs/api-guide/fields.md
+++ b/docs/api-guide/fields.md
@@ -261,9 +261,10 @@ Corresponds to `django.db.models.fields.DecimalField`.
- `max_digits` The maximum number of digits allowed in the number. Note that this number must be greater than or equal to decimal_places.
- `decimal_places` The number of decimal places to store with the number.
-- `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer.
+- `coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. Note that setting `localize` will force the value to `True`.
- `max_value` Validate that the number provided is no greater than this value.
- `min_value` Validate that the number provided is no less than this value.
+- `localize` Set to `True` to enable localization of input and output based on the current locale. This will also force `coerce_to_string` to `True`. Defaults to `False`. Note that data formatting is enabled if you have set `USE_L10N=True` in your settings file.
#### Example usage
diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md
index fcab15a79..8664dcc8a 100644
--- a/docs/api-guide/filtering.md
+++ b/docs/api-guide/filtering.md
@@ -96,7 +96,7 @@ The default filter backends may be set globally, using the `DEFAULT_FILTER_BACKE
}
You can also set the filter backends on a per-view, or per-viewset basis,
-using the `GenericAPIView` class based views.
+using the `GenericAPIView` class-based views.
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
@@ -178,8 +178,8 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
from rest_framework import generics
class ProductFilter(filters.FilterSet):
- min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
- max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
+ min_price = django_filters.NumberFilter(name="price", lookup_expr='gte')
+ max_price = django_filters.NumberFilter(name="price", lookup_expr='lte')
class Meta:
model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price']
diff --git a/docs/api-guide/format-suffixes.md b/docs/api-guide/format-suffixes.md
index 13717b05f..05dde47f2 100644
--- a/docs/api-guide/format-suffixes.md
+++ b/docs/api-guide/format-suffixes.md
@@ -42,7 +42,7 @@ When using `format_suffix_patterns`, you must make sure to add the `'format'` ke
def comment_list(request, format=None):
# do stuff...
-Or with class based views:
+Or with class-based views:
class CommentList(APIView):
def get(self, request, format=None):
diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md
index e6e300561..d7dc30ce1 100644
--- a/docs/api-guide/generic-views.md
+++ b/docs/api-guide/generic-views.md
@@ -7,7 +7,7 @@ source: mixins.py
>
> — [Django Documentation][cite]
-One of the key benefits of class based views is the way they allow you to compose bits of reusable behavior. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns.
+One of the key benefits of class-based views is the way they allow you to compose bits of reusable behavior. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns.
The generic views provided by REST framework allow you to quickly build API views that map closely to your database models.
diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md
index 65ea2b3e6..0dd935ba3 100644
--- a/docs/api-guide/pagination.md
+++ b/docs/api-guide/pagination.md
@@ -47,7 +47,7 @@ You can then apply your new style to a view using the `.pagination_class` attrib
class BillingRecordsView(generics.ListAPIView):
queryset = Billing.objects.all()
- serializer = BillingRecordsSerializer
+ serializer_class = BillingRecordsSerializer
pagination_class = LargeResultsSetPagination
Or apply the style globally, using the `DEFAULT_PAGINATION_CLASS` settings key. For example:
diff --git a/docs/api-guide/parsers.md b/docs/api-guide/parsers.md
index e1e6d1d65..ef2859fe1 100644
--- a/docs/api-guide/parsers.md
+++ b/docs/api-guide/parsers.md
@@ -35,7 +35,7 @@ The default set of parsers may be set globally, using the `DEFAULT_PARSER_CLASSE
}
You can also set the parsers used for an individual view, or viewset,
-using the `APIView` class based views.
+using the `APIView` class-based views.
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
diff --git a/docs/api-guide/permissions.md b/docs/api-guide/permissions.md
index 5386e4df6..402875cd5 100644
--- a/docs/api-guide/permissions.md
+++ b/docs/api-guide/permissions.md
@@ -71,7 +71,7 @@ If not specified, this setting defaults to allowing unrestricted access:
)
You can also set the authentication policy on a per-view, or per-viewset basis,
-using the `APIView` class based views.
+using the `APIView` class-based views.
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md
index f04770a36..a95778350 100644
--- a/docs/api-guide/renderers.md
+++ b/docs/api-guide/renderers.md
@@ -28,7 +28,7 @@ The default set of renderers may be set globally, using the `DEFAULT_RENDERER_CL
}
You can also set the renderers used for an individual view, or viewset,
-using the `APIView` class based views.
+using the `APIView` class-based views.
from django.contrib.auth.models import User
from rest_framework.renderers import JSONRenderer
diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md
new file mode 100644
index 000000000..6585801e7
--- /dev/null
+++ b/docs/api-guide/schemas.md
@@ -0,0 +1,424 @@
+source: schemas.py
+
+# Schemas
+
+> A machine-readable [schema] describes what resources are available via the API, what their URLs are, how they are represented and what operations they support.
+>
+> — Heroku, [JSON Schema for the Heroku Platform API][cite]
+
+API schemas are a useful tool that allow for a range of use cases, including
+generating reference documentation, or driving dynamic client libraries that
+can interact with your API.
+
+## Representing schemas internally
+
+REST framework uses [Core API][coreapi] in order to model schema information in
+a format-independent representation. This information can then be rendered
+into various different schema formats, or used to generate API documentation.
+
+When using Core API, a schema is represented as a `Document` which is the
+top-level container object for information about the API. Available API
+interactions are represented using `Link` objects. Each link includes a URL,
+HTTP method, and may include a list of `Field` instances, which describe any
+parameters that may be accepted by the API endpoint. The `Link` and `Field`
+instances may also include descriptions, that allow an API schema to be
+rendered into user documentation.
+
+Here's an example of an API description that includes a single `search`
+endpoint:
+
+ coreapi.Document(
+ title='Flight Search API',
+ url='https://api.example.org/',
+ content={
+ 'search': coreapi.Link(
+ url='/search/',
+ action='get',
+ fields=[
+ coreapi.Field(
+ name='from',
+ required=True,
+ location='query',
+ description='City name or airport code.'
+ ),
+ coreapi.Field(
+ name='to',
+ required=True,
+ location='query',
+ description='City name or airport code.'
+ ),
+ coreapi.Field(
+ name='date',
+ required=True,
+ location='query',
+ description='Flight date in "YYYY-MM-DD" format.'
+ )
+ ],
+ description='Return flight availability and prices.'
+ )
+ }
+ )
+
+## Schema output formats
+
+In order to be presented in an HTTP response, the internal representation
+has to be rendered into the actual bytes that are used in the response.
+
+[Core JSON][corejson] is designed as a canonical format for use with Core API.
+REST framework includes a renderer class for handling this media type, which
+is available as `renderers.CoreJSONRenderer`.
+
+Other schema formats such as [Open API][open-api] ("Swagger"),
+[JSON HyperSchema][json-hyperschema], or [API Blueprint][api-blueprint] can
+also be supported by implementing a custom renderer class.
+
+## Schemas vs Hypermedia
+
+It's worth pointing out here that Core API can also be used to model hypermedia
+responses, which present an alternative interaction style to API schemas.
+
+With an API schema, the entire available interface is presented up-front
+as a single endpoint. Responses to individual API endpoints are then typically
+presented as plain data, without any further interactions contained in each
+response.
+
+With Hypermedia, the client is instead presented with a document containing
+both data and available interactions. Each interaction results in a new
+document, detailing both the current state and the available interactions.
+
+Further information and support on building Hypermedia APIs with REST framework
+is planned for a future version.
+
+---
+
+# Adding a schema
+
+You'll need to install the `coreapi` package in order to add schema support
+for REST framework.
+
+ pip install coreapi
+
+REST framework includes functionality for auto-generating a schema,
+or allows you to specify one explicitly. There are a few different ways to
+add a schema to your API, depending on exactly what you need.
+
+## Using DefaultRouter
+
+If you're using `DefaultRouter` then you can include an auto-generated schema,
+simply by adding a `schema_title` argument to the router.
+
+ router = DefaultRouter(schema_title='Server Monitoring API')
+
+The schema will be included at the root URL, `/`, and presented to clients
+that include the Core JSON media type in their `Accept` header.
+
+ $ http http://127.0.0.1:8000/ Accept:application/vnd.coreapi+json
+ HTTP/1.0 200 OK
+ Allow: GET, HEAD, OPTIONS
+ Content-Type: application/vnd.coreapi+json
+
+ {
+ "_meta": {
+ "title": "Server Monitoring API"
+ },
+ "_type": "document",
+ ...
+ }
+
+This is a great zero-configuration option for when you want to get up and
+running really quickly.
+
+The only other available option to `DefaultRouter` is `schema_renderers`, which
+may be used to pass the set of renderer classes that can be used to render
+schema output.
+
+ from rest_framework.renderers import CoreJSONRenderer
+ from my_custom_package import APIBlueprintRenderer
+
+ router = DefaultRouter(schema_title='Server Monitoring API', schema_renderers=[
+ CoreJSONRenderer, APIBlueprintRenderer
+ ])
+
+If you want more flexibility over the schema output then you'll need to consider
+using `SchemaGenerator` instead.
+
+## Using SchemaGenerator
+
+The most common way to add a schema to your API is to use the `SchemaGenerator`
+class to auto-generate the `Document` instance, and to return that from a view.
+
+This option gives you the flexibility of setting up the schema endpoint
+with whatever behavior you want. For example, you can apply different
+permission, throttling or authentication policies to the schema endpoint.
+
+Here's an example of using `SchemaGenerator` together with a view to
+return the schema.
+
+**views.py:**
+
+ from rest_framework.decorators import api_view, renderer_classes
+ from rest_framework import renderers, response, schemas
+
+
+ @api_view()
+ @renderer_classes([renderers.CoreJSONRenderer])
+ def schema_view(request):
+ generator = schemas.SchemaGenerator(title='Bookings API')
+ return response.Response(generator.get_schema())
+
+**urls.py:**
+
+ urlpatterns = [
+ url('/', schema_view),
+ ...
+ ]
+
+You can also serve different schemas to different users, depending on the
+permissions they have available. This approach can be used to ensure that
+unauthenticated requests are presented with a different schema to
+authenticated requests, or to ensure that different parts of the API are
+made visible to different users depending on their role.
+
+In order to present a schema with endpoints filtered by user permissions,
+you need to pass the `request` argument to the `get_schema()` method, like so:
+
+ @api_view()
+ @renderer_classes([renderers.CoreJSONRenderer])
+ def schema_view(request):
+ generator = schemas.SchemaGenerator(title='Bookings API')
+ return response.Response(generator.get_schema(request=request))
+
+## Explicit schema definition
+
+An alternative to the auto-generated approach is to specify the API schema
+explicitly, by declaring a `Document` object in your codebase. Doing so is a
+little more work, but ensures that you have full control over the schema
+representation.
+
+ import coreapi
+ from rest_framework.decorators import api_view, renderer_classes
+ from rest_framework import renderers, response
+
+ schema = coreapi.Document(
+ title='Bookings API',
+ content={
+ ...
+ }
+ )
+
+ @api_view()
+ @renderer_classes([renderers.CoreJSONRenderer])
+ def schema_view(request):
+ return response.Response(schema)
+
+## Static schema file
+
+A final option is to write your API schema as a static file, using one
+of the available formats, such as Core JSON or Open API.
+
+You could then either:
+
+* Write a schema definition as a static file, and [serve the static file directly][static-files].
+* Write a schema definition that is loaded using `Core API`, and then
+ rendered to one of many available formats, depending on the client request.
+
+---
+
+# Alternate schema formats
+
+In order to support an alternate schema format, you need to implement a custom renderer
+class that handles converting a `Document` instance into a bytestring representation.
+
+If there is a Core API codec package that supports encoding into the format you
+want to use then implementing the renderer class can be done by using the codec.
+
+## Example
+
+For example, the `openapi_codec` package provides support for encoding or decoding
+to the Open API ("Swagger") format:
+
+ from rest_framework import renderers
+ from openapi_codec import OpenAPICodec
+
+ class SwaggerRenderer(renderers.BaseRenderer):
+ media_type = 'application/openapi+json;version=2.0'
+ format = 'swagger'
+
+ def render(self, data, media_type=None, renderer_context=None):
+ codec = OpenAPICodec()
+ return codec.dump(data)
+
+---
+
+# API Reference
+
+## SchemaGenerator
+
+A class that deals with introspecting your API views, which can be used to
+generate a schema.
+
+Typically you'll instantiate `SchemaGenerator` with a single argument, like so:
+
+ generator = SchemaGenerator(title='Stock Prices API')
+
+Arguments:
+
+* `title` - The name of the API. **required**
+* `patterns` - A list of URLs to inspect when generating the schema. Defaults to the project's URL conf.
+* `urlconf` - A URL conf module name to use when generating the schema. Defaults to `settings.ROOT_URLCONF`.
+
+### get_schema()
+
+Returns a `coreapi.Document` instance that represents the API schema.
+
+ @api_view
+ @renderer_classes([renderers.CoreJSONRenderer])
+ def schema_view(request):
+ generator = schemas.SchemaGenerator(title='Bookings API')
+ return Response(generator.get_schema())
+
+Arguments:
+
+* `request` - The incoming request. Optionally used if you want to apply per-user permissions to the schema-generation.
+
+---
+
+## Core API
+
+This documentation gives a brief overview of the components within the `coreapi`
+package that are used to represent an API schema.
+
+Note that these classes are imported from the `coreapi` package, rather than
+from the `rest_framework` package.
+
+### Document
+
+Represents a container for the API schema.
+
+#### `title`
+
+A name for the API.
+
+#### `url`
+
+A canonical URL for the API.
+
+#### `content`
+
+A dictionary, containing the `Link` objects that the schema contains.
+
+In order to provide more structure to the schema, the `content` dictionary
+may be nested, typically to a second level. For example:
+
+ content={
+ "bookings": {
+ "list": Link(...),
+ "create": Link(...),
+ ...
+ },
+ "venues": {
+ "list": Link(...),
+ ...
+ },
+ ...
+ }
+
+### Link
+
+Represents an individual API endpoint.
+
+#### `url`
+
+The URL of the endpoint. May be a URI template, such as `/users/{username}/`.
+
+#### `action`
+
+The HTTP method associated with the endpoint. Note that URLs that support
+more than one HTTP method, should correspond to a single `Link` for each.
+
+#### `fields`
+
+A list of `Field` instances, describing the available parameters on the input.
+
+#### `description`
+
+A short description of the meaning and intended usage of the endpoint.
+
+### Field
+
+Represents a single input parameter on a given API endpoint.
+
+#### `name`
+
+A descriptive name for the input.
+
+#### `required`
+
+A boolean, indicated if the client is required to included a value, or if
+the parameter can be omitted.
+
+#### `location`
+
+Determines how the information is encoded into the request. Should be one of
+the following strings:
+
+**"path"**
+
+Included in a templated URI. For example a `url` value of `/products/{product_code}/` could be used together with a `"path"` field, to handle API inputs in a URL path such as `/products/slim-fit-jeans/`.
+
+These fields will normally correspond with [named arguments in the project URL conf][named-arguments].
+
+**"query"**
+
+Included as a URL query parameter. For example `?search=sale`. Typically for `GET` requests.
+
+These fields will normally correspond with pagination and filtering controls on a view.
+
+**"form"**
+
+Included in the request body, as a single item of a JSON object or HTML form. For example `{"colour": "blue", ...}`. Typically for `POST`, `PUT` and `PATCH` requests. Multiple `"form"` fields may be included on a single link.
+
+These fields will normally correspond with serializer fields on a view.
+
+**"body"**
+
+Included as the complete request body. Typically for `POST`, `PUT` and `PATCH` requests. No more than one `"body"` field may exist on a link. May not be used together with `"form"` fields.
+
+These fields will normally correspond with views that use `ListSerializer` to validate the request input, or with file upload views.
+
+#### `encoding`
+
+**"application/json"**
+
+JSON encoded request content. Corresponds to views using `JSONParser`.
+Valid only if either one or more `location="form"` fields, or a single
+`location="body"` field is included on the `Link`.
+
+**"multipart/form-data"**
+
+Multipart encoded request content. Corresponds to views using `MultiPartParser`.
+Valid only if one or more `location="form"` fields is included on the `Link`.
+
+**"application/x-www-form-urlencoded"**
+
+URL encoded request content. Corresponds to views using `FormParser`. Valid
+only if one or more `location="form"` fields is included on the `Link`.
+
+**"application/octet-stream"**
+
+Binary upload request content. Corresponds to views using `FileUploadParser`.
+Valid only if a `location="body"` field is included on the `Link`.
+
+#### `description`
+
+A short description of the meaning and intended usage of the input field.
+
+
+[cite]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api
+[coreapi]: http://www.coreapi.org/
+[corejson]: http://www.coreapi.org/specification/encoding/#core-json-encoding
+[open-api]: https://openapis.org/
+[json-hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html
+[api-blueprint]: https://apiblueprint.org/
+[static-files]: https://docs.djangoproject.com/en/dev/howto/static-files/
+[named-arguments]: https://docs.djangoproject.com/en/dev/topics/http/urls/#named-groups
diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md
index 038a4d6b9..70fab448c 100644
--- a/docs/api-guide/serializers.md
+++ b/docs/api-guide/serializers.md
@@ -876,7 +876,7 @@ There are four methods that can be overridden, depending on what functionality y
* `.to_internal_value()` - Override this to support deserialization, for write operations.
* `.create()` and `.update()` - Override either or both of these to support saving instances.
-Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
+Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class-based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input.
diff --git a/docs/api-guide/settings.md b/docs/api-guide/settings.md
index f218d00ad..ea018053f 100644
--- a/docs/api-guide/settings.md
+++ b/docs/api-guide/settings.md
@@ -36,7 +36,7 @@ The `api_settings` object will check for any user-defined settings, and otherwis
## API policy settings
-*The following settings control the basic API policies, and are applied to every `APIView` class based view, or `@api_view` function based view.*
+*The following settings control the basic API policies, and are applied to every `APIView` class-based view, or `@api_view` function based view.*
#### DEFAULT_RENDERER_CLASSES
@@ -98,7 +98,7 @@ Default: `'rest_framework.negotiation.DefaultContentNegotiation'`
## Generic view settings
-*The following settings control the behavior of the generic class based views.*
+*The following settings control the behavior of the generic class-based views.*
#### DEFAULT_PAGINATION_SERIALIZER_CLASS
@@ -181,7 +181,7 @@ If set, this value will restrict the set of versions that may be returned by the
Default: `None`
-#### VERSION_PARAMETER
+#### VERSION_PARAM
The string that should used for any versioning parameters, such as in the media type or URL query parameters.
diff --git a/docs/api-guide/throttling.md b/docs/api-guide/throttling.md
index 36753aafc..4eef4fd5d 100644
--- a/docs/api-guide/throttling.md
+++ b/docs/api-guide/throttling.md
@@ -41,7 +41,7 @@ The default throttling policy may be set globally, using the `DEFAULT_THROTTLE_C
The rate descriptions used in `DEFAULT_THROTTLE_RATES` may include `second`, `minute`, `hour` or `day` as the throttle period.
You can also set the throttling policy on a per-view or per-viewset basis,
-using the `APIView` class based views.
+using the `APIView` class-based views.
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
diff --git a/docs/api-guide/validators.md b/docs/api-guide/validators.md
index e54ebfc38..a059f1197 100644
--- a/docs/api-guide/validators.md
+++ b/docs/api-guide/validators.md
@@ -156,7 +156,7 @@ If you want the date field to be entirely hidden from the user, then use `Hidden
---
-# Advanced 'default' argument usage
+# Advanced field defaults
Validators that are applied across multiple fields in the serializer can sometimes require a field input that should not be provided by the API client, but that *is* available as input to the validator.
@@ -188,6 +188,71 @@ It takes a single argument, which is the default value or callable that should b
---
+# Limitations of validators
+
+There are some ambiguous cases where you'll need to instead handle validation
+explicitly, rather than relying on the default serializer classes that
+`ModelSerializer` generates.
+
+In these cases you may want to disable the automatically generated validators,
+by specifying an empty list for the serializer `Meta.validators` attribute.
+
+## Optional fields
+
+By default "unique together" validation enforces that all fields be
+`required=True`. In some cases, you might want to explicit apply
+`required=False` to one of the fields, in which case the desired behaviour
+of the validation is ambiguous.
+
+In this case you will typically need to exclude the validator from the
+serializer class, and instead write any validation logic explicitly, either
+in the `.validate()` method, or else in the view.
+
+For example:
+
+ class BillingRecordSerializer(serializers.ModelSerializer):
+ def validate(self, data):
+ # Apply custom validation either here, or in the view.
+
+ class Meta:
+ fields = ('client', 'date', 'amount')
+ extra_kwargs = {'client': {'required': 'False'}}
+ validators = [] # Remove a default "unique together" constraint.
+
+## Updating nested serializers
+
+When applying an update to an existing instance, uniqueness validators will
+exclude the current instance from the uniqueness check. The current instance
+is available in the context of the uniqueness check, because it exists as
+an attribute on the serializer, having initially been passed using
+`instance=...` when instantiating the serializer.
+
+In the case of update operations on *nested* serializers there's no way of
+applying this exclusion, because the instance is not available.
+
+Again, you'll probably want to explicitly remove the validator from the
+serializer class, and write the code the for the validation constraint
+explicitly, in a `.validate()` method, or in the view.
+
+## Debugging complex cases
+
+If you're not sure exactly what behavior a `ModelSerializer` class will
+generate it is usually a good idea to run `manage.py shell`, and print
+an instance of the serializer, so that you can inspect the fields and
+validators that it automatically generates for you.
+
+ >>> serializer = MyComplexModelSerializer()
+ >>> print(serializer)
+ class MyComplexModelSerializer:
+ my_fields = ...
+
+Also keep in mind that with complex cases it can often be better to explicitly
+define your serializer classes, rather than relying on the default
+`ModelSerializer` behavior. This involves a little more code, but ensures
+that the resulting behavior is more transparent.
+
+---
+
# Writing custom validators
You can use any of Django's existing validators, or write your own custom validators.
@@ -200,9 +265,9 @@ A validator may be any callable that raises a `serializers.ValidationError` on f
if value % 2 != 0:
raise serializers.ValidationError('This field must be an even number.')
-## Class based
+## Class-based
-To write a class based validator, use the `__call__` method. Class based validators are useful as they allow you to parameterize and reuse behavior.
+To write a class-based validator, use the `__call__` method. Class-based validators are useful as they allow you to parameterize and reuse behavior.
class MultipleOf(object):
def __init__(self, base):
@@ -215,7 +280,7 @@ To write a class based validator, use the `__call__` method. Class based validat
#### Using `set_context()`
-In some advanced cases you might want a validator to be passed the serializer field it is being used with as additional context. You can do so by declaring a `set_context` method on a class based validator.
+In some advanced cases you might want a validator to be passed the serializer field it is being used with as additional context. You can do so by declaring a `set_context` method on a class-based validator.
def set_context(self, serializer_field):
# Determine if this is an update or a create operation.
diff --git a/docs/api-guide/views.md b/docs/api-guide/views.md
index 291fe7376..62f14087f 100644
--- a/docs/api-guide/views.md
+++ b/docs/api-guide/views.md
@@ -1,9 +1,9 @@
source: decorators.py
views.py
-# Class Based Views
+# Class-based Views
-> Django's class based views are a welcome departure from the old-style views.
+> Django's class-based views are a welcome departure from the old-style views.
>
> — [Reinout van Rees][cite]
@@ -119,7 +119,7 @@ You won't typically need to override this method.
# Function Based Views
-> Saying [that Class based views] is always the superior solution is a mistake.
+> Saying [that class-based views] is always the superior solution is a mistake.
>
> — [Nick Coghlan][cite2]
diff --git a/docs/img/corejson-format.png b/docs/img/corejson-format.png
new file mode 100644
index 000000000..36c197a0d
Binary files /dev/null and b/docs/img/corejson-format.png differ
diff --git a/docs/img/premium/rover-readme.png b/docs/img/premium/rover-readme.png
new file mode 100644
index 000000000..aeef1de4f
Binary files /dev/null and b/docs/img/premium/rover-readme.png differ
diff --git a/docs/img/premium/sentry-readme.png b/docs/img/premium/sentry-readme.png
new file mode 100644
index 000000000..0b8a80c49
Binary files /dev/null and b/docs/img/premium/sentry-readme.png differ
diff --git a/docs/img/premium/stream-readme.png b/docs/img/premium/stream-readme.png
new file mode 100644
index 000000000..a04009d7f
Binary files /dev/null and b/docs/img/premium/stream-readme.png differ
diff --git a/docs/index.md b/docs/index.md
index 9204a4f11..87e013b8e 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,3 +1,22 @@
+
+
@@ -38,24 +57,28 @@ Some reasons you might want to use REST framework:
* [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources.
* Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers].
* [Extensive documentation][index], and [great community support][group].
-* Used and trusted by large companies such as [Mozilla][mozilla] and [Eventbrite][eventbrite].
+* Used and trusted by internationally recognised companies including [Mozilla][mozilla], [Red Hat][redhat], [Heroku][heroku], and [Eventbrite][eventbrite].
---
-We are a [collaboratively funded project](https://fund.django-rest-framework.org/topics/funding/).
-Many thanks to our sponsors for ensuring we can continue to develop, support and improve Django REST framework.
+## Funding
-Rover.com
+REST framework is a *collaboratively funded project*. If you use
+REST framework commercially we strongly encourage you to invest in its
+continued development by **[signing up for a paid plan][funding]**.
+
+The initial aim is to provide a single full-time position on REST framework.
+Right now we're over 58% of the way towards achieving that.
+*Every single sign-up makes a significant impact.*
+
+
+
+
+*Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), and [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf).*
---
@@ -68,6 +91,7 @@ REST framework requires the following:
The following packages are optional:
+* [coreapi][coreapi] (1.32.0+) - Schema generation support.
* [Markdown][markdown] (2.1.0+) - Markdown support for the browsable API.
* [django-filter][django-filter] (0.9.2+) - Filtering support.
* [django-crispy-forms][django-crispy-forms] - Improved HTML display for filtering.
@@ -160,10 +184,11 @@ The tutorial will walk you through the building blocks that make up REST framewo
* [1 - Serialization][tut-1]
* [2 - Requests & Responses][tut-2]
-* [3 - Class based views][tut-3]
+* [3 - Class-based views][tut-3]
* [4 - Authentication & permissions][tut-4]
* [5 - Relationships & hyperlinked APIs][tut-5]
* [6 - Viewsets & routers][tut-6]
+* [7 - Schemas & client libraries][tut-7]
There is a live example API of the finished tutorial API for testing purposes, [available here][sandbox].
@@ -191,6 +216,7 @@ The API guide is your complete reference manual to all the functionality provide
* [Versioning][versioning]
* [Content negotiation][contentnegotiation]
* [Metadata][metadata]
+* [Schemas][schemas]
* [Format suffixes][formatsuffixes]
* [Returning URLs][reverse]
* [Exceptions][exceptions]
@@ -203,6 +229,7 @@ The API guide is your complete reference manual to all the functionality provide
General guides to using REST framework.
* [Documenting your API][documenting-your-api]
+* [API Clients][api-clients]
* [Internationalization][internationalization]
* [AJAX, CSRF & CORS][ajax-csrf-cors]
* [HTML & Forms][html-and-forms]
@@ -216,6 +243,7 @@ General guides to using REST framework.
* [3.1 Announcement][3.1-announcement]
* [3.2 Announcement][3.2-announcement]
* [3.3 Announcement][3.3-announcement]
+* [3.4 Announcement][3.4-announcement]
* [Kickstarter Announcement][kickstarter-announcement]
* [Mozilla Grant][mozilla-grant]
* [Funding][funding]
@@ -270,7 +298,10 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[mozilla]: http://www.mozilla.org/en-US/about/
+[redhat]: https://www.redhat.com/
+[heroku]: https://www.heroku.com/
[eventbrite]: https://www.eventbrite.co.uk/about/
+[coreapi]: http://pypi.python.org/pypi/coreapi/
[markdown]: http://pypi.python.org/pypi/Markdown/
[django-filter]: http://pypi.python.org/pypi/django-filter
[django-crispy-forms]: https://github.com/maraujop/django-crispy-forms
@@ -284,6 +315,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[modelserializer-section]: api-guide/serializers#modelserializer
[functionview-section]: api-guide/views#function-based-views
[sandbox]: http://restframework.herokuapp.com/
+[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
[quickstart]: tutorial/quickstart.md
[tut-1]: tutorial/1-serialization.md
@@ -292,6 +324,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[tut-4]: tutorial/4-authentication-and-permissions.md
[tut-5]: tutorial/5-relationships-and-hyperlinked-apis.md
[tut-6]: tutorial/6-viewsets-and-routers.md
+[tut-7]: tutorial/7-schemas-and-client-libraries.md
[request]: api-guide/requests.md
[response]: api-guide/responses.md
@@ -313,6 +346,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[versioning]: api-guide/versioning.md
[contentnegotiation]: api-guide/content-negotiation.md
[metadata]: api-guide/metadata.md
+[schemas]: api-guide/schemas.md
[formatsuffixes]: api-guide/format-suffixes.md
[reverse]: api-guide/reverse.md
[exceptions]: api-guide/exceptions.md
@@ -321,6 +355,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[settings]: api-guide/settings.md
[documenting-your-api]: topics/documenting-your-api.md
+[api-clients]: topics/api-clients.md
[internationalization]: topics/internationalization.md
[ajax-csrf-cors]: topics/ajax-csrf-cors.md
[html-and-forms]: topics/html-and-forms.md
@@ -334,6 +369,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[3.1-announcement]: topics/3.1-announcement.md
[3.2-announcement]: topics/3.2-announcement.md
[3.3-announcement]: topics/3.3-announcement.md
+[3.4-announcement]: topics/3.4-announcement.md
[kickstarter-announcement]: topics/kickstarter-announcement.md
[mozilla-grant]: topics/mozilla-grant.md
[funding]: topics/funding.md
diff --git a/docs/topics/2.3-announcement.md b/docs/topics/2.3-announcement.md
index 21d9f1dbc..d9bab39dc 100644
--- a/docs/topics/2.3-announcement.md
+++ b/docs/topics/2.3-announcement.md
@@ -6,7 +6,7 @@ REST framework 2.3 makes it even quicker and easier to build your Web APIs.
The 2.3 release introduces the [ViewSet][viewset] and [Router][router] classes.
-A viewset is simply a type of class based view that allows you to group multiple views into a single common class.
+A viewset is simply a type of class-based view that allows you to group multiple views into a single common class.
Routers allow you to automatically determine the URLconf for your viewset classes.
diff --git a/docs/topics/3.0-announcement.md b/docs/topics/3.0-announcement.md
index 89f9e8001..e6cbf7238 100644
--- a/docs/topics/3.0-announcement.md
+++ b/docs/topics/3.0-announcement.md
@@ -426,7 +426,7 @@ There are four methods that can be overridden, depending on what functionality y
* `.to_internal_value()` - Override this to support deserialization, for write operations.
* `.create()` and `.update()` - Override either or both of these to support saving instances.
-Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
+Because this class provides the same interface as the `Serializer` class, you can use it with the existing generic class-based views exactly as you would for a regular `Serializer` or `ModelSerializer`.
The only difference you'll notice when doing so is the `BaseSerializer` classes will not generate HTML forms in the browsable API. This is because the data they return does not include all the field information that would allow each field to be rendered into a suitable HTML input.
@@ -801,7 +801,7 @@ This change means that you can now easily customize the style of error responses
## The metadata API
-Behavior for dealing with `OPTIONS` requests was previously built directly into the class based views. This has now been properly separated out into a Metadata API that allows the same pluggable style as other API policies in REST framework.
+Behavior for dealing with `OPTIONS` requests was previously built directly into the class-based views. This has now been properly separated out into a Metadata API that allows the same pluggable style as other API policies in REST framework.
This makes it far easier to use a different style for `OPTIONS` responses throughout your API, and makes it possible to create third-party metadata policies.
diff --git a/docs/topics/3.4-announcement.md b/docs/topics/3.4-announcement.md
new file mode 100644
index 000000000..69343c75e
--- /dev/null
+++ b/docs/topics/3.4-announcement.md
@@ -0,0 +1,194 @@
+
+
+# Django REST framework 3.4
+
+The 3.4 release is the first in a planned series that will be addressing schema
+generation, hypermedia support, API clients, and finally realtime support.
+
+---
+
+## Funding
+
+The 3.4 release has been made possible a recent [Mozilla grant][moss], and by our
+[collaborative funding model][funding]. If you use REST framework commercially, and would
+like to see this work continue, we strongly encourage you to invest in its
+continued development by **[signing up for a paid plan][funding]**.
+
+The initial aim is to provide a single full-time position on REST framework.
+Right now we're over 60% of the way towards achieving that.
+*Every single sign-up makes a significant impact.*
+
+
+
+
+*Many thanks to all our [awesome sponsors][sponsors], and in particular to our premium backers, [Rover](http://jobs.rover.com/), [Sentry](https://getsentry.com/welcome/), and [Stream](https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf).*
+
+---
+
+## Schemas & client libraries
+
+REST framework 3.4 brings built-in support for generating API schemas.
+
+We provide this support by using [Core API][core-api], a Document Object Model
+for describing APIs.
+
+Because Core API represents the API schema in an format-independent
+manner, we're able to render the Core API `Document` object into many different
+schema formats, by allowing the renderer class to determine how the internal
+representation maps onto the external schema format.
+
+This approach should also open the door to a range of auto-generated API
+documentation options in the future, by rendering the `Document` object into
+HTML documentation pages.
+
+Alongside the built-in schema support, we're also now providing the following:
+
+* A [command line tool][command-line-client] for interacting with APIs.
+* A [Python client library][client-library] for interacting with APIs.
+
+These API clients are dynamically driven, and able to interact with any API
+that exposes a supported schema format.
+
+Dynamically driven clients allow you to interact with an API at an application
+layer interface, rather than a network layer interface, while still providing
+the benefits of RESTful Web API design.
+
+We're expecting to expand the range of languages that we provide client libraries
+for over the coming months.
+
+Further work on maturing the API schema support is also planned, including
+documentation on supporting file upload and download, and improved support for
+documentation generation and parameter annotation.
+
+---
+
+Current support for schema formats is as follows:
+
+Name | Support | PyPI package
+---------------------------------|-------------------------------------|--------------------------------
+[Core JSON][core-json] | Schema generation & client support. | Built-in support in `coreapi`.
+[Swagger / OpenAPI][swagger] | Schema generation & client support. | The `openapi-codec` package.
+[JSON Hyper-Schema][hyperschema] | Currrently client support only. | The `hyperschema-codec` package.
+[API Blueprint][api-blueprint] | Not yet available. | Not yet available.
+
+---
+
+You can read more about any of this new functionality in the following:
+
+* New tutorial section on [schemas & client libraries][tut-7].
+* Documentation page on [schema generation][schema-generation].
+* Topic page on [API clients][api-clients].
+
+It is also worth noting that Marc Gibbons is currently working towards a 2.0 release of
+the popular Django REST Swagger package, which will tie in with our new built-in support.
+
+---
+
+## Supported versions
+
+The 3.4.0 release adds support for Django 1.10.
+
+The following versions of Python and Django are now supported:
+
+* Django versions 1.8, 1.9, and 1.10.
+* Python versions 2.7, 3.2(\*), 3.3(\*), 3.4, 3.5.
+
+(\*) Note that Python 3.2 and 3.3 are not supported from Django 1.9 onwards.
+
+---
+
+## Deprecations and changes
+
+The 3.4 release includes very limited deprecation or behavioral changes, and
+should present a straightforward upgrade.
+
+### Use fields or exclude on serializer classes.
+
+The following change in 3.3.0 is now escalated from "pending deprecation" to
+"deprecated". Its usage will continue to function but will raise warnings:
+
+`ModelSerializer` and `HyperlinkedModelSerializer` should include either a `fields`
+option, or an `exclude` option. The `fields = '__all__'` shortcut may be used
+to explicitly include all fields.
+
+### Microsecond precision when returning time or datetime.
+
+Using the default JSON renderer and directly returning a `datetime` or `time`
+instance will now render with microsecond precision (6 digits), rather than
+millisecond precision (3 digits). This makes the output format consistent with the
+default string output of `serializers.DateTimeField` and `serializers.TimeField`.
+
+This change *does not affect the default behavior when using serializers*,
+which is to serialize `datetime` and `time` instances into strings with
+microsecond precision.
+
+The serializer behavior can be modified if needed, using the `DATETIME_FORMAT`
+and `TIME_FORMAT` settings.
+
+The renderer behavior can be modified by setting a custom `encoder_class`
+attribute on a `JSONRenderer` subclass.
+
+### Relational choices no longer displayed in OPTIONS requests.
+
+Making an `OPTIONS` request to views that have a serializer choice field
+will result in a list of the available choices being returned in the response.
+
+In cases where there is a relational field, the previous behavior would be
+to return a list of available instances to choose from for that relational field.
+
+In order to minimise exposed information the behavior now is to *not* return
+choices information for relational fields.
+
+If you want to override this new behavior you'll need to [implement a custom
+metadata class][metadata].
+
+See [issue #3751][gh3751] for more information on this behavioral change.
+
+---
+
+## Other improvements
+
+This release includes further work from a huge number of [pull requests and issues][milestone].
+
+Many thanks to all our contributors who've been involved in the release, either through raising issues, giving feedback, improving the documentation, or suggesting and implementing code changes.
+
+The full set of itemized release notes [are available here][release-notes].
+
+[sponsors]: https://fund.django-rest-framework.org/topics/funding/#our-sponsors
+[moss]: mozilla-grant.md
+[funding]: funding.md
+[core-api]: http://www.coreapi.org/
+[command-line-client]: api-clients#command-line-client
+[client-library]: api-clients#python-client-library
+[core-json]: http://www.coreapi.org/specification/encoding/#core-json-encoding
+[swagger]: https://openapis.org/specification
+[hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html
+[api-blueprint]: https://apiblueprint.org/
+[tut-7]: ../../tutorial/7-schemas-and-client-libraries/
+[schema-generation]: ../../api-guide/schemas/
+[api-clients]: api-clients.md
+[milestone]: https://github.com/tomchristie/django-rest-framework/milestone/35
+[release-notes]: release-notes#34
+[metadata]: ../../api-guide/metadata/#custom-metadata-classes
+[gh3751]: https://github.com/tomchristie/django-rest-framework/issues/3751
diff --git a/docs/topics/api-clients.md b/docs/topics/api-clients.md
new file mode 100644
index 000000000..f17f5e4d4
--- /dev/null
+++ b/docs/topics/api-clients.md
@@ -0,0 +1,325 @@
+# API Clients
+
+An API client handles the underlying details of how network requests are made
+and how responses are decoded. They present the developer with an application
+interface to work against, rather than working directly with the network interface.
+
+The API clients documented here are not restricted to APIs built with Django REST framework.
+ They can be used with any API that exposes a supported schema format.
+
+For example, [the Heroku platform API][heroku-api] exposes a schema in the JSON
+Hyperschema format. As a result, the Core API command line client and Python
+client library can be [used to interact with the Heroku API][heroku-example].
+
+## Client-side Core API
+
+[Core API][core-api] is a document specification that can be used to describe APIs. It can
+be used either server-side, as is done with REST framework's [schema generation][schema-generation],
+or used client-side, as described here.
+
+When used client-side, Core API allows for *dynamically driven client libraries*
+that can interact with any API that exposes a supported schema or hypermedia
+format.
+
+Using a dynamically driven client has a number of advantages over interacting
+with an API by building HTTP requests directly.
+
+#### More meaningful interaction
+
+API interactions are presented in a more meaningful way. You're working at
+the application interface layer, rather than the network interface layer.
+
+#### Resilience & evolvability
+
+The client determines what endpoints are available, what parameters exist
+against each particular endpoint, and how HTTP requests are formed.
+
+This also allows for a degree of API evolvability. URLs can be modified
+without breaking existing clients, or more efficient encodings can be used
+on-the-wire, with clients transparently upgrading.
+
+#### Self-descriptive APIs
+
+A dynamically driven client is able to present documentation on the API to the
+end user. This documentation allows the user to discover the available endpoints
+and parameters, and better understand the API they are working with.
+
+Because this documentation is driven by the API schema it will always be fully
+up to date with the most recently deployed version of the service.
+
+---
+
+# Command line client
+
+The command line client allows you to inspect and interact with any API that
+exposes a supported schema format.
+
+## Getting started
+
+To install the Core API command line client, use `pip`.
+
+Note that the command-line client is a separate package to the
+python client library. Make sure to install `coreapi-cli`.
+
+ $ pip install coreapi-cli
+
+To start inspecting and interacting with an API the schema must first be loaded
+from the network.
+
+ $ coreapi get http://api.example.org/
+
+ snippets: {
+ create(code, [title], [linenos], [language], [style])
+ destroy(pk)
+ highlight(pk)
+ list([page])
+ partial_update(pk, [title], [code], [linenos], [language], [style])
+ retrieve(pk)
+ update(pk, code, [title], [linenos], [language], [style])
+ }
+ users: {
+ list([page])
+ retrieve(pk)
+ }
+
+This will then load the schema, displaying the resulting `Document`. This
+`Document` includes all the available interactions that may be made against the API.
+
+To interact with the API, use the `action` command. This command requires a list
+of keys that are used to index into the link.
+
+ $ coreapi action users list
+ [
+ {
+ "url": "http://127.0.0.1:8000/users/2/",
+ "id": 2,
+ "username": "aziz",
+ "snippets": []
+ },
+ ...
+ ]
+
+To inspect the underlying HTTP request and response, use the `--debug` flag.
+
+ $ coreapi action users list --debug
+ > GET /users/ HTTP/1.1
+ > Accept: application/vnd.coreapi+json, */*
+ > Authorization: Basic bWF4Om1heA==
+ > Host: 127.0.0.1
+ > User-Agent: coreapi
+ < 200 OK
+ < Allow: GET, HEAD, OPTIONS
+ < Content-Type: application/json
+ < Date: Thu, 30 Jun 2016 10:51:46 GMT
+ < Server: WSGIServer/0.1 Python/2.7.10
+ < Vary: Accept, Cookie
+ <
+ < [{"url":"http://127.0.0.1/users/2/","id":2,"username":"aziz","snippets":[]},{"url":"http://127.0.0.1/users/3/","id":3,"username":"amy","snippets":["http://127.0.0.1/snippets/3/"]},{"url":"http://127.0.0.1/users/4/","id":4,"username":"max","snippets":["http://127.0.0.1/snippets/4/","http://127.0.0.1/snippets/5/","http://127.0.0.1/snippets/6/","http://127.0.0.1/snippets/7/"]},{"url":"http://127.0.0.1/users/5/","id":5,"username":"jose","snippets":[]},{"url":"http://127.0.0.1/users/6/","id":6,"username":"admin","snippets":["http://127.0.0.1/snippets/1/","http://127.0.0.1/snippets/2/"]}]
+
+ [
+ ...
+ ]
+
+Some actions may include optional or required parameters.
+
+ $ coreapi action users create --param username=example
+
+When using `--param`, the type of the input will be determined automatically.
+
+If you want to be more explicit about the parameter type then use `--data` for
+any null, numeric, boolean, list, or object inputs, and use `--string` for string inputs.
+
+ $ coreapi action users edit --string username=tomchristie --data is_admin=true
+
+## Authentication & headers
+
+The `credentials` command is used to manage the request `Authentication:` header.
+Any credentials added are always linked to a particular domain, so as to ensure
+that credentials are not leaked across differing APIs.
+
+The format for adding a new credential is:
+
+ $ coreapi credentials add
+
+For instance:
+
+ $ coreapi credentials add api.example.org "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"
+
+The optional `--auth` flag also allows you to add specific types of authentication,
+handling the encoding for you. Currently only `"basic"` is supported as an option here.
+For example:
+
+ $ coreapi credentials add api.example.org tomchristie:foobar --auth basic
+
+You can also add specific request headers, using the `headers` command:
+
+ $ coreapi headers add api.example.org x-api-version 2
+
+For more information and a listing of the available subcommands use `coreapi
+credentials --help` or `coreapi headers --help`.
+
+## Codecs
+
+By default the command line client only includes support for reading Core JSON
+schemas, however it includes a plugin system for installing additional codecs.
+
+ $ pip install openapi-codec jsonhyperschema-codec hal-codec
+ $ coreapi codecs show
+ Codecs
+ corejson application/vnd.coreapi+json encoding, decoding
+ hal application/hal+json encoding, decoding
+ openapi application/openapi+json encoding, decoding
+ jsonhyperschema application/schema+json decoding
+ json application/json data
+ text text/* data
+
+## Utilities
+
+The command line client includes functionality for bookmarking API URLs
+under a memorable name. For example, you can add a bookmark for the
+existing API, like so...
+
+ $ coreapi bookmarks add accountmanagement
+
+There is also functionality for navigating forward or backward through the
+history of which API URLs have been accessed.
+
+ $ coreapi history show
+ $ coreapi history back
+
+For more information and a listing of the available subcommands use
+`coreapi bookmarks --help` or `coreapi history --help`.
+
+## Other commands
+
+To display the current `Document`:
+
+ $ coreapi show
+
+To reload the current `Document` from the network:
+
+ $ coreapi reload
+
+To load a schema file from disk:
+
+ $ coreapi load my-api-schema.json --format corejson
+
+To dump the current document to console in a given format:
+
+ $ coreapi dump --format openapi
+
+To remove the current document, along with all currently saved history,
+credentials, headers and bookmarks:
+
+ $ coreapi clear
+
+---
+
+# Python client library
+
+The `coreapi` Python package allows you to programatically interact with any
+API that exposes a supported schema format.
+
+## Getting started
+
+You'll need to install the `coreapi` package using `pip` before you can get
+started.
+
+ $ pip install coreapi
+
+In order to start working with an API, we first need a `Client` instance. The
+client holds any configuration around which codecs and transports are supported
+when interacting with an API, which allows you to provide for more advanced
+kinds of behaviour.
+
+ import coreapi
+ client = coreapi.Client()
+
+Once we have a `Client` instance, we can fetch an API schema from the network.
+
+ schema = client.get('https://api.example.org/')
+
+The object returned from this call will be a `Document` instance, which is
+the internal representation of the interface that we are interacting with.
+
+Now that we have our schema `Document`, we can now start to interact with the API:
+
+ users = client.action(schema, ['users', 'list'])
+
+Some endpoints may include named parameters, which might be either optional or required:
+
+ new_user = client.action(schema, ['users', 'create'], params={"username": "max"})
+
+## Codecs
+
+Codecs are responsible for encoding or decoding Documents.
+
+The decoding process is used by a client to take a bytestring of an API schema
+definition, and returning the Core API `Document` that represents that interface.
+
+A codec should be associated with a particular media type, such as **TODO**.
+
+This media type is used by the server in the response `Content-Type` header,
+in order to indicate what kind of data is being returned in the response.
+
+#### Configuring codecs
+
+The codecs that are available can be configured when instantiating a client.
+The keyword argument used here is `decoders`, because in the context of a
+client the codecs are only for *decoding* responses.
+
+In the following example we'll configure a client to only accept `Core JSON`
+and `JSON` responses. This will allow us to receive and decode a Core JSON schema,
+and subsequently to receive JSON responses made against the API.
+
+ from coreapi import codecs, Client
+
+ decoders = [codecs.CoreJSONCodec(), codecs.JSONCodec()]
+ client = Client(decoders=decoders)
+
+#### Loading and saving schemas
+
+You can use a codec directly, in order to load an existing schema definition,
+and return the resulting `Document`.
+
+ input_file = open('my-api-schema.json', 'rb')
+ schema_definition = input_file.read()
+ codec = codecs.CoreJSONCodec()
+ schema = codec.load(schema_definition)
+
+You can also use a codec directly to generate a schema definition given a `Document` instance:
+
+ schema_definition = codec.dump(schema)
+ output_file = open('my-api-schema.json', 'rb')
+ output_file.write(schema_definition)
+
+## Transports
+
+Transports are responsible for making network requests. The set of transports
+that a client has installed determines which network protocols it is able to
+support.
+
+Currently the `coreapi` library only includes an HTTP/HTTPS transport, but
+other protocols can also be supported.
+
+#### Configuring transports
+
+The behaviour of the network layer can be customized by configuring the
+transports that the client is instantiated with.
+
+ import requests
+ from coreapi import transports, Client
+
+ credentials = {'api.example.org': 'Token 3bd44a009d16ff'}
+ transports = transports.HTTPTransport(credentials=credentials)
+ client = Client(transports=transports)
+
+More complex customizations can also be achieved, for example modifying the
+underlying `requests.Session` instance to [attach transport adaptors][transport-adaptors]
+that modify the outgoing requests.
+
+[heroku-api]: https://devcenter.heroku.com/categories/platform-api
+[heroku-example]: http://www.coreapi.org/tools-and-resources/example-services/#heroku-json-hyper-schema
+[core-api]: http://www.coreapi.org/
+[schema-generation]: ../api-guide/schemas.md
+[transport-adaptors]: http://docs.python-requests.org/en/master/user/advanced/#transport-adapters
diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md
index 201549b45..5bfdad09b 100644
--- a/docs/topics/release-notes.md
+++ b/docs/topics/release-notes.md
@@ -40,12 +40,94 @@ You can determine your currently installed version using `pip freeze`:
## 3.4.x series
-### 3.4
+### 3.4.0
-**Unreleased**
+**Date**: [14th July 2016][3.4.0-milestone]
-* Dropped support for EOL Django 1.7 ([#3933][gh3933])
-* Fixed null foreign keys targeting UUIDField primary keys. ([#3936][gh3936])
+* Don't strip microseconds in JSON output. ([#4256][gh4256])
+* Two slightly different iso 8601 datetime serialization. ([#4255][gh4255])
+* Resolve incorrect inclusion of media type parameters. ([#4254][gh4254])
+* Response Content-Type potentially malformed. ([#4253][gh4253])
+* Fix setup.py error on some platforms. ([#4246][gh4246])
+* Move alternate formats in coreapi into separate packages. ([#4244][gh4244])
+* Add localize keyword argument to `DecimalField`. ([#4233][gh4233])
+* Fix issues with routers for custom list-route and detail-routes. ([#4229][gh4229])
+* Namespace versioning with nested namespaces. ([#4219][gh4219])
+* Robust uniqueness checks. ([#4217][gh4217])
+* Minor refactoring of `must_call_distinct`. ([#4215][gh4215])
+* Overridable offset cutoff in CursorPagination. ([#4212][gh4212])
+* Pass through strings as-in with date/time fields. ([#4196][gh4196])
+* Add test confirming that required=False is valid on a relational field. ([#4195][gh4195])
+* In LimitOffsetPagination `limit=0` should revert to default limit. ([#4194][gh4194])
+* Exclude read_only=True fields from unique_together validation & add docs. ([#4192][gh4192])
+* Handle bytestrings in JSON. ([#4191][gh4191])
+* JSONField(binary=True) represents using binary strings, which JSONRenderer does not support. ([#4187][gh4187])
+* JSONField(binary=True) represents using binary strings, which JSONRenderer does not support. ([#4185][gh4185])
+* More robust form rendering in the browsable API. ([#4181][gh4181])
+* Empty cases of `.validated_data` and `.errors` as lists not dicts for ListSerializer. ([#4180][gh4180])
+* Schemas & client libraries. ([#4179][gh4179])
+* Removed `AUTH_USER_MODEL` compat property. ([#4176][gh4176])
+* Clean up existing deprecation warnings. ([#4166][gh4166])
+* Django 1.10 support. ([#4158][gh4158])
+* Updated jQuery version to 1.12.4. ([#4157][gh4157])
+* More robust default behavior on OrderingFilter. ([#4156][gh4156])
+* description.py codes and tests removal. ([#4153][gh4153])
+* Wrap guardian.VERSION in tuple. ([#4149][gh4149])
+* Refine validator for fields with kwargs. ([#4146][gh4146])
+* Fix None values representation in childs of ListField, DictField. ([#4118][gh4118])
+* Resolve TimeField representation for midnight value. ([#4107][gh4107])
+* Set proper status code in AdminRenderer for the redirection after POST/DELETE requests. ([#4106][gh4106])
+* TimeField render returns None instead of 00:00:00. ([#4105][gh4105])
+* Fix incorrectly named zh-hans and zh-hant locale path. ([#4103][gh4103])
+* Prevent raising exception when limit is 0. ([#4098][gh4098])
+* TokenAuthentication: Allow custom keyword in the header. ([#4097][gh4097])
+* Handle incorrectly padded HTTP basic auth header. ([#4090][gh4090])
+* LimitOffset pagination crashes Browseable API when limit=0. ([#4079][gh4079])
+* Fixed DecimalField arbitrary precision support. ([#4075][gh4075])
+* Added support for custom CSRF cookie names. ([#4049][gh4049])
+* Fix regression introduced by #4035. ([#4041][gh4041])
+* No auth view failing permission should raise 403. ([#4040][gh4040])
+* Fix string_types / text_types confusion. ([#4025][gh4025])
+* Do not list related field choices in OPTIONS requests. ([#4021][gh4021])
+* Fix typo. ([#4008][gh4008])
+* Reorder initializing the view. ([#4006][gh4006])
+* Type error in DjangoObjectPermissionsFilter on Python 3.4. ([#4005][gh4005])
+* Fixed use of deprecated Query.aggregates. ([#4003][gh4003])
+* Fix blank lines around docstrings. ([#4002][gh4002])
+* Fixed admin pagination when limit is 0. ([#3990][gh3990])
+* OrderingFilter adjustements. ([#3983][gh3983])
+* Non-required serializer related fields. ([#3976][gh3976])
+* Using safer calling way of "@api_view" in tutorial. ([#3971][gh3971])
+* ListSerializer doesn't handle unique_together constraints. ([#3970][gh3970])
+* Add missing migration file. ([#3968][gh3968])
+* `OrderingFilter` should call `get_serializer_class()` to determine default fields. ([#3964][gh3964])
+* Remove old django checks from tests and compat. ([#3953][gh3953])
+* Support callable as the value of `initial` for any `serializer.Field`. ([#3943][gh3943])
+* Prevented unnecessary distinct() call in SearchFilter. ([#3938][gh3938])
+* Fix None UUID ForeignKey serialization. ([#3936][gh3936])
+* Drop EOL Django 1.7. ([#3933][gh3933])
+* Add missing space in serializer error message. ([#3926][gh3926])
+* Fixed _force_text_recursive typo. ([#3908][gh3908])
+* Attempt to address Django 2.0 deprecate warnings related to `field.rel`. ([#3906][gh3906])
+* Fix parsing multipart data using a nested serializer with list. ([#3820][gh3820])
+* Resolving APIs URL to different namespaces. ([#3816][gh3816])
+* Do not HTML-escape `help_text` in Browsable API forms. ([#3812][gh3812])
+* OPTIONS fetches and shows all possible foreign keys in choices field. ([#3751][gh3751])
+* Django 1.9 deprecation warnings ([#3729][gh3729])
+* Test case for #3598 ([#3710][gh3710])
+* Adding support for multiple values for search filter. ([#3541][gh3541])
+* Use get_serializer_class in ordering filter. ([#3487][gh3487])
+* Serializers with many=True should return empty list rather than empty dict. ([#3476][gh3476])
+* LimitOffsetPagination limit=0 fix. ([#3444][gh3444])
+* Enable Validators to defer string evaluation and handle new string format. ([#3438][gh3438])
+* Unique validator is executed and breaks if field is invalid. ([#3381][gh3381])
+* Do not ignore overridden View.get_view_name() in breadcrumbs. ([#3273][gh3273])
+* Retry form rendering when rendering with serializer fails. ([#3164][gh3164])
+* Unique constraint prevents nested serializers from updating. ([#2996][gh2996])
+* Uniqueness validators should not be run for excluded (read_only) fields. ([#2848][gh2848])
+* UniqueValidator raises exception for nested objects. ([#2403][gh2403])
+* `lookup_type` is deprecated in favor of `lookup_expr`. ([#4259][gh4259])
+---
## 3.3.x series
@@ -127,6 +209,8 @@ You can determine your currently installed version using `pip freeze`:
* Removed support for Django 1.5 & 1.6. ([#3421][gh3421], [#3429][gh3429])
* Removed 'south' migrations. ([#3495][gh3495])
+---
+
## 3.2.x series
### 3.2.5
@@ -410,6 +494,7 @@ For older release notes, [please see the version 2.x documentation][old-release-
[3.3.1-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.1+Release%22
[3.3.2-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.2+Release%22
[3.3.3-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.3+Release%22
+[3.4.0-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.4.0+Release%22
[gh2013]: https://github.com/tomchristie/django-rest-framework/issues/2013
@@ -726,3 +811,88 @@ For older release notes, [please see the version 2.x documentation][old-release-
[gh3636]: https://github.com/tomchristie/django-rest-framework/issues/3636
[gh3605]: https://github.com/tomchristie/django-rest-framework/issues/3605
[gh3604]: https://github.com/tomchristie/django-rest-framework/issues/3604
+
+
+[gh2403]: https://github.com/tomchristie/django-rest-framework/issues/2403
+[gh2848]: https://github.com/tomchristie/django-rest-framework/issues/2848
+[gh2996]: https://github.com/tomchristie/django-rest-framework/issues/2996
+[gh3164]: https://github.com/tomchristie/django-rest-framework/issues/3164
+[gh3273]: https://github.com/tomchristie/django-rest-framework/issues/3273
+[gh3381]: https://github.com/tomchristie/django-rest-framework/issues/3381
+[gh3438]: https://github.com/tomchristie/django-rest-framework/issues/3438
+[gh3444]: https://github.com/tomchristie/django-rest-framework/issues/3444
+[gh3476]: https://github.com/tomchristie/django-rest-framework/issues/3476
+[gh3487]: https://github.com/tomchristie/django-rest-framework/issues/3487
+[gh3541]: https://github.com/tomchristie/django-rest-framework/issues/3541
+[gh3710]: https://github.com/tomchristie/django-rest-framework/issues/3710
+[gh3729]: https://github.com/tomchristie/django-rest-framework/issues/3729
+[gh3751]: https://github.com/tomchristie/django-rest-framework/issues/3751
+[gh3812]: https://github.com/tomchristie/django-rest-framework/issues/3812
+[gh3816]: https://github.com/tomchristie/django-rest-framework/issues/3816
+[gh3820]: https://github.com/tomchristie/django-rest-framework/issues/3820
+[gh3906]: https://github.com/tomchristie/django-rest-framework/issues/3906
+[gh3908]: https://github.com/tomchristie/django-rest-framework/issues/3908
+[gh3926]: https://github.com/tomchristie/django-rest-framework/issues/3926
+[gh3933]: https://github.com/tomchristie/django-rest-framework/issues/3933
+[gh3936]: https://github.com/tomchristie/django-rest-framework/issues/3936
+[gh3938]: https://github.com/tomchristie/django-rest-framework/issues/3938
+[gh3943]: https://github.com/tomchristie/django-rest-framework/issues/3943
+[gh3953]: https://github.com/tomchristie/django-rest-framework/issues/3953
+[gh3964]: https://github.com/tomchristie/django-rest-framework/issues/3964
+[gh3968]: https://github.com/tomchristie/django-rest-framework/issues/3968
+[gh3970]: https://github.com/tomchristie/django-rest-framework/issues/3970
+[gh3971]: https://github.com/tomchristie/django-rest-framework/issues/3971
+[gh3976]: https://github.com/tomchristie/django-rest-framework/issues/3976
+[gh3983]: https://github.com/tomchristie/django-rest-framework/issues/3983
+[gh3990]: https://github.com/tomchristie/django-rest-framework/issues/3990
+[gh4002]: https://github.com/tomchristie/django-rest-framework/issues/4002
+[gh4003]: https://github.com/tomchristie/django-rest-framework/issues/4003
+[gh4005]: https://github.com/tomchristie/django-rest-framework/issues/4005
+[gh4006]: https://github.com/tomchristie/django-rest-framework/issues/4006
+[gh4008]: https://github.com/tomchristie/django-rest-framework/issues/4008
+[gh4021]: https://github.com/tomchristie/django-rest-framework/issues/4021
+[gh4025]: https://github.com/tomchristie/django-rest-framework/issues/4025
+[gh4040]: https://github.com/tomchristie/django-rest-framework/issues/4040
+[gh4041]: https://github.com/tomchristie/django-rest-framework/issues/4041
+[gh4049]: https://github.com/tomchristie/django-rest-framework/issues/4049
+[gh4075]: https://github.com/tomchristie/django-rest-framework/issues/4075
+[gh4079]: https://github.com/tomchristie/django-rest-framework/issues/4079
+[gh4090]: https://github.com/tomchristie/django-rest-framework/issues/4090
+[gh4097]: https://github.com/tomchristie/django-rest-framework/issues/4097
+[gh4098]: https://github.com/tomchristie/django-rest-framework/issues/4098
+[gh4103]: https://github.com/tomchristie/django-rest-framework/issues/4103
+[gh4105]: https://github.com/tomchristie/django-rest-framework/issues/4105
+[gh4106]: https://github.com/tomchristie/django-rest-framework/issues/4106
+[gh4107]: https://github.com/tomchristie/django-rest-framework/issues/4107
+[gh4118]: https://github.com/tomchristie/django-rest-framework/issues/4118
+[gh4146]: https://github.com/tomchristie/django-rest-framework/issues/4146
+[gh4149]: https://github.com/tomchristie/django-rest-framework/issues/4149
+[gh4153]: https://github.com/tomchristie/django-rest-framework/issues/4153
+[gh4156]: https://github.com/tomchristie/django-rest-framework/issues/4156
+[gh4157]: https://github.com/tomchristie/django-rest-framework/issues/4157
+[gh4158]: https://github.com/tomchristie/django-rest-framework/issues/4158
+[gh4166]: https://github.com/tomchristie/django-rest-framework/issues/4166
+[gh4176]: https://github.com/tomchristie/django-rest-framework/issues/4176
+[gh4179]: https://github.com/tomchristie/django-rest-framework/issues/4179
+[gh4180]: https://github.com/tomchristie/django-rest-framework/issues/4180
+[gh4181]: https://github.com/tomchristie/django-rest-framework/issues/4181
+[gh4185]: https://github.com/tomchristie/django-rest-framework/issues/4185
+[gh4187]: https://github.com/tomchristie/django-rest-framework/issues/4187
+[gh4191]: https://github.com/tomchristie/django-rest-framework/issues/4191
+[gh4192]: https://github.com/tomchristie/django-rest-framework/issues/4192
+[gh4194]: https://github.com/tomchristie/django-rest-framework/issues/4194
+[gh4195]: https://github.com/tomchristie/django-rest-framework/issues/4195
+[gh4196]: https://github.com/tomchristie/django-rest-framework/issues/4196
+[gh4212]: https://github.com/tomchristie/django-rest-framework/issues/4212
+[gh4215]: https://github.com/tomchristie/django-rest-framework/issues/4215
+[gh4217]: https://github.com/tomchristie/django-rest-framework/issues/4217
+[gh4219]: https://github.com/tomchristie/django-rest-framework/issues/4219
+[gh4229]: https://github.com/tomchristie/django-rest-framework/issues/4229
+[gh4233]: https://github.com/tomchristie/django-rest-framework/issues/4233
+[gh4244]: https://github.com/tomchristie/django-rest-framework/issues/4244
+[gh4246]: https://github.com/tomchristie/django-rest-framework/issues/4246
+[gh4253]: https://github.com/tomchristie/django-rest-framework/issues/4253
+[gh4254]: https://github.com/tomchristie/django-rest-framework/issues/4254
+[gh4255]: https://github.com/tomchristie/django-rest-framework/issues/4255
+[gh4256]: https://github.com/tomchristie/django-rest-framework/issues/4256
+[gh4259]: https://github.com/tomchristie/django-rest-framework/issues/4259
diff --git a/docs/topics/third-party-resources.md b/docs/topics/third-party-resources.md
index 0b7d39b29..4be88d618 100644
--- a/docs/topics/third-party-resources.md
+++ b/docs/topics/third-party-resources.md
@@ -267,6 +267,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
* [ViewSets and Routers - django-rest-framework part 3][viewsets-and-routers-django-rest-framework-part-3]
* [Django Rest Framework User Endpoint][django-rest-framework-user-endpoint]
* [Check credentials using Django Rest Framework][check-credentials-using-django-rest-framework]
+* [Django REST Framework course][django-rest-framework-course]
### Videos
@@ -363,3 +364,4 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque
[django-rest-messaging-centrifugo]: https://github.com/raphaelgyory/django-rest-messaging-centrifugo
[django-rest-messaging-js]: https://github.com/raphaelgyory/django-rest-messaging-js
[medium-django-rest-framework]: https://medium.com/django-rest-framework
+[django-rest-framework-course]: https://teamtreehouse.com/library/django-rest-framework
diff --git a/docs/tutorial/2-requests-and-responses.md b/docs/tutorial/2-requests-and-responses.md
index c2e7e1c0a..5c020a1f7 100644
--- a/docs/tutorial/2-requests-and-responses.md
+++ b/docs/tutorial/2-requests-and-responses.md
@@ -25,7 +25,7 @@ Using numeric HTTP status codes in your views doesn't always make for obvious re
REST framework provides two wrappers you can use to write API views.
1. The `@api_view` decorator for working with function based views.
-2. The `APIView` class for working with class based views.
+2. The `APIView` class for working with class-based views.
These wrappers provide a few bits of functionality such as making sure you receive `Request` instances in your view, and adding context to `Response` objects so that content negotiation can be performed.
@@ -96,7 +96,7 @@ Notice that we're no longer explicitly tying our requests or responses to a give
## Adding optional format suffixes to our URLs
-To take advantage of the fact that our responses are no longer hardwired to a single content type let's add support for format suffixes to our API endpoints. Using format suffixes gives us URLs that explicitly refer to a given format, and means our API will be able to handle URLs such as [http://example.com/api/items/4/.json][json-url].
+To take advantage of the fact that our responses are no longer hardwired to a single content type let's add support for format suffixes to our API endpoints. Using format suffixes gives us URLs that explicitly refer to a given format, and means our API will be able to handle URLs such as [http://example.com/api/items/4.json][json-url].
Start by adding a `format` keyword argument to both of the views, like so.
@@ -186,6 +186,8 @@ Similarly, we can control the format of the request that we send, using the `Con
"style": "friendly"
}
+If you add a `--debug` switch to the `http` requests above, you will be able to see the request type in request headers.
+
Now go and open the API in a web browser, by visiting [http://127.0.0.1:8000/snippets/][devserver].
### Browsability
@@ -198,9 +200,9 @@ See the [browsable api][browsable-api] topic for more information about the brow
## What's next?
-In [tutorial part 3][tut-3], we'll start using class based views, and see how generic views reduce the amount of code we need to write.
+In [tutorial part 3][tut-3], we'll start using class-based views, and see how generic views reduce the amount of code we need to write.
-[json-url]: http://example.com/api/items/4/.json
+[json-url]: http://example.com/api/items/4.json
[devserver]: http://127.0.0.1:8000/snippets/
[browsable-api]: ../topics/browsable-api.md
[tut-1]: 1-serialization.md
diff --git a/docs/tutorial/3-class-based-views.md b/docs/tutorial/3-class-based-views.md
index abf82e495..f018666f5 100644
--- a/docs/tutorial/3-class-based-views.md
+++ b/docs/tutorial/3-class-based-views.md
@@ -1,10 +1,10 @@
-# Tutorial 3: Class Based Views
+# Tutorial 3: Class-based Views
-We can also write our API views using class based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code [DRY][dry].
+We can also write our API views using class-based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code [DRY][dry].
-## Rewriting our API using class based views
+## Rewriting our API using class-based views
-We'll start by rewriting the root view as a class based view. All this involves is a little bit of refactoring of `views.py`.
+We'll start by rewriting the root view as a class-based view. All this involves is a little bit of refactoring of `views.py`.
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@@ -62,7 +62,7 @@ So far, so good. It looks pretty similar to the previous case, but we've got be
That's looking good. Again, it's still pretty similar to the function based view right now.
-We'll also need to refactor our `urls.py` slightly now we're using class based views.
+We'll also need to refactor our `urls.py` slightly now we're using class-based views.
from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
@@ -79,7 +79,7 @@ Okay, we're done. If you run the development server everything should be workin
## Using mixins
-One of the big wins of using class based views is that it allows us to easily compose reusable bits of behaviour.
+One of the big wins of using class-based views is that it allows us to easily compose reusable bits of behaviour.
The create/retrieve/update/delete operations that we've been using so far are going to be pretty similar for any model-backed API views we create. Those bits of common behaviour are implemented in REST framework's mixin classes.
@@ -124,7 +124,7 @@ The base class provides the core functionality, and the mixin classes provide th
Pretty similar. Again we're using the `GenericAPIView` class to provide the core functionality, and adding in mixins to provide the `.retrieve()`, `.update()` and `.destroy()` actions.
-## Using generic class based views
+## Using generic class-based views
Using the mixin classes we've rewritten the views to use slightly less code than before, but we can go one step further. REST framework provides a set of already mixed-in generic views that we can use to trim down our `views.py` module even more.
diff --git a/docs/tutorial/4-authentication-and-permissions.md b/docs/tutorial/4-authentication-and-permissions.md
index 74fe51895..d69c38552 100644
--- a/docs/tutorial/4-authentication-and-permissions.md
+++ b/docs/tutorial/4-authentication-and-permissions.md
@@ -67,7 +67,7 @@ Now that we've got some users to work with, we'd better add representations of t
Because `'snippets'` is a *reverse* relationship on the User model, it will not be included by default when using the `ModelSerializer` class, so we needed to add an explicit field for it.
-We'll also add a couple of views to `views.py`. We'd like to just use read-only views for the user representations, so we'll use the `ListAPIView` and `RetrieveAPIView` generic class based views.
+We'll also add a couple of views to `views.py`. We'd like to just use read-only views for the user representations, so we'll use the `ListAPIView` and `RetrieveAPIView` generic class-based views.
from django.contrib.auth.models import User
diff --git a/docs/tutorial/5-relationships-and-hyperlinked-apis.md b/docs/tutorial/5-relationships-and-hyperlinked-apis.md
index 4b9347bfa..8cda09c62 100644
--- a/docs/tutorial/5-relationships-and-hyperlinked-apis.md
+++ b/docs/tutorial/5-relationships-and-hyperlinked-apis.md
@@ -18,7 +18,7 @@ Right now we have endpoints for 'snippets' and 'users', but we don't have a sing
'snippets': reverse('snippet-list', request=request, format=format)
})
-Two things should be noticed here. First, we're using REST framework's `reverse` function in order to return fully-qualified URLs; second, URL patterns are identified by convenience names that we will declare later on in our `snippets/urls.py`.
+Two things should be noticed here. First, we're using REST framework's `reverse` function in order to return fully-qualified URLs; second, URL patterns are identified by convenience names that we will declare later on in our `snippets/urls.py`.
## Creating an endpoint for the highlighted snippets
@@ -80,7 +80,7 @@ We can easily re-write our existing serializers to use hyperlinking. In your `sn
class Meta:
model = Snippet
- fields = ('url', 'highlight', 'owner',
+ fields = ('url', 'pk', 'highlight', 'owner',
'title', 'code', 'linenos', 'language', 'style')
@@ -89,7 +89,7 @@ We can easily re-write our existing serializers to use hyperlinking. In your `sn
class Meta:
model = User
- fields = ('url', 'username', 'snippets')
+ fields = ('url', 'pk', 'username', 'snippets')
Notice that we've also added a new `'highlight'` field. This field is of the same type as the `url` field, except that it points to the `'snippet-highlight'` url pattern, instead of the `'snippet-detail'` url pattern.
diff --git a/docs/tutorial/6-viewsets-and-routers.md b/docs/tutorial/6-viewsets-and-routers.md
index f1dbe9443..00152cc17 100644
--- a/docs/tutorial/6-viewsets-and-routers.md
+++ b/docs/tutorial/6-viewsets-and-routers.md
@@ -130,27 +130,7 @@ Using viewsets can be a really useful abstraction. It helps ensure that URL con
That doesn't mean it's always the right approach to take. There's a similar set of trade-offs to consider as when using class-based views instead of function based views. Using viewsets is less explicit than building your views individually.
-## Reviewing our work
+In [part 7][tut-7] of the tutorial we'll look at how we can add an API schema,
+and interact with our API using a client library or command line tool.
-With an incredibly small amount of code, we've now got a complete pastebin Web API, which is fully web browsable, and comes complete with authentication, per-object permissions, and multiple renderer formats.
-
-We've walked through each step of the design process, and seen how if we need to customize anything we can gradually work our way down to simply using regular Django views.
-
-You can review the final [tutorial code][repo] on GitHub, or try out a live example in [the sandbox][sandbox].
-
-## Onwards and upwards
-
-We've reached the end of our tutorial. If you want to get more involved in the REST framework project, here are a few places you can start:
-
-* Contribute on [GitHub][github] by reviewing and submitting issues, and making pull requests.
-* Join the [REST framework discussion group][group], and help build the community.
-* Follow [the author][twitter] on Twitter and say hi.
-
-**Now go build awesome things.**
-
-
-[repo]: https://github.com/tomchristie/rest-framework-tutorial
-[sandbox]: http://restframework.herokuapp.com/
-[github]: https://github.com/tomchristie/django-rest-framework
-[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework
-[twitter]: https://twitter.com/_tomchristie
+[tut-7]: 7-schemas-and-client-libraries.md
diff --git a/docs/tutorial/7-schemas-and-client-libraries.md b/docs/tutorial/7-schemas-and-client-libraries.md
new file mode 100644
index 000000000..77cfdd3b3
--- /dev/null
+++ b/docs/tutorial/7-schemas-and-client-libraries.md
@@ -0,0 +1,221 @@
+# Tutorial 7: Schemas & client libraries
+
+A schema is a machine-readable document that describes the available API
+endpoints, their URLS, and what operations they support.
+
+Schemas can be a useful tool for auto-generated documentation, and can also
+be used to drive dynamic client libraries that can interact with the API.
+
+## Core API
+
+In order to provide schema support REST framework uses [Core API][coreapi].
+
+Core API is a document specification for describing APIs. It is used to provide
+an internal representation format of the available endpoints and possible
+interactions that an API exposes. It can either be used server-side, or
+client-side.
+
+When used server-side, Core API allows an API to support rendering to a wide
+range of schema or hypermedia formats.
+
+When used client-side, Core API allows for dynamically driven client libraries
+that can interact with any API that exposes a supported schema or hypermedia
+format.
+
+## Adding a schema
+
+REST framework supports either explicitly defined schema views, or
+automatically generated schemas. Since we're using viewsets and routers,
+we can simply use the automatic schema generation.
+
+You'll need to install the `coreapi` python package in order to include an
+API schema.
+
+ $ pip install coreapi
+
+We can now include a schema for our API, by adding a `schema_title` argument to
+the router instantiation.
+
+ router = DefaultRouter(schema_title='Pastebin API')
+
+If you visit the API root endpoint in a browser you should now see `corejson`
+representation become available as an option.
+
+
+
+We can also request the schema from the command line, by specifying the desired
+content type in the `Accept` header.
+
+ $ http http://127.0.0.1:8000/ Accept:application/vnd.coreapi+json
+ HTTP/1.0 200 OK
+ Allow: GET, HEAD, OPTIONS
+ Content-Type: application/vnd.coreapi+json
+
+ {
+ "_meta": {
+ "title": "Pastebin API"
+ },
+ "_type": "document",
+ ...
+
+The default output style is to use the [Core JSON][corejson] encoding.
+
+Other schema formats, such as [Open API][openapi] (formerly Swagger) are
+also supported.
+
+## Using a command line client
+
+Now that our API is exposing a schema endpoint, we can use a dynamic client
+library to interact with the API. To demonstrate this, let's use the
+Core API command line client.
+
+The command line client is available as the `coreapi-cli` package:
+
+ $ pip install coreapi-cli
+
+Now check that it is available on the command line...
+
+ $ coreapi
+ Usage: coreapi [OPTIONS] COMMAND [ARGS]...
+
+ Command line client for interacting with CoreAPI services.
+
+ Visit http://www.coreapi.org for more information.
+
+ Options:
+ --version Display the package version number.
+ --help Show this message and exit.
+
+ Commands:
+ ...
+
+First we'll load the API schema using the command line client.
+
+ $ coreapi get http://127.0.0.1:8000/
+
+ snippets: {
+ highlight(pk)
+ list()
+ retrieve(pk)
+ }
+ users: {
+ list()
+ retrieve(pk)
+ }
+
+We haven't authenticated yet, so right now we're only able to see the read only
+endpoints, in line with how we've set up the permissions on the API.
+
+Let's try listing the existing snippets, using the command line client:
+
+ $ coreapi action snippets list
+ [
+ {
+ "url": "http://127.0.0.1:8000/snippets/1/",
+ "pk": 1,
+ "highlight": "http://127.0.0.1:8000/snippets/1/highlight/",
+ "owner": "lucy",
+ "title": "Example",
+ "code": "print('hello, world!')",
+ "linenos": true,
+ "language": "python",
+ "style": "friendly"
+ },
+ ...
+
+Some of the API endpoints require named parameters. For example, to get back
+the highlight HTML for a particular snippet we need to provide an id.
+
+ $ coreapi action snippets highlight --param pk=1
+
+
+
+
+ Example
+ ...
+
+## Authenticating our client
+
+If we want to be able to create, edit and delete snippets, we'll need to
+authenticate as a valid user. In this case we'll just use basic auth.
+
+Make sure to replace the `` and `` below with your
+actual username and password.
+
+ $ coreapi credentials add 127.0.0.1 : --auth basic
+ Added credentials
+ 127.0.0.1 "Basic <...>"
+
+Now if we fetch the schema again, we should be able to see the full
+set of available interactions.
+
+ $ coreapi reload
+ Pastebin API "http://127.0.0.1:8000/">
+ snippets: {
+ create(code, [title], [linenos], [language], [style])
+ destroy(pk)
+ highlight(pk)
+ list()
+ partial_update(pk, [title], [code], [linenos], [language], [style])
+ retrieve(pk)
+ update(pk, code, [title], [linenos], [language], [style])
+ }
+ users: {
+ list()
+ retrieve(pk)
+ }
+
+We're now able to interact with these endpoints. For example, to create a new
+snippet:
+
+ $ coreapi action snippets create --param title="Example" --param code="print('hello, world')"
+ {
+ "url": "http://127.0.0.1:8000/snippets/7/",
+ "pk": 7,
+ "highlight": "http://127.0.0.1:8000/snippets/7/highlight/",
+ "owner": "lucy",
+ "title": "Example",
+ "code": "print('hello, world')",
+ "linenos": false,
+ "language": "python",
+ "style": "friendly"
+ }
+
+And to delete a snippet:
+
+ $ coreapi action snippets destroy --param pk=7
+
+As well as the command line client, developers can also interact with your
+API using client libraries. The Python client library is the first of these
+to be available, and a Javascript client library is planned to be released
+soon.
+
+For more details on customizing schema generation and using Core API
+client libraries you'll need to refer to the full documentation.
+
+## Reviewing our work
+
+With an incredibly small amount of code, we've now got a complete pastebin Web API, which is fully web browsable, includes a schema-driven client library, and comes complete with authentication, per-object permissions, and multiple renderer formats.
+
+We've walked through each step of the design process, and seen how if we need to customize anything we can gradually work our way down to simply using regular Django views.
+
+You can review the final [tutorial code][repo] on GitHub, or try out a live example in [the sandbox][sandbox].
+
+## Onwards and upwards
+
+We've reached the end of our tutorial. If you want to get more involved in the REST framework project, here are a few places you can start:
+
+* Contribute on [GitHub][github] by reviewing and submitting issues, and making pull requests.
+* Join the [REST framework discussion group][group], and help build the community.
+* Follow [the author][twitter] on Twitter and say hi.
+
+**Now go build awesome things.**
+
+[coreapi]: http://www.coreapi.org
+[corejson]: http://www.coreapi.org/specification/encoding/#core-json-encoding
+[openapi]: https://openapis.org/
+[repo]: https://github.com/tomchristie/rest-framework-tutorial
+[sandbox]: http://restframework.herokuapp.com/
+[github]: https://github.com/tomchristie/django-rest-framework
+[group]: https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework
+[twitter]: https://twitter.com/_tomchristie
diff --git a/docs/tutorial/quickstart.md b/docs/tutorial/quickstart.md
index 5e3b522cc..96fed2767 100644
--- a/docs/tutorial/quickstart.md
+++ b/docs/tutorial/quickstart.md
@@ -104,7 +104,7 @@ Okay, now let's wire up the API URLs. On to `tutorial/urls.py`...
Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.
-Again, if we need more control over the API URLs we can simply drop down to using regular class based views, and writing the URL conf explicitly.
+Again, if we need more control over the API URLs we can simply drop down to using regular class-based views, and writing the URL conf explicitly.
Finally, we're including default login and logout views for use with the browsable API. That's optional, but useful if your API requires authentication and you want to use the browsable API.
@@ -130,7 +130,7 @@ Okay, we're done.
We're now ready to test the API we've built. Let's fire up the server from the command line.
- python ./manage.py runserver
+ python manage.py runserver
We can now access our API, both from the command-line, using tools like `curl`...
@@ -182,7 +182,7 @@ Or using the [httpie][httpie], command line tool...
}
-Or directly through the browser...
+Or directly through the browser, by going to the URL `http://127.0.0.1:8000/users/`...
![Quick start image][image]
diff --git a/mkdocs.yml b/mkdocs.yml
index 19d1b3553..0b89988b1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -20,6 +20,7 @@ pages:
- '4 - Authentication and permissions': 'tutorial/4-authentication-and-permissions.md'
- '5 - Relationships and hyperlinked APIs': 'tutorial/5-relationships-and-hyperlinked-apis.md'
- '6 - Viewsets and routers': 'tutorial/6-viewsets-and-routers.md'
+ - '7 - Schemas and client libraries': 'tutorial/7-schemas-and-client-libraries.md'
- API Guide:
- 'Requests': 'api-guide/requests.md'
- 'Responses': 'api-guide/responses.md'
@@ -41,6 +42,7 @@ pages:
- 'Versioning': 'api-guide/versioning.md'
- 'Content negotiation': 'api-guide/content-negotiation.md'
- 'Metadata': 'api-guide/metadata.md'
+ - 'Schemas': 'api-guide/schemas.md'
- 'Format suffixes': 'api-guide/format-suffixes.md'
- 'Returning URLs': 'api-guide/reverse.md'
- 'Exceptions': 'api-guide/exceptions.md'
@@ -49,6 +51,7 @@ pages:
- 'Settings': 'api-guide/settings.md'
- Topics:
- 'Documenting your API': 'topics/documenting-your-api.md'
+ - 'API Clients': 'topics/api-clients.md'
- 'Internationalization': 'topics/internationalization.md'
- 'AJAX, CSRF & CORS': 'topics/ajax-csrf-cors.md'
- 'HTML & Forms': 'topics/html-and-forms.md'
@@ -62,6 +65,7 @@ pages:
- '3.1 Announcement': 'topics/3.1-announcement.md'
- '3.2 Announcement': 'topics/3.2-announcement.md'
- '3.3 Announcement': 'topics/3.3-announcement.md'
+ - '3.4 Announcement': 'topics/3.4-announcement.md'
- 'Kickstarter Announcement': 'topics/kickstarter-announcement.md'
- 'Mozilla Grant': 'topics/mozilla-grant.md'
- 'Funding': 'topics/funding.md'
diff --git a/requirements/requirements-optionals.txt b/requirements/requirements-optionals.txt
index 241e1951d..20436e6b4 100644
--- a/requirements/requirements-optionals.txt
+++ b/requirements/requirements-optionals.txt
@@ -2,3 +2,4 @@
markdown==2.6.4
django-guardian==1.4.3
django-filter==0.13.0
+coreapi==1.32.0
diff --git a/rest_framework/__init__.py b/rest_framework/__init__.py
index 6f02b8039..ab1a16597 100644
--- a/rest_framework/__init__.py
+++ b/rest_framework/__init__.py
@@ -8,7 +8,7 @@ ______ _____ _____ _____ __
"""
__title__ = 'Django REST framework'
-__version__ = '3.3.3'
+__version__ = '3.4.0'
__author__ = 'Tom Christie'
__license__ = 'BSD 2-Clause'
__copyright__ = 'Copyright 2011-2016 Tom Christie'
diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py
index 50db18103..8df84105d 100644
--- a/rest_framework/authtoken/models.py
+++ b/rest_framework/authtoken/models.py
@@ -6,12 +6,6 @@ from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
-# Prior to Django 1.5, the AUTH_USER_MODEL setting does not exist.
-# Note that we don't perform this code in the compat module due to
-# bug report #1297
-# See: https://github.com/tomchristie/django-rest-framework/issues/1297
-AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
-
@python_2_unicode_compatible
class Token(models.Model):
@@ -19,8 +13,10 @@ class Token(models.Model):
The default authorization token model.
"""
key = models.CharField(_("Key"), max_length=40, primary_key=True)
- user = models.OneToOneField(AUTH_USER_MODEL, related_name='auth_token',
- on_delete=models.CASCADE, verbose_name=_("User"))
+ user = models.OneToOneField(
+ settings.AUTH_USER_MODEL, related_name='auth_token',
+ on_delete=models.CASCADE, verbose_name=_("User")
+ )
created = models.DateTimeField(_("Created"), auto_now_add=True)
class Meta:
diff --git a/rest_framework/compat.py b/rest_framework/compat.py
index 227313bd0..88138320b 100644
--- a/rest_framework/compat.py
+++ b/rest_framework/compat.py
@@ -126,7 +126,7 @@ def get_related_model(field):
def value_from_object(field, obj):
if django.VERSION < (1, 9):
return field._get_val_from_obj(obj)
- field.value_from_object(obj)
+ return field.value_from_object(obj)
# contrib.postgres only supported from 1.8 onwards.
@@ -157,6 +157,16 @@ except ImportError:
crispy_forms = None
+# coreapi is optional (Note that uritemplate is a dependancy of coreapi)
+try:
+ import coreapi
+ import uritemplate
+except (ImportError, SyntaxError):
+ # SyntaxError is possible under python 3.2
+ coreapi = None
+ uritemplate = None
+
+
# Django-guardian is optional. Import only if guardian is in INSTALLED_APPS
# Fixes (#1712). We keep the try/except for the test suite.
guardian = None
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index c220b2031..cc93e95fa 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -25,6 +25,7 @@ from django.utils.dateparse import (
)
from django.utils.duration import duration_string
from django.utils.encoding import is_protected_type, smart_text
+from django.utils.formats import localize_input, sanitize_separators
from django.utils.functional import cached_property
from django.utils.ipv6 import clean_ipv6_address
from django.utils.translation import ugettext_lazy as _
@@ -855,6 +856,7 @@ class FloatField(Field):
self.validators.append(MinValueValidator(self.min_value, message=message))
def to_internal_value(self, data):
+
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
self.fail('max_string_length')
@@ -879,11 +881,15 @@ class DecimalField(Field):
}
MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs.
- def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None, **kwargs):
+ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None,
+ localize=False, **kwargs):
self.max_digits = max_digits
self.decimal_places = decimal_places
+ self.localize = localize
if coerce_to_string is not None:
self.coerce_to_string = coerce_to_string
+ if self.localize:
+ self.coerce_to_string = True
self.max_value = max_value
self.min_value = min_value
@@ -907,7 +913,12 @@ class DecimalField(Field):
Validate that the input is a decimal number and return a Decimal
instance.
"""
+
data = smart_text(data).strip()
+
+ if self.localize:
+ data = sanitize_separators(data)
+
if len(data) > self.MAX_STRING_LENGTH:
self.fail('max_string_length')
@@ -972,6 +983,9 @@ class DecimalField(Field):
if not coerce_to_string:
return quantized
+ if self.localize:
+ return localize_input(quantized)
+
return '{0:f}'.format(quantized)
def quantize(self, value):
@@ -1057,7 +1071,7 @@ class DateTimeField(Field):
output_format = getattr(self, 'format', api_settings.DATETIME_FORMAT)
- if output_format is None:
+ if output_format is None or isinstance(value, six.string_types):
return value
if output_format.lower() == ISO_8601:
@@ -1117,7 +1131,7 @@ class DateField(Field):
output_format = getattr(self, 'format', api_settings.DATE_FORMAT)
- if output_format is None:
+ if output_format is None or isinstance(value, six.string_types):
return value
# Applying a `DateField` to a datetime value is almost always
@@ -1130,8 +1144,6 @@ class DateField(Field):
)
if output_format.lower() == ISO_8601:
- if isinstance(value, six.string_types):
- value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
return value.isoformat()
return value.strftime(output_format)
@@ -1182,7 +1194,7 @@ class TimeField(Field):
output_format = getattr(self, 'format', api_settings.TIME_FORMAT)
- if output_format is None:
+ if output_format is None or isinstance(value, six.string_types):
return value
# Applying a `TimeField` to a datetime value is almost always
@@ -1195,8 +1207,6 @@ class TimeField(Field):
)
if output_format.lower() == ISO_8601:
- if isinstance(value, six.string_types):
- value = datetime.datetime.strptime(value, '%H:%M:%S').time()
return value.isoformat()
return value.strftime(output_format)
diff --git a/rest_framework/filters.py b/rest_framework/filters.py
index 3836e8170..caff1c17f 100644
--- a/rest_framework/filters.py
+++ b/rest_framework/filters.py
@@ -10,6 +10,7 @@ from functools import reduce
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.db import models
+from django.db.models.constants import LOOKUP_SEP
from django.template import loader
from django.utils import six
from django.utils.translation import ugettext_lazy as _
@@ -71,6 +72,9 @@ class BaseFilterBackend(object):
"""
raise NotImplementedError(".filter_queryset() must be overridden.")
+ def get_fields(self, view):
+ return []
+
class DjangoFilterBackend(BaseFilterBackend):
"""
@@ -127,11 +131,28 @@ class DjangoFilterBackend(BaseFilterBackend):
template = loader.get_template(self.template)
return template_render(template, context)
+ def get_fields(self, view):
+ filter_class = getattr(view, 'filter_class', None)
+ if filter_class:
+ return list(filter_class().filters.keys())
+
+ filter_fields = getattr(view, 'filter_fields', None)
+ if filter_fields:
+ return filter_fields
+
+ return []
+
class SearchFilter(BaseFilterBackend):
# The URL query parameter used for the search.
search_param = api_settings.SEARCH_PARAM
template = 'rest_framework/filters/search.html'
+ lookup_prefixes = {
+ '^': 'istartswith',
+ '=': 'iexact',
+ '@': 'search',
+ '$': 'iregex',
+ }
def get_search_terms(self, request):
"""
@@ -142,16 +163,32 @@ class SearchFilter(BaseFilterBackend):
return params.replace(',', ' ').split()
def construct_search(self, field_name):
- if field_name.startswith('^'):
- return "%s__istartswith" % field_name[1:]
- elif field_name.startswith('='):
- return "%s__iexact" % field_name[1:]
- elif field_name.startswith('@'):
- return "%s__search" % field_name[1:]
- if field_name.startswith('$'):
- return "%s__iregex" % field_name[1:]
+ lookup = self.lookup_prefixes.get(field_name[0])
+ if lookup:
+ field_name = field_name[1:]
else:
- return "%s__icontains" % field_name
+ lookup = 'icontains'
+ return LOOKUP_SEP.join([field_name, lookup])
+
+ def must_call_distinct(self, queryset, search_fields):
+ """
+ Return True if 'distinct()' should be used to query the given lookups.
+ """
+ opts = queryset.model._meta
+ for search_field in search_fields:
+ if search_field[0] in self.lookup_prefixes:
+ search_field = search_field[1:]
+ parts = search_field.split(LOOKUP_SEP)
+ for part in parts:
+ field = opts.get_field(part)
+ if hasattr(field, 'get_path_info'):
+ # This field is a relation, update opts to follow the relation
+ path_info = field.get_path_info()
+ opts = path_info[-1].to_opts
+ if any(path.m2m for path in path_info):
+ # This field is a m2m relation so we know we need to call distinct
+ return True
+ return False
def filter_queryset(self, request, queryset, view):
search_fields = getattr(view, 'search_fields', None)
@@ -173,10 +210,13 @@ class SearchFilter(BaseFilterBackend):
]
queryset = queryset.filter(reduce(operator.or_, queries))
- # Filtering against a many-to-many field requires us to
- # call queryset.distinct() in order to avoid duplicate items
- # in the resulting queryset.
- return distinct(queryset, base)
+ if self.must_call_distinct(queryset, search_fields):
+ # Filtering against a many-to-many field requires us to
+ # call queryset.distinct() in order to avoid duplicate items
+ # in the resulting queryset.
+ # We try to avoid this is possible, for performance reasons.
+ queryset = distinct(queryset, base)
+ return queryset
def to_html(self, request, queryset, view):
if not getattr(view, 'search_fields', None):
@@ -191,6 +231,9 @@ class SearchFilter(BaseFilterBackend):
template = loader.get_template(self.template)
return template_render(template, context)
+ def get_fields(self, view):
+ return [self.search_param]
+
class OrderingFilter(BaseFilterBackend):
# The URL query parameter used for the ordering.
@@ -304,6 +347,9 @@ class OrderingFilter(BaseFilterBackend):
context = self.get_template_context(request, queryset, view)
return template_render(template, context)
+ def get_fields(self, view):
+ return [self.ordering_param]
+
class DjangoObjectPermissionsFilter(BaseFilterBackend):
"""
diff --git a/rest_framework/locale/ach/LC_MESSAGES/django.mo b/rest_framework/locale/ach/LC_MESSAGES/django.mo
index a91bc8b32..495c1ce7d 100644
Binary files a/rest_framework/locale/ach/LC_MESSAGES/django.mo and b/rest_framework/locale/ach/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ach/LC_MESSAGES/django.po b/rest_framework/locale/ach/LC_MESSAGES/django.po
index bfb8b75cc..a245f1510 100644
--- a/rest_framework/locale/ach/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ach/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Acoli (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ach/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: ach\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.mo b/rest_framework/locale/ar/LC_MESSAGES/django.mo
index 719bb0b31..06471de23 100644
Binary files a/rest_framework/locale/ar/LC_MESSAGES/django.mo and b/rest_framework/locale/ar/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.po b/rest_framework/locale/ar/LC_MESSAGES/django.po
index 21c997eb1..314356654 100644
--- a/rest_framework/locale/ar/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ar/LC_MESSAGES/django.po
@@ -3,14 +3,15 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Bashar Al-Abdulhadi, 2016
# Eyad Toma , 2015
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Arabic (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,74 +19,74 @@ msgstr ""
"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"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "اسم المستخدم/كلمة السر غير صحيحين."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "المستخدم غير مفعل او تم حذفه."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
-msgstr ""
+msgstr "رمز غير صحيح"
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "رمز التفويض"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "المفتاح"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "المستخدم"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "أنشئ"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "الرمز"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "الرموز"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "اسم المستخدم"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "كلمة المرور"
#: authtoken/serializers.py:20
msgid "User account is disabled."
@@ -124,7 +125,6 @@ msgid "Not found."
msgstr "غير موجود."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -133,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -141,214 +140,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "هذا الحقل مطلوب."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "لا يمكن لهذا الحقل ان يكون فارغاً null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ليس قيمة منطقية."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "لا يمكن لهذا الحقل ان يكون فارغاً."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "تأكد ان الحقل لا يزيد عن {max_length} محرف."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "تأكد ان الحقل {min_length} محرف على الاقل."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "عليك ان تدخل بريد إلكتروني صالح."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "هذه القيمة لا تطابق النمط المطلوب."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "الرجاء إدخال رابط إلكتروني صالح."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "الرجاء إدخال رقم صحيح صالح."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "تأكد ان القيمة أقل أو تساوي {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "تأكد ان القيمة أكبر أو تساوي {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "الرجاء إدخال رقم صالح."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "تأكد ان القيمة لا تحوي أكثر من {max_digits} رقم."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة التاريخ و الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة التاريخ غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "صيغة الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ليست واحدة من الخيارات الصالحة."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "لم يتم إرسال أي ملف."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "الملف الذي تم إرساله فارغ."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "تأكد ان اسم الملف لا يحوي أكثر من {max_length} محرف (الإسم المرسل يحوي {length} محرف)."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "أرسل"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "صفحة غير صحيحة"
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -365,41 +351,38 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "قيمة غير صالحة."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "مرشحات"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "مرشحات الحقول"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "الترتيب"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "البحث"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
@@ -413,27 +396,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -441,15 +420,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/be/LC_MESSAGES/django.mo b/rest_framework/locale/be/LC_MESSAGES/django.mo
index cf959f6d9..13a9e2569 100644
Binary files a/rest_framework/locale/be/LC_MESSAGES/django.mo and b/rest_framework/locale/be/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/be/LC_MESSAGES/django.po b/rest_framework/locale/be/LC_MESSAGES/django.po
index 6fe59735f..5aaa072ae 100644
--- a/rest_framework/locale/be/LC_MESSAGES/django.po
+++ b/rest_framework/locale/be/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Belarusian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/be/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"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"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.mo b/rest_framework/locale/ca/LC_MESSAGES/django.mo
index e9d5355e1..7418c1ed0 100644
Binary files a/rest_framework/locale/ca/LC_MESSAGES/django.mo and b/rest_framework/locale/ca/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.po b/rest_framework/locale/ca/LC_MESSAGES/django.po
index f23310d2c..56f46319f 100644
--- a/rest_framework/locale/ca/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ca/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Catalan (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Header Basic invàlid. No hi ha disponibles les credencials."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Header Basic invàlid. Les credencials no poden contenir espais."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Header Basic invàlid. Les credencials no estan codificades correctament en base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Usuari/Contrasenya incorrectes."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Usuari inactiu o esborrat."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Token header invàlid. No s'han indicat les credencials."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Token header invàlid. El token no ha de contenir espais."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Token header invàlid. El token no pot contenir caràcters invàlids."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Token invàlid."
@@ -58,23 +58,23 @@ msgstr "Token invàlid."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr "No trobat."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Mètode \"{method}\" no permès."
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "No s'ha pogut satisfer l'Accept header de la petició."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Media type \"{media_type}\" no suportat."
@@ -140,214 +138,201 @@ msgstr "Media type \"{media_type}\" no suportat."
msgid "Request was throttled."
msgstr "La petició ha estat limitada pel número màxim de peticions definit."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Aquest camp és obligatori."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Aquest camp no pot ser nul."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" no és un booleà."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Aquest camp no pot estar en blanc."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Aquest camp no pot tenir més de {max_length} caràcters."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Aquest camp ha de tenir un mínim de {min_length} caràcters."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Introdueixi una adreça de correu vàlida."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Aquest valor no compleix el patró requerit."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Introdueix un \"slug\" vàlid consistent en lletres, números, guions o guions baixos."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Introdueixi una URL vàlida."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" no és un UUID vàlid."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Introdueixi una adreça IPv4 o IPv6 vàlida."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Es requereix un nombre enter vàlid."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Aquest valor ha de ser menor o igual a {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Aquest valor ha de ser més gran o igual a {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Valor del text massa gran."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Es requereix un nombre vàlid."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "No pot haver-hi més de {max_digits} dígits en total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "No pot haver-hi més de {max_decimal_places} decimals."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "No pot haver-hi més de {max_whole_digits} dígits abans del punt decimal."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "El Datetime té un format incorrecte. Utilitzi un d'aquests formats: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "S'espera un Datetime però s'ha rebut un Date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "El Date té un format incorrecte. Utilitzi un d'aquests formats: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "S'espera un Date però s'ha rebut un Datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "El Time té un format incorrecte. Utilitzi un d'aquests formats: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "La durada té un format incorrecte. Utilitzi un d'aquests formats: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" no és una opció vàlida."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "S'espera una llista d'ítems però s'ha rebut el tipus \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Aquesta selecció no pot estar buida."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" no és un path vàlid."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "No s'ha enviat cap fitxer."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Les dades enviades no són un fitxer. Comproveu l'encoding type del formulari."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "No s'ha pogut determinar el nom del fitxer."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "El fitxer enviat està buit."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "El nom del fitxer ha de tenir com a màxim {max_length} caràcters (en té {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Envieu una imatge vàlida. El fitxer enviat no és una imatge o és una imatge corrompuda."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Aquesta llista no pot estar buida."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "S'espera un diccionari però s'ha rebut el tipus \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Cursor invàlid."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "PK invàlida \"{pk_value}\" - l'objecte no existeix."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipus incorrecte. S'espera el valor d'una PK, s'ha rebut {data_type}."
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Hyperlink invàlid - L'objecte no existeix."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipus incorrecte. S'espera una URL, s'ha rebut {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "L'objecte amb {slug_name}={value} no existeix."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valor invàlid."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Dades invàlides. S'espera un diccionari però s'ha rebut {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr "Cap"
msgid "No items to select."
msgstr "Cap opció seleccionada."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Aquest camp ha de ser únic."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Aquests camps {field_names} han de constituir un conjunt únic."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Aquest camp ha de ser únic per a la data \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Aquest camp ha de ser únic per al mes \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"."
@@ -440,15 +418,19 @@ msgstr "Aquest camp ha de ser únic per a l'any \"{date_field}\"."
msgid "Invalid version in \"Accept\" header."
msgstr "Versió invàlida al header \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Versió invàlida a la URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Versió invàlida al hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Versió invàlida al paràmetre de consulta."
diff --git a/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo b/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo
index 96a0b1ebb..3a733aa1b 100644
Binary files a/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo and b/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ca_ES/LC_MESSAGES/django.po b/rest_framework/locale/ca_ES/LC_MESSAGES/django.po
index c4f9df6cb..c9ce5fd13 100644
--- a/rest_framework/locale/ca_ES/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ca_ES/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Catalan (Spain) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca_ES/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: ca_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.mo b/rest_framework/locale/cs/LC_MESSAGES/django.mo
index 459b3f01f..1c98eb62d 100644
Binary files a/rest_framework/locale/cs/LC_MESSAGES/django.mo and b/rest_framework/locale/cs/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.po b/rest_framework/locale/cs/LC_MESSAGES/django.po
index 43c571130..8ba979350 100644
--- a/rest_framework/locale/cs/LC_MESSAGES/django.po
+++ b/rest_framework/locale/cs/LC_MESSAGES/django.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Czech (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,40 +19,40 @@ msgstr ""
"Language: cs\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Chybná hlavička. Nebyly poskytnuty přihlašovací údaje."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Chybná hlavička. Přihlašovací údaje by neměly obsahovat mezery."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Chybná hlavička. Přihlašovací údaje nebyly správně zakódovány pomocí base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Chybné uživatelské jméno nebo heslo."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Uživatelský účet je neaktivní nebo byl smazán."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Chybná hlavička tokenu. Nebyly zadány přihlašovací údaje."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Chybná hlavička tokenu. Přihlašovací údaje by neměly obsahovat mezery."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Chybný token."
@@ -60,23 +60,23 @@ msgstr "Chybný token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Nenalezeno."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metoda \"{method}\" není povolena."
@@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Nelze vyhovět požadavku v hlavičce Accept."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Nepodporovaný media type \"{media_type}\" v požadavku."
@@ -142,214 +140,201 @@ msgstr "Nepodporovaný media type \"{media_type}\" v požadavku."
msgid "Request was throttled."
msgstr "Požadavek byl limitován kvůli omezení počtu požadavků za časovou periodu."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Toto pole je vyžadováno."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Toto pole nesmí být prázdné (null)."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" nelze použít jako typ boolean."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Toto pole nesmí být prázdné."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Zkontrolujte, že toto pole není delší než {max_length} znaků."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Zkontrolujte, že toto pole obsahuje alespoň {min_length} znaků."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Vložte platnou e-mailovou adresu."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Hodnota v tomto poli neodpovídá požadovanému formátu."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Vložte platnou \"zkrácenou formu\" obsahující pouze malá písmena, čísla, spojovník nebo podtržítko."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Vložte platný odkaz."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" není platné UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Je vyžadováno celé číslo."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Zkontrolujte, že hodnota je menší nebo rovna {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Zkontrolujte, že hodnota je větší nebo rovna {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Řetězec je příliš dlouhý."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Je vyžadováno číslo."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Zkontrolujte, že číslo neobsahuje více než {max_digits} čislic."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Zkontrolujte, že číslo nemá více než {max_decimal_places} desetinných míst."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Zkontrolujte, že číslo neobsahuje více než {max_whole_digits} čislic před desetinnou čárkou."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát data a času. Použijte jeden z těchto formátů: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Bylo zadáno pouze datum bez času."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát data. Použijte jeden z těchto formátů: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Bylo zadáno datum a čas, místo samotného data."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Chybný formát času. Použijte jeden z těchto formátů: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" není platnou možností."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Byl očekáván seznam položek ale nalezen \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Nebyl zaslán žádný soubor."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Zaslaná data neobsahují soubor. Zkontrolujte typ kódování ve formuláři."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Nebylo možné zjistit jméno souboru."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Zaslaný soubor je prázdný."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Zajistěte, aby jméno souboru obsahovalo maximálně {max_length} znaků (teď má {length} znaků)."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Nahrajte platný obrázek. Nahraný soubor buď není obrázkem nebo je poškozen."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Byl očekáván slovník položek ale nalezen \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Chybný kurzor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Chybný primární klíč \"{pk_value}\" - objekt neexistuje."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Chybný typ. Byl přijat typ {data_type} místo hodnoty primárního klíče."
@@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Chybný odkaz - objekt neexistuje."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Chybný typ. Byl přijat typ {data_type} místo očekávaného odkazu."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt s {slug_name}={value} neexistuje."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Chybná hodnota."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Chybná data. Byl přijat typ {datatype} místo očekávaného slovníku."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -414,27 +396,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Tato položka musí být unikátní."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Položka {field_names} musí tvořit unikátní množinu."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Tato položka musí být pro datum \"{date_field}\" unikátní."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Tato položka musí být pro měsíc \"{date_field}\" unikátní."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní."
@@ -442,15 +420,19 @@ msgstr "Tato položka musí být pro rok \"{date_field}\" unikátní."
msgid "Invalid version in \"Accept\" header."
msgstr "Chybné číslo verze v hlavičce Accept."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Chybné číslo verze v odkazu."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Chybné číslo verze v hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Chybné čislo verze v URL parametru."
diff --git a/rest_framework/locale/da/LC_MESSAGES/django.mo b/rest_framework/locale/da/LC_MESSAGES/django.mo
index 7820bdd3e..9c17c3a40 100644
Binary files a/rest_framework/locale/da/LC_MESSAGES/django.mo and b/rest_framework/locale/da/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/da/LC_MESSAGES/django.po b/rest_framework/locale/da/LC_MESSAGES/django.po
index 3d4e0ada2..2903376ad 100644
--- a/rest_framework/locale/da/LC_MESSAGES/django.po
+++ b/rest_framework/locale/da/LC_MESSAGES/django.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Danish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,40 +19,40 @@ msgstr ""
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Ugyldig basic header. Ingen legitimation angivet."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ugyldig basic header. Legitimationsstrenge må ikke indeholde mellemrum."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ugyldig basic header. Legitimationen er ikke base64 encoded på korrekt vis."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Ugyldigt brugernavn/kodeord."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Inaktiv eller slettet bruger."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Ugyldig token header."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ugyldig token header. Token-strenge må ikke indeholde mellemrum."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Ugyldig token header. Token streng bør ikke indeholde ugyldige karakterer."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Ugyldigt token."
@@ -60,23 +60,23 @@ msgstr "Ugyldigt token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Ikke fundet."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metoden \"{method}\" er ikke tilladt."
@@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kunne ikke efterkomme forespørgslens Accept header."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet."
@@ -142,214 +140,201 @@ msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet."
msgid "Request was throttled."
msgstr "Forespørgslen blev neddroslet."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Dette felt er påkrævet."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Dette felt må ikke være null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" er ikke en tilladt boolsk værdi."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Dette felt må ikke være tomt."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Tjek at dette felt ikke indeholder flere end {max_length} tegn."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Tjek at dette felt indeholder mindst {min_length} tegn."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Angiv en gyldig e-mailadresse."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Denne værdi passer ikke med det påkrævede mønster."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Indtast en gyldig \"slug\", bestående af bogstaver, tal, bund- og bindestreger."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Indtast en gyldig URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" er ikke et gyldigt UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Indtast en gyldig IPv4 eller IPv6 adresse."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Et gyldigt heltal er påkrævet."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Tjek at værdien er mindre end eller lig med {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Tjek at værdien er større end eller lig med {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Strengværdien er for stor."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Et gyldigt tal er påkrævet."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Tjek at der ikke er flere end {max_digits} cifre i alt."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Tjek at der ikke er flere end {max_decimal_places} cifre efter kommaet."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Tjek at der ikke er flere end {max_whole_digits} cifre før kommaet."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datotid har et forkert format. Brug i stedet et af disse formater: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Forventede en datotid, men fik en dato."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Dato har et forkert format. Brug i stedet et af disse formater: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Forventede en dato men fik en datotid."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Klokkeslæt har forkert format. Brug i stedet et af disse formater: {format}. "
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Varighed har forkert format. Brug istedet et af følgende formater: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" er ikke et gyldigt valg."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Flere end {count} objekter..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Forventede en liste, men fik noget af typen \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Dette valg kan være tomt."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" er ikke et gyldigt valg af adresse."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Ingen medsendt fil."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Det medsendte data var ikke en fil. Tjek typen af indkodning på formularen."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Filnavnet kunne ikke afgøres."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Den medsendte fil er tom."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Sørg for at filnavnet er højst {max_length} langt (det er {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Medsend et gyldigt billede. Den medsendte fil var enten ikke et billede eller billedfilen var ødelagt."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Denne liste er muligvis ikke tom."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Forventede en dictionary, men fik noget af typen \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Værdi skal være gyldig JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Indsend."
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Ugyldig cursor"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ugyldig primærnøgle \"{pk_value}\" - objektet findes ikke."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Ugyldig type. Forventet værdi er primærnøgle, fik {data_type}."
@@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ugyldigt hyperlink - objektet findes ikke."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Forkert type. Forventede en URL-streng, fik {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Object med {slug_name}={value} findes ikke."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Ugyldig værdi."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ugyldig data. Forventede en dictionary, men fik {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtre"
@@ -414,27 +396,23 @@ msgstr "Ingen"
msgid "No items to select."
msgstr "Intet at vælge."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Dette felt skal være unikt."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Felterne {field_names} skal udgøre et unikt sæt."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dette felt skal være unikt for \"{date_field}\"-datoen."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dette felt skal være unikt for \"{date_field}\"-måneden."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dette felt skal være unikt for \"{date_field}\"-året."
@@ -442,15 +420,19 @@ msgstr "Dette felt skal være unikt for \"{date_field}\"-året."
msgid "Invalid version in \"Accept\" header."
msgstr "Ugyldig version i \"Accept\" headeren."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Ugyldig version i URL-stien."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Ugyldig version i hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Ugyldig version i forespørgselsparameteren."
diff --git a/rest_framework/locale/da_DK/LC_MESSAGES/django.mo b/rest_framework/locale/da_DK/LC_MESSAGES/django.mo
index 0e1cc36ef..f34583e4c 100644
Binary files a/rest_framework/locale/da_DK/LC_MESSAGES/django.mo and b/rest_framework/locale/da_DK/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/da_DK/LC_MESSAGES/django.po b/rest_framework/locale/da_DK/LC_MESSAGES/django.po
index 7ec27dee2..bb512e284 100644
--- a/rest_framework/locale/da_DK/LC_MESSAGES/django.po
+++ b/rest_framework/locale/da_DK/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Danish (Denmark) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da_DK/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: da_DK\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/de/LC_MESSAGES/django.mo b/rest_framework/locale/de/LC_MESSAGES/django.mo
index ce4458e00..317124886 100644
Binary files a/rest_framework/locale/de/LC_MESSAGES/django.mo and b/rest_framework/locale/de/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/de/LC_MESSAGES/django.po b/rest_framework/locale/de/LC_MESSAGES/django.po
index c30dd7555..057a69f1c 100644
--- a/rest_framework/locale/de/LC_MESSAGES/django.po
+++ b/rest_framework/locale/de/LC_MESSAGES/django.po
@@ -5,7 +5,7 @@
# Translators:
# Fabian Büchler , 2015
# Mads Jensen , 2015
-# Niklas P , 2015
+# Niklas P , 2015-2016
# Thomas Tanner, 2015
# Tom Jaster , 2015
# Xavier Ordoquy , 2015
@@ -13,9 +13,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: German (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,74 +23,74 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Ungültiger basic header. Keine Zugangsdaten angegeben."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ungültiger basic header. Zugangsdaten sollen keine Leerzeichen enthalten."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ungültiger basic header. Zugangsdaten sind nicht korrekt mit base64 kodiert."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Ungültiger Benutzername/Passwort"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Benutzer inaktiv oder gelöscht."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Ungültiger token header. Keine Zugangsdaten angegeben."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ungültiger token header. Zugangsdaten sollen keine Leerzeichen enthalten."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Ungültiger Token Header. Tokens dürfen keine ungültigen Zeichen enthalten."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Ungültiges Token"
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Auth Token"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Schlüssel"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Benutzer"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Tokens"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Benutzername"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Passwort"
#: authtoken/serializers.py:20
msgid "User account is disabled."
@@ -129,7 +129,6 @@ msgid "Not found."
msgstr "Nicht gefunden."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Methode \"{method}\" nicht erlaubt."
@@ -138,7 +137,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kann die Accept Kopfzeile der Anfrage nicht erfüllen."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage."
@@ -146,214 +144,201 @@ msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage."
msgid "Request was throttled."
msgstr "Die Anfrage wurde gedrosselt."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Dieses Feld ist erforderlich."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Dieses Feld darf nicht Null sein."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ist kein gültiger Wahrheitswert."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Dieses Feld darf nicht leer sein."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Stelle sicher, dass dieses Feld nicht mehr als {max_length} Zeichen lang ist."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Stelle sicher, dass dieses Feld mindestens {min_length} Zeichen lang ist."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Gib eine gültige E-Mail Adresse an."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Dieser Wert passt nicht zu dem erforderlichen Muster."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Gib ein gültiges \"slug\" aus Buchstaben, Ziffern, Unterstrichen und Minuszeichen ein."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Gib eine gültige URL ein."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" ist keine gültige UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Geben Sie eine gültige UPv4 oder IPv6 Adresse an"
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Eine gültige Ganzzahl ist erforderlich."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Stelle sicher, dass dieser Wert kleiner oder gleich {max_value} ist."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Stelle sicher, dass dieser Wert größer oder gleich {min_value} ist."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Zeichenkette zu lang."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Eine gültige Zahl ist erforderlich."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Stelle sicher, dass es insgesamt nicht mehr als {max_digits} Ziffern lang ist."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Stelle sicher, dass es nicht mehr als {max_decimal_places} Nachkommastellen lang ist."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Stelle sicher, dass es nicht mehr als {max_whole_digits} Stellen vor dem Komma lang ist."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datums- und Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Erwarte eine Datums- und Zeitangabe, erhielt aber ein Datum."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Datum hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Erwarte ein Datum, erhielt aber eine Datums- und Zeitangabe."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Zeitangabe hat das falsche Format. Nutze stattdessen eines dieser Formate: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Laufzeit hat das falsche Format. Benutze stattdessen eines dieser Formate {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ist keine gültige Option."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Mehr als {count} Ergebnisse"
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Erwarte eine Liste von Elementen, erhielt aber den Typ \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Diese Auswahl darf nicht leer sein"
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" ist ein ungültiger Pfad Wahl."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Es wurde keine Datei übermittelt."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Die übermittelten Daten stellen keine Datei dar. Prüfe den Kodierungstyp im Formular."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Der Dateiname konnte nicht ermittelt werden."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Die übermittelte Datei ist leer."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Stelle sicher, dass dieser Dateiname höchstens {max_length} Zeichen lang ist (er hat {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Lade ein gültiges Bild hoch. Die hochgeladene Datei ist entweder kein Bild oder ein beschädigtes Bild."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Diese Liste darf nicht leer sein."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Erwarte ein Dictionary mit Elementen, erhielt aber den Typ \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Wert muss gültiges JSON sein."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Abschicken"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Ungültiger Zeiger"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ungültiger pk \"{pk_value}\" - Object existiert nicht."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Falscher Typ. Erwarte pk Wert, erhielt aber {data_type}."
@@ -370,25 +355,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ungültiger Hyperlink - Objekt existiert nicht."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Falscher Typ. Erwarte URL Zeichenkette, erhielt aber {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt mit {slug_name}={value} existiert nicht."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Ungültiger Wert."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ungültige Daten. Dictionary erwartet, aber {datatype} erhalten."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filter"
@@ -418,27 +400,23 @@ msgstr "Nichts"
msgid "No items to select."
msgstr "Keine Elemente zum Auswählen."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Dieses Feld muss eindeutig sein."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Die Felder {field_names} müssen eine eindeutige Menge bilden."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Datums eindeutig sein."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Monats eindeutig sein."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein."
@@ -446,15 +424,19 @@ msgstr "Dieses Feld muss bezüglich des \"{date_field}\" Jahrs eindeutig sein."
msgid "Invalid version in \"Accept\" header."
msgstr "Ungültige Version in der \"Accept\" Kopfzeile."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Ungültige Version im URL Pfad."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Ungültige Version im Hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Ungültige Version im Anfrageparameter."
diff --git a/rest_framework/locale/el/LC_MESSAGES/django.mo b/rest_framework/locale/el/LC_MESSAGES/django.mo
index fc2120f7f..c7fb97b2c 100644
Binary files a/rest_framework/locale/el/LC_MESSAGES/django.mo and b/rest_framework/locale/el/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/el/LC_MESSAGES/django.po b/rest_framework/locale/el/LC_MESSAGES/django.po
index 407ecf3a7..be9bdf717 100644
--- a/rest_framework/locale/el/LC_MESSAGES/django.po
+++ b/rest_framework/locale/el/LC_MESSAGES/django.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Serafeim Papastefanos , 2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Greek (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,441 +18,423 @@ msgstr ""
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
-msgstr ""
+msgstr "Λανθασμένη επικεφαλίδα basic. Δεν υπάρχουν διαπιστευτήρια."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
-msgstr ""
+msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δε μπορεί να περιέχουν κενά."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
-msgstr ""
+msgstr "Λανθασμένη επικεφαλίδα basic. Τα διαπιστευτήρια δεν είναι κωδικοποιημένα κατά base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
-msgstr ""
+msgstr "Λανθασμένο όνομα χρήστη/κωδικός."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
-msgstr ""
-
-#: authentication.py:173
-msgid "Invalid token header. No credentials provided."
-msgstr ""
+msgstr "Ο χρήστης είναι ανενεργός ή διεγραμμένος."
#: authentication.py:176
-msgid "Invalid token header. Token string should not contain spaces."
-msgstr ""
+msgid "Invalid token header. No credentials provided."
+msgstr "Λανθασμένη επικεφαλίδα token. Δεν υπάρχουν διαπιστευτήρια."
-#: authentication.py:182
+#: authentication.py:179
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr "Λανθασμένη επικεφαλίδα token. Το token δε πρέπει να περιέχει κενά."
+
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
-msgstr ""
+msgstr "Λανθασμένη επικεφαλίδα token. Το token περιέχει μη επιτρεπτούς χαρακτήρες."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
-msgstr ""
+msgstr "Λανθασμένο token"
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Token πιστοποίησης"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Κλειδί"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Χρήστης"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Δημιουργήθηκε"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Tokens"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Όνομα χρήστη"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Κωδικός"
#: authtoken/serializers.py:20
msgid "User account is disabled."
-msgstr ""
+msgstr "Ο λογαριασμός χρήστη είναι απενεργοποιημένος."
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
-msgstr ""
+msgstr "Δεν είναι δυνατή η σύνδεση με τα διαπιστευτήρια."
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
-msgstr ""
+msgstr "Πρέπει να περιέχει \"όνομα χρήστη\" και \"κωδικό\"."
#: exceptions.py:49
msgid "A server error occurred."
-msgstr ""
+msgstr "Σφάλμα διακομιστή."
#: exceptions.py:84
msgid "Malformed request."
-msgstr ""
+msgstr "Λανθασμένο αίτημα."
#: exceptions.py:89
msgid "Incorrect authentication credentials."
-msgstr ""
+msgstr "Λάθος διαπιστευτήρια."
#: exceptions.py:94
msgid "Authentication credentials were not provided."
-msgstr ""
+msgstr "Δεν δόθηκαν διαπιστευτήρια."
#: exceptions.py:99
msgid "You do not have permission to perform this action."
-msgstr ""
+msgstr "Δεν έχετε δικαίωματα για αυτή την ενέργεια."
#: exceptions.py:104 views.py:81
msgid "Not found."
-msgstr ""
+msgstr "Δε βρέθηκε."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
-msgstr ""
+msgstr "Η μέθοδος \"{method\"} δεν επιτρέπεται."
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
-msgstr ""
+msgstr "Δεν ήταν δυνατή η ικανοποίηση της επικεφαλίδας Accept της αίτησης."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
-msgstr ""
+msgstr "Δεν υποστηρίζεται το media type \"{media_type}\" της αίτησης."
#: exceptions.py:145
msgid "Request was throttled."
-msgstr ""
+msgstr "Το αίτημα έγινε throttle."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
-msgstr ""
+msgstr "Το πεδίο είναι απαραίτητο."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
-msgstr ""
+msgstr "Το πεδίο δε μπορεί να είναι null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
-msgstr ""
+msgstr "Το \"{input}\" δεν είναι έγκυρο boolean."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
-msgstr ""
+msgstr "Το πεδίο δε μπορεί να είναι κενό."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι το πεδίο δεν έχει περισσότερους από {max_length} χαρακτήρες."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι το πεδίο έχει τουλάχιστον {min_length} χαρακτήρες."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
-msgstr ""
+msgstr "Συμπληρώσατε μια έγκυρη διεύθυνση e-mail."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
-msgstr ""
+msgstr "Η τιμή δε ταιριάζει με το pattern."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
-msgstr ""
+msgstr "Εισάγετε ένα έγκυρο \"slug\" που αποτελείται από γράμματα, αριθμούς παύλες και κάτω παύλες."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
-msgstr ""
+msgstr "Εισάγετε έγκυρο URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
-msgstr ""
+msgstr "Το \"{value}\" δεν είναι έγκυρο UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
-msgstr ""
+msgstr "Εισάγετε μια έγκυρη διεύθυνση IPv4 ή IPv6."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
-msgstr ""
+msgstr "Ένας έγκυρος ακέραιος είναι απαραίτητος."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι η τιμή είναι μικρότερη ή ίση του {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι η τιμή είναι μεγαλύτερη ή ίση του {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
-msgstr ""
+msgstr "Το κείμενο είναι πολύ μεγάλο."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
-msgstr ""
+msgstr "Ένας έγκυρος αριθμός είναι απαραίτητος."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_digits} ψηφία."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_decimal_places} δεκαδικά ψηφία."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι δεν υπάρχουν παραπάνω από {max_whole_digits} ακέραια ψηφία."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
-msgstr ""
+msgstr "Αναμένεται ημερομηνία και ώρα αλλά δόθηκε μόνο ημερομηνία."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Η ημερομηνία έχεi λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
-msgstr ""
+msgstr "Αναμένεται ημερομηνία αλλά δόθηκε ημερομηνία και ώρα."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Η ώρα έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Η διάρκεια έχει λάθος μορφή. Χρησιμοποιήστε μια από τις ακόλουθες μορφές: {format}"
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
-msgstr ""
+msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
-msgstr ""
+msgstr "Περισσότερα από {count} αντικείμενα..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Αναμένεται μια λίστα αντικειμένον αλλά δόθηκε ο τύπος \"{input_type}\""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
-msgstr ""
+msgstr "Η επιλογή δε μπορεί να είναι κενή."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
-msgstr ""
+msgstr "Το \"{input}\" δεν είναι έγκυρη επιλογή διαδρομής."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
-msgstr ""
+msgstr "Δεν υποβλήθηκε αρχείο."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
-msgstr ""
+msgstr "Τα δεδομένα που υποβλήθηκαν δεν ήταν αρχείο. Ελέγξατε την κωδικοποίηση της φόρμας."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
-msgstr ""
+msgstr "Δε βρέθηκε όνομα αρχείου."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
-msgstr ""
+msgstr "Το αρχείο που υποβλήθηκε είναι κενό."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
-msgstr ""
+msgstr "Επιβεβαιώσατε ότι το όνομα αρχείου έχει ως {max_length} χαρακτήρες (έχει {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
-msgstr ""
+msgstr "Ανεβάστε μια έγκυρη εικόνα. Το αρχείο που ανεβάσατε είτε δεν είναι εικόνα είτε έχει καταστραφεί."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
-msgstr ""
+msgstr "Η λίστα δε μπορεί να είναι κενή."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Αναμένεται ένα λεξικό αντικείμενων αλλά δόθηκε ο τύπος \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
-msgstr ""
+msgstr "Η τιμή πρέπει να είναι μορφής JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "Υποβολή"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "Λάθος σελίδα."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
-msgstr ""
+msgstr "Λάθος cursor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
-msgstr ""
+msgstr "Λάθος κλειδί \"{pk_value}\" - το αντικείμενο δεν υπάρχει."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
-msgstr ""
+msgstr "Λάθος τύπος. Αναμένεται τιμή κλειδιού, δόθηκε {data_type}."
#: relations.py:240
msgid "Invalid hyperlink - No URL match."
-msgstr ""
+msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL."
#: relations.py:241
msgid "Invalid hyperlink - Incorrect URL match."
-msgstr ""
+msgstr "Λάθος σύνδεση - δε ταιριάζει κάποιο URL."
#: relations.py:242
msgid "Invalid hyperlink - Object does not exist."
-msgstr ""
+msgstr "Λάθος σύνδεση - το αντικείμενο δεν υπάρχει."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
-msgstr ""
+msgstr "Λάθος τύπος. Αναμένεται URL, δόθηκε {data_type}."
+
+#: relations.py:401
+msgid "Object with {slug_name}={value} does not exist."
+msgstr "Το αντικείμενο {slug_name}={value} δεν υπάρχει."
#: relations.py:402
-#, python-brace-format
-msgid "Object with {slug_name}={value} does not exist."
-msgstr ""
-
-#: relations.py:403
msgid "Invalid value."
-msgstr ""
+msgstr "Λάθος τιμή."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
-msgstr ""
+msgstr "Λάθος δεδομένα. Αναμένεται λεξικό αλλά δόθηκε {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "Φίλτρα"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "Φίλτρα πεδίων"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "Ταξινόμηση"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "Αναζήτηση"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
-msgstr ""
+msgstr "None"
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
-msgstr ""
+msgstr "Δεν υπάρχουν αντικείμενα προς επιλογή."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
-msgstr ""
+msgstr "Το πεδίο πρέπει να είναι μοναδικό"
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
-msgstr ""
+msgstr "Τα πεδία {field_names} πρέπει να αποτελούν ένα μοναδικό σύνολο."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
-msgstr ""
+msgstr "Το πεδίο πρέπει να είναι μοναδικό για την ημερομηνία \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
-msgstr ""
+msgstr "Το πεδίο πρέπει να είναι μοναδικό για το μήνα \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
-msgstr ""
+msgstr "Το πεδίο πρέπει να είναι μοναδικό για το έτος \"{date_field}\"."
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
-msgstr ""
+msgstr "Λάθος έκδοση στην επικεφαλίδα \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
+msgstr "Λάθος έκδοση στη διαδρομή URL."
+
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
-#: versioning.py:144
+#: versioning.py:147
msgid "Invalid version in hostname."
-msgstr ""
+msgstr "Λάθος έκδοση στο hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
-msgstr ""
+msgstr "Λάθος έκδοση στην παράμετρο"
#: views.py:88
msgid "Permission denied."
-msgstr ""
+msgstr "Απόρριψη πρόσβασης"
diff --git a/rest_framework/locale/el_GR/LC_MESSAGES/django.mo b/rest_framework/locale/el_GR/LC_MESSAGES/django.mo
index 67022a7f7..67018c3f9 100644
Binary files a/rest_framework/locale/el_GR/LC_MESSAGES/django.mo and b/rest_framework/locale/el_GR/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/el_GR/LC_MESSAGES/django.po b/rest_framework/locale/el_GR/LC_MESSAGES/django.po
index 645a1a8c6..051a88783 100644
--- a/rest_framework/locale/el_GR/LC_MESSAGES/django.po
+++ b/rest_framework/locale/el_GR/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Greek (Greece) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/el_GR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: el_GR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/en/LC_MESSAGES/django.mo b/rest_framework/locale/en/LC_MESSAGES/django.mo
index 06dc754a8..13760f707 100644
Binary files a/rest_framework/locale/en/LC_MESSAGES/django.mo and b/rest_framework/locale/en/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/en/LC_MESSAGES/django.po b/rest_framework/locale/en/LC_MESSAGES/django.po
index bd57a8b1f..ac7f4fa71 100644
--- a/rest_framework/locale/en/LC_MESSAGES/django.po
+++ b/rest_framework/locale/en/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: English (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Invalid basic header. No credentials provided."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Invalid basic header. Credentials string should not contain spaces."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Invalid basic header. Credentials not correctly base64 encoded."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Invalid username/password."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "User inactive or deleted."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Invalid token header. No credentials provided."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Invalid token header. Token string should not contain spaces."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Invalid token header. Token string should not contain invalid characters."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Invalid token."
@@ -58,23 +58,23 @@ msgstr "Invalid token."
msgid "Auth Token"
msgstr "Auth Token"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Key"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "User"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Created"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "Tokens"
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr "Not found."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Method \"{method}\" not allowed."
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Could not satisfy the request Accept header."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Unsupported media type \"{media_type}\" in request."
@@ -140,214 +138,201 @@ msgstr "Unsupported media type \"{media_type}\" in request."
msgid "Request was throttled."
msgstr "Request was throttled."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "This field is required."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "This field may not be null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" is not a valid boolean."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "This field may not be blank."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Ensure this field has no more than {max_length} characters."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Ensure this field has at least {min_length} characters."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Enter a valid email address."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "This value does not match the required pattern."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Enter a valid \"slug\" consisting of letters, numbers, underscores or hyphens."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Enter a valid URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" is not a valid UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Enter a valid IPv4 or IPv6 address."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "A valid integer is required."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Ensure this value is less than or equal to {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Ensure this value is greater than or equal to {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "String value too large."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "A valid number is required."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Ensure that there are no more than {max_digits} digits in total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Ensure that there are no more than {max_decimal_places} decimal places."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Ensure that there are no more than {max_whole_digits} digits before the decimal point."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime has wrong format. Use one of these formats instead: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Expected a datetime but got a date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Date has wrong format. Use one of these formats instead: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Expected a date but got a datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time has wrong format. Use one of these formats instead: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duration has wrong format. Use one of these formats instead: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" is not a valid choice."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "More than {count} items..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Expected a list of items but got type \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "This selection may not be empty."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" is not a valid path choice."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "No file was submitted."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "The submitted data was not a file. Check the encoding type on the form."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "No filename could be determined."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "The submitted file is empty."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Ensure this filename has at most {max_length} characters (it has {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "This list may not be empty."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Expected a dictionary of items but got type \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Value must be valid JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Submit"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr "ascending"
+
+#: filters.py:337
+msgid "descending"
+msgstr "descending"
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Invalid page."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Invalid cursor"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Invalid pk \"{pk_value}\" - object does not exist."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Incorrect type. Expected pk value, received {data_type}."
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Invalid hyperlink - Object does not exist."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Incorrect type. Expected URL string, received {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Object with {slug_name}={value} does not exist."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Invalid value."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Invalid data. Expected a dictionary, but got {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filters"
@@ -412,27 +394,23 @@ msgstr "None"
msgid "No items to select."
msgstr "No items to select."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "This field must be unique."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "The fields {field_names} must make a unique set."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "This field must be unique for the \"{date_field}\" date."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "This field must be unique for the \"{date_field}\" month."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "This field must be unique for the \"{date_field}\" year."
@@ -440,15 +418,19 @@ msgstr "This field must be unique for the \"{date_field}\" year."
msgid "Invalid version in \"Accept\" header."
msgstr "Invalid version in \"Accept\" header."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Invalid version in URL path."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr "Invalid version in URL path. Does not match any version namespace."
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Invalid version in hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Invalid version in query parameter."
diff --git a/rest_framework/locale/en_AU/LC_MESSAGES/django.mo b/rest_framework/locale/en_AU/LC_MESSAGES/django.mo
index 288595123..d24f22cb4 100644
Binary files a/rest_framework/locale/en_AU/LC_MESSAGES/django.mo and b/rest_framework/locale/en_AU/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/en_AU/LC_MESSAGES/django.po b/rest_framework/locale/en_AU/LC_MESSAGES/django.po
index 9ee758d64..18c70fb96 100644
--- a/rest_framework/locale/en_AU/LC_MESSAGES/django.po
+++ b/rest_framework/locale/en_AU/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: English (Australia) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_AU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/en_CA/LC_MESSAGES/django.mo b/rest_framework/locale/en_CA/LC_MESSAGES/django.mo
index aee511aa1..ef1569c0b 100644
Binary files a/rest_framework/locale/en_CA/LC_MESSAGES/django.mo and b/rest_framework/locale/en_CA/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/en_CA/LC_MESSAGES/django.po b/rest_framework/locale/en_CA/LC_MESSAGES/django.po
index 2bb5b573b..144694345 100644
--- a/rest_framework/locale/en_CA/LC_MESSAGES/django.po
+++ b/rest_framework/locale/en_CA/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: English (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en_CA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: en_CA\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/en_US/LC_MESSAGES/django.mo b/rest_framework/locale/en_US/LC_MESSAGES/django.mo
index 1f28ebba0..3714ec8fa 100644
Binary files a/rest_framework/locale/en_US/LC_MESSAGES/django.mo and b/rest_framework/locale/en_US/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/en_US/LC_MESSAGES/django.po b/rest_framework/locale/en_US/LC_MESSAGES/django.po
index f88a3e567..3733a1e33 100644
--- a/rest_framework/locale/en_US/LC_MESSAGES/django.po
+++ b/rest_framework/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,40 +17,40 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,212 +138,199 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid "Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid "The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -362,25 +347,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -410,27 +392,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -438,15 +416,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/es/LC_MESSAGES/django.mo b/rest_framework/locale/es/LC_MESSAGES/django.mo
index fa87eb02f..1ddc885de 100644
Binary files a/rest_framework/locale/es/LC_MESSAGES/django.mo and b/rest_framework/locale/es/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/es/LC_MESSAGES/django.po b/rest_framework/locale/es/LC_MESSAGES/django.po
index f443b2e28..b8a89aeb6 100644
--- a/rest_framework/locale/es/LC_MESSAGES/django.po
+++ b/rest_framework/locale/es/LC_MESSAGES/django.po
@@ -3,18 +3,18 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# nnrcschmdt , 2015
+# Ernesto Rico-Schmidt , 2015
# José Padilla , 2015
-# Miguel González , 2015
-# Miguel González , 2015-2016
+# Miguel Gonzalez , 2015
+# Miguel Gonzalez , 2015-2016
# Sergio Infante , 2015
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 18:16+0000\n"
-"Last-Translator: Miguel González \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Spanish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,40 +22,40 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Cabecera básica inválida. Las credenciales no fueron suministradas."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Cabecera básica inválida. La cadena con las credenciales no debe contener espacios."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Cabecera básica inválida. Las credenciales incorrectamente codificadas en base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Nombre de usuario/contraseña inválidos."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Usuario inactivo o borrado."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Cabecera token inválida. Las credenciales no fueron suministradas."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Cabecera token inválida. La cadena token no debe contener espacios."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Cabecera token inválida. La cadena token no debe contener caracteres inválidos."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Token inválido."
@@ -63,23 +63,23 @@ msgstr "Token inválido."
msgid "Auth Token"
msgstr "Token de autenticación"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Clave"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "Usuario"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Fecha de creación"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "Tokens"
@@ -128,7 +128,6 @@ msgid "Not found."
msgstr "No encontrado."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Método \"{method}\" no permitido."
@@ -137,7 +136,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "No se ha podido satisfacer la solicitud de cabecera de Accept."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud."
@@ -145,214 +143,201 @@ msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud."
msgid "Request was throttled."
msgstr "Solicitud fue regulada (throttled)."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Este campo es requerido."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Este campo no puede ser nulo."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" no es un booleano válido."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Este campo no puede estar en blanco."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Asegúrese de que este campo no tenga más de {max_length} caracteres."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Asegúrese de que este campo tenga al menos {min_length} caracteres."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Introduzca una dirección de correo electrónico válida."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Este valor no coincide con el patrón requerido."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Introduzca un \"slug\" válido consistente en letras, números, guiones o guiones bajos."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Introduzca una URL válida."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" no es un UUID válido."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Introduzca una dirección IPv4 o IPv6 válida."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Introduzca un número entero válido."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Asegúrese de que este valor es menor o igual a {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Asegúrese de que este valor es mayor o igual a {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Cadena demasiado larga."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Se requiere un número válido."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Asegúrese de que no haya más de {max_digits} dígitos en total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Asegúrese de que no haya más de {max_decimal_places} decimales."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Asegúrese de que no haya más de {max_whole_digits} dígitos en la parte entera."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Fecha/hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Se esperaba un fecha/hora en vez de una fecha."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Se esperaba una fecha en vez de una fecha/hora."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Hora con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duración con formato erróneo. Use uno de los siguientes formatos en su lugar: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" no es una elección válida."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Más de {count} elementos..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Se esperaba una lista de elementos en vez del tipo \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Esta selección no puede estar vacía."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" no es una elección de ruta válida."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "No se envió ningún archivo."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "La información enviada no era un archivo. Compruebe el tipo de codificación del formulario."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "No se pudo determinar un nombre de archivo."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "El archivo enviado está vació."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Asegúrese de que el nombre de archivo no tenga más de {max_length} caracteres (tiene {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Adjunte una imagen válida. El archivo adjunto o bien no es una imagen o bien está dañado."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Esta lista no puede estar vacía."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Se esperaba un diccionario de elementos en vez del tipo \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "El valor debe ser JSON válido."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Enviar"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Página inválida."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Cursor inválido"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Clave primaria \"{pk_value}\" inválida - objeto no existe."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipo incorrecto. Se esperaba valor de clave primaria y se recibió {data_type}."
@@ -369,25 +354,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Hiperenlace inválido - Objeto no existe."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipo incorrecto. Se esperaba una URL y se recibió {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objeto con {slug_name}={value} no existe."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valor inválido."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Datos inválidos. Se esperaba un diccionario pero es un {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtros"
@@ -417,27 +399,23 @@ msgstr "Ninguno"
msgid "No items to select."
msgstr "No hay elementos para seleccionar."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Este campo debe ser único."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Los campos {field_names} deben formar un conjunto único."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Este campo debe ser único para el día \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Este campo debe ser único para el mes \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Este campo debe ser único para el año \"{date_field}\"."
@@ -445,15 +423,19 @@ msgstr "Este campo debe ser único para el año \"{date_field}\"."
msgid "Invalid version in \"Accept\" header."
msgstr "Versión inválida en la cabecera \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Versión inválida en la ruta de la URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Versión inválida en el nombre de host."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Versión inválida en el parámetro de consulta."
diff --git a/rest_framework/locale/et/LC_MESSAGES/django.mo b/rest_framework/locale/et/LC_MESSAGES/django.mo
index ee9c40c2b..8bed39930 100644
Binary files a/rest_framework/locale/et/LC_MESSAGES/django.mo and b/rest_framework/locale/et/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/et/LC_MESSAGES/django.po b/rest_framework/locale/et/LC_MESSAGES/django.po
index 5ccd9226c..c9701cca7 100644
--- a/rest_framework/locale/et/LC_MESSAGES/django.po
+++ b/rest_framework/locale/et/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Estonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/et/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Sobimatu lihtpäis. Kasutajatunnus on esitamata."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Sobimatu lihtpäis. Kasutajatunnus ei tohi sisaldada tühikuid."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Sobimatu lihtpäis. Kasutajatunnus pole korrektselt base64-kodeeritud."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Sobimatu kasutajatunnus/salasõna."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Kasutaja on inaktiivne või kustutatud."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Sobimatu lubakaardi päis. Kasutajatunnus on esitamata."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Sobimatu lubakaardi päis. Loa sõne ei tohi sisaldada tühikuid."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Sobimatu lubakaart."
@@ -59,23 +59,23 @@ msgstr "Sobimatu lubakaart."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Ei leidnud."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Meetod \"{method}\" pole lubatud."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Päringu Accept-päist ei suutnud täita."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Meedia tüüpi {media_type} päringus ei toetata."
@@ -141,214 +139,201 @@ msgstr "Meedia tüüpi {media_type} päringus ei toetata."
msgid "Request was throttled."
msgstr "Liiga palju päringuid."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Väli on kohustuslik."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Väli ei tohi olla tühi."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" pole kehtiv kahendarv."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "See väli ei tohi olla tühi."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Veendu, et see väli poleks pikem kui {max_length} tähemärki."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Veendu, et see väli oleks vähemalt {min_length} tähemärki pikk."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Sisestage kehtiv e-posti aadress."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Väärtus ei ühti etteantud mustriga."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Sisestage kehtiv \"slug\", mis koosneks tähtedest, numbritest, ala- või sidekriipsudest."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Sisestage korrektne URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" pole kehtiv UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Sisendiks peab olema täisarv."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Veenduge, et väärtus on väiksem kui või võrdne väärtusega {max_value}. "
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Veenduge, et väärtus on suurem kui või võrdne väärtusega {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Sõne on liiga pikk."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Sisendiks peab olema arv."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Veenduge, et kokku pole rohkem kui {max_digits} numbit."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Veenduge, et komakohti pole rohkem kui {max_decimal_places}. "
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Veenduge, et täiskohti poleks rohkem kui {max_whole_digits}."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kuupäev-kellaaeg. Kasutage mõnda neist: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Ootasin kuupäev-kellaaeg andmetüüpi, kuid sain hoopis kuupäeva."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kuupäev. Kasutage mõnda neist: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Ootasin kuupäeva andmetüüpi, kuid sain hoopis kuupäev-kellaaja."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Valesti formaaditud kellaaeg. Kasutage mõnda neist: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" on sobimatu valik."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Ootasin kirjete järjendit, kuid sain \"{input_type}\" - tüübi."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Ühtegi faili ei esitatud."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Esitatud andmetes ei olnud faili. Kontrollige vormi kodeeringut."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Ei suutnud tuvastada failinime."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Esitatud fail oli tühi."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Veenduge, et failinimi oleks maksimaalselt {max_length} tähemärki pikk (praegu on {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Laadige üles kehtiv pildifail. Üles laetud fail ei olnud pilt või oli see katki."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Ootasin kirjete sõnastikku, kuid sain \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Sobimatu kursor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Sobimatu primaarvõti \"{pk_value}\" - objekti pole olemas."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Sobimatu andmetüüp. Ootasin primaarvõtit, sain {data_type}."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Sobimatu hüperlink - objekti ei eksisteeri."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Sobimatu andmetüüp. Ootasin URLi sõne, sain {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekti {slug_name}={value} ei eksisteeri."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Sobimatu väärtus."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Sobimatud andmed. Ootasin sõnastikku, kuid sain {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Selle välja väärtus peab olema unikaalne."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Veerud {field_names} peavad moodustama unikaalse hulga."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Selle välja väärtus peab olema unikaalne veerus \"{date_field}\" märgitud kuupäeval."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud kuul."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märgitud aastal."
@@ -441,15 +419,19 @@ msgstr "Selle välja väärtus peab olema unikaalneveerus \"{date_field}\" märg
msgid "Invalid version in \"Accept\" header."
msgstr "Sobimatu versioon \"Accept\" päises."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Sobimatu versioon URLi rajas."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Sobimatu versioon hostinimes."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Sobimatu versioon päringu parameetris."
diff --git a/rest_framework/locale/fa/LC_MESSAGES/django.mo b/rest_framework/locale/fa/LC_MESSAGES/django.mo
index 4b0b24bc2..0f9b58f3f 100644
Binary files a/rest_framework/locale/fa/LC_MESSAGES/django.mo and b/rest_framework/locale/fa/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/fa/LC_MESSAGES/django.po b/rest_framework/locale/fa/LC_MESSAGES/django.po
index 986c56594..0aa9ae4c6 100644
--- a/rest_framework/locale/fa/LC_MESSAGES/django.po
+++ b/rest_framework/locale/fa/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Persian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo b/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo
index 05d849e08..9a02cb05e 100644
Binary files a/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo and b/rest_framework/locale/fa_IR/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/fa_IR/LC_MESSAGES/django.po b/rest_framework/locale/fa_IR/LC_MESSAGES/django.po
index 94388647f..75b6fd156 100644
--- a/rest_framework/locale/fa_IR/LC_MESSAGES/django.po
+++ b/rest_framework/locale/fa_IR/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Persian (Iran) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fa_IR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: fa_IR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.mo b/rest_framework/locale/fi/LC_MESSAGES/django.mo
index cd904e35c..cb13cdaae 100644
Binary files a/rest_framework/locale/fi/LC_MESSAGES/django.mo and b/rest_framework/locale/fi/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.po b/rest_framework/locale/fi/LC_MESSAGES/django.po
index 39315af6b..bf1dd8c10 100644
--- a/rest_framework/locale/fi/LC_MESSAGES/django.po
+++ b/rest_framework/locale/fi/LC_MESSAGES/django.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Finnish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,40 +19,40 @@ msgstr ""
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Epäkelpo perusotsake. Ei annettuja tunnuksia."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Epäkelpo perusotsake. Tunnusmerkkijono ei saa sisältää välilyöntejä."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Epäkelpo perusotsake. Tunnukset eivät ole base64-koodattu."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Epäkelpo käyttäjänimi tai salasana."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Käyttäjä ei-aktiivinen tai poistettu."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Epäkelpo Token-otsake. Ei annettuja tunnuksia."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää välilyöntejä."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Epäkelpo Token-otsake. Tunnusmerkkijono ei saa sisältää epäkelpoja merkkejä."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Epäkelpo Token."
@@ -60,23 +60,23 @@ msgstr "Epäkelpo Token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Ei löydy."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metodi \"{method}\" ei ole sallittu."
@@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Ei voitu vastata pyynnön Accept-otsakkeen mukaisesti."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta."
@@ -142,214 +140,201 @@ msgstr "Pyynnön mediatyyppiä \"{media_type}\" ei tueta."
msgid "Request was throttled."
msgstr "Pyyntö hidastettu."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Tämä kenttä vaaditaan."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Tämän kentän arvo ei voi olla \"null\"."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" ei ole kelvollinen totuusarvo."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Tämä kenttä ei voi olla tyhjä."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Arvo saa olla enintään {max_length} merkkiä pitkä."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Arvo tulee olla vähintään {min_length} merkkiä pitkä."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Syötä kelvollinen sähköpostiosoite."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Arvo ei täsmää vaadittuun kuvioon."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja tavuviivoja (_ -)."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Syötä oikea URL-osoite."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "{value} ei ole kelvollinen UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Syötä kelvollinen kokonaisluku."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Tämän arvon on oltava enintään {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Tämän luvun on oltava vähintään {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Liian suuri merkkijonoarvo."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Kelvollinen luku vaaditaan."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Tässä luvussa voi olla yhteensä enintään {max_digits} numeroa."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Tässä luvussa saa olla enintään {max_decimal_places} desimaalia."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Tässä luvussa saa olla enintään {max_whole_digits} numeroa ennen desimaalipilkkua."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen päivämäärän/ajan muotoilu. Käytä jotain näistä muodoista: {format}"
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Odotettiin päivämäärää ja aikaa, saatiin vain päivämäärä."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen päivämäärän muotoilu. Käytä jotain näistä muodoista: {format}"
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Odotettiin päivämäärää, saatiin päivämäärä ja aika."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen kellonajan muotoilu. Käytä jotain näistä muodoista: {format}"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Virheellinen keston muotoilu. Käytä jotain näistä muodoista: {format}"
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" ei ole kelvollinen valinta."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Enemmän kuin {count} kappaletta..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Odotettiin listaa, saatiin tyyppi {input_type}."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Valinta ei saa olla tyhjä."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" ei ole kelvollinen polku."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Yhtään tiedostoa ei ole lähetetty."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Tiedostonimeä ei voitu päätellä."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Lähetetty tiedosto on tyhjä."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Varmista että tiedostonimi on enintään {max_length} merkkiä pitkä (nyt {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Lista ei saa olla tyhjä."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Odotettiin sanakirjaa, saatiin tyyppi {input_type}."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Arvon pitää olla kelvollista JSONia."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Lähetä"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Epäkelpo kursori"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Epäkelpo pääavain {pk_value} - objektia ei ole olemassa."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Väärä tyyppi. Odotettiin pääavainarvoa, saatiin {data_type}."
@@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Epäkelpo linkki - objektia ei ole."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Epäkelpo tyyppi. Odotettiin URL-merkkijonoa, saatiin {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objektia ({slug_name}={value}) ei ole."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Epäkelpo arvo."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Odotettiin sanakirjaa, saatiin tyyppi {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Suotimet"
@@ -414,27 +396,23 @@ msgstr "Ei mitään"
msgid "No items to select."
msgstr "Ei valittavia kohteita."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Arvon tulee olla uniikki."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Kenttien {field_names} tulee muodostaa uniikki joukko."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Kentän tulee olla uniikki päivämäärän {date_field} suhteen."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Kentän tulee olla uniikki kuukauden {date_field} suhteen."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen."
@@ -442,15 +420,19 @@ msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen."
msgid "Invalid version in \"Accept\" header."
msgstr "Epäkelpo versio Accept-otsakkeessa."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Epäkelpo versio URL-polussa."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Epäkelpo versio palvelinosoitteessa."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Epäkelpo versio kyselyparametrissa."
diff --git a/rest_framework/locale/fr/LC_MESSAGES/django.mo b/rest_framework/locale/fr/LC_MESSAGES/django.mo
index 531cc46b5..2bc60c63a 100644
Binary files a/rest_framework/locale/fr/LC_MESSAGES/django.mo and b/rest_framework/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/fr/LC_MESSAGES/django.po b/rest_framework/locale/fr/LC_MESSAGES/django.po
index 3824b1a2e..284999a8b 100644
--- a/rest_framework/locale/fr/LC_MESSAGES/django.po
+++ b/rest_framework/locale/fr/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:40+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: French (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,40 +21,40 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "En-tête « basic » non valide. Informations d'identification non fournies."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "En-tête « basic » non valide. Les informations d'identification ne doivent pas contenir d'espaces."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "En-tête « basic » non valide. Encodage base64 des informations d'identification incorrect."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Nom d'utilisateur et/ou mot de passe non valide(s)."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Utilisateur inactif ou supprimé."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "En-tête « token » non valide. Informations d'identification non fournies."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "En-tête « token » non valide. Un token ne doit pas contenir d'espaces."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "En-tête « token » non valide. Un token ne doit pas contenir de caractères invalides."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Token non valide."
@@ -62,23 +62,23 @@ msgstr "Token non valide."
msgid "Auth Token"
msgstr "Jeton d'authentification"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Clef"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "Utilisateur"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Création"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "Jeton"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "Jetons"
@@ -127,7 +127,6 @@ msgid "Not found."
msgstr "Pas trouvé."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Méthode \"{method}\" non autorisée."
@@ -136,7 +135,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "L'en-tête « Accept » n'a pas pu être satisfaite."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Type de média \"{media_type}\" non supporté."
@@ -144,214 +142,201 @@ msgstr "Type de média \"{media_type}\" non supporté."
msgid "Request was throttled."
msgstr "Requête ralentie."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Ce champ est obligatoire."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Ce champ ne peut être nul."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" n'est pas un booléen valide."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Ce champ ne peut être vide."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Assurez-vous que ce champ comporte au plus {max_length} caractères."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Assurez-vous que ce champ comporte au moins {min_length} caractères."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Saisissez une adresse email valable."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Cette valeur ne satisfait pas le motif imposé."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et des traits d'union."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Saisissez une URL valide."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" n'est pas un UUID valide."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Saisissez une adresse IPv4 ou IPv6 valide."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Un nombre entier valide est requis."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Assurez-vous que cette valeur est inférieure ou égale à {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Assurez-vous que cette valeur est supérieure ou égale à {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Chaîne de caractères trop longue."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Un nombre valide est requis."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_digits} chiffres au total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_decimal_places} chiffres après la virgule."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Assurez-vous qu'il n'y a pas plus de {max_whole_digits} chiffres avant la virgule."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "La date + heure n'a pas le bon format. Utilisez un des formats suivants : {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Attendait une date + heure mais a reçu une date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "La date n'a pas le bon format. Utilisez un des formats suivants : {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Attendait une date mais a reçu une date + heure."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "L'heure n'a pas le bon format. Utilisez un des formats suivants : {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "La durée n'a pas le bon format. Utilisez l'un des formats suivants: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" n'est pas un choix valide."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Plus de {count} éléments..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Attendait une liste d'éléments mais a reçu \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Cette sélection ne peut être vide."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" n'est pas un choix de chemin valide."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Aucun fichier n'a été soumis."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "La donnée soumise n'est pas un fichier. Vérifiez le type d'encodage du formulaire."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Le nom de fichier n'a pu être déterminé."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Le fichier soumis est vide."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Assurez-vous que le nom de fichier comporte au plus {max_length} caractères (il en comporte {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Transférez une image valide. Le fichier que vous avez transféré n'est pas une image, ou il est corrompu."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Cette liste ne peut pas être vide."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Attendait un dictionnaire d'éléments mais a reçu \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "La valeur doit être un JSON valide."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Envoyer"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Page invalide."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Curseur non valide"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Clé primaire \"{pk_value}\" non valide - l'objet n'existe pas."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Type incorrect. Attendait une clé primaire, a reçu {data_type}."
@@ -368,25 +353,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Lien non valide : l'objet n'existe pas."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Type incorrect. Attendait une URL, a reçu {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "L'object avec {slug_name}={value} n'existe pas."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valeur non valide."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Donnée non valide. Attendait un dictionnaire, a reçu {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtres"
@@ -416,27 +398,23 @@ msgstr "Aucune"
msgid "No items to select."
msgstr "Aucun élément à sélectionner."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Ce champ doit être unique."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Les champs {field_names} doivent former un ensemble unique."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Ce champ doit être unique pour la date \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Ce champ doit être unique pour le mois \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Ce champ doit être unique pour l'année \"{date_field}\"."
@@ -444,15 +422,19 @@ msgstr "Ce champ doit être unique pour l'année \"{date_field}\"."
msgid "Invalid version in \"Accept\" header."
msgstr "Version non valide dans l'en-tête « Accept »."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Version non valide dans l'URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Version non valide dans le nom d'hôte."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Version non valide dans le paramètre de requête."
diff --git a/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo b/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo
index cd0a91340..1771787f8 100644
Binary files a/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo and b/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/fr_CA/LC_MESSAGES/django.po b/rest_framework/locale/fr_CA/LC_MESSAGES/django.po
index f26ed453b..84cbdf4cc 100644
--- a/rest_framework/locale/fr_CA/LC_MESSAGES/django.po
+++ b/rest_framework/locale/fr_CA/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: French (Canada) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr_CA/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: fr_CA\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/gl/LC_MESSAGES/django.mo b/rest_framework/locale/gl/LC_MESSAGES/django.mo
index 761037249..030e25f94 100644
Binary files a/rest_framework/locale/gl/LC_MESSAGES/django.mo and b/rest_framework/locale/gl/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/gl/LC_MESSAGES/django.po b/rest_framework/locale/gl/LC_MESSAGES/django.po
index ba0b788fc..5ec55729e 100644
--- a/rest_framework/locale/gl/LC_MESSAGES/django.po
+++ b/rest_framework/locale/gl/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Galician (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/gl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: gl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo b/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo
index 281b6e66b..90c4212ba 100644
Binary files a/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo and b/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/gl_ES/LC_MESSAGES/django.po b/rest_framework/locale/gl_ES/LC_MESSAGES/django.po
index 07ee4061f..870c0916f 100644
--- a/rest_framework/locale/gl_ES/LC_MESSAGES/django.po
+++ b/rest_framework/locale/gl_ES/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Galician (Spain) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/gl_ES/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: gl_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -59,23 +59,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -141,214 +139,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valor non válido."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr "Ningún"
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -441,15 +419,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/he_IL/LC_MESSAGES/django.mo b/rest_framework/locale/he_IL/LC_MESSAGES/django.mo
index feef64e1b..55ffe5403 100644
Binary files a/rest_framework/locale/he_IL/LC_MESSAGES/django.mo and b/rest_framework/locale/he_IL/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/he_IL/LC_MESSAGES/django.po b/rest_framework/locale/he_IL/LC_MESSAGES/django.po
index cee35fedc..686ae6fa7 100644
--- a/rest_framework/locale/he_IL/LC_MESSAGES/django.po
+++ b/rest_framework/locale/he_IL/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Hebrew (Israel) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/he_IL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: he_IL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/hu/LC_MESSAGES/django.mo b/rest_framework/locale/hu/LC_MESSAGES/django.mo
index 9053ad62f..cb27fb740 100644
Binary files a/rest_framework/locale/hu/LC_MESSAGES/django.mo and b/rest_framework/locale/hu/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/hu/LC_MESSAGES/django.po b/rest_framework/locale/hu/LC_MESSAGES/django.po
index 669a7bffa..7f3081fff 100644
--- a/rest_framework/locale/hu/LC_MESSAGES/django.po
+++ b/rest_framework/locale/hu/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Hungarian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Érvénytelen basic fejlécmező. Nem voltak megadva azonosítók."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Érvénytelen basic fejlécmező. Az azonosító karakterlánc nem tartalmazhat szóközöket."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Érvénytelen basic fejlécmező. Az azonosítók base64 kódolása nem megfelelő."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Érvénytelen felhasználónév/jelszó."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "A felhasználó nincs aktiválva vagy törölve lett."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Érvénytelen token fejlécmező. Nem voltak megadva azonosítók."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Érvénytelen token fejlécmező. A token karakterlánc nem tartalmazhat szóközöket."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Érvénytelen token."
@@ -59,23 +59,23 @@ msgstr "Érvénytelen token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Nem található."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "A \"{method}\" metódus nem megengedett."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "A kérés Accept fejlécmezőjét nem lehetett kiszolgálni."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Nem támogatott média típus \"{media_type}\" a kérésben."
@@ -141,214 +139,201 @@ msgstr "Nem támogatott média típus \"{media_type}\" a kérésben."
msgid "Request was throttled."
msgstr "A kérés korlátozva lett."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Ennek a mezőnek a megadása kötelező."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Ez a mező nem lehet null értékű."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "Az \"{input}\" nem egy érvényes logikai érték."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Ez a mező nem lehet üres."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Bizonyosodjon meg arról, hogy ez a mező legfeljebb {max_length} karakterből áll."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Bizonyosodjon meg arról, hogy ez a mező legalább {min_length} karakterből áll."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Adjon meg egy érvényes e-mail címet!"
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Ez az érték nem illeszkedik a szükséges mintázatra."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Az URL barát cím csak betűket, számokat, aláhúzásokat és kötőjeleket tartalmazhat."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Adjon meg egy érvényes URL-t!"
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Egy érvényes egész szám megadása szükséges."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Bizonyosodjon meg arról, hogy ez az érték legfeljebb {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Bizonyosodjon meg arról, hogy ez az érték legalább {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "A karakterlánc túl hosszú."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Egy érvényes szám megadása szükséges."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Bizonyosodjon meg arról, hogy a számjegyek száma összesen legfeljebb {max_digits}."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Bizonyosodjon meg arról, hogy a tizedes tört törtrészében levő számjegyek száma összesen legfeljebb {max_decimal_places}."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Bizonyosodjon meg arról, hogy a tizedes tört egész részében levő számjegyek száma összesen legfeljebb {max_whole_digits}."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "A dátum formátuma hibás. Használja ezek valamelyikét helyette: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Időt is tartalmazó dátum helyett egy időt nem tartalmazó dátum lett elküldve."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "A dátum formátuma hibás. Használja ezek valamelyikét helyette: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Időt nem tartalmazó dátum helyett egy időt is tartalmazó dátum lett elküldve."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Az idő formátuma hibás. Használja ezek valamelyikét helyette: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "Az \"{input}\" nem egy érvényes elem."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Elemek listája helyett \"{input_type}\" lett elküldve."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Semmilyen fájl sem került feltöltésre."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Az elküldött adat nem egy fájl volt. Ellenőrizze a kódolás típusát az űrlapon!"
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "A fájlnév nem megállapítható."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "A küldött fájl üres."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Bizonyosodjon meg arról, hogy a fájlnév legfeljebb {max_length} karakterből áll (jelenlegi hossza: {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Töltsön fel egy érvényes képfájlt! A feltöltött fájl nem kép volt, vagy megsérült."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Érvénytelen pk \"{pk_value}\" - az objektum nem létezik."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Helytelen típus. pk érték helyett {data_type} lett elküldve."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Érvénytelen link - Az objektum nem létezik."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Helytelen típus. URL karakterlánc helyett {data_type} lett elküldve."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Nem létezik olyan objektum, amelynél {slug_name}={value}."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Érvénytelen érték."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Érvénytelen adat. Egy dictionary helyett {datatype} lett elküldve."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Ennek a mezőnek egyedinek kell lennie."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "A {field_names} mezőnevek nem tartalmazhatnak duplikátumot."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" dátumra."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" hónapra."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" évre."
@@ -441,15 +419,19 @@ msgstr "A mezőnek egyedinek kell lennie a \"{date_field}\" évre."
msgid "Invalid version in \"Accept\" header."
msgstr "Érvénytelen verzió az \"Accept\" fejlécmezőben."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Érvénytelen verzió az URL elérési útban."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Érvénytelen verzió a hosztnévben."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Érvénytelen verzió a lekérdezési paraméterben."
diff --git a/rest_framework/locale/id/LC_MESSAGES/django.mo b/rest_framework/locale/id/LC_MESSAGES/django.mo
index 350d64a3b..beb9643b0 100644
Binary files a/rest_framework/locale/id/LC_MESSAGES/django.mo and b/rest_framework/locale/id/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/id/LC_MESSAGES/django.po b/rest_framework/locale/id/LC_MESSAGES/django.po
index 1137755c8..c84add0a4 100644
--- a/rest_framework/locale/id/LC_MESSAGES/django.po
+++ b/rest_framework/locale/id/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Indonesian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/it/LC_MESSAGES/django.mo b/rest_framework/locale/it/LC_MESSAGES/django.mo
index 8af8bc746..5d52d3dcf 100644
Binary files a/rest_framework/locale/it/LC_MESSAGES/django.mo and b/rest_framework/locale/it/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/it/LC_MESSAGES/django.po b/rest_framework/locale/it/LC_MESSAGES/django.po
index 24101d88e..6a48c53a7 100644
--- a/rest_framework/locale/it/LC_MESSAGES/django.po
+++ b/rest_framework/locale/it/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Italian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,40 +21,40 @@ msgstr ""
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Header di base invalido. Credenziali non fornite."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Header di base invalido. Le credenziali non dovrebbero contenere spazi."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Credenziali non correttamente codificate in base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Nome utente/password non validi"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Utente inattivo o eliminato."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Header del token non valido. Credenziali non fornite."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Header del token non valido. Il contenuto del token non dovrebbe contenere spazi."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Header del token invalido. La stringa del token non dovrebbe contenere caratteri illegali."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Token invalido."
@@ -62,23 +62,23 @@ msgstr "Token invalido."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -127,7 +127,6 @@ msgid "Not found."
msgstr "Non trovato."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metodo \"{method}\" non consentito"
@@ -136,7 +135,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Impossibile soddisfare l'header \"Accept\" presente nella richiesta."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Tipo di media \"{media_type}\"non supportato."
@@ -144,214 +142,201 @@ msgstr "Tipo di media \"{media_type}\"non supportato."
msgid "Request was throttled."
msgstr "La richiesta è stata limitata (throttled)."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Campo obbligatorio."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Il campo non può essere nullo."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" non è un valido valore booleano."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Questo campo non può essere omesso."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Assicurati che questo campo non abbia più di {max_length} caratteri."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Assicurati che questo campo abbia almeno {min_length} caratteri."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Inserisci un indirizzo email valido."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Questo valore non corrisponde alla sequenza richiesta."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Immetti uno \"slug\" valido che consista di lettere, numeri, underscore o trattini."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Inserisci un URL valido"
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" non è un UUID valido."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Inserisci un indirizzo IPv4 o IPv6 valido."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "È richiesto un numero intero valido."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Assicurati che il valore sia minore o uguale a {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Assicurati che il valore sia maggiore o uguale a {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Stringa troppo lunga."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "È richiesto un numero valido."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Assicurati che non ci siano più di {max_digits} cifre in totale."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Assicurati che non ci siano più di {max_decimal_places} cifre decimali."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Assicurati che non ci siano più di {max_whole_digits} cifre prima del separatore decimale."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "L'oggetto di tipo datetime è in un formato errato. Usa uno dei seguenti formati: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Atteso un oggetto di tipo datetime ma l'oggetto ricevuto è di tipo date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "La data è in un formato errato. Usa uno dei seguenti formati: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Atteso un oggetto di tipo date ma l'oggetto ricevuto è di tipo datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "L'orario ha un formato errato. Usa uno dei seguenti formati: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "La durata è in un formato errato. Usa uno dei seguenti formati: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" non è una scelta valida."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Più di {count} oggetti..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Attesa una lista di oggetti ma l'oggetto ricevuto è di tipo \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Questa selezione potrebbe non essere vuota."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" non è un percorso valido."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Non è stato inviato alcun file."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "I dati inviati non corrispondono ad un file. Si prega di controllare il tipo di codifica nel form."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Il nome del file non può essere determinato."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Il file inviato è vuoto."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Assicurati che il nome del file abbia, al più, {max_length} caratteri (attualmente ne ha {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Invia un'immagine valida. Il file che hai inviato non era un'immagine o era corrotto."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Questa lista potrebbe non essere vuota."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Era atteso un dizionario di oggetti ma il dato ricevuto è di tipo \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Il valore deve essere un JSON valido."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Invia"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Cursore non valido"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Pk \"{pk_value}\" non valido - l'oggetto non esiste."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipo non corretto. Era atteso un valore pk, ma è stato ricevuto {data_type}."
@@ -368,25 +353,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Collegamento non valido - L'oggetto non esiste."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipo non corretto. Era attesa una stringa URL, ma è stato ricevuto {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "L'oggetto con {slug_name}={value} non esiste."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valore non valido."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Dati non validi. Era atteso un dizionario, ma si è ricevuto {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtri"
@@ -416,27 +398,23 @@ msgstr "Nessuno"
msgid "No items to select."
msgstr "Nessun elemento da selezionare."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Questo campo deve essere unico."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "I campi {field_names} devono costituire un insieme unico."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Questo campo deve essere unico per la data \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Questo campo deve essere unico per il mese \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Questo campo deve essere unico per l'anno \"{date_field}\"."
@@ -444,15 +422,19 @@ msgstr "Questo campo deve essere unico per l'anno \"{date_field}\"."
msgid "Invalid version in \"Accept\" header."
msgstr "Versione non valida nell'header \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Versione non valida nella sequenza URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Versione non valida nel nome dell'host."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Versione non valida nel parametro della query."
diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.mo b/rest_framework/locale/ja/LC_MESSAGES/django.mo
index 048da56fd..1f934cc37 100644
Binary files a/rest_framework/locale/ja/LC_MESSAGES/django.mo and b/rest_framework/locale/ja/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.po b/rest_framework/locale/ja/LC_MESSAGES/django.po
index 85c2fa5ae..d2881dec9 100644
--- a/rest_framework/locale/ja/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ja/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Japanese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "不正な基本ヘッダです。認証情報が含まれていません。"
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "不正な基本ヘッダです。認証情報文字列に空白を含めてはいけません。"
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "不正な基本ヘッダです。認証情報がBASE64で正しくエンコードされていません。"
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "ユーザ名かパスワードが違います。"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "ユーザが無効か削除されています。"
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "不正なトークンヘッダです。認証情報が含まれていません。"
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "不正なトークンヘッダです。トークン文字列に空白を含めてはいけません。"
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "不正なトークンヘッダです。トークン文字列に不正な文字を含めてはいけません。"
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "不正なトークンです。"
@@ -59,23 +59,23 @@ msgstr "不正なトークンです。"
msgid "Auth Token"
msgstr "認証トークン"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "キー"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "ユーザ"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "作成された"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "トークン"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "トークン"
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "見つかりませんでした。"
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "メソッド \"{method}\" は許されていません。"
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "リクエストのAcceptヘッダを満たすことができませんでした。"
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "リクエストのメディアタイプ \"{media_type}\" はサポートされていません。"
@@ -141,214 +139,201 @@ msgstr "リクエストのメディアタイプ \"{media_type}\" はサポート
msgid "Request was throttled."
msgstr "リクエストの処理は絞られました。"
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "この項目は必須です。"
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "この項目はnullにできません。"
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" は有効なブーリアンではありません。"
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "この項目は空にできません。"
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "この項目が{max_length}文字より長くならないようにしてください。"
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "この項目は少なくとも{min_length}文字以上にしてください。"
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "有効なメールアドレスを入力してください。"
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "この値は所要のパターンにマッチしません。"
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "文字、数字、アンダースコア、またはハイフンから成る有効な \"slug\" を入力してください。"
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "有効なURLを入力してください。"
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" は有効なUUIDではありません。"
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "有効なIPv4またはIPv6アドレスを入力してください。"
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "有効な整数を入力してください。"
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "この値は{max_value}以下にしてください。"
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "この値は{min_value}以上にしてください。"
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "文字列が長過ぎます。"
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "有効な数値を入力してください。"
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "合計で最大{max_digits}桁以下になるようにしてください。"
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "小数点以下の桁数を{max_decimal_places}を超えないようにしてください。"
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "整数部の桁数を{max_whole_digits}を超えないようにしてください。"
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "日時の形式が違います。以下のどれかの形式にしてください: {format}。"
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "日付ではなく日時を入力してください。"
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "日付の形式が違います。以下のどれかの形式にしてください: {format}。"
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "日時ではなく日付を入力してください。"
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "時刻の形式が違います。以下のどれかの形式にしてください: {format}。"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "機関の形式が違います。以下のどれかの形式にしてください: {format}。"
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\"は有効な選択肢ではありません。"
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr " {count} 個より多い..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "\"{input_type}\" 型のデータではなく項目のリストを入力してください。"
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "空でない項目を選択してください。"
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\"は有効なパスの選択肢ではありません。"
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "ファイルが添付されていません。"
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "添付されたデータはファイルではありません。フォームのエンコーディングタイプを確認してください。"
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "ファイル名が取得できませんでした。"
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "添付ファイルの中身が空でした。"
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "ファイル名は最大{max_length}文字にしてください({length}文字でした)。"
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "有効な画像をアップロードしてください。アップロードされたファイルは画像でないか壊れた画像です。"
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "リストは空ではいけません。"
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "\"{input_type}\" 型のデータではなく項目の辞書を入力してください。"
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "値は有効なJSONでなければなりません。"
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "提出"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "カーソルが不正です。"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "主キー \"{pk_value}\" は不正です - データが存在しません。"
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "不正な型です。{data_type} 型ではなく主キーの値を入力してください。"
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "ハイパーリンクが不正です - リンク先が存在しません。"
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "不正なデータ型です。{data_type} 型ではなくURL文字列を入力してください。"
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "{slug_name}={value} のデータが存在しません。"
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "不正な値です。"
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "不正なデータです。{datatype} 型ではなく辞書を入力してください。"
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "フィルタ"
@@ -413,27 +395,23 @@ msgstr "なし"
msgid "No items to select."
msgstr "選択する項目がありません。"
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "この項目は一意でなければなりません。"
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "項目 {field_names} は一意な組でなければなりません。"
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "この項目は \"{date_field}\" の日に対して一意でなければなりません。"
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "この項目は \"{date_field}\" の月に対して一意でなければなりません。"
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "この項目は \"{date_field}\" の年に対して一意でなければなりません。"
@@ -441,15 +419,19 @@ msgstr "この項目は \"{date_field}\" の年に対して一意でなければ
msgid "Invalid version in \"Accept\" header."
msgstr "\"Accept\" 内のバージョンが不正です。"
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URLパス内のバージョンが不正です。"
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "ホスト名内のバージョンが不正です。"
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "クエリパラメータ内のバージョンが不正です。"
diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo b/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo
index ac88a062d..6410f0b1c 100644
Binary files a/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo and b/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po
index f0d56067f..4ca53b3c3 100644
--- a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Korean (Korea) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: ko_KR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials)가 제공되지 않았습니다."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials) 문자열은 빈칸(spaces)을 포함하지 않아야 합니다."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이터(credentials)가 base64로 적절히 부호화(encode)되지 않았습니다."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "아이디/비밀번호가 유효하지 않습니다."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "계정이 중지되었거나 삭제되었습니다."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "토큰 헤더가 유효하지 않습니다. 인증데이터(credentials)가 제공되지 않았습니다."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 빈칸(spaces)를 포함하지 않아야 합니다."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 유효하지 않은 문자를 포함하지 않아야 합니다."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "토큰이 유효하지 않습니다."
@@ -59,23 +59,23 @@ msgstr "토큰이 유효하지 않습니다."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "찾을 수 없습니다."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "메소드(Method) \"{method}\"는 허용되지 않습니다."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Accept header 요청을 만족할 수 없습니다."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "요청된 \"{media_type}\"가 지원되지 않는 미디어 형태입니다."
@@ -141,214 +139,201 @@ msgstr "요청된 \"{media_type}\"가 지원되지 않는 미디어 형태입니
msgid "Request was throttled."
msgstr "요청이 지연(throttled)되었습니다."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "이 항목을 채워주십시오."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "이 칸은 null일 수 없습니다."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\"이 유효하지 않은 부울(boolean)입니다."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "이 칸은 blank일 수 없습니다."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "이 칸이 글자 수가 {max_length} 이하인지 확인하십시오."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "이 칸이 글자 수가 적어도 {min_length} 이상인지 확인하십시오."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "유효한 이메일 주소를 입력하십시오."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "형식에 맞지 않는 값입니다."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "문자, 숫자, 밑줄( _ ) 또는 하이픈( - )으로 이루어진 유효한 \"slug\"를 입력하십시오."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "유효한 URL을 입력하십시오."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\"가 유효하지 않은 UUID 입니다."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "유효한 IPv4 또는 IPv6 주소를 입력하십시오."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "유효한 정수(integer)를 넣어주세요."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "이 값이 {max_value}보다 작거나 같은지 확인하십시오."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "이 값이 {min_value}보다 크거나 같은지 확인하십시오."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "문자열 값이 너무 큽니다."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "유효한 숫자를 넣어주세요."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "전체 숫자(digits)가 {max_digits} 이하인지 확인하십시오."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "소수점 자릿수가 {max_decimal_places} 이하인지 확인하십시오."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "소수점 자리 앞에 숫자(digits)가 {max_whole_digits} 이하인지 확인하십시오."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "예상된 datatime 대신 date를 받았습니다."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Date의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "예상된 date 대신 datetime을 받았습니다."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\"이 유효하지 않은 선택(choice)입니다."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "아이템 리스트가 예상되었으나 \"{input_type}\"를 받았습니다."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "파일이 제출되지 않았습니다."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "제출된 데이터는 파일이 아닙니다. 제출된 서식의 인코딩 형식을 확인하세요."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "파일명을 알 수 없습니다."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "제출된 파일이 비어있습니다."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "이 파일명의 글자수가 최대 {max_length}를 넘지 않는지 확인하십시오. (이것은 {length}가 있습니다)."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "유효한 이미지 파일을 업로드 하십시오. 업로드 하신 파일은 이미지 파일이 아니거나 손상된 이미지 파일입니다."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "아이템 딕셔너리가 예상되었으나 \"{input_type}\" 타입을 받았습니다."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "커서(cursor)가 유효하지 않습니다."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "유효하지 않은 pk \"{pk_value}\" - 객체가 존재하지 않습니다."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "잘못된 형식입니다. pk 값 대신 {data_type}를 받았습니다."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "유효하지 않은 하이퍼링크 - 객체가 존재하지 않습니다."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "잘못된 형식입니다. URL 문자열을 예상했으나 {data_type}을 받았습니다."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "{slug_name}={value} 객체가 존재하지 않습니다."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "값이 유효하지 않습니다."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "유효하지 않은 데이터. 딕셔너리(dictionary)대신 {datatype}를 받았습니다."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select."
msgstr "선택할 아이템이 없습니다."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "이 칸은 반드시 고유해야 합니다."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -441,15 +419,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr "\"Accept\" header내 버전이 유효하지 않습니다."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URL path내 버전이 유효하지 않습니다."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "hostname내 버전이 유효하지 않습니다."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "쿼리 파라메터내 버전이 유효하지 않습니다."
diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.mo b/rest_framework/locale/mk/LC_MESSAGES/django.mo
index e2a518f71..ac9a48193 100644
Binary files a/rest_framework/locale/mk/LC_MESSAGES/django.mo and b/rest_framework/locale/mk/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.po b/rest_framework/locale/mk/LC_MESSAGES/django.po
index 5818124ae..d53a30677 100644
--- a/rest_framework/locale/mk/LC_MESSAGES/django.po
+++ b/rest_framework/locale/mk/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Macedonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/mk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: mk\n"
"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Невалиден основен header. Не се внесени податоци за автентикација."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Невалиден основен header. Автентикационата низа не треба да содржи празни места."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Невалиден основен header. Податоците за автентикација не се енкодирани со base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Невалидно корисничко име/лозинка."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Корисникот е деактивиран или избришан."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Невалиден токен header. Не се внесени податоци за најава."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Невалиден токен во header. Токенот не треба да содржи празни места."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Невалиден токен."
@@ -59,23 +59,23 @@ msgstr "Невалиден токен."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Не е пронајдено ништо."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Методата \"{method}\" не е дозволена."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Не може да се исполни барањето на Accept header-от."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Media типот „{media_type}“ не е поддржан."
@@ -141,214 +139,201 @@ msgstr "Media типот „{media_type}“ не е поддржан."
msgid "Request was throttled."
msgstr "Request-от е забранет заради ограничувања."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Ова поле е задолжително."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Ова поле не смее да биде недефинирано."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" не е валиден boolean."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Ова поле не смее да биде празно."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Ова поле не смее да има повеќе од {max_length} знаци."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Ова поле мора да има барем {min_length} знаци."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Внесете валидна email адреса."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Ова поле не е по правилната шема/барање."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Внесете валидно име што содржи букви, бројки, долни црти или црти."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Внесете валиден URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Задолжителен е валиден цел број."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Вредноста треба да биде помала или еднаква на {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Вредноста треба да биде поголема или еднаква на {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Вредноста е преголема."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Задолжителен е валиден број."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Не смее да има повеќе од {max_digits} цифри вкупно."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Не смее да има повеќе од {max_decimal_places} децимални места."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Не смее да има повеќе од {max_whole_digits} цифри пред децималната точка."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Датата и времето се со погрешен формат. Користете го овој формат: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Очекувано беше дата и време, а внесено беше само дата."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Датата е со погрешен формат. Користете го овој формат: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Очекувана беше дата, а внесени беа и дата и време."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Времето е со погрешен формат. Користете го овој формат: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "„{input}“ не е валиден избор."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Очекувана беше листа, а внесено беше „{input_type}“."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Ниеден фајл не е качен (upload-иран)."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Испратените податоци не се фајл. Проверете го encoding-от на формата."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Не може да се открие име на фајлот."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Качениот (upload-иран) фајл е празен."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Името на фајлот треба да има највеќе {max_length} знаци (а има {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Качете (upload-ирајте) валидна слика. Фајлот што го качивте не е валидна слика или е расипан."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Невалиден pk „{pk_value}“ - објектот не постои."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Неточен тип. Очекувано беше pk, а внесено {data_type}."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Невалиден хиперлинк - Објектот не постои."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Неточен тип. Очекувано беше URL, a внесено {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Објектот со {slug_name}={value} не постои."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Невалидна вредност."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Невалидни податоци. Очекуван беше dictionary, а внесен {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Ова поле мора да биде уникатно."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Полињата {field_names} заедно мора да формираат уникатен збир."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Ова поле мора да биде уникатно за „{date_field}“ датата."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Ова поле мора да биде уникатно за „{date_field}“ месецот."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Ова поле мора да биде уникатно за „{date_field}“ годината."
@@ -441,15 +419,19 @@ msgstr "Ова поле мора да биде уникатно за „{date_fi
msgid "Invalid version in \"Accept\" header."
msgstr "Невалидна верзија во „Accept“ header-от."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Невалидна верзија во URL патеката."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Невалидна верзија во hostname-от."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Невалидна верзија во query параметарот."
diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.mo b/rest_framework/locale/nb/LC_MESSAGES/django.mo
index a0bdb3a49..d3dfe100a 100644
Binary files a/rest_framework/locale/nb/LC_MESSAGES/django.mo and b/rest_framework/locale/nb/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.po b/rest_framework/locale/nb/LC_MESSAGES/django.po
index 3aecbee12..634a24642 100644
--- a/rest_framework/locale/nb/LC_MESSAGES/django.po
+++ b/rest_framework/locale/nb/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Ugyldig basic header. Ingen legitimasjon gitt."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ugylid basic header. Legitimasjonsstreng bør ikke inneholde mellomrom."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ugyldig basic header. Legitimasjonen ikke riktig Base64 kodet."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Ugyldig brukernavn eller passord."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Bruker inaktiv eller slettet."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Ugyldig token header. Ingen legitimasjon gitt."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ugyldig token header. Token streng skal ikke inneholde mellomrom."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Ugyldig token header. Tokenstrengen skal ikke inneholde ugyldige tegn."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Ugyldig token."
@@ -59,23 +59,23 @@ msgstr "Ugyldig token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Ikke funnet."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metoden \"{method}\" ikke gyldig."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kunne ikke tilfredsstille request Accept header."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Ugyldig media type \"{media_type}\" i request."
@@ -141,214 +139,201 @@ msgstr "Ugyldig media type \"{media_type}\" i request."
msgid "Request was throttled."
msgstr "Forespørselen ble strupet."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Dette feltet er påkrevd."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Dette feltet må ikke være tomt."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" er ikke en gyldig bolsk verdi."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Dette feltet må ikke være blankt."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Forsikre deg om at dette feltet ikke har mer enn {max_length} tegn."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Forsikre deg at dette feltet har minst {min_length} tegn."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Oppgi en gyldig epost-adresse."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Denne verdien samsvarer ikke med de påkrevde mønsteret."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Skriv inn en gyldig \"slug\" som består av bokstaver, tall, understrek eller bindestrek."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Skriv inn en gyldig URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" er ikke en gyldig UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Skriv inn en gyldig IPv4 eller IPv6-adresse."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "En gyldig heltall er nødvendig."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Sikre denne verdien er mindre enn eller lik {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Sikre denne verdien er større enn eller lik {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Strengverdien for stor."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Et gyldig nummer er nødvendig."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Pass på at det ikke er flere enn {max_digits} siffer totalt."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Pass på at det ikke er flere enn {max_decimal_places} desimaler."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Pass på at det ikke er flere enn {max_whole_digits} siffer før komma."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime har feil format. Bruk et av disse formatene i stedet: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Forventet en datetime, men fikk en date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Dato har feil format. Bruk et av disse formatene i stedet: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Forventet en date, men fikk en datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Tid har feil format. Bruk et av disse formatene i stedet: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Varighet har feil format. Bruk et av disse formatene i stedet: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" er ikke et gyldig valg."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Mer enn {count} elementer ..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Forventet en liste over elementer, men fikk type \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Dette valget kan ikke være tomt."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" er ikke en gyldig bane valg."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Ingen fil ble sendt."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "De innsendte data var ikke en fil. Kontroller kodingstypen på skjemaet."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Kunne ikke finne filnavn."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Den innsendte filen er tom."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Sikre dette filnavnet har på det meste {max_length} tegn (det har {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Last opp et gyldig bilde. Filen du lastet opp var enten ikke et bilde eller en ødelagt bilde."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Denne listen kan ikke være tom."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Forventet en dictionary av flere ting, men fikk typen \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Verdien må være gyldig JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Send inn"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Ugyldig markør"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ugyldig pk \"{pk_value}\" - objektet eksisterer ikke."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Feil type. Forventet pk verdi, fikk {data_type}."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ugyldig hyperkobling - Objektet eksisterer ikke."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Feil type. Forventet URL streng, fikk {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt med {slug_name}={value} finnes ikke."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Ugyldig verdi."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ugyldige data. Forventet en dicitonary, men fikk {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtre"
@@ -413,27 +395,23 @@ msgstr "Ingen"
msgid "No items to select."
msgstr "Ingenting å velge."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Dette feltet må være unikt."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Feltene {field_names} må gjøre et unikt sett."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dette feltet må være unikt for \"{date_field}\" dato."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dette feltet må være unikt for \"{date_field}\" måned."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dette feltet må være unikt for \"{date_field}\" år."
@@ -441,15 +419,19 @@ msgstr "Dette feltet må være unikt for \"{date_field}\" år."
msgid "Invalid version in \"Accept\" header."
msgstr "Ugyldig versjon på \"Accept\" header."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Ugyldig versjon i URL-banen."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Ugyldig versjon i vertsnavn."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Ugyldig versjon i søkeparameter."
diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.mo b/rest_framework/locale/nl/LC_MESSAGES/django.mo
index 8b70ddbd6..8f9c2dcde 100644
Binary files a/rest_framework/locale/nl/LC_MESSAGES/django.mo and b/rest_framework/locale/nl/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.po b/rest_framework/locale/nl/LC_MESSAGES/django.po
index b89af0606..6b9dd127b 100644
--- a/rest_framework/locale/nl/LC_MESSAGES/django.po
+++ b/rest_framework/locale/nl/LC_MESSAGES/django.po
@@ -3,14 +3,17 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Hans van Luttikhuizen , 2016
# mikedingjan , 2015
+# mikedingjan , 2015
+# Hans van Luttikhuizen , 2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Dutch (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,78 +21,78 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
-msgstr "Ongeldige basic header. Geen login gegevens opgegeven."
+msgstr "Ongeldige basic header. Geen logingegevens opgegeven."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
-msgstr "Ongeldige basic header. login gegevens kunnen geen spaties bevatten."
+msgstr "Ongeldige basic header. logingegevens kunnen geen spaties bevatten."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
-msgstr "Ongeldige basic header. login gegevens zijn niet correct base64 versleuteld."
+msgstr "Ongeldige basic header. logingegevens zijn niet correct base64-versleuteld."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Ongeldige gebruikersnaam/wachtwoord."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Gebruiker inactief of verwijderd."
-#: authentication.py:173
-msgid "Invalid token header. No credentials provided."
-msgstr "Ongeldige token header. Geen login gegevens opgegeven"
-
#: authentication.py:176
+msgid "Invalid token header. No credentials provided."
+msgstr "Ongeldige token header. Geen logingegevens opgegeven"
+
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ongeldige token header. Token kan geen spaties bevatten."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
-msgstr ""
+msgstr "Ongeldige token header. Token kan geen ongeldige karakters bevatten."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Ongeldige token."
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Autorisatietoken"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Key"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Gebruiker"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Aangemaakt"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Tokens"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Gebruikersnaam"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Wachtwoord"
#: authtoken/serializers.py:20
msgid "User account is disabled."
-msgstr "Gebruikers account is inactief."
+msgstr "Gebruikersaccount is gedeactiveerd."
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
@@ -97,11 +100,11 @@ msgstr "Kan niet inloggen met opgegeven gegevens."
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
-msgstr "Moet een \"gebruikersnaam\" en \"wachtwoord\" bevatten."
+msgstr "Moet \"username\" en \"password\" bevatten."
#: exceptions.py:49
msgid "A server error occurred."
-msgstr "Er is een server fout opgetreden."
+msgstr "Er is een serverfout opgetreden."
#: exceptions.py:84
msgid "Malformed request."
@@ -109,248 +112,233 @@ msgstr "Ongeldig samengestelde request."
#: exceptions.py:89
msgid "Incorrect authentication credentials."
-msgstr "Ongeldige authenticatie gegevens."
+msgstr "Ongeldige authenticatiegegevens."
#: exceptions.py:94
msgid "Authentication credentials were not provided."
-msgstr "Authenticatie gegevens zijn niet opgegeven."
+msgstr "Authenticatiegegevens zijn niet opgegeven."
#: exceptions.py:99
msgid "You do not have permission to perform this action."
-msgstr "Je hebt geen toegang om deze actie uit te voeren."
+msgstr "Je hebt geen toestemming om deze actie uit te voeren."
#: exceptions.py:104 views.py:81
msgid "Not found."
msgstr "Niet gevonden."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Methode \"{method}\" niet toegestaan."
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
-msgstr "Kan niet voldoen aan de opgegeven \"Accept\" header."
+msgstr "Kan niet voldoen aan de opgegeven Accept header."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
-msgstr "Ongeldig media type \"{media_type}\" in aanvraag."
+msgstr "Ongeldige media type \"{media_type}\" in aanvraag."
#: exceptions.py:145
msgid "Request was throttled."
msgstr "Aanvraag was verstikt."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
-msgstr "Dit veld is verplicht."
+msgstr "Dit veld is vereist."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Dit veld mag niet leeg zijn."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
-msgstr "\"{input}\" is een ongeldige boolean waarde."
+msgstr "\"{input}\" is een ongeldige booleanwaarde."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Dit veld mag niet leeg zijn."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Zorg ervoor dat dit veld niet meer dan {max_length} karakters bevat."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Zorg ervoor dat dit veld minimaal {min_length} karakters bevat."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Voer een geldig e-mailadres in."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
-msgstr "Deze waarde voldoet niet aan het benodigde formaat."
+msgstr "Deze waarde voldoet niet aan het vereisde formaat."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
-msgstr "Voer een geldige \"slug\" in bestaande uit letters, cijfers, underscore of streepjes."
+msgstr "Voer een geldige \"slug\" in, bestaande uit letters, cijfers, lage streepjes of streepjes."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Voer een geldige URL in."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
-msgstr "\"{value}\" in een ongeldige UUID."
+msgstr "\"{value}\" is een ongeldige UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
-msgstr ""
+msgstr "Voer een geldig IPv4- of IPv6-adres in."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Een geldig getal is vereist."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
-msgstr "Zorg ervoor dat deze waarde minder of gelijk is aan {max_value}."
+msgstr "Zorg ervoor dat deze waarde kleiner is dan of gelijk is aan {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
-msgstr "Zorg ervoor dat deze waarde groter of gelijk is aan {min_value}."
+msgstr "Zorg ervoor dat deze waarde groter is dan of gelijk is aan {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
-msgstr "Tekstuele waarde is te lang."
+msgstr "Tekstwaarde is te lang."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
-msgstr "Een geldig nummer is verplicht."
+msgstr "Een geldig nummer is vereist."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
-msgstr "Zorg ervoor dat er niet meer dan {max_digits} getallen zijn in totaal."
+msgstr "Zorg ervoor dat er in totaal niet meer dan {max_digits} cijfers zijn."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
-msgstr "zorg ervoor dat er niet meer dan {max_decimal_places} getallen achter de komma zijn."
+msgstr "Zorg ervoor dat er niet meer dan {max_decimal_places} cijfers achter de komma zijn."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
-msgstr "Zorg ervoor dat er niet meer dan {max_whole_digits} getallen voor de komma zijn."
+msgstr "Zorg ervoor dat er niet meer dan {max_whole_digits} cijfers voor de komma zijn."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime heeft een ongeldig formaat, gebruik 1 van de volgende formaten: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
-msgstr "Verwacht een datetime, in plaats kreeg een date."
+msgstr "Verwachtte een datetime, maar kreeg een date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
-msgstr "Date heeft het verkeerde formaat, gebruik 1 van de onderstaande formaten: {format}."
+msgstr "Date heeft het verkeerde formaat, gebruik 1 van deze formaten: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
-msgstr "Verwacht een date, in plaats kreeg een datetime"
+msgstr "Verwachtte een date, maar kreeg een datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time heeft het verkeerde formaat, gebruik 1 van onderstaande formaten: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Tijdsduur heeft een verkeerd formaat, gebruik 1 van onderstaande formaten: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" is een ongeldige keuze."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
-msgstr ""
+msgstr "Meer dan {count} items..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
-msgstr "Verwacht een lijst met items, kreeg een type \"{input_type}\" in plaats."
+msgstr "Verwachtte een lijst met items, maar kreeg type \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
-msgstr ""
+msgstr "Deze selectie mag niet leeg zijn."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
-msgstr ""
+msgstr "\"{input}\" is niet een geldig pad."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
-msgstr "Er is geen bestand opgestuurd"
+msgstr "Er is geen bestand opgestuurd."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "De verstuurde data was geen bestand. Controleer de encoding type op het formulier."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
-msgstr "Bestandsnaam kan niet vastgesteld worden."
+msgstr "Bestandsnaam kon niet vastgesteld worden."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Het verstuurde bestand is leeg."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
-msgstr "Zorg ervoor dat deze bestandsnaam minstens {max_length} karakters heeft (momenteel {length})."
+msgstr "Zorg ervoor dat deze bestandsnaam hoogstens {max_length} karakters heeft (het heeft er {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
-msgstr "Upload een geldige afbeelding, de geüploade afbeelding is geen afbeelding of mogelijk corrupt geraakt,"
+msgstr "Upload een geldige afbeelding, de geüploade afbeelding is geen afbeelding of is beschadigd geraakt,"
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
-msgstr ""
+msgstr "Deze lijst mag niet leeg zijn."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
-msgstr "Verwacht een dictionary van items, in plaats kreeg een type \"{input_type}\"."
+msgstr "Verwachtte een dictionary van items, maar kreeg type \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
-msgstr ""
+msgstr "Waarde moet valide JSON zijn."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "Verzenden"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "Ongeldige pagina."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Ongeldige cursor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ongeldige pk \"{pk_value}\" - object bestaat niet."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
-msgstr "Ongeldig type. Verwacht een pk waarde, ontving {data_type}."
+msgstr "Ongeldig type. Verwacht een pk-waarde, ontving {data_type}."
#: relations.py:240
msgid "Invalid hyperlink - No URL match."
@@ -365,41 +353,38 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ongeldige hyperlink - Object bestaat niet."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Ongeldig type. Verwacht een URL, ontving {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Object met {slug_name}={value} bestaat niet."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Ongeldige waarde."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ongeldige data. Verwacht een dictionary, kreeg een {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "Filters"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "Veldfilters"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "Sorteer op"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "Zoek"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
@@ -413,27 +398,23 @@ msgstr "Geen"
msgid "No items to select."
msgstr "Geen items geselecteerd."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Dit veld moet uniek zijn."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "De velden {field_names} moeten een unieke set zijn."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" datum."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" maand."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" year."
@@ -441,18 +422,22 @@ msgstr "Dit veld moet uniek zijn voor de \"{date_field}\" year."
msgid "Invalid version in \"Accept\" header."
msgstr "Ongeldige versie in \"Accept\" header."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
-msgstr "Ongeldige versie in URL pad."
+msgstr "Ongeldige versie in URL-pad."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
-msgstr "Ongeldige versie in host naam."
+msgstr "Ongeldige versie in hostnaam."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Ongeldige versie in query parameter."
#: views.py:88
msgid "Permission denied."
-msgstr "Toegang niet toegestaan."
+msgstr "Toestemming geweigerd."
diff --git a/rest_framework/locale/nn/LC_MESSAGES/django.mo b/rest_framework/locale/nn/LC_MESSAGES/django.mo
index 43d080aa6..a2c1e01f8 100644
Binary files a/rest_framework/locale/nn/LC_MESSAGES/django.mo and b/rest_framework/locale/nn/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/nn/LC_MESSAGES/django.po b/rest_framework/locale/nn/LC_MESSAGES/django.po
index 26a625b6d..bd4d690d2 100644
--- a/rest_framework/locale/nn/LC_MESSAGES/django.po
+++ b/rest_framework/locale/nn/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nn/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: nn\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/no/LC_MESSAGES/django.mo b/rest_framework/locale/no/LC_MESSAGES/django.mo
index 730768a27..2c058c8c7 100644
Binary files a/rest_framework/locale/no/LC_MESSAGES/django.mo and b/rest_framework/locale/no/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/no/LC_MESSAGES/django.po b/rest_framework/locale/no/LC_MESSAGES/django.po
index 4a3d609ca..1ddd6675f 100644
--- a/rest_framework/locale/no/LC_MESSAGES/django.po
+++ b/rest_framework/locale/no/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Norwegian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/no/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: no\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.mo b/rest_framework/locale/pl/LC_MESSAGES/django.mo
index f228dfc7c..8af27437f 100644
Binary files a/rest_framework/locale/pl/LC_MESSAGES/django.mo and b/rest_framework/locale/pl/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.po b/rest_framework/locale/pl/LC_MESSAGES/django.po
index fdf4904bb..b8592e9b7 100644
--- a/rest_framework/locale/pl/LC_MESSAGES/django.po
+++ b/rest_framework/locale/pl/LC_MESSAGES/django.po
@@ -5,14 +5,14 @@
# Translators:
# Janusz Harkot , 2015
# Piotr Jakimiak , 2015
-# Maciek Olko , 2015-2016
+# m_aciek , 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-07 21:25+0000\n"
-"Last-Translator: Maciek Olko \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Polish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,40 +20,40 @@ msgstr ""
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Niepoprawny podstawowy nagłówek. Brak danych uwierzytelniających."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Niepoprawny podstawowy nagłówek. Ciąg znaków danych uwierzytelniających nie powinien zawierać spacji."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Niepoprawny podstawowy nagłówek. Niewłaściwe kodowanie base64 danych uwierzytelniających."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Niepoprawna nazwa użytkownika lub hasło."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Użytkownik nieaktywny lub usunięty."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Niepoprawny nagłówek tokena. Brak danych uwierzytelniających."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Niepoprawny nagłówek tokena. Token nie może zawierać odstępów."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Błędny nagłówek z tokenem. Token nie może zawierać błędnych znaków."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Niepoprawny token."
@@ -61,23 +61,23 @@ msgstr "Niepoprawny token."
msgid "Auth Token"
msgstr "Token uwierzytelniający"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Klucz"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "Użytkownik"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Stworzono"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "Tokeny"
@@ -126,7 +126,6 @@ msgid "Not found."
msgstr "Nie znaleziono."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Niedozwolona metoda \"{method}\"."
@@ -135,7 +134,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Nie można zaspokoić nagłówka Accept żądania."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Brak wsparcia dla żądanego typu danych \"{media_type}\"."
@@ -143,214 +141,201 @@ msgstr "Brak wsparcia dla żądanego typu danych \"{media_type}\"."
msgid "Request was throttled."
msgstr "Żądanie zostało zdławione."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "To pole jest wymagane."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Pole nie może mieć wartości null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" nie jest poprawną wartością logiczną."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "To pole nie może być puste."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Upewnij się, że to pole ma nie więcej niż {max_length} znaków."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Upewnij się, że pole ma co najmniej {min_length} znaków."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Podaj poprawny adres e-mail."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Ta wartość nie pasuje do wymaganego wzorca."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Wprowadź poprawną wartość pola typu \"slug\", składającą się ze znaków łacińskich, cyfr, podkreślenia lub myślnika."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Wprowadź poprawny adres URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" nie jest poprawnym UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Wprowadź poprawny adres IPv4 lub IPv6."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Wymagana poprawna liczba całkowita."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Upewnij się, że ta wartość jest mniejsza lub równa {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Upewnij się, że ta wartość jest większa lub równa {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Za długi ciąg znaków."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Wymagana poprawna liczba."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Upewnij się, że liczba ma nie więcej niż {max_digits} cyfr."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Upewnij się, że liczba ma nie więcej niż {max_decimal_places} cyfr dziesiętnych."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Upewnij się, że liczba ma nie więcej niż {max_whole_digits} cyfr całkowitych."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Wartość daty z czasem ma zły format. Użyj jednego z dostępnych formatów: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Oczekiwano datę z czasem, otrzymano tylko datę."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Data ma zły format. Użyj jednego z tych formatów: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Oczekiwano daty a otrzymano datę z czasem."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Błędny format czasu. Użyj jednego z dostępnych formatów: {format}"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Czas trwania ma zły format. Użyj w zamian jednego z tych formatów: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" nie jest poprawnym wyborem."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Więcej niż {count} elementów..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Oczekiwano listy elementów, a otrzymano dane typu \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Zaznaczenie nie może być puste."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" nie jest poprawną ścieżką."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Nie przesłano pliku."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Przesłane dane nie były plikiem. Sprawdź typ kodowania formatki."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Nie można określić nazwy pliku."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Przesłany plik jest pusty."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Upewnij się, że nazwa pliku ma długość co najwyżej {max_length} znaków (aktualnie ma {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Prześlij poprawny plik graficzny. Przesłany plik albo nie jest grafiką lub jest uszkodzony."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Lista nie może być pusta."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Oczekiwano słownika, ale otrzymano \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Wartość musi być poprawnym ciągiem znaków JSON"
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Wyślij"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Niepoprawna strona."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Niepoprawny wskaźnik"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Błędny klucz główny \"{pk_value}\" - obiekt nie istnieje."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Błędny typ danych. Oczekiwano wartość klucza głównego, otrzymano {data_type}."
@@ -367,25 +352,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Błędny hyperlink - obiekt nie istnieje."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Błędny typ danych. Oczekiwano adresu URL, otrzymano {data_type}"
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Obiekt z polem {slug_name}={value} nie istnieje"
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Niepoprawna wartość."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Niepoprawne dane. Oczekiwano słownika, otrzymano {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtry"
@@ -415,27 +397,23 @@ msgstr "None"
msgid "No items to select."
msgstr "Nie wybrano wartości."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Wartość dla tego pola musi być unikalna."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Pola {field_names} muszą tworzyć unikalny zestaw."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "To pole musi mieć unikalną wartość dla jednej daty z pola \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "To pole musi mieć unikalną wartość dla konkretnego miesiąca z pola \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "To pole musi mieć unikalną wartość dla konkretnego roku z pola \"{date_field}\"."
@@ -443,15 +421,19 @@ msgstr "To pole musi mieć unikalną wartość dla konkretnego roku z pola \"{da
msgid "Invalid version in \"Accept\" header."
msgstr "Błędna wersja w nagłówku \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Błędna wersja w ścieżce URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Błędna wersja w nazwie hosta."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Błędna wersja w parametrach zapytania."
diff --git a/rest_framework/locale/pt/LC_MESSAGES/django.mo b/rest_framework/locale/pt/LC_MESSAGES/django.mo
index 9553b8f7a..9e3c7ab2f 100644
Binary files a/rest_framework/locale/pt/LC_MESSAGES/django.mo and b/rest_framework/locale/pt/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/pt/LC_MESSAGES/django.po b/rest_framework/locale/pt/LC_MESSAGES/django.po
index c1217b2d6..9f1de1938 100644
--- a/rest_framework/locale/pt/LC_MESSAGES/django.po
+++ b/rest_framework/locale/pt/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Portuguese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo b/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo
index 20a41eb1f..1dd7287f3 100644
Binary files a/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo and b/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.po b/rest_framework/locale/pt_BR/LC_MESSAGES/django.po
index 8b55e9ed9..2c90f14ca 100644
--- a/rest_framework/locale/pt_BR/LC_MESSAGES/django.po
+++ b/rest_framework/locale/pt_BR/LC_MESSAGES/django.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,40 +21,40 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Cabeçalho básico inválido. Credenciais não fornecidas."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Cabeçalho básico inválido. String de credenciais não deve incluir espaços."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Cabeçalho básico inválido. Credenciais codificadas em base64 incorretamente."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Usuário ou senha inválido."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Usuário inativo ou removido."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Cabeçalho de token inválido. Credenciais não fornecidas."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Cabeçalho de token inválido. String de token não deve incluir espaços."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Cabeçalho de token inválido. String de token não deve possuir caracteres inválidos."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Token inválido."
@@ -62,23 +62,23 @@ msgstr "Token inválido."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -127,7 +127,6 @@ msgid "Not found."
msgstr "Não encontrado."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Método \"{method}\" não é permitido."
@@ -136,7 +135,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Não foi possível satisfazer a requisição do cabeçalho Accept."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Tipo de mídia \"{media_type}\" no pedido não é suportado."
@@ -144,214 +142,201 @@ msgstr "Tipo de mídia \"{media_type}\" no pedido não é suportado."
msgid "Request was throttled."
msgstr "Pedido foi limitado."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Este campo é obrigatório."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Este campo não pode ser nulo."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" não é um valor boleano válido."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Este campo não pode ser em branco."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Certifique-se de que este campo não tenha mais de {max_length} caracteres."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Certifique-se de que este campo tenha mais de {min_length} caracteres."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Insira um endereço de email válido."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Este valor não corresponde ao padrão exigido."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Entrar um \"slug\" válido que consista de letras, números, sublinhados ou hífens."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Entrar um URL válido."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" não é um UUID válido."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Informe um endereço IPv4 ou IPv6 válido."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Um número inteiro válido é exigido."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Certifique-se de que este valor seja inferior ou igual a {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Certifque-se de que este valor seja maior ou igual a {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Valor da string é muito grande."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Um número válido é necessário."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Certifique-se de que não haja mais de {max_digits} dígitos no total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Certifique-se de que não haja mais de {max_decimal_places} casas decimais."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Certifique-se de que não haja mais de {max_whole_digits} dígitos antes do ponto decimal."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Formato inválido para data e hora. Use um dos formatos a seguir: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Necessário uma data e hora mas recebeu uma data."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Formato inválido para data. Use um dos formatos a seguir: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Necessário uma data mas recebeu uma data e hora."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Formato inválido para Tempo. Use um dos formatos a seguir: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Formato inválido para Duração. Use um dos formatos a seguir: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" não é um escolha válido."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Mais de {count} itens..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Necessário uma lista de itens, mas recebeu tipo \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Esta seleção não pode estar vazia."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" não é uma escolha válida para um caminho."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Nenhum arquivo foi submetido."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "O dado submetido não é um arquivo. Certifique-se do tipo de codificação no formulário."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Nome do arquivo não pode ser determinado."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "O arquivo submetido está vázio."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Certifique-se de que o nome do arquivo tem menos de {max_length} caracteres (tem {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Fazer upload de uma imagem válida. O arquivo enviado não é um arquivo de imagem ou está corrompido."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Esta lista não pode estar vazia."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Esperado um dicionário de itens mas recebeu tipo \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Valor devo ser JSON válido."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Enviar"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Cursor inválido"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Pk inválido \"{pk_value}\" - objeto não existe."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Tipo incorreto. Esperado valor pk, recebeu {data_type}."
@@ -368,25 +353,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Hyperlink inválido - Objeto não existe."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Tipo incorreto. Necessário string URL, recebeu {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objeto com {slug_name}={value} não existe."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Valor inválido."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Dado inválido. Necessário um dicionário mas recebeu {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtra"
@@ -416,27 +398,23 @@ msgstr "Nenhum(a/as)"
msgid "No items to select."
msgstr "Nenhum item para escholher."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Esse campo deve ser único."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Os campos {field_names} devem criar um set único."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "O campo \"{date_field}\" deve ser único para a data."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "O campo \"{date_field}\" deve ser único para o mês."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "O campo \"{date_field}\" deve ser único para o ano."
@@ -444,15 +422,19 @@ msgstr "O campo \"{date_field}\" deve ser único para o ano."
msgid "Invalid version in \"Accept\" header."
msgstr "Versão inválida no cabeçalho \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Versão inválida no caminho de URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Versão inválida no hostname."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Versão inválida no parâmetro de query."
diff --git a/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo b/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo
index 82403c3ca..754e18154 100644
Binary files a/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo and b/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/pt_PT/LC_MESSAGES/django.po b/rest_framework/locale/pt_PT/LC_MESSAGES/django.po
index 1727fc42b..eedfa817d 100644
--- a/rest_framework/locale/pt_PT/LC_MESSAGES/django.po
+++ b/rest_framework/locale/pt_PT/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Portuguese (Portugal) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt_PT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: pt_PT\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.mo b/rest_framework/locale/ro/LC_MESSAGES/django.mo
index 77dc7d0f2..5a113ab72 100644
Binary files a/rest_framework/locale/ro/LC_MESSAGES/django.mo and b/rest_framework/locale/ro/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.po b/rest_framework/locale/ro/LC_MESSAGES/django.po
index f63a1da24..bb3b5e3c0 100644
--- a/rest_framework/locale/ro/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ro/LC_MESSAGES/django.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Elena-Adela Neacsu , 2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Romanian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,441 +18,423 @@ msgstr ""
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
-msgstr ""
+msgstr "Antet de bază invalid. Datele de autentificare nu au fost furnizate."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
-msgstr ""
+msgstr "Antet de bază invalid. Şirul de caractere cu datele de autentificare nu trebuie să conțină spații."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
-msgstr ""
+msgstr "Antet de bază invalid. Datele de autentificare nu au fost corect codificate în base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
-msgstr ""
+msgstr "Nume utilizator / Parolă invalid(ă)."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
-msgstr ""
-
-#: authentication.py:173
-msgid "Invalid token header. No credentials provided."
-msgstr ""
+msgstr "Utilizator inactiv sau șters."
#: authentication.py:176
-msgid "Invalid token header. Token string should not contain spaces."
-msgstr ""
+msgid "Invalid token header. No credentials provided."
+msgstr "Antet token invalid. Datele de autentificare nu au fost furnizate."
-#: authentication.py:182
+#: authentication.py:179
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr "Antet token invalid. Şirul de caractere pentru token nu trebuie să conțină spații."
+
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
-msgstr ""
+msgstr "Antet token invalid. Şirul de caractere pentru token nu trebuie să conțină caractere nevalide."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
-msgstr ""
+msgstr "Token nevalid."
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Token de autentificare"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Cheie"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Utilizator"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Creat"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Tokenuri"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Nume de utilizator"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Parola"
#: authtoken/serializers.py:20
msgid "User account is disabled."
-msgstr ""
+msgstr "Contul de utilizator este dezactivat."
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
-msgstr ""
+msgstr "Nu se poate conecta cu datele de conectare furnizate."
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
-msgstr ""
+msgstr "Trebuie să includă \"numele de utilizator\" și \"parola\"."
#: exceptions.py:49
msgid "A server error occurred."
-msgstr ""
+msgstr "A apărut o eroare pe server."
#: exceptions.py:84
msgid "Malformed request."
-msgstr ""
+msgstr "Cerere incorectă."
#: exceptions.py:89
msgid "Incorrect authentication credentials."
-msgstr ""
+msgstr "Date de autentificare incorecte."
#: exceptions.py:94
msgid "Authentication credentials were not provided."
-msgstr ""
+msgstr "Datele de autentificare nu au fost furnizate."
#: exceptions.py:99
msgid "You do not have permission to perform this action."
-msgstr ""
+msgstr "Nu aveți permisiunea de a efectua această acțiune."
#: exceptions.py:104 views.py:81
msgid "Not found."
-msgstr ""
+msgstr "Nu a fost găsit(ă)."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
-msgstr ""
+msgstr "Metoda \"{method}\" nu este permisa."
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
-msgstr ""
+msgstr "Antetul Accept al cererii nu a putut fi îndeplinit."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
-msgstr ""
+msgstr "Cererea conține tipul media neacceptat \"{media_type}\""
#: exceptions.py:145
msgid "Request was throttled."
-msgstr ""
+msgstr "Cererea a fost gâtuită."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
-msgstr ""
+msgstr "Acest câmp este obligatoriu."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
-msgstr ""
+msgstr "Acest câmp nu poate fi nul."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
-msgstr ""
+msgstr "\"{input}\" nu este un boolean valid."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
-msgstr ""
+msgstr "Acest câmp nu poate fi gol."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
-msgstr ""
+msgstr "Asigurați-vă că acest câmp nu are mai mult de {max_length} caractere."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
-msgstr ""
+msgstr "Asigurați-vă că acest câmp are cel puțin{min_length} caractere."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
-msgstr ""
+msgstr "Introduceți o adresă de email validă."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
-msgstr ""
+msgstr "Această valoare nu se potrivește cu şablonul cerut."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
-msgstr ""
+msgstr "Introduceți un \"slug\" valid format din litere, numere, caractere de subliniere sau cratime."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
-msgstr ""
+msgstr "Introduceți un URL valid."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
-msgstr ""
+msgstr "\"{value}\" nu este un UUID valid."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
-msgstr ""
+msgstr "Introduceți o adresă IPv4 sau IPv6 validă."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
-msgstr ""
+msgstr "Este necesar un întreg valid."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
-msgstr ""
+msgstr "Asigurați-vă că această valoare este mai mică sau egală cu {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
-msgstr ""
+msgstr "Asigurați-vă că această valoare este mai mare sau egală cu {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
-msgstr ""
+msgstr "Valoare șir de caractere prea mare."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
-msgstr ""
+msgstr "Este necesar un număr valid."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
-msgstr ""
+msgstr "Asigurați-vă că nu există mai mult de {max_digits} cifre în total."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
-msgstr ""
+msgstr "Asigurați-vă că nu există mai mult de {max_decimal_places} zecimale."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
-msgstr ""
+msgstr "Asigurați-vă că nu există mai mult de {max_whole_digits} cifre înainte de punctul zecimal."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Câmpul datetime are format greșit. Utilizați unul dintre aceste formate în loc: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
-msgstr ""
+msgstr "Se aștepta un câmp datetime, dar s-a primit o dată."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Data are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
-msgstr ""
+msgstr "Se aștepta o dată, dar s-a primit un câmp datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Timpul are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Durata are formatul greșit. Utilizați unul dintre aceste formate în loc: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
-msgstr ""
+msgstr "\"{input}\" nu este o opțiune validă."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
-msgstr ""
+msgstr "Mai mult de {count} articole ..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Se aștepta o listă de elemente, dar s-a primit tip \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
-msgstr ""
+msgstr "Această selecție nu poate fi goală."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
-msgstr ""
+msgstr "\"{input}\" nu este o cale validă."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
-msgstr ""
+msgstr "Nici un fișier nu a fost sumis."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
-msgstr ""
+msgstr "Datele prezentate nu sunt un fișier. Verificați tipul de codificare de pe formular."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
-msgstr ""
+msgstr "Numele fișierului nu a putut fi determinat."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
-msgstr ""
+msgstr "Fișierul sumis este gol."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
-msgstr ""
+msgstr "Asigurați-vă că acest nume de fișier are cel mult {max_length} caractere (momentan are {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
-msgstr ""
+msgstr "Încărcați o imagine validă. Fișierul încărcat a fost fie nu o imagine sau o imagine coruptă."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
-msgstr ""
+msgstr "Această listă nu poate fi goală."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Se aștepta un dicționar de obiecte, dar s-a primit tipul \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
-msgstr ""
+msgstr "Valoarea trebuie să fie JSON valid."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "Sumiteţi"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "Pagină nevalidă."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
-msgstr ""
+msgstr "Cursor nevalid"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
-msgstr ""
+msgstr "Pk \"{pk_value}\" nevalid - obiectul nu există."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
-msgstr ""
+msgstr "Tip incorect. Se aștepta un pk, dar s-a primit \"{data_type}\"."
#: relations.py:240
msgid "Invalid hyperlink - No URL match."
-msgstr ""
+msgstr "Hyperlink nevalid - Nici un URL nu se potrivește."
#: relations.py:241
msgid "Invalid hyperlink - Incorrect URL match."
-msgstr ""
+msgstr "Hyperlink nevalid - Potrivire URL incorectă."
#: relations.py:242
msgid "Invalid hyperlink - Object does not exist."
-msgstr ""
+msgstr "Hyperlink nevalid - Obiectul nu există."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
-msgstr ""
+msgstr "Tip incorect. Se aștepta un URL, dar s-a primit \"{data_type}\"."
+
+#: relations.py:401
+msgid "Object with {slug_name}={value} does not exist."
+msgstr "Obiectul cu {slug_name}={value} nu există."
#: relations.py:402
-#, python-brace-format
-msgid "Object with {slug_name}={value} does not exist."
-msgstr ""
-
-#: relations.py:403
msgid "Invalid value."
-msgstr ""
+msgstr "Valoare nevalidă."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
-msgstr ""
+msgstr "Date nevalide. Se aștepta un dicționar de obiecte, dar s-a primit \"{datatype}\"."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "Filtre"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "Filtre câmpuri"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "Ordonare"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "Căutare"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
-msgstr ""
+msgstr "Nici unul/una"
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
-msgstr ""
+msgstr "Nu există elemente pentru a fi selectate."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
-msgstr ""
+msgstr "Acest câmp trebuie să fie unic."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
-msgstr ""
+msgstr "Câmpurile {field_names} trebuie să formeze un set unic."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
-msgstr ""
+msgstr "Acest câmp trebuie să fie unic pentru data \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
-msgstr ""
+msgstr "Acest câmp trebuie să fie unic pentru luna \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
-msgstr ""
+msgstr "Acest câmp trebuie să fie unic pentru anul \"{date_field}\"."
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
-msgstr ""
+msgstr "Versiune nevalidă în antetul \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
+msgstr "Versiune nevalidă în calea URL."
+
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
-#: versioning.py:144
+#: versioning.py:147
msgid "Invalid version in hostname."
-msgstr ""
+msgstr "Versiune nevalidă în numele de gazdă."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
-msgstr ""
+msgstr "Versiune nevalid în parametrul de interogare."
#: views.py:88
msgid "Permission denied."
-msgstr ""
+msgstr "Permisiune refuzată."
diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.mo b/rest_framework/locale/ru/LC_MESSAGES/django.mo
index ac67f09a3..be0620a33 100644
Binary files a/rest_framework/locale/ru/LC_MESSAGES/django.mo and b/rest_framework/locale/ru/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.po b/rest_framework/locale/ru/LC_MESSAGES/django.po
index 980a9e5b4..b73270906 100644
--- a/rest_framework/locale/ru/LC_MESSAGES/django.po
+++ b/rest_framework/locale/ru/LC_MESSAGES/django.po
@@ -5,14 +5,15 @@
# Translators:
# Kirill Tarasenko, 2015
# koodjo , 2015
-# Mikhail Dmitriev , 2015
+# Mike TUMS , 2015
+# Sergei Sinitsyn , 2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Russian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,74 +21,74 @@ msgstr ""
"Language: ru\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"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Недопустимый заголовок. Не предоставлены учетные данные."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Недопустимый заголовок. Учетные данные не должны содержать пробелов."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Недопустимый заголовок. Учетные данные некорректно закодированны в base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Недопустимые имя пользователя или пароль."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Пользователь неактивен или удален."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Недопустимый заголовок токена. Не предоставлены учетные данные."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Недопустимый заголовок токена. Токен не должен содержать пробелов."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
-msgstr ""
+msgstr "Недопустимый заголовок токена. Токен не должен содержать недопустимые символы."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Недопустимый токен."
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Токен аутентификации"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Ключ"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Пользователь"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Создан"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Токен"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Токены"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Имя пользователя"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Пароль"
#: authtoken/serializers.py:20
msgid "User account is disabled."
@@ -126,7 +127,6 @@ msgid "Not found."
msgstr "Не найдено."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Метод \"{method}\" не разрешен."
@@ -135,7 +135,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Невозможно удовлетворить \"Accept\" заголовок запроса."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Неподдерживаемый тип данных \"{media_type}\" в запросе."
@@ -143,214 +142,201 @@ msgstr "Неподдерживаемый тип данных \"{media_type}\" в
msgid "Request was throttled."
msgstr "Запрос был проигнорирован."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Это поле обязательно."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Это поле не может быть null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" не является корректным булевым значением."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Это поле не может быть пустым."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Убедитесь что в этом поле не больше {max_length} символов."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Убедитесь что в этом поле как минимум {min_length} символов."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Введите корректный адрес электронной почты."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Значение не соответствует требуемому паттерну."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Введите корректный \"slug\", состоящий из букв, цифр, знаков подчеркивания или дефисов."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Введите корректный URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" не является корректным UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
-msgstr ""
+msgstr "Введите действительный адрес IPv4 или IPv6."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Требуется целочисленное значение."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Убедитесь что значение меньше или равно {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Убедитесь что значение больше или равно {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Слишком длинное значение."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Требуется численное значение."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Убедитесь что в числе не больше {max_digits} знаков."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Убедитесь что в числе не больше {max_decimal_places} знаков в дробной части."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Убедитесь что в цисле не больше {max_whole_digits} знаков в целой части."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Неправильный формат datetime. Используйте один из этих форматов: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Ожидался datetime, но был получен date."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Неправильный формат date. Используйте один из этих форматов: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Ожидался date, но был получен datetime."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Неправильный формат времени. Используйте один из этих форматов: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Неправильный формат. Используйте один из этих форматов: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" не является корректным значением."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
-msgstr ""
+msgstr "Элементов больше чем {count}"
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Ожидался list со значениями, но был получен \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
-msgstr ""
+msgstr "Выбор не может быть пустым."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
-msgstr ""
+msgstr "\"{input}\" не является корректным путем до файла"
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Не был загружен файл."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Загруженный файл не является корректным файлом. "
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Невозможно определить имя файла."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Загруженный файл пуст."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Убедитесь что имя файла меньше {max_length} символов (сейчас {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Загрузите корректное изображение. Загруженный файл не является изображением, либо является испорченным."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
-msgstr ""
+msgstr "Этот список не может быть пустым."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Ожидался словарь со значениями, но был получен \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
-msgstr ""
+msgstr "Значение должно быть правильным JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "Отправить"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "Неправильная страница"
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Не корректный курсор"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Недопустимый первичный ключ \"{pk_value}\" - объект не существует."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Некорректный тип. Ожилалось значение первичного ключа, получен {data_type}."
@@ -367,75 +353,68 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Недопустимая ссылка - объект не существует."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Некорректный тип. Ожидался URL, получен {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Объект с {slug_name}={value} не существует."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Недопустимое значение."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Недопустимые данные. Ожидался dictionary, но был получен {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "Фильтры"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "Фильтры полей"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "Порядок сортировки"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "Поиск"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
-msgstr ""
+msgstr "Ничего"
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
-msgstr ""
+msgstr "Нет элементов для выбора"
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Это поле должно быть уникально."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Поля {field_names} должны производить массив с уникальными значениями."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Это поле должно быть уникально для даты \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Это поле должно быть уникально для месяца \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Это поле должно быть уникально для года \"{date_field}\"."
@@ -443,18 +422,22 @@ msgstr "Это поле должно быть уникально для года
msgid "Invalid version in \"Accept\" header."
msgstr "Недопустимая версия в заголовке \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Недопустимая версия в пути URL."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Недопустимая версия в имени хоста."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Недопустимая версия в параметре запроса."
#: views.py:88
msgid "Permission denied."
-msgstr ""
+msgstr "Доступ запрещен"
diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.mo b/rest_framework/locale/sk/LC_MESSAGES/django.mo
index 832378898..dda693e32 100644
Binary files a/rest_framework/locale/sk/LC_MESSAGES/django.mo and b/rest_framework/locale/sk/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.po b/rest_framework/locale/sk/LC_MESSAGES/django.po
index 208c063ac..1c22d09f0 100644
--- a/rest_framework/locale/sk/LC_MESSAGES/django.po
+++ b/rest_framework/locale/sk/LC_MESSAGES/django.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Slovak (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: sk\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Nesprávna hlavička. Neboli poskytnuté prihlasovacie údaje."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Nesprávna hlavička. Prihlasovacie údaje nesmú obsahovať medzery."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Nesprávna hlavička. Prihlasovacie údaje nie sú správne zakódované pomocou metódy base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Nesprávne prihlasovacie údaje."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Daný používateľ je neaktívny, alebo zmazaný."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Nesprávna token hlavička. Neboli poskytnuté prihlasovacie údaje."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Nesprávna token hlavička. Token hlavička nesmie obsahovať medzery."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Nesprávny token."
@@ -59,23 +59,23 @@ msgstr "Nesprávny token."
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Nebolo nájdené."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metóda \"{method}\" nie je povolená."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Nie je možné vyhovieť požiadavku v hlavičke \"Accept\"."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Požiadavok obsahuje nepodporovaný media type: \"{media_type}\"."
@@ -141,214 +139,201 @@ msgstr "Požiadavok obsahuje nepodporovaný media type: \"{media_type}\"."
msgid "Request was throttled."
msgstr "Požiadavok bol obmedzený, z dôvodu prekročenia limitu."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Toto pole je povinné."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Toto pole nemôže byť nulové."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" je validný boolean."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Toto pole nemože byť prázdne."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Uistite sa, že toto pole nemá viac ako {max_length} znakov."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Uistite sa, že toto pole má viac ako {min_length} znakov."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Vložte správnu emailovú adresu."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Toto pole nezodpovedá požadovanému formátu."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Zadajte platný \"slug\", ktorý obsahuje len malé písmená, čísla, spojovník alebopodtržítko."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Zadajte platnú URL adresu."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" nie je platné UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Je vyžadované celé číslo."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Uistite sa, že hodnota je menšia alebo rovná {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Uistite sa, že hodnota je väčšia alebo rovná {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Zadaný textový reťazec je príliš dlhý."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Je vyžadované číslo."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_digits} cifier."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_decimal_places} desatinných miest."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Uistite sa, že hodnota neobsahuje viac ako {max_whole_digits} cifier pred desatinnou čiarkou."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Nesprávny formát dátumu a času. Prosím použite jeden z nasledujúcich formátov: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Vložený len dátum - date namiesto dátumu a času - datetime."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Nesprávny formát dátumu. Prosím použite jeden z nasledujúcich formátov: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Vložený dátum a čas - datetime namiesto jednoduchého dátumu - date."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Nesprávny formát času. Prosím použite jeden z nasledujúcich formátov: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" je nesprávny výber z daných možností."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Bol očakávaný zoznam položiek, no namiesto toho bol nájdený \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Nebol odoslaný žiadny súbor."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Odoslané dáta neobsahujú súbor. Prosím skontrolujte kódovanie - encoding type daného formuláru."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Nebolo možné určiť meno súboru."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Odoslaný súbor je prázdny."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Uistite sa, že meno súboru neobsahuje viac ako {max_length} znakov. (V skutočnosti ich má {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Uploadujte prosím obrázok. Súbor, ktorý ste uploadovali buď nie je obrázok, alebo daný obrázok je poškodený."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Bol očakávaný slovník položiek, no namiesto toho bol nájdený \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Nesprávny kurzor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Nesprávny primárny kľúč \"{pk_value}\" - objekt s daným primárnym kľúčom neexistuje."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Nesprávny typ. Bol prijatý {data_type} namiesto primárneho kľúča."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Nesprávny hypertextový odkaz - požadovný objekt neexistuje."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Nesprávny typ {data_type}. Požadovaný typ: hypertextový odkaz."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt, ktorého atribút \"{slug_name}\" je \"{value}\" neexistuje."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Nesprávna hodnota."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Bol očakávaný slovník položiek, no namiesto toho bol nájdený \"{datatype}\"."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -413,27 +395,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Táto položka musí byť unikátna."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Dané položky: {field_names} musia tvoriť musia spolu tvoriť unikátnu množinu."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Položka musí byť pre špecifický deň \"{date_field}\" unikátna."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Položka musí byť pre mesiac \"{date_field}\" unikátna."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Položka musí byť pre rok \"{date_field}\" unikátna."
@@ -441,15 +419,19 @@ msgstr "Položka musí byť pre rok \"{date_field}\" unikátna."
msgid "Invalid version in \"Accept\" header."
msgstr "Nesprávna verzia v \"Accept\" hlavičke."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Nesprávna verzia v URL adrese."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Nesprávna verzia v \"hostname\"."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Nesprávna verzia v parametri požiadavku."
diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.mo b/rest_framework/locale/sv/LC_MESSAGES/django.mo
index d560de6e1..cbecec44d 100644
Binary files a/rest_framework/locale/sv/LC_MESSAGES/django.mo and b/rest_framework/locale/sv/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.po b/rest_framework/locale/sv/LC_MESSAGES/django.po
index 879b2e991..82dde0d87 100644
--- a/rest_framework/locale/sv/LC_MESSAGES/django.po
+++ b/rest_framework/locale/sv/LC_MESSAGES/django.po
@@ -4,14 +4,14 @@
#
# Translators:
# Frank Wickström , 2015
-# Joakim Soderlund, 2015
+# Joakim Soderlund, 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Swedish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,74 +19,74 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Ogiltig \"basic\"-header. Inga användaruppgifter tillhandahölls."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Ogiltig \"basic\"-header. Strängen för användaruppgifterna ska inte innehålla mellanslag."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Ogiltig \"basic\"-header. Användaruppgifterna är inte korrekt base64-kodade."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Ogiltigt användarnamn/lösenord."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Användaren borttagen eller inaktiv."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Ogiltig \"token\"-header. Inga användaruppgifter tillhandahölls."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Ogiltig \"token\"-header. Strängen ska inte innehålla mellanslag."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Ogiltig \"token\"-header. Strängen ska inte innehålla ogiltiga tecken."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Ogiltig \"token\"."
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Autentiseringstoken"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Nyckel"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Användare"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Skapad"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Token"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Tokens"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Användarnamn"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Lösenord"
#: authtoken/serializers.py:20
msgid "User account is disabled."
@@ -125,7 +125,6 @@ msgid "Not found."
msgstr "Hittades inte."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "Metoden \"{method}\" tillåts inte."
@@ -134,7 +133,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "Kunde inte tillfredsställa förfrågans \"Accept\"-header."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "Medietypen \"{media_type}\" stöds inte."
@@ -142,214 +140,201 @@ msgstr "Medietypen \"{media_type}\" stöds inte."
msgid "Request was throttled."
msgstr "Förfrågan stoppades eftersom du har skickat för många."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Det här fältet är obligatoriskt."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Det här fältet får inte vara null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" är inte ett giltigt booleskt värde."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Det här fältet får inte vara blankt."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Se till att detta fält inte har fler än {max_length} tecken."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Se till att detta fält har minst {min_length} tecken."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Ange en giltig mejladress."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Det här värdet matchar inte mallen."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Ange en giltig \"slug\" bestående av bokstäver, nummer, understreck eller bindestreck."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Ange en giltig URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value} är inte ett giltigt UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Ange en giltig IPv4- eller IPv6-adress."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Ett giltigt heltal krävs."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Se till att detta värde är mindre än eller lika med {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Se till att detta värde är större än eller lika med {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "Textvärdet är för långt."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Ett giltigt nummer krävs."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Se till att det inte finns fler än totalt {max_digits} siffror."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Se till att det inte finns fler än {max_decimal_places} decimaler."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Se till att det inte finns fler än {max_whole_digits} siffror före decimalpunkten."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datumtiden har fel format. Använd ett av dessa format istället: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Förväntade en datumtid men fick ett datum."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Datumet har fel format. Använde ett av dessa format istället: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Förväntade ett datum men fick en datumtid."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Tiden har fel format. Använd ett av dessa format istället: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Perioden har fel format. Använd ett av dessa format istället: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" är inte ett giltigt val."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "Fler än {count} objekt..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Förväntade en lista med element men fick typen \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Det här valet får inte vara tomt."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" är inte ett giltigt val för en sökväg."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Ingen fil skickades."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Den skickade informationen var inte en fil. Kontrollera formulärets kodningstyp."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Inget filnamn kunde bestämmas."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Den skickade filen var tom."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Se till att det här filnamnet har högst {max_length} tecken (det har {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Ladda upp en giltig bild. Filen du laddade upp var antingen inte en bild eller en skadad bild."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Den här listan får inte vara tom."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Förväntade en \"dictionary\" med element men fick typen \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Värdet måste vara giltig JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Skicka"
-#: pagination.py:189
-msgid "Invalid page."
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:407
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
+msgid "Invalid page."
+msgstr "Ogiltig sida."
+
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Ogiltig cursor."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Ogiltigt pk \"{pk_value}\" - Objektet finns inte."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Felaktig typ. Förväntade pk-värde, fick {data_type}."
@@ -366,25 +351,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Ogiltig hyperlänk - Objektet finns inte."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Felaktig typ. Förväntade URL-sträng, fick {data_type}."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "Objekt med {slug_name}={value} finns inte."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Ogiltigt värde."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Ogiltig data. Förväntade en dictionary, men fick {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filter"
@@ -414,27 +396,23 @@ msgstr "Inget"
msgid "No items to select."
msgstr "Inga valbara objekt."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Det här fältet måste vara unikt."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "Fälten {field_names} måste skapa ett unikt set."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Det här fältet måste vara unikt för datumet \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Det här fältet måste vara unikt för månaden \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Det här fältet måste vara unikt för året \"{date_field}\"."
@@ -442,15 +420,19 @@ msgstr "Det här fältet måste vara unikt för året \"{date_field}\"."
msgid "Invalid version in \"Accept\" header."
msgstr "Ogiltig version i \"Accept\"-headern."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "Ogiltig version i URL-resursen."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Ogiltig version i värdnamnet."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Ogiltig version i förfrågningsparametern."
diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.mo b/rest_framework/locale/tr/LC_MESSAGES/django.mo
index 14f5dc981..818aad279 100644
Binary files a/rest_framework/locale/tr/LC_MESSAGES/django.mo and b/rest_framework/locale/tr/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.po b/rest_framework/locale/tr/LC_MESSAGES/django.po
index 50722b3d8..17e6e4a73 100644
--- a/rest_framework/locale/tr/LC_MESSAGES/django.po
+++ b/rest_framework/locale/tr/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
# Dogukan Tufekci , 2015
# Emrah BİLBAY , 2015
# Ertaç Paprat , 2015
-# José Alaguna , 2016
+# Yusuf (Josè) Luis , 2016
# Mesut Can Gürle , 2015
# Murat Çorlu , 2015
# Recep KIRMIZI , 2015
@@ -15,9 +15,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-09 23:45+0000\n"
-"Last-Translator: José Alaguna \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Turkish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,40 +25,40 @@ msgstr ""
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Geçersiz yetkilendirme başlığı. Gerekli uygunluk kriterleri sağlanmamış."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterine ait veri boşluk karakteri içermemeli."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterleri base64 formatına uygun olarak kodlanmamış."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Geçersiz kullanıcı adı/parola"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Kullanıcı aktif değil ya da silinmiş."
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Geçersiz token başlığı. Kimlik bilgileri eksik."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Geçersiz token başlığı. Token'da boşluk olmamalı."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Geçersiz token başlığı. Token geçersiz karakter içermemeli."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Geçersiz token."
@@ -66,23 +66,23 @@ msgstr "Geçersiz token."
msgid "Auth Token"
msgstr "Kimlik doğrulama belirteci"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Anahtar"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "Kullanan"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Oluşturulan"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "İşaret"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "İşaretler"
@@ -131,7 +131,6 @@ msgid "Not found."
msgstr "Bulunamadı."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "\"{method}\" metoduna izin verilmiyor."
@@ -140,7 +139,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "İsteğe ait Accept başlık bilgisi yanıt verilecek başlık bilgileri arasında değil."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"."
@@ -148,214 +146,201 @@ msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"."
msgid "Request was throttled."
msgstr "Üst üste çok fazla istek yapıldı."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Bu alan zorunlu."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Bu alan boş bırakılmamalı."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" geçerli bir boolean değil."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Bu alan boş bırakılmamalı."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Bu alanın {max_length} karakterden fazla karakter barındırmadığından emin olun."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Bu alanın en az {min_length} karakter barındırdığından emin olun."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Geçerli bir e-posta adresi girin."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Bu değer gereken düzenli ifade deseni ile uyuşmuyor."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Harf, rakam, altçizgi veya tireden oluşan geçerli bir \"slug\" giriniz."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Geçerli bir URL girin."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" geçerli bir UUID değil."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Geçerli bir IPv4 ya da IPv6 adresi girin."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Geçerli bir tam sayı girin."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Değerin {max_value} değerinden küçük ya da eşit olduğundan emin olun."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Değerin {min_value} değerinden büyük ya da eşit olduğundan emin olun."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "String değeri çok uzun."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Geçerli bir numara gerekiyor."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Toplamda {max_digits} haneden fazla hane olmadığından emin olun."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Ondalık basamak değerinin {max_decimal_places} haneden fazla olmadığından emin olun."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Ondalık ayracından önce {max_whole_digits} basamaktan fazla olmadığından emin olun."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime alanı yanlış biçimde. {format} biçimlerinden birini kullanın."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Datetime değeri bekleniyor, ama date değeri geldi."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Tarih biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Date tipi beklenmekteydi, fakat datetime tipi geldi."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duration biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" geçerli bir seçim değil."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "{count} elemandan daha fazla..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Elemanların listesi beklenirken \"{input_type}\" alındı."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Bu seçim boş bırakılmamalı."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" geçerli bir yol seçimi değil."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Hiçbir dosya verilmedi."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Gönderilen veri dosya değil. Formdaki kodlama tipini kontrol edin."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Hiçbir dosya adı belirlenemedi."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Gönderilen dosya boş."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Bu dosya adının en fazla {max_length} karakter uzunluğunda olduğundan emin olun. (şu anda {length} karakter)."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Geçerli bir resim yükleyin. Yüklediğiniz dosya resim değil ya da bozuk."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Bu liste boş olmamalı."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Sözlük tipi bir değişken beklenirken \"{input_type}\" tipi bir değişken alındı."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Değer geçerli bir JSON olmalı."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Gönder"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Geçersiz sayfa."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Sayfalandırma imleci geçersiz"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Geçersiz pk \"{pk_value}\" - obje bulunamadı."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Hatalı tip. Pk değeri beklenirken, alınan {data_type}."
@@ -372,25 +357,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Geçersiz bağlantı - Obje bulunamadı."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Hatalı tip. URL metni bekleniyor, {data_type} alındı."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "{slug_name}={value} değerini taşıyan obje bulunamadı."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Geçersiz değer."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Geçersiz veri. Sözlük bekleniyordu fakat {datatype} geldi. "
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtreler"
@@ -420,27 +402,23 @@ msgstr "Hiçbiri"
msgid "No items to select."
msgstr "Seçenek yok."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Bu alan eşsiz olmalı."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "{field_names} hep birlikte eşsiz bir küme oluşturmalılar."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Bu alan \"{date_field}\" tarihine göre eşsiz olmalı."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Bu alan \"{date_field}\" ayına göre eşsiz olmalı."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı."
@@ -448,15 +426,19 @@ msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı."
msgid "Invalid version in \"Accept\" header."
msgstr "\"Accept\" başlığındaki sürüm geçersiz."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URL dizininde geçersiz versiyon."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Host adında geçersiz versiyon."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Sorgu parametresinde geçersiz versiyon."
diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo b/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo
index 5fa743b50..a3a8ca0d5 100644
Binary files a/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo and b/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po
index efbd689e6..171826a63 100644
--- a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po
+++ b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po
@@ -3,14 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# José Alaguna , 2015-2016
+# Yusuf (Josè) Luis , 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-09 23:48+0000\n"
-"Last-Translator: José Alaguna \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,40 +18,40 @@ msgstr ""
"Language: tr_TR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "Geçersiz yetkilendirme başlığı. Gerekli uygunluk kriterleri sağlanmamış."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterine ait veri boşluk karakteri içermemeli."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterleri base64 formatına uygun olarak kodlanmamış."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "Geçersiz kullanıcı adı / şifre."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "Kullanıcı aktif değil ya da silinmiş"
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "Geçersiz token başlığı. Kimlik bilgileri eksik."
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "Geçersiz token başlığı. Token'da boşluk olmamalı."
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "Geçersiz token başlığı. Token geçersiz karakter içermemeli."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "Geçersiz simge."
@@ -59,23 +59,23 @@ msgstr "Geçersiz simge."
msgid "Auth Token"
msgstr "Kimlik doğrulama belirteci"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr "Anahtar"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "Kullanan"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr "Oluşturulan"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "İşaret"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "İşaretler"
@@ -124,7 +124,6 @@ msgid "Not found."
msgstr "Bulunamadı."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "\"{method}\" metoduna izin verilmiyor."
@@ -133,7 +132,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "İsteğe ait Accept başlık bilgisi yanıt verilecek başlık bilgileri arasında değil."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"."
@@ -141,214 +139,201 @@ msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"."
msgid "Request was throttled."
msgstr "Üst üste çok fazla istek yapıldı."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "Bu alan zorunlu."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "Bu alan boş bırakılmamalı."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "\"{input}\" geçerli bir boolean değil."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "Bu alan boş bırakılmamalı."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "Bu alanın {max_length} karakterden fazla karakter barındırmadığından emin olun."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "Bu alanın en az {min_length} karakter barındırdığından emin olun."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "Geçerli bir e-posta adresi girin."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "Bu değer gereken düzenli ifade deseni ile uyuşmuyor."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "Harf, rakam, altçizgi veya tireden oluşan geçerli bir \"slug\" giriniz."
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "Geçerli bir URL girin."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "\"{value}\" geçerli bir UUID değil."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "Geçerli bir IPv4 ya da IPv6 adresi girin."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "Geçerli bir tam sayı girin."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "Değerin {max_value} değerinden küçük ya da eşit olduğundan emin olun."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "Değerin {min_value} değerinden büyük ya da eşit olduğundan emin olun."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "String değeri çok uzun."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "Geçerli bir numara gerekiyor."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "Toplamda {max_digits} haneden fazla hane olmadığından emin olun."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "Ondalık basamak değerinin {max_decimal_places} haneden fazla olmadığından emin olun."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "Ondalık ayracından önce {max_whole_digits} basamaktan fazla olmadığından emin olun."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "Datetime alanı yanlış biçimde. {format} biçimlerinden birini kullanın."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "Datetime değeri bekleniyor, ama date değeri geldi."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "Tarih biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "Date tipi beklenmekteydi, fakat datetime tipi geldi."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "Time biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "Duration biçimi yanlış. {format} biçimlerinden birini kullanın."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "\"{input}\" geçerli bir seçim değil."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "{count} elemandan daha fazla..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "Elemanların listesi beklenirken \"{input_type}\" alındı."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "Bu seçim boş bırakılmamalı."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\" geçerli bir yol seçimi değil."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "Hiçbir dosya verilmedi."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "Gönderilen veri dosya değil. Formdaki kodlama tipini kontrol edin."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "Hiçbir dosya adı belirlenemedi."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "Gönderilen dosya boş."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "Bu dosya adının en fazla {max_length} karakter uzunluğunda olduğundan emin olun. (şu anda {length} karakter)."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "Geçerli bir resim yükleyin. Yüklediğiniz dosya resim değil ya da bozuk."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "Bu liste boş olmamalı."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "Sözlük tipi bir değişken beklenirken \"{input_type}\" tipi bir değişken alındı."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "Değer geçerli bir JSON olmalı."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "Gönder"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr "Geçersiz sayfa."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "Geçersiz imleç."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "Geçersiz pk \"{pk_value}\" - obje bulunamadı."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "Hatalı tip. Pk değeri beklenirken, alınan {data_type}."
@@ -365,25 +350,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "Geçersiz hyper link - Nesne yok.."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "Hatalı tip. URL metni bekleniyor, {data_type} alındı."
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "{slug_name}={value} değerini taşıyan obje bulunamadı."
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "Geçersiz değer."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "Geçersiz veri. Bir sözlük bekleniyor, ama var {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "Filtreler"
@@ -413,27 +395,23 @@ msgstr "Hiç kimse"
msgid "No items to select."
msgstr "Seçenek yok."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "Bu alan benzersiz olmalıdır."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "{field_names} alanları benzersiz bir set yapmak gerekir."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "Bu alan \"{date_field}\" tarihine göre eşsiz olmalı."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "Bu alan \"{date_field}\" ayına göre eşsiz olmalı."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı."
@@ -441,15 +419,19 @@ msgstr "Bu alan \"{date_field}\" yılına göre eşsiz olmalı."
msgid "Invalid version in \"Accept\" header."
msgstr "\"Kabul et\" başlığında geçersiz sürümü."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URL yolu geçersiz sürümü."
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "Hostname geçersiz sürümü."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "Sorgu parametresi geçersiz sürümü."
diff --git a/rest_framework/locale/uk/LC_MESSAGES/django.mo b/rest_framework/locale/uk/LC_MESSAGES/django.mo
index 79396f543..bfcb776e7 100644
Binary files a/rest_framework/locale/uk/LC_MESSAGES/django.mo and b/rest_framework/locale/uk/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/uk/LC_MESSAGES/django.po b/rest_framework/locale/uk/LC_MESSAGES/django.po
index 0e3c82802..51909058f 100644
--- a/rest_framework/locale/uk/LC_MESSAGES/django.po
+++ b/rest_framework/locale/uk/LC_MESSAGES/django.po
@@ -3,13 +3,16 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Denis Podlesniy , 2016
+# Illarion , 2016
+# Kirill Tarasenko, 2016
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Ukrainian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,441 +20,423 @@ msgstr ""
"Language: uk\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"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
-msgstr ""
+msgstr "Недійсний основний заголовок. Облікові дані відсутні."
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
-msgstr ""
+msgstr "Недійсний основний заголовок. Облікові дані мають бути без пробілів."
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
-msgstr ""
+msgstr "Недійсний основний заголовок. Облікові дані невірно закодовані у Base64."
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
-msgstr ""
+msgstr "Недійсне iм'я користувача/пароль."
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
-msgstr ""
-
-#: authentication.py:173
-msgid "Invalid token header. No credentials provided."
-msgstr ""
+msgstr "Користувач неактивний або видалений."
#: authentication.py:176
-msgid "Invalid token header. Token string should not contain spaces."
-msgstr ""
+msgid "Invalid token header. No credentials provided."
+msgstr "Недійсний заголовок токена. Облікові дані відсутні."
-#: authentication.py:182
+#: authentication.py:179
+msgid "Invalid token header. Token string should not contain spaces."
+msgstr "Недійсний заголовок токена. Значення токена не повинне містити пробіли."
+
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
-msgstr ""
+msgstr "Недійсний заголовок токена. Значення токена не повинне містити некоректні символи."
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
-msgstr ""
+msgstr "Недійсний токен."
#: authtoken/apps.py:7
msgid "Auth Token"
-msgstr ""
+msgstr "Авторизаційний токен"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
-msgstr ""
+msgstr "Ключ"
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
-msgstr ""
+msgstr "Користувач"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
-msgstr ""
+msgstr "Створено"
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
-msgstr ""
+msgstr "Токен"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
-msgstr ""
+msgstr "Токени"
#: authtoken/serializers.py:8
msgid "Username"
-msgstr ""
+msgstr "Ім'я користувача"
#: authtoken/serializers.py:9
msgid "Password"
-msgstr ""
+msgstr "Пароль"
#: authtoken/serializers.py:20
msgid "User account is disabled."
-msgstr ""
+msgstr "Обліковий запис деактивований."
#: authtoken/serializers.py:23
msgid "Unable to log in with provided credentials."
-msgstr ""
+msgstr "Неможливо зайти з введеними даними."
#: authtoken/serializers.py:26
msgid "Must include \"username\" and \"password\"."
-msgstr ""
+msgstr "Має включати iм'я користувача та пароль"
#: exceptions.py:49
msgid "A server error occurred."
-msgstr ""
+msgstr "Помилка сервера."
#: exceptions.py:84
msgid "Malformed request."
-msgstr ""
+msgstr "Некоректний запит."
#: exceptions.py:89
msgid "Incorrect authentication credentials."
-msgstr ""
+msgstr "Некоректні реквізити перевірки достовірності."
#: exceptions.py:94
msgid "Authentication credentials were not provided."
-msgstr ""
+msgstr "Реквізити перевірки достовірності не надані."
#: exceptions.py:99
msgid "You do not have permission to perform this action."
-msgstr ""
+msgstr "У вас нема дозволу робити цю дію."
#: exceptions.py:104 views.py:81
msgid "Not found."
-msgstr ""
+msgstr "Не знайдено."
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
-msgstr ""
+msgstr "Метод \"{method}\" не дозволений."
#: exceptions.py:120
msgid "Could not satisfy the request Accept header."
-msgstr ""
+msgstr "Неможливо виконати запит прийняття заголовку."
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
-msgstr ""
+msgstr "Непідтримуваний тип даних \"{media_type}\" в запиті."
#: exceptions.py:145
msgid "Request was throttled."
-msgstr ""
+msgstr "Запит було проігноровано."
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
-msgstr ""
+msgstr "Це поле обов'язкове."
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
-msgstr ""
+msgstr "Це поле не може бути null."
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
-msgstr ""
+msgstr "\"{input}\" не є коректним бульовим значенням."
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
-msgstr ""
+msgstr "Це поле не може бути порожнім."
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
-msgstr ""
+msgstr "Переконайтесь, що кількість символів в цьому полі не перевищує {max_length}."
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
-msgstr ""
+msgstr "Переконайтесь, що в цьому полі мінімум {min_length} символів."
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
-msgstr ""
+msgstr "Введіть коректну адресу електронної пошти."
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
-msgstr ""
+msgstr "Значення не відповідає необхідному патерну."
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
-msgstr ""
+msgstr "Введіть коректний \"slug\", що складається із букв, цифр, нижніх підкреслень або дефісів. "
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
-msgstr ""
+msgstr "Введіть коректний URL."
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
-msgstr ""
+msgstr "\"{value}\" не є коректним UUID."
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
-msgstr ""
+msgstr "Введіть дійсну IPv4 або IPv6 адресу."
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
-msgstr ""
+msgstr "Необхідне цілочисельне значення."
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
-msgstr ""
+msgstr "Переконайтесь, що значення менше або дорівнює {max_value}."
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
-msgstr ""
+msgstr "Переконайтесь, що значення більше або дорівнює {min_value}."
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
-msgstr ""
+msgstr "Строкове значення занадто велике."
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
-msgstr ""
+msgstr "Необхідне чисельне значення."
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
-msgstr ""
+msgstr "Переконайтесь, що в числі не більше {max_digits} знаків."
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
-msgstr ""
+msgstr "Переконайтесь, що в числі не більше {max_decimal_places} знаків у дробовій частині."
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
-msgstr ""
+msgstr "Переконайтесь, що в числі не більше {max_whole_digits} знаків у цілій частині."
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Невірний формат дата з часом. Використайте один з цих форматів: {format}."
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
-msgstr ""
+msgstr "Очікувалась дата з часом, але було отримано дату."
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Невірний формат дати. Використайте один з цих форматів: {format}."
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
-msgstr ""
+msgstr "Очікувалась дата, але було отримано дату з часом."
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Неправильний формат часу. Використайте один з цих форматів: {format}."
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
-msgstr ""
+msgstr "Невірний формат тривалості. Використайте один з цих форматів: {format}."
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
-msgstr ""
+msgstr "\"{input}\" не є коректним вибором."
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
-msgstr ""
+msgstr "Елементів більше, ніж {count}..."
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Очікувався список елементів, але було отримано \"{input_type}\"."
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
-msgstr ""
+msgstr "Вибір не може бути порожнім."
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
-msgstr ""
+msgstr "\"{input}\" вибраний шлях не є коректним."
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
-msgstr ""
+msgstr "Файл не було відправленно."
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
-msgstr ""
+msgstr "Відправленні дані не є файл. Перевірте тип кодування у формі."
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
-msgstr ""
+msgstr "Неможливо визначити ім'я файлу."
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
-msgstr ""
+msgstr "Відправленний файл порожній."
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
-msgstr ""
+msgstr "Переконайтесь, що ім'я файлу становить менше {max_length} символів (зараз {length})."
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
-msgstr ""
+msgstr "Завантажте коректне зображення. Завантажений файл або не є зображенням, або пошкоджений."
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
-msgstr ""
+msgstr "Цей список не може бути порожнім."
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
-msgstr ""
+msgstr "Очікувався словник зі елементами, але було отримано \"{input_type}\"."
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
-msgstr ""
+msgstr "Значення повинно бути коректним JSON."
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
+msgstr "Відправити"
+
+#: filters.py:336
+msgid "ascending"
msgstr ""
-#: pagination.py:189
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
-msgstr ""
+msgstr "Недійсна сторінка."
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
-msgstr ""
+msgstr "Недійсний курсор."
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
-msgstr ""
+msgstr "Недопустимий первинний ключ \"{pk_value}\" - об'єкт не існує."
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
-msgstr ""
+msgstr "Некоректний тип. Очікувалось значення первинного ключа, отримано {data_type}."
#: relations.py:240
msgid "Invalid hyperlink - No URL match."
-msgstr ""
+msgstr "Недійсне посилання - немає збігу за URL."
#: relations.py:241
msgid "Invalid hyperlink - Incorrect URL match."
-msgstr ""
+msgstr "Недійсне посилання - некоректний збіг за URL."
#: relations.py:242
msgid "Invalid hyperlink - Object does not exist."
-msgstr ""
+msgstr "Недійсне посилання - об'єкт не існує."
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
-msgstr ""
+msgstr "Некоректний тип. Очікувався URL, отримано {data_type}."
+
+#: relations.py:401
+msgid "Object with {slug_name}={value} does not exist."
+msgstr "Об'єкт із {slug_name}={value} не існує."
#: relations.py:402
-#, python-brace-format
-msgid "Object with {slug_name}={value} does not exist."
-msgstr ""
-
-#: relations.py:403
msgid "Invalid value."
-msgstr ""
+msgstr "Недійсне значення."
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
-msgstr ""
+msgstr "Недопустимі дані. Очікувався словник, але було отримано {datatype}."
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
-msgstr ""
+msgstr "Фільтри"
#: templates/rest_framework/filters/django_filter.html:2
#: templates/rest_framework/filters/django_filter_crispyforms.html:4
msgid "Field filters"
-msgstr ""
+msgstr "Фільтри поля"
#: templates/rest_framework/filters/ordering.html:3
msgid "Ordering"
-msgstr ""
+msgstr "Впорядкування"
#: templates/rest_framework/filters/search.html:2
msgid "Search"
-msgstr ""
+msgstr "Пошук"
#: templates/rest_framework/horizontal/radio.html:2
#: templates/rest_framework/inline/radio.html:2
#: templates/rest_framework/vertical/radio.html:2
msgid "None"
-msgstr ""
+msgstr "Нічого"
#: templates/rest_framework/horizontal/select_multiple.html:2
#: templates/rest_framework/inline/select_multiple.html:2
#: templates/rest_framework/vertical/select_multiple.html:2
msgid "No items to select."
-msgstr ""
+msgstr "Немає елементів для вибору."
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
-msgstr ""
+msgstr "Це поле повинне бути унікальним."
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
-msgstr ""
+msgstr "Поля {field_names} повинні створювати унікальний масив значень."
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
-msgstr ""
+msgstr "Це поле повинне бути унікальним для дати \"{date_field}\"."
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
-msgstr ""
+msgstr "Це поле повинне бути унікальним для місяця \"{date_field}\"."
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
-msgstr ""
+msgstr "Це поле повинне бути унікальним для року \"{date_field}\"."
#: versioning.py:42
msgid "Invalid version in \"Accept\" header."
-msgstr ""
+msgstr "Недопустима версія в загаловку \"Accept\"."
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
+msgstr "Недопустима версія в шляху URL."
+
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
msgstr ""
-#: versioning.py:144
+#: versioning.py:147
msgid "Invalid version in hostname."
-msgstr ""
+msgstr "Недопустима версія в імені хоста."
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
-msgstr ""
+msgstr "Недопустима версія в параметрі запиту."
#: views.py:88
msgid "Permission denied."
-msgstr ""
+msgstr "Доступ заборонено."
diff --git a/rest_framework/locale/vi/LC_MESSAGES/django.mo b/rest_framework/locale/vi/LC_MESSAGES/django.mo
index a055d763a..578308acf 100644
Binary files a/rest_framework/locale/vi/LC_MESSAGES/django.mo and b/rest_framework/locale/vi/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/vi/LC_MESSAGES/django.po b/rest_framework/locale/vi/LC_MESSAGES/django.po
index 0f8415b51..ea43efb95 100644
--- a/rest_framework/locale/vi/LC_MESSAGES/django.po
+++ b/rest_framework/locale/vi/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Vietnamese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: vi\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo b/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo
index ecd7a91eb..5ba81a865 100644
Binary files a/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po
index 7eca9d517..c21604b42 100644
--- a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po
+++ b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Chinese (China) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,40 +20,40 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "无效的Basic认证头,没有提供认证信息。"
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "认证字符串不应该包含空格(基本认证HTTP头无效)。"
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。"
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "用户名或者密码错误。"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "用户未激活或者已删除。"
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "没有提供认证信息(认证令牌HTTP头无效)。"
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。"
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "无效的Token。Token字符串不能包含非法的字符。"
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "认证令牌无效。"
@@ -61,23 +61,23 @@ msgstr "认证令牌无效。"
msgid "Auth Token"
msgstr "认证令牌"
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr "用户"
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr "令牌"
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr "令牌"
@@ -126,7 +126,6 @@ msgid "Not found."
msgstr "未找到。"
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "方法 “{method}” 不被允许。"
@@ -135,7 +134,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "无法满足Accept HTTP头的请求。"
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "不支持请求中的媒体类型 “{media_type}”。"
@@ -143,214 +141,201 @@ msgstr "不支持请求中的媒体类型 “{media_type}”。"
msgid "Request was throttled."
msgstr "请求超过了限速。"
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "该字段是必填项。"
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "该字段不能为 null。"
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "“{input}” 不是合法的布尔值。"
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "该字段不能为空。"
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "请确保这个字段不能超过 {max_length} 个字符。"
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "请确保这个字段至少包含 {min_length} 个字符。"
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "请输入合法的邮件地址。"
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "输入值不匹配要求的模式。"
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。"
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "请输入合法的URL。"
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "“{value}”不是合法的UUID。"
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "请输入一个有效的IPv4或IPv6地址。"
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "请填写合法的整数值。"
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "请确保该值小于或者等于 {max_value}。"
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "请确保该值大于或者等于 {min_value}。"
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "字符串值太长。"
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "请填写合法的数字。"
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "请确保总计不超过 {max_digits} 个数字。"
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "请确保总计不超过 {max_decimal_places} 个小数位。"
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "请确保小数点前不超过 {max_whole_digits} 个数字。"
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "日期时间格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "期望为日期时间,得到的是日期。"
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "日期格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "期望为日期,得到的是日期时间。"
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "时间格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。"
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "“{input}” 不是合法选项。"
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "多于{count}条记录。"
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。"
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "这项选择不能为空。"
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "“{input}” 不是有效路径选项。"
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "没有提交任何文件。"
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "提交的数据不是一个文件。请检查表单的编码类型。"
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "无法检测到文件名。"
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "提交的是空文件。"
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。"
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。"
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "列表字段不能为空值。"
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。"
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "值必须是有效的 JSON 数据。"
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "保存"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "无效游标"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "无效主键 “{pk_value}” - 对象不存在。"
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "类型错误。期望为主键,得到的类型为 {data_type}。"
@@ -367,25 +352,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "无效超链接 -对象不存在。"
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。"
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "属性 {slug_name} 为 {value} 的对象不存在。"
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "无效值。"
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "无效数据。期待为字典类型,得到的是 {datatype} 。"
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "过滤器"
@@ -415,27 +397,23 @@ msgstr "无"
msgid "No items to select."
msgstr "没有可选项。"
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "该字段必须唯一。"
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "字段 {field_names} 必须能构成唯一集合。"
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "该字段必须在日期 “{date_field}” 唯一。"
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "该字段必须在月份 “{date_field}” 唯一。"
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "该字段必须在年 “{date_field}” 唯一。"
@@ -443,15 +421,19 @@ msgstr "该字段必须在年 “{date_field}” 唯一。"
msgid "Invalid version in \"Accept\" header."
msgstr "“Accept” HTTP头包含无效版本。"
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URL路径包含无效版本。"
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "主机名包含无效版本。"
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "请求参数里包含无效版本。"
diff --git a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo
index cffdae362..396aded07 100644
Binary files a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po
index 8a0f67382..9f5cd24f1 100644
--- a/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/rest_framework/locale/zh_Hans/LC_MESSAGES/django.po
@@ -3,16 +3,16 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Ping , 2015
+# cokky , 2015
# hunter007 , 2015
# nypisces , 2015
msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Chinese Simplified (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh-Hans/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,40 +20,40 @@ msgstr ""
"Language: zh-Hans\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr "无效的Basic认证头,没有提供认证信息。"
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr "认证字符串不应该包含空格(基本认证HTTP头无效)。"
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。"
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr "用户名或者密码错误。"
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr "用户未激活或者已删除。"
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr "没有提供认证信息(认证令牌HTTP头无效)。"
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。"
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr "无效的Token。Token字符串不能包含非法的字符。"
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr "认证令牌无效。"
@@ -61,23 +61,23 @@ msgstr "认证令牌无效。"
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -126,7 +126,6 @@ msgid "Not found."
msgstr "未找到。"
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr "方法 “{method}” 不被允许。"
@@ -135,7 +134,6 @@ msgid "Could not satisfy the request Accept header."
msgstr "无法满足Accept HTTP头的请求。"
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr "不支持请求中的媒体类型 “{media_type}”。"
@@ -143,214 +141,201 @@ msgstr "不支持请求中的媒体类型 “{media_type}”。"
msgid "Request was throttled."
msgstr "请求超过了限速。"
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr "该字段是必填项。"
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr "该字段不能为 null。"
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr "“{input}” 不是合法的布尔值。"
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr "该字段不能为空。"
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr "请确保这个字段不能超过 {max_length} 个字符。"
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr "请确保这个字段至少包含 {min_length} 个字符。"
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr "请输入合法的邮件地址。"
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr "输入值不匹配要求的模式。"
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。"
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr "请输入合法的URL。"
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr "“{value}”不是合法的UUID。"
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr "请输入一个有效的IPv4或IPv6地址。"
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr "请填写合法的整数值。"
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr "请确保该值小于或者等于 {max_value}。"
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr "请确保该值大于或者等于 {min_value}。"
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr "字符串值太长。"
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr "请填写合法的数字。"
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr "请确保总计不超过 {max_digits} 个数字。"
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr "请确保总计不超过 {max_decimal_places} 个小数位。"
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr "请确保小数点前不超过 {max_whole_digits} 个数字。"
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr "日期时间格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr "期望为日期时间,获得的是日期。"
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr "日期格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr "期望为日期,获得的是日期时间。"
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr "时间格式错误。请从这些格式中选择:{format}。"
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。"
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr "“{input}” 不是合法选项。"
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr "多于{count}条记录。"
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。"
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr "这项选择不能为空。"
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr "\"{input}\"不是一个有效路径选项。"
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr "没有提交任何文件。"
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr "提交的数据不是一个文件。请检查表单的编码类型。"
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr "无法检测到文件名。"
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr "提交的是空文件。"
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。"
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。"
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr "列表不能为空。"
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。"
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr "值必须是有效的 JSON 数据。"
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr "提交"
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr "无效游标"
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr "无效主键 “{pk_value}” - 对象不存在。"
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr "类型错误。期望为主键,获得的类型为 {data_type}。"
@@ -367,25 +352,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr "无效超链接 -对象不存在。"
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。"
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr "属性 {slug_name} 为 {value} 的对象不存在。"
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr "无效值。"
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr "无效数据。期待为字典类型,得到的是 {datatype} 。"
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr "过滤器"
@@ -415,27 +397,23 @@ msgstr "无"
msgid "No items to select."
msgstr "没有可选项。"
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr "该字段必须唯一。"
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr "字段 {field_names} 必须能构成唯一集合。"
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr "该字段必须在日期 “{date_field}” 唯一。"
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr "该字段必须在月份 “{date_field}” 唯一。"
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr "该字段必须在年 “{date_field}” 唯一。"
@@ -443,15 +421,19 @@ msgstr "该字段必须在年 “{date_field}” 唯一。"
msgid "Invalid version in \"Accept\" header."
msgstr "“Accept” HTTP头包含无效版本。"
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr "URL路径包含无效版本。"
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr "主机名包含无效版本。"
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr "请求参数里包含无效版本。"
diff --git a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo
index d33604524..08954cc4b 100644
Binary files a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po
index ea6a45312..1960f1f5d 100644
--- a/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/rest_framework/locale/zh_Hant/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Chinese Traditional (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh-Hant/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: zh-Hant\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo b/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo
index 6371fcea7..b3158f9eb 100644
Binary files a/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo and b/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo differ
diff --git a/rest_framework/locale/zh_TW/LC_MESSAGES/django.po b/rest_framework/locale/zh_TW/LC_MESSAGES/django.po
index 8858ce17c..9bfb23c6b 100644
--- a/rest_framework/locale/zh_TW/LC_MESSAGES/django.po
+++ b/rest_framework/locale/zh_TW/LC_MESSAGES/django.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Django REST framework\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-01 18:38+0100\n"
-"PO-Revision-Date: 2016-03-01 17:38+0000\n"
-"Last-Translator: Xavier Ordoquy \n"
+"POT-Creation-Date: 2016-07-12 16:13+0100\n"
+"PO-Revision-Date: 2016-07-12 15:14+0000\n"
+"Last-Translator: Thomas Christie \n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,40 +17,40 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentication.py:71
+#: authentication.py:73
msgid "Invalid basic header. No credentials provided."
msgstr ""
-#: authentication.py:74
+#: authentication.py:76
msgid "Invalid basic header. Credentials string should not contain spaces."
msgstr ""
-#: authentication.py:80
+#: authentication.py:82
msgid "Invalid basic header. Credentials not correctly base64 encoded."
msgstr ""
-#: authentication.py:97
+#: authentication.py:99
msgid "Invalid username/password."
msgstr ""
-#: authentication.py:100 authentication.py:195
+#: authentication.py:102 authentication.py:198
msgid "User inactive or deleted."
msgstr ""
-#: authentication.py:173
+#: authentication.py:176
msgid "Invalid token header. No credentials provided."
msgstr ""
-#: authentication.py:176
+#: authentication.py:179
msgid "Invalid token header. Token string should not contain spaces."
msgstr ""
-#: authentication.py:182
+#: authentication.py:185
msgid ""
"Invalid token header. Token string should not contain invalid characters."
msgstr ""
-#: authentication.py:192
+#: authentication.py:195
msgid "Invalid token."
msgstr ""
@@ -58,23 +58,23 @@ msgstr ""
msgid "Auth Token"
msgstr ""
-#: authtoken/models.py:21
+#: authtoken/models.py:15
msgid "Key"
msgstr ""
-#: authtoken/models.py:23
+#: authtoken/models.py:18
msgid "User"
msgstr ""
-#: authtoken/models.py:24
+#: authtoken/models.py:20
msgid "Created"
msgstr ""
-#: authtoken/models.py:33
+#: authtoken/models.py:29
msgid "Token"
msgstr ""
-#: authtoken/models.py:34
+#: authtoken/models.py:30
msgid "Tokens"
msgstr ""
@@ -123,7 +123,6 @@ msgid "Not found."
msgstr ""
#: exceptions.py:109
-#, python-brace-format
msgid "Method \"{method}\" not allowed."
msgstr ""
@@ -132,7 +131,6 @@ msgid "Could not satisfy the request Accept header."
msgstr ""
#: exceptions.py:132
-#, python-brace-format
msgid "Unsupported media type \"{media_type}\" in request."
msgstr ""
@@ -140,214 +138,201 @@ msgstr ""
msgid "Request was throttled."
msgstr ""
-#: fields.py:266 relations.py:206 relations.py:239 validators.py:79
-#: validators.py:162
+#: fields.py:269 relations.py:206 relations.py:239 validators.py:98
+#: validators.py:181
msgid "This field is required."
msgstr ""
-#: fields.py:267
+#: fields.py:270
msgid "This field may not be null."
msgstr ""
-#: fields.py:603 fields.py:634
-#, python-brace-format
+#: fields.py:608 fields.py:639
msgid "\"{input}\" is not a valid boolean."
msgstr ""
-#: fields.py:669
+#: fields.py:674
msgid "This field may not be blank."
msgstr ""
-#: fields.py:670 fields.py:1664
-#, python-brace-format
+#: fields.py:675 fields.py:1675
msgid "Ensure this field has no more than {max_length} characters."
msgstr ""
-#: fields.py:671
-#, python-brace-format
+#: fields.py:676
msgid "Ensure this field has at least {min_length} characters."
msgstr ""
-#: fields.py:708
+#: fields.py:713
msgid "Enter a valid email address."
msgstr ""
-#: fields.py:719
+#: fields.py:724
msgid "This value does not match the required pattern."
msgstr ""
-#: fields.py:730
+#: fields.py:735
msgid ""
"Enter a valid \"slug\" consisting of letters, numbers, underscores or "
"hyphens."
msgstr ""
-#: fields.py:742
+#: fields.py:747
msgid "Enter a valid URL."
msgstr ""
-#: fields.py:755
-#, python-brace-format
+#: fields.py:760
msgid "\"{value}\" is not a valid UUID."
msgstr ""
-#: fields.py:791
+#: fields.py:796
msgid "Enter a valid IPv4 or IPv6 address."
msgstr ""
-#: fields.py:816
+#: fields.py:821
msgid "A valid integer is required."
msgstr ""
-#: fields.py:817 fields.py:852 fields.py:885
-#, python-brace-format
+#: fields.py:822 fields.py:857 fields.py:891
msgid "Ensure this value is less than or equal to {max_value}."
msgstr ""
-#: fields.py:818 fields.py:853 fields.py:886
-#, python-brace-format
+#: fields.py:823 fields.py:858 fields.py:892
msgid "Ensure this value is greater than or equal to {min_value}."
msgstr ""
-#: fields.py:819 fields.py:854 fields.py:890
+#: fields.py:824 fields.py:859 fields.py:896
msgid "String value too large."
msgstr ""
-#: fields.py:851 fields.py:884
+#: fields.py:856 fields.py:890
msgid "A valid number is required."
msgstr ""
-#: fields.py:887
-#, python-brace-format
+#: fields.py:893
msgid "Ensure that there are no more than {max_digits} digits in total."
msgstr ""
-#: fields.py:888
-#, python-brace-format
+#: fields.py:894
msgid ""
"Ensure that there are no more than {max_decimal_places} decimal places."
msgstr ""
-#: fields.py:889
-#, python-brace-format
+#: fields.py:895
msgid ""
"Ensure that there are no more than {max_whole_digits} digits before the "
"decimal point."
msgstr ""
-#: fields.py:1004
-#, python-brace-format
+#: fields.py:1025
msgid "Datetime has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1005
+#: fields.py:1026
msgid "Expected a datetime but got a date."
msgstr ""
-#: fields.py:1082
-#, python-brace-format
+#: fields.py:1103
msgid "Date has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1083
+#: fields.py:1104
msgid "Expected a date but got a datetime."
msgstr ""
-#: fields.py:1151
-#, python-brace-format
+#: fields.py:1170
msgid "Time has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1215
-#, python-brace-format
+#: fields.py:1232
msgid "Duration has wrong format. Use one of these formats instead: {format}."
msgstr ""
-#: fields.py:1240 fields.py:1289
-#, python-brace-format
+#: fields.py:1251 fields.py:1300
msgid "\"{input}\" is not a valid choice."
msgstr ""
-#: fields.py:1243 relations.py:71 relations.py:442
-#, python-brace-format
+#: fields.py:1254 relations.py:71 relations.py:441
msgid "More than {count} items..."
msgstr ""
-#: fields.py:1290 fields.py:1437 relations.py:438 serializers.py:520
-#, python-brace-format
+#: fields.py:1301 fields.py:1448 relations.py:437 serializers.py:524
msgid "Expected a list of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1291
+#: fields.py:1302
msgid "This selection may not be empty."
msgstr ""
-#: fields.py:1328
-#, python-brace-format
+#: fields.py:1339
msgid "\"{input}\" is not a valid path choice."
msgstr ""
-#: fields.py:1347
+#: fields.py:1358
msgid "No file was submitted."
msgstr ""
-#: fields.py:1348
+#: fields.py:1359
msgid ""
"The submitted data was not a file. Check the encoding type on the form."
msgstr ""
-#: fields.py:1349
+#: fields.py:1360
msgid "No filename could be determined."
msgstr ""
-#: fields.py:1350
+#: fields.py:1361
msgid "The submitted file is empty."
msgstr ""
-#: fields.py:1351
-#, python-brace-format
+#: fields.py:1362
msgid ""
"Ensure this filename has at most {max_length} characters (it has {length})."
msgstr ""
-#: fields.py:1399
+#: fields.py:1410
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-#: fields.py:1438 relations.py:439 serializers.py:521
+#: fields.py:1449 relations.py:438 serializers.py:525
msgid "This list may not be empty."
msgstr ""
-#: fields.py:1491
-#, python-brace-format
+#: fields.py:1502
msgid "Expected a dictionary of items but got type \"{input_type}\"."
msgstr ""
-#: fields.py:1538
+#: fields.py:1549
msgid "Value must be valid JSON."
msgstr ""
-#: filters.py:35 templates/rest_framework/filters/django_filter.html.py:5
+#: filters.py:36 templates/rest_framework/filters/django_filter.html:5
msgid "Submit"
msgstr ""
-#: pagination.py:189
+#: filters.py:336
+msgid "ascending"
+msgstr ""
+
+#: filters.py:337
+msgid "descending"
+msgstr ""
+
+#: pagination.py:193
msgid "Invalid page."
msgstr ""
-#: pagination.py:407
+#: pagination.py:427
msgid "Invalid cursor"
msgstr ""
#: relations.py:207
-#, python-brace-format
msgid "Invalid pk \"{pk_value}\" - object does not exist."
msgstr ""
#: relations.py:208
-#, python-brace-format
msgid "Incorrect type. Expected pk value, received {data_type}."
msgstr ""
@@ -364,25 +349,22 @@ msgid "Invalid hyperlink - Object does not exist."
msgstr ""
#: relations.py:243
-#, python-brace-format
msgid "Incorrect type. Expected URL string, received {data_type}."
msgstr ""
-#: relations.py:402
-#, python-brace-format
+#: relations.py:401
msgid "Object with {slug_name}={value} does not exist."
msgstr ""
-#: relations.py:403
+#: relations.py:402
msgid "Invalid value."
msgstr ""
#: serializers.py:326
-#, python-brace-format
msgid "Invalid data. Expected a dictionary, but got {datatype}."
msgstr ""
-#: templates/rest_framework/admin.html:118
+#: templates/rest_framework/admin.html:116
#: templates/rest_framework/base.html:128
msgid "Filters"
msgstr ""
@@ -412,27 +394,23 @@ msgstr ""
msgid "No items to select."
msgstr ""
-#: validators.py:24
+#: validators.py:43
msgid "This field must be unique."
msgstr ""
-#: validators.py:78
-#, python-brace-format
+#: validators.py:97
msgid "The fields {field_names} must make a unique set."
msgstr ""
-#: validators.py:226
-#, python-brace-format
+#: validators.py:245
msgid "This field must be unique for the \"{date_field}\" date."
msgstr ""
-#: validators.py:241
-#, python-brace-format
+#: validators.py:260
msgid "This field must be unique for the \"{date_field}\" month."
msgstr ""
-#: validators.py:254
-#, python-brace-format
+#: validators.py:273
msgid "This field must be unique for the \"{date_field}\" year."
msgstr ""
@@ -440,15 +418,19 @@ msgstr ""
msgid "Invalid version in \"Accept\" header."
msgstr ""
-#: versioning.py:73 versioning.py:115
+#: versioning.py:73
msgid "Invalid version in URL path."
msgstr ""
-#: versioning.py:144
+#: versioning.py:115
+msgid "Invalid version in URL path. Does not match any version namespace."
+msgstr ""
+
+#: versioning.py:147
msgid "Invalid version in hostname."
msgstr ""
-#: versioning.py:166
+#: versioning.py:169
msgid "Invalid version in query parameter."
msgstr ""
diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py
index 153a77d33..6ad10d860 100644
--- a/rest_framework/pagination.py
+++ b/rest_framework/pagination.py
@@ -157,6 +157,9 @@ class BasePagination(object):
def get_results(self, data):
return data['results']
+ def get_fields(self, view):
+ return []
+
class PageNumberPagination(BasePagination):
"""
@@ -280,6 +283,11 @@ class PageNumberPagination(BasePagination):
context = self.get_html_context()
return template_render(template, context)
+ def get_fields(self, view):
+ if self.page_size_query_param is None:
+ return [self.page_query_param]
+ return [self.page_query_param, self.page_size_query_param]
+
class LimitOffsetPagination(BasePagination):
"""
@@ -319,6 +327,7 @@ class LimitOffsetPagination(BasePagination):
try:
return _positive_int(
request.query_params[self.limit_query_param],
+ strict=True,
cutoff=self.max_limit
)
except (KeyError, ValueError):
@@ -403,10 +412,13 @@ class LimitOffsetPagination(BasePagination):
context = self.get_html_context()
return template_render(template, context)
+ def get_fields(self, view):
+ return [self.limit_query_param, self.offset_query_param]
+
class CursorPagination(BasePagination):
"""
- The cursor pagination implementation is neccessarily complex.
+ The cursor pagination implementation is necessarily complex.
For an overview of the position/offset style we use, see this post:
http://cramer.io/2011/03/08/building-cursors-for-the-disqus-api
"""
@@ -416,6 +428,12 @@ class CursorPagination(BasePagination):
ordering = '-created'
template = 'rest_framework/pagination/previous_and_next.html'
+ # The offset in the cursor is used in situations where we have a
+ # nearly-unique index. (Eg millisecond precision creation timestamps)
+ # We guard against malicious users attempting to cause expensive database
+ # queries, by having a hard cap on the maximum possible size of the offset.
+ offset_cutoff = 1000
+
def paginate_queryset(self, queryset, request, view=None):
self.page_size = self.get_page_size(request)
if not self.page_size:
@@ -646,18 +664,12 @@ class CursorPagination(BasePagination):
if encoded is None:
return None
- # The offset in the cursor is used in situations where we have a
- # nearly-unique index. (Eg millisecond precision creation timestamps)
- # We guard against malicious users attempting to cause expensive database
- # queries, by having a hard cap on the maximum possible size of the offset.
- OFFSET_CUTOFF = 1000
-
try:
querystring = b64decode(encoded.encode('ascii')).decode('ascii')
tokens = urlparse.parse_qs(querystring, keep_blank_values=True)
offset = tokens.get('o', ['0'])[0]
- offset = _positive_int(offset, cutoff=OFFSET_CUTOFF)
+ offset = _positive_int(offset, cutoff=self.offset_cutoff)
reverse = tokens.get('r', ['0'])[0]
reverse = bool(int(reverse))
@@ -705,3 +717,6 @@ class CursorPagination(BasePagination):
template = loader.get_template(self.template)
context = self.get_html_context()
return template_render(template, context)
+
+ def get_fields(self, view):
+ return [self.cursor_query_param]
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py
index 264f7ac3b..e313998d1 100644
--- a/rest_framework/renderers.py
+++ b/rest_framework/renderers.py
@@ -22,7 +22,8 @@ from django.utils import six
from rest_framework import VERSION, exceptions, serializers, status
from rest_framework.compat import (
- INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, template_render
+ INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi,
+ template_render
)
from rest_framework.exceptions import ParseError
from rest_framework.request import is_form_media_type, override_method
@@ -472,31 +473,37 @@ class BrowsableAPIRenderer(BaseRenderer):
return
if existing_serializer is not None:
- serializer = existing_serializer
- else:
- if has_serializer:
- if method in ('PUT', 'PATCH'):
- serializer = view.get_serializer(instance=instance, **kwargs)
- else:
- serializer = view.get_serializer(**kwargs)
+ try:
+ return self.render_form_for_serializer(existing_serializer)
+ except TypeError:
+ pass
+
+ if has_serializer:
+ if method in ('PUT', 'PATCH'):
+ serializer = view.get_serializer(instance=instance, **kwargs)
else:
- # at this point we must have a serializer_class
- if method in ('PUT', 'PATCH'):
- serializer = self._get_serializer(view.serializer_class, view,
- request, instance=instance, **kwargs)
- else:
- serializer = self._get_serializer(view.serializer_class, view,
- request, **kwargs)
+ serializer = view.get_serializer(**kwargs)
+ else:
+ # at this point we must have a serializer_class
+ if method in ('PUT', 'PATCH'):
+ serializer = self._get_serializer(view.serializer_class, view,
+ request, instance=instance, **kwargs)
+ else:
+ serializer = self._get_serializer(view.serializer_class, view,
+ request, **kwargs)
- if hasattr(serializer, 'initial_data'):
- serializer.is_valid()
+ return self.render_form_for_serializer(serializer)
- form_renderer = self.form_renderer_class()
- return form_renderer.render(
- serializer.data,
- self.accepted_media_type,
- {'style': {'template_pack': 'rest_framework/horizontal'}}
- )
+ def render_form_for_serializer(self, serializer):
+ if hasattr(serializer, 'initial_data'):
+ serializer.is_valid()
+
+ form_renderer = self.form_renderer_class()
+ return form_renderer.render(
+ serializer.data,
+ self.accepted_media_type,
+ {'style': {'template_pack': 'rest_framework/horizontal'}}
+ )
def get_raw_data_form(self, data, view, method, request):
"""
@@ -784,3 +791,17 @@ class MultiPartRenderer(BaseRenderer):
"test case." % key
)
return encode_multipart(self.BOUNDARY, data)
+
+
+class CoreJSONRenderer(BaseRenderer):
+ media_type = 'application/vnd.coreapi+json'
+ charset = None
+ format = 'corejson'
+
+ def __init__(self):
+ assert coreapi, 'Using CoreJSONRenderer, but `coreapi` is not installed.'
+
+ def render(self, data, media_type=None, renderer_context=None):
+ indent = bool(renderer_context.get('indent', 0))
+ codec = coreapi.codecs.CoreJSONCodec()
+ return codec.dump(data, indent=indent)
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 0e97668eb..ab8aff114 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -51,14 +51,13 @@ class Response(SimpleTemplateResponse):
@property
def rendered_content(self):
renderer = getattr(self, 'accepted_renderer', None)
- media_type = getattr(self, 'accepted_media_type', None)
context = getattr(self, 'renderer_context', None)
assert renderer, ".accepted_renderer not set on Response"
- assert media_type, ".accepted_media_type not set on Response"
assert context, ".renderer_context not set on Response"
context['response'] = self
+ media_type = renderer.media_type
charset = renderer.charset
content_type = self.content_type
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
index 027a78cc1..69d73e842 100644
--- a/rest_framework/routers.py
+++ b/rest_framework/routers.py
@@ -22,9 +22,11 @@ from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch
-from rest_framework import views
+from rest_framework import exceptions, renderers, views
from rest_framework.response import Response
from rest_framework.reverse import reverse
+from rest_framework.schemas import SchemaGenerator
+from rest_framework.settings import api_settings
from rest_framework.urlpatterns import format_suffix_patterns
Route = namedtuple('Route', ['url', 'mapping', 'name', 'initkwargs'])
@@ -144,7 +146,9 @@ class SimpleRouter(BaseRouter):
Returns a list of the Route namedtuple.
"""
- known_actions = flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)])
+ # converting to list as iterables are good for one pass, known host needs to be checked again and again for
+ # different functions.
+ known_actions = list(flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)]))
# Determine any `@detail_route` or `@list_route` decorated methods on the viewset
detail_routes = []
@@ -154,6 +158,7 @@ class SimpleRouter(BaseRouter):
httpmethods = getattr(attr, 'bind_to_methods', None)
detail = getattr(attr, 'detail', True)
if httpmethods:
+ # checking method names against the known actions list
if methodname in known_actions:
raise ImproperlyConfigured('Cannot use @detail_route or @list_route '
'decorators on method "%s" '
@@ -252,6 +257,7 @@ class SimpleRouter(BaseRouter):
lookup=lookup,
trailing_slash=self.trailing_slash
)
+
view = viewset.as_view(mapping, **route.initkwargs)
name = route.name.format(basename=basename)
ret.append(url(regex, view, name=name))
@@ -267,8 +273,14 @@ class DefaultRouter(SimpleRouter):
include_root_view = True
include_format_suffixes = True
root_view_name = 'api-root'
+ default_schema_renderers = [renderers.CoreJSONRenderer]
- def get_api_root_view(self):
+ def __init__(self, *args, **kwargs):
+ self.schema_title = kwargs.pop('schema_title', None)
+ self.schema_renderers = kwargs.pop('schema_renderers', self.default_schema_renderers)
+ super(DefaultRouter, self).__init__(*args, **kwargs)
+
+ def get_api_root_view(self, schema_urls=None):
"""
Return a view to use as the API root.
"""
@@ -277,10 +289,33 @@ class DefaultRouter(SimpleRouter):
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
+ view_renderers = list(api_settings.DEFAULT_RENDERER_CLASSES)
+ schema_media_types = []
+
+ if schema_urls and self.schema_title:
+ view_renderers += list(self.schema_renderers)
+ schema_generator = SchemaGenerator(
+ title=self.schema_title,
+ patterns=schema_urls
+ )
+ schema_media_types = [
+ renderer.media_type
+ for renderer in self.schema_renderers
+ ]
+
class APIRoot(views.APIView):
_ignore_model_permissions = True
+ renderer_classes = view_renderers
def get(self, request, *args, **kwargs):
+ if request.accepted_renderer.media_type in schema_media_types:
+ # Return a schema response.
+ schema = schema_generator.get_schema(request)
+ if schema is None:
+ raise exceptions.PermissionDenied()
+ return Response(schema)
+
+ # Return a plain {"name": "hyperlink"} response.
ret = OrderedDict()
namespace = request.resolver_match.namespace
for key, url_name in api_root_dict.items():
@@ -307,15 +342,13 @@ class DefaultRouter(SimpleRouter):
Generate the list of URL patterns, including a default root view
for the API, and appending `.json` style format suffixes.
"""
- urls = []
+ urls = super(DefaultRouter, self).get_urls()
if self.include_root_view:
- root_url = url(r'^$', self.get_api_root_view(), name=self.root_view_name)
+ view = self.get_api_root_view(schema_urls=urls)
+ root_url = url(r'^$', view, name=self.root_view_name)
urls.append(root_url)
- default_urls = super(DefaultRouter, self).get_urls()
- urls.extend(default_urls)
-
if self.include_format_suffixes:
urls = format_suffix_patterns(urls)
diff --git a/rest_framework/schemas.py b/rest_framework/schemas.py
new file mode 100644
index 000000000..cf84aca74
--- /dev/null
+++ b/rest_framework/schemas.py
@@ -0,0 +1,300 @@
+from importlib import import_module
+
+from django.conf import settings
+from django.contrib.admindocs.views import simplify_regex
+from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+from django.utils import six
+
+from rest_framework import exceptions, serializers
+from rest_framework.compat import coreapi, uritemplate
+from rest_framework.request import clone_request
+from rest_framework.views import APIView
+
+
+def as_query_fields(items):
+ """
+ Take a list of Fields and plain strings.
+ Convert any pain strings into `location='query'` Field instances.
+ """
+ return [
+ item if isinstance(item, coreapi.Field) else coreapi.Field(name=item, required=False, location='query')
+ for item in items
+ ]
+
+
+def is_api_view(callback):
+ """
+ Return `True` if the given view callback is a REST framework view/viewset.
+ """
+ cls = getattr(callback, 'cls', None)
+ return (cls is not None) and issubclass(cls, APIView)
+
+
+def insert_into(target, keys, item):
+ """
+ Insert `item` into the nested dictionary `target`.
+
+ For example:
+
+ target = {}
+ insert_into(target, ('users', 'list'), Link(...))
+ insert_into(target, ('users', 'detail'), Link(...))
+ assert target == {'users': {'list': Link(...), 'detail': Link(...)}}
+ """
+ for key in keys[:1]:
+ if key not in target:
+ target[key] = {}
+ target = target[key]
+ target[keys[-1]] = item
+
+
+class SchemaGenerator(object):
+ default_mapping = {
+ 'get': 'read',
+ 'post': 'create',
+ 'put': 'update',
+ 'patch': 'partial_update',
+ 'delete': 'destroy',
+ }
+
+ def __init__(self, title=None, patterns=None, urlconf=None):
+ assert coreapi, '`coreapi` must be installed for schema support.'
+
+ if patterns is None and urlconf is not None:
+ if isinstance(urlconf, six.string_types):
+ urls = import_module(urlconf)
+ else:
+ urls = urlconf
+ patterns = urls.urlpatterns
+ elif patterns is None and urlconf is None:
+ urls = import_module(settings.ROOT_URLCONF)
+ patterns = urls.urlpatterns
+
+ self.title = title
+ self.endpoints = self.get_api_endpoints(patterns)
+
+ def get_schema(self, request=None):
+ if request is None:
+ endpoints = self.endpoints
+ else:
+ # Filter the list of endpoints to only include those that
+ # the user has permission on.
+ endpoints = []
+ for key, link, callback in self.endpoints:
+ method = link.action.upper()
+ view = callback.cls()
+ view.request = clone_request(request, method)
+ try:
+ view.check_permissions(view.request)
+ except exceptions.APIException:
+ pass
+ else:
+ endpoints.append((key, link, callback))
+
+ if not endpoints:
+ return None
+
+ # Generate the schema content structure, from the endpoints.
+ # ('users', 'list'), Link -> {'users': {'list': Link()}}
+ content = {}
+ for key, link, callback in endpoints:
+ insert_into(content, key, link)
+
+ # Return the schema document.
+ return coreapi.Document(title=self.title, content=content)
+
+ def get_api_endpoints(self, patterns, prefix=''):
+ """
+ Return a list of all available API endpoints by inspecting the URL conf.
+ """
+ api_endpoints = []
+
+ for pattern in patterns:
+ path_regex = prefix + pattern.regex.pattern
+
+ if isinstance(pattern, RegexURLPattern):
+ path = self.get_path(path_regex)
+ callback = pattern.callback
+ if self.should_include_endpoint(path, callback):
+ for method in self.get_allowed_methods(callback):
+ key = self.get_key(path, method, callback)
+ link = self.get_link(path, method, callback)
+ endpoint = (key, link, callback)
+ api_endpoints.append(endpoint)
+
+ elif isinstance(pattern, RegexURLResolver):
+ nested_endpoints = self.get_api_endpoints(
+ patterns=pattern.url_patterns,
+ prefix=path_regex
+ )
+ api_endpoints.extend(nested_endpoints)
+
+ return api_endpoints
+
+ def get_path(self, path_regex):
+ """
+ Given a URL conf regex, return a URI template string.
+ """
+ path = simplify_regex(path_regex)
+ path = path.replace('<', '{').replace('>', '}')
+ return path
+
+ def should_include_endpoint(self, path, callback):
+ """
+ Return `True` if the given endpoint should be included.
+ """
+ if not is_api_view(callback):
+ return False # Ignore anything except REST framework views.
+
+ if path.endswith('.{format}') or path.endswith('.{format}/'):
+ return False # Ignore .json style URLs.
+
+ if path == '/':
+ return False # Ignore the root endpoint.
+
+ return True
+
+ def get_allowed_methods(self, callback):
+ """
+ Return a list of the valid HTTP methods for this endpoint.
+ """
+ if hasattr(callback, 'actions'):
+ return [method.upper() for method in callback.actions.keys()]
+
+ return [
+ method for method in
+ callback.cls().allowed_methods if method != 'OPTIONS'
+ ]
+
+ def get_key(self, path, method, callback):
+ """
+ Return a tuple of strings, indicating the identity to use for a
+ given endpoint. eg. ('users', 'list').
+ """
+ category = None
+ for item in path.strip('/').split('/'):
+ if '{' in item:
+ break
+ category = item
+
+ actions = getattr(callback, 'actions', self.default_mapping)
+ action = actions[method.lower()]
+
+ if category:
+ return (category, action)
+ return (action,)
+
+ # Methods for generating each individual `Link` instance...
+
+ def get_link(self, path, method, callback):
+ """
+ Return a `coreapi.Link` instance for the given endpoint.
+ """
+ view = callback.cls()
+
+ fields = self.get_path_fields(path, method, callback, view)
+ fields += self.get_serializer_fields(path, method, callback, view)
+ fields += self.get_pagination_fields(path, method, callback, view)
+ fields += self.get_filter_fields(path, method, callback, view)
+
+ if fields and any([field.location in ('form', 'body') for field in fields]):
+ encoding = self.get_encoding(path, method, callback, view)
+ else:
+ encoding = None
+
+ return coreapi.Link(
+ url=path,
+ action=method.lower(),
+ encoding=encoding,
+ fields=fields
+ )
+
+ def get_encoding(self, path, method, callback, view):
+ """
+ Return the 'encoding' parameter to use for a given endpoint.
+ """
+ # Core API supports the following request encodings over HTTP...
+ supported_media_types = set((
+ 'application/json',
+ 'application/x-www-form-urlencoded',
+ 'multipart/form-data',
+ ))
+ parser_classes = getattr(view, 'parser_classes', [])
+ for parser_class in parser_classes:
+ media_type = getattr(parser_class, 'media_type', None)
+ if media_type in supported_media_types:
+ return media_type
+ # Raw binary uploads are supported with "application/octet-stream"
+ if media_type == '*/*':
+ return 'application/octet-stream'
+
+ return None
+
+ def get_path_fields(self, path, method, callback, view):
+ """
+ Return a list of `coreapi.Field` instances corresponding to any
+ templated path variables.
+ """
+ fields = []
+
+ for variable in uritemplate.variables(path):
+ field = coreapi.Field(name=variable, location='path', required=True)
+ fields.append(field)
+
+ return fields
+
+ def get_serializer_fields(self, path, method, callback, view):
+ """
+ Return a list of `coreapi.Field` instances corresponding to any
+ request body input, as determined by the serializer class.
+ """
+ if method not in ('PUT', 'PATCH', 'POST'):
+ return []
+
+ fields = []
+
+ serializer_class = view.get_serializer_class()
+ serializer = serializer_class()
+
+ if isinstance(serializer, serializers.ListSerializer):
+ return coreapi.Field(name='data', location='body', required=True)
+
+ if not isinstance(serializer, serializers.Serializer):
+ return []
+
+ for field in serializer.fields.values():
+ if field.read_only:
+ continue
+ required = field.required and method != 'PATCH'
+ field = coreapi.Field(name=field.source, location='form', required=required)
+ fields.append(field)
+
+ return fields
+
+ def get_pagination_fields(self, path, method, callback, view):
+ if method != 'GET':
+ return []
+
+ if hasattr(callback, 'actions') and ('list' not in callback.actions.values()):
+ return []
+
+ if not hasattr(view, 'pagination_class'):
+ return []
+
+ paginator = view.pagination_class()
+ return as_query_fields(paginator.get_fields(view))
+
+ def get_filter_fields(self, path, method, callback, view):
+ if method != 'GET':
+ return []
+
+ if hasattr(callback, 'actions') and ('list' not in callback.actions.values()):
+ return []
+
+ if not hasattr(view, 'filter_backends'):
+ return []
+
+ fields = []
+ for filter_backend in view.filter_backends:
+ fields += as_query_fields(filter_backend().get_fields(view))
+ return fields
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 698730f53..8c39202f4 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -667,6 +667,28 @@ class ListSerializer(BaseSerializer):
return self.instance
+ def is_valid(self, raise_exception=False):
+ # This implementation is the same as the default,
+ # except that we use lists, rather than dicts, as the empty case.
+ assert hasattr(self, 'initial_data'), (
+ 'Cannot call `.is_valid()` as no `data=` keyword argument was '
+ 'passed when instantiating the serializer instance.'
+ )
+
+ if not hasattr(self, '_validated_data'):
+ try:
+ self._validated_data = self.run_validation(self.initial_data)
+ except ValidationError as exc:
+ self._validated_data = []
+ self._errors = exc.detail
+ else:
+ self._errors = []
+
+ if self._errors and raise_exception:
+ raise ValidationError(self.errors)
+
+ return not bool(self._errors)
+
def __repr__(self):
return unicode_to_repr(representation.list_repr(self, indent=1))
@@ -991,12 +1013,12 @@ class ModelSerializer(Serializer):
if fields is None and exclude is None:
warnings.warn(
"Creating a ModelSerializer without either the 'fields' "
- "attribute or the 'exclude' attribute is pending deprecation "
+ "attribute or the 'exclude' attribute is deprecated "
"since 3.3.0. Add an explicit fields = '__all__' to the "
"{serializer_class} serializer.".format(
serializer_class=self.__class__.__name__
),
- PendingDeprecationWarning
+ DeprecationWarning
)
if fields == ALL_FIELDS:
@@ -1221,6 +1243,11 @@ class ModelSerializer(Serializer):
read_only_fields = getattr(self.Meta, 'read_only_fields', None)
if read_only_fields is not None:
+ if not isinstance(read_only_fields, (list, tuple)):
+ raise TypeError(
+ 'The `read_only_fields` option must be a list or tuple. '
+ 'Got %s.' % type(read_only_fields).__name__
+ )
for field_name in read_only_fields:
kwargs = extra_kwargs.get(field_name, {})
kwargs['read_only'] = True
@@ -1236,6 +1263,9 @@ class ModelSerializer(Serializer):
('dict of updated extra kwargs', 'mapping of hidden fields')
"""
+ if getattr(self.Meta, 'validators', None) is not None:
+ return (extra_kwargs, {})
+
model = getattr(self.Meta, 'model')
model_fields = self._get_model_fields(
field_names, declared_fields, extra_kwargs
@@ -1286,7 +1316,7 @@ class ModelSerializer(Serializer):
else:
uniqueness_extra_kwargs[unique_constraint_name] = {'default': default}
elif default is not empty:
- # The corresponding field is not present in the,
+ # The corresponding field is not present in the
# serializer. We have a default to use for it, so
# add in a hidden field that populates it.
hidden_fields[unique_constraint_name] = HiddenField(default=default)
@@ -1368,6 +1398,7 @@ class ModelSerializer(Serializer):
field_names = {
field.source for field in self.fields.values()
if (field.source != '*') and ('.' not in field.source)
+ and not field.read_only
}
# Note that we make sure to check `unique_together` both on the
diff --git a/rest_framework/settings.py b/rest_framework/settings.py
index 946b905c6..68c7709e8 100644
--- a/rest_framework/settings.py
+++ b/rest_framework/settings.py
@@ -19,8 +19,6 @@ back to the defaults.
"""
from __future__ import unicode_literals
-import warnings
-
from django.conf import settings
from django.test.signals import setting_changed
from django.utils import six
@@ -218,7 +216,7 @@ class APISettings(object):
SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/"
for setting in REMOVED_SETTINGS:
if setting in user_settings:
- warnings.warn("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC), DeprecationWarning)
+ raise RuntimeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC))
return user_settings
diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py
index 949c99eda..8203a7bc8 100644
--- a/rest_framework/utils/encoders.py
+++ b/rest_framework/utils/encoders.py
@@ -13,7 +13,7 @@ from django.utils import six, timezone
from django.utils.encoding import force_text
from django.utils.functional import Promise
-from rest_framework.compat import total_seconds
+from rest_framework.compat import coreapi, total_seconds
class JSONEncoder(json.JSONEncoder):
@@ -28,8 +28,6 @@ class JSONEncoder(json.JSONEncoder):
return force_text(obj)
elif isinstance(obj, datetime.datetime):
representation = obj.isoformat()
- if obj.microsecond:
- representation = representation[:23] + representation[26:]
if representation.endswith('+00:00'):
representation = representation[:-6] + 'Z'
return representation
@@ -51,6 +49,9 @@ class JSONEncoder(json.JSONEncoder):
return six.text_type(obj)
elif isinstance(obj, QuerySet):
return tuple(obj)
+ elif isinstance(obj, six.binary_type):
+ # Best-effort for binary blobs. See #4187.
+ return obj.decode('utf-8')
elif hasattr(obj, 'tolist'):
# Numpy arrays and array scalars.
return obj.tolist()
@@ -61,4 +62,9 @@ class JSONEncoder(json.JSONEncoder):
pass
elif hasattr(obj, '__iter__'):
return tuple(item for item in obj)
+ elif (coreapi is not None) and isinstance(obj, (coreapi.Document, coreapi.Error)):
+ raise RuntimeError(
+ 'Cannot return a coreapi object from a JSON view. '
+ 'You should be using a schema renderer instead for this view.'
+ )
return super(JSONEncoder, self).default(obj)
diff --git a/rest_framework/utils/html.py b/rest_framework/utils/html.py
index 3b871027c..121c825c7 100644
--- a/rest_framework/utils/html.py
+++ b/rest_framework/utils/html.py
@@ -80,10 +80,12 @@ def parse_html_dict(dictionary, prefix=''):
"""
ret = MultiValueDict()
regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix))
- for field, value in dictionary.items():
+ for field in dictionary:
match = regex.match(field)
if not match:
continue
key = match.groups()[0]
- ret[key] = value
+ value = dictionary.getlist(field)
+ ret.setlist(key, value)
+
return ret
diff --git a/rest_framework/validators.py b/rest_framework/validators.py
index 83ad6f7d8..ef23b9bd7 100644
--- a/rest_framework/validators.py
+++ b/rest_framework/validators.py
@@ -8,6 +8,7 @@ object creation, and makes it possible to switch between using the implicit
"""
from __future__ import unicode_literals
+from django.db import DataError
from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import unicode_to_repr
@@ -15,6 +16,24 @@ from rest_framework.exceptions import ValidationError
from rest_framework.utils.representation import smart_repr
+# Robust filter and exist implementations. Ensures that queryset.exists() for
+# an invalid value returns `False`, rather than raising an error.
+# Refs https://github.com/tomchristie/django-rest-framework/issues/3381
+
+def qs_exists(queryset):
+ try:
+ return queryset.exists()
+ except (TypeError, ValueError, DataError):
+ return False
+
+
+def qs_filter(queryset, **kwargs):
+ try:
+ return queryset.filter(**kwargs)
+ except (TypeError, ValueError, DataError):
+ return queryset.none()
+
+
class UniqueValidator(object):
"""
Validator that corresponds to `unique=True` on a model field.
@@ -44,7 +63,7 @@ class UniqueValidator(object):
Filter the queryset to all instances matching the given attribute.
"""
filter_kwargs = {self.field_name: value}
- return queryset.filter(**filter_kwargs)
+ return qs_filter(queryset, **filter_kwargs)
def exclude_current_instance(self, queryset):
"""
@@ -59,7 +78,7 @@ class UniqueValidator(object):
queryset = self.queryset
queryset = self.filter_queryset(value, queryset)
queryset = self.exclude_current_instance(queryset)
- if queryset.exists():
+ if qs_exists(queryset):
raise ValidationError(self.message)
def __repr__(self):
@@ -124,7 +143,7 @@ class UniqueTogetherValidator(object):
field_name: attrs[field_name]
for field_name in self.fields
}
- return queryset.filter(**filter_kwargs)
+ return qs_filter(queryset, **filter_kwargs)
def exclude_current_instance(self, attrs, queryset):
"""
@@ -145,7 +164,7 @@ class UniqueTogetherValidator(object):
checked_values = [
value for field, value in attrs.items() if field in self.fields
]
- if None not in checked_values and queryset.exists():
+ if None not in checked_values and qs_exists(queryset):
field_names = ', '.join(self.fields)
raise ValidationError(self.message.format(field_names=field_names))
@@ -209,7 +228,7 @@ class BaseUniqueForValidator(object):
queryset = self.queryset
queryset = self.filter_queryset(attrs, queryset)
queryset = self.exclude_current_instance(attrs, queryset)
- if queryset.exists():
+ if qs_exists(queryset):
message = self.message.format(date_field=self.date_field)
raise ValidationError({self.field: message})
@@ -234,7 +253,7 @@ class UniqueForDateValidator(BaseUniqueForValidator):
filter_kwargs['%s__day' % self.date_field_name] = date.day
filter_kwargs['%s__month' % self.date_field_name] = date.month
filter_kwargs['%s__year' % self.date_field_name] = date.year
- return queryset.filter(**filter_kwargs)
+ return qs_filter(queryset, **filter_kwargs)
class UniqueForMonthValidator(BaseUniqueForValidator):
@@ -247,7 +266,7 @@ class UniqueForMonthValidator(BaseUniqueForValidator):
filter_kwargs = {}
filter_kwargs[self.field_name] = value
filter_kwargs['%s__month' % self.date_field_name] = date.month
- return queryset.filter(**filter_kwargs)
+ return qs_filter(queryset, **filter_kwargs)
class UniqueForYearValidator(BaseUniqueForValidator):
@@ -260,4 +279,4 @@ class UniqueForYearValidator(BaseUniqueForValidator):
filter_kwargs = {}
filter_kwargs[self.field_name] = value
filter_kwargs['%s__year' % self.date_field_name] = date.year
- return queryset.filter(**filter_kwargs)
+ return qs_filter(queryset, **filter_kwargs)
diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py
index e27c7b316..763a92b4c 100644
--- a/rest_framework/versioning.py
+++ b/rest_framework/versioning.py
@@ -112,16 +112,19 @@ class NamespaceVersioning(BaseVersioning):
Host: example.com
Accept: application/json
"""
- invalid_version_message = _('Invalid version in URL path.')
+ invalid_version_message = _('Invalid version in URL path. Does not match any version namespace.')
def determine_version(self, request, *args, **kwargs):
resolver_match = getattr(request, 'resolver_match', None)
if (resolver_match is None or not resolver_match.namespace):
return self.default_version
- version = resolver_match.namespace
- if not self.is_allowed_version(version):
- raise exceptions.NotFound(self.invalid_version_message)
- return version
+
+ # Allow for possibly nested namespaces.
+ possible_versions = resolver_match.namespace.split(':')
+ for version in possible_versions:
+ if self.is_allowed_version(version):
+ return version
+ raise exceptions.NotFound(self.invalid_version_message)
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
if request.version is not None:
diff --git a/rest_framework/viewsets.py b/rest_framework/viewsets.py
index 05434b72e..7687448c4 100644
--- a/rest_framework/viewsets.py
+++ b/rest_framework/viewsets.py
@@ -98,6 +98,7 @@ class ViewSetMixin(object):
# resolved URL.
view.cls = cls
view.suffix = initkwargs.get('suffix', None)
+ view.actions = actions
return csrf_exempt(view)
def initialize_request(self, request, *args, **kwargs):
diff --git a/runtests.py b/runtests.py
index 1627e33b2..e97ac0367 100755
--- a/runtests.py
+++ b/runtests.py
@@ -14,7 +14,7 @@ PYTEST_ARGS = {
FLAKE8_ARGS = ['rest_framework', 'tests', '--ignore=E501']
-ISORT_ARGS = ['--recursive', '--check-only', '-p', 'tests', 'rest_framework', 'tests']
+ISORT_ARGS = ['--recursive', '--check-only', '-o' 'uritemplate', '-p', 'tests', 'rest_framework', 'tests']
sys.path.append(os.path.dirname(__file__))
diff --git a/schema-support b/schema-support
new file mode 100644
index 000000000..e69de29bb
diff --git a/setup.cfg b/setup.cfg
index 5e4090017..fd8b0682b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,2 +1,5 @@
[wheel]
universal = 1
+
+[metadata]
+license_file = LICENSE.md
diff --git a/setup.py b/setup.py
index 0fef70f1f..86870489f 100755
--- a/setup.py
+++ b/setup.py
@@ -4,6 +4,7 @@ import os
import re
import shutil
import sys
+from io import open
from setuptools import setup
@@ -16,7 +17,7 @@ except ImportError:
print("warning: pypandoc module not found, could not convert Markdown to RST")
def read_md(f):
- return open(f, 'r').read()
+ return open(f, 'r', encoding='utf-8').read()
def get_version(package):
diff --git a/tests/browsable_api/test_form_rendering.py b/tests/browsable_api/test_form_rendering.py
new file mode 100644
index 000000000..5a31ae0dd
--- /dev/null
+++ b/tests/browsable_api/test_form_rendering.py
@@ -0,0 +1,53 @@
+from django.test import TestCase
+
+from rest_framework import generics, renderers, serializers, status
+from rest_framework.response import Response
+from rest_framework.test import APIRequestFactory
+from tests.models import BasicModel
+
+factory = APIRequestFactory()
+
+
+class BasicSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = BasicModel
+
+
+class ManyPostView(generics.GenericAPIView):
+ queryset = BasicModel.objects.all()
+ serializer_class = BasicSerializer
+ renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer)
+
+ def post(self, request, *args, **kwargs):
+ serializer = self.get_serializer(self.get_queryset(), many=True)
+ return Response(serializer.data, status.HTTP_200_OK)
+
+
+class TestManyPostView(TestCase):
+ def setUp(self):
+ """
+ Create 3 BasicModel instances.
+ """
+ items = ['foo', 'bar', 'baz']
+ for item in items:
+ BasicModel(text=item).save()
+ self.objects = BasicModel.objects
+ self.data = [
+ {'id': obj.id, 'text': obj.text}
+ for obj in self.objects.all()
+ ]
+ self.view = ManyPostView.as_view()
+
+ def test_post_many_post_view(self):
+ """
+ POST request to a view that returns a list of objects should
+ still successfully return the browsable API with a rendered form.
+
+ Regression test for https://github.com/tomchristie/django-rest-framework/pull/3164
+ """
+ data = {}
+ request = factory.post('/', data, format='json')
+ with self.assertNumQueries(1):
+ response = self.view(request).render()
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.data), 3)
diff --git a/tests/test_fields.py b/tests/test_fields.py
index 8b187ecd4..1149cc4b3 100644
--- a/tests/test_fields.py
+++ b/tests/test_fields.py
@@ -5,6 +5,7 @@ from decimal import Decimal
import pytest
from django.http import QueryDict
+from django.test import TestCase, override_settings
from django.utils import six, timezone
import rest_framework
@@ -894,6 +895,22 @@ class TestNoStringCoercionDecimalField(FieldValues):
)
+class TestLocalizedDecimalField(TestCase):
+ @override_settings(USE_L10N=True, LANGUAGE_CODE='pl')
+ def test_to_internal_value(self):
+ field = serializers.DecimalField(max_digits=2, decimal_places=1, localize=True)
+ self.assertEqual(field.to_internal_value('1,1'), Decimal('1.1'))
+
+ @override_settings(USE_L10N=True, LANGUAGE_CODE='pl')
+ def test_to_representation(self):
+ field = serializers.DecimalField(max_digits=2, decimal_places=1, localize=True)
+ self.assertEqual(field.to_representation(Decimal('1.1')), '1,1')
+
+ def test_localize_forces_coerce_to_string(self):
+ field = serializers.DecimalField(max_digits=2, decimal_places=1, coerce_to_string=False, localize=True)
+ self.assertTrue(isinstance(field.to_representation(Decimal('1.1')), six.string_types))
+
+
class TestNoDecimalPlaces(FieldValues):
valid_inputs = {
'0.12345': Decimal('0.12345'),
@@ -993,6 +1010,8 @@ class TestDateTimeField(FieldValues):
outputs = {
datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00',
datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): '2001-01-01T13:00:00Z',
+ '2001-01-01T00:00:00': '2001-01-01T00:00:00',
+ six.text_type('2016-01-10T00:00:00'): '2016-01-10T00:00:00',
None: None,
'': None,
}
diff --git a/tests/test_filters.py b/tests/test_filters.py
index 646d8a625..8bffd215c 100644
--- a/tests/test_filters.py
+++ b/tests/test_filters.py
@@ -37,9 +37,9 @@ if django_filters:
# These class are used to test a filter class.
class SeveralFieldsFilter(django_filters.FilterSet):
- text = django_filters.CharFilter(lookup_type='icontains')
- decimal = django_filters.NumberFilter(lookup_type='lt')
- date = django_filters.DateFilter(lookup_type='gt')
+ text = django_filters.CharFilter(lookup_expr='icontains')
+ decimal = django_filters.NumberFilter(lookup_expr='lt')
+ date = django_filters.DateFilter(lookup_expr='gt')
class Meta:
model = FilterableItem
@@ -53,7 +53,7 @@ if django_filters:
# These classes are used to test a misconfigured filter class.
class MisconfiguredFilter(django_filters.FilterSet):
- text = django_filters.CharFilter(lookup_type='icontains')
+ text = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = BasicModel
@@ -500,6 +500,21 @@ class SearchFilterM2MTests(TestCase):
response = view(request)
self.assertEqual(len(response.data), 1)
+ def test_must_call_distinct(self):
+ filter_ = filters.SearchFilter()
+ prefixes = [''] + list(filter_.lookup_prefixes)
+ for prefix in prefixes:
+ self.assertFalse(
+ filter_.must_call_distinct(
+ SearchFilterModelM2M._meta, ["%stitle" % prefix]
+ )
+ )
+ self.assertTrue(
+ filter_.must_call_distinct(
+ SearchFilterModelM2M._meta, ["%stitle" % prefix, "%sattributes__label" % prefix]
+ )
+ )
+
class OrderingFilterModel(models.Model):
title = models.CharField(max_length=20, verbose_name='verbose title')
diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py
index c6f7472aa..f24d1d515 100644
--- a/tests/test_model_serializer.py
+++ b/tests/test_model_serializer.py
@@ -377,9 +377,9 @@ class TestGenericIPAddressFieldValidation(TestCase):
s = TestSerializer(data={'address': 'not an ip address'})
self.assertFalse(s.is_valid())
- self.assertEquals(1, len(s.errors['address']),
- 'Unexpected number of validation errors: '
- '{0}'.format(s.errors))
+ self.assertEqual(1, len(s.errors['address']),
+ 'Unexpected number of validation errors: '
+ '{0}'.format(s.errors))
# Tests for relational field mappings.
@@ -521,8 +521,6 @@ class TestRelationalFieldMappings(TestCase):
one_to_one = NestedSerializer(read_only=True):
url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail')
name = CharField(max_length=100)
- class Meta:
- validators = []
""")
if six.PY2:
# This case is also too awkward to resolve fully across both py2
diff --git a/tests/test_pagination.py b/tests/test_pagination.py
index ba3cc7037..4ea706429 100644
--- a/tests/test_pagination.py
+++ b/tests/test_pagination.py
@@ -486,6 +486,19 @@ class TestLimitOffset:
assert queryset == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
assert content.get('next') == next_url
+ def test_zero_limit(self):
+ """
+ An zero limit query param should be ignored in favor of the default.
+ """
+ request = Request(factory.get('/', {'limit': 0, 'offset': 0}))
+ queryset = self.paginate_queryset(request)
+ content = self.get_paginated_content(queryset)
+ next_limit = self.pagination.default_limit
+ next_offset = self.pagination.default_limit
+ next_url = 'http://testserver/?limit={0}&offset={1}'.format(next_limit, next_offset)
+ assert queryset == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ assert content.get('next') == next_url
+
def test_max_limit(self):
"""
The limit defaults to the max_limit when there is a max_limit and the
@@ -505,31 +518,6 @@ class TestLimitOffset:
assert content.get('next') == next_url
assert content.get('previous') == prev_url
- def test_limit_zero(self):
- """
- A limit of 0 should return empty results.
- """
- request = Request(factory.get('/', {'limit': 0, 'offset': 10}))
- queryset = self.paginate_queryset(request)
- context = self.get_html_context()
- content = self.get_paginated_content(queryset)
-
- assert context == {
- 'previous_url': 'http://testserver/?limit=0&offset=10',
- 'page_links': [
- PageLink(
- url='http://testserver/?limit=0',
- number=1,
- is_active=True,
- is_break=False
- )
- ],
- 'next_url': 'http://testserver/?limit=0&offset=10'
- }
-
- assert queryset == []
- assert content.get('results') == []
-
class TestCursorPagination:
"""
diff --git a/tests/test_relations_pk.py b/tests/test_relations_pk.py
index ba75bd94f..7a3d45927 100644
--- a/tests/test_relations_pk.py
+++ b/tests/test_relations_pk.py
@@ -340,6 +340,18 @@ class PKForeignKeyTests(TestCase):
serializer = NullableForeignKeySourceSerializer()
self.assertEqual(serializer.data['target'], None)
+ def test_foreign_key_not_required(self):
+ """
+ Let's say we wanted to fill the non-nullable model field inside
+ Model.save(), we would make it empty and not required.
+ """
+ class ModelSerializer(ForeignKeySourceSerializer):
+ class Meta(ForeignKeySourceSerializer.Meta):
+ extra_kwargs = {'target': {'required': False}}
+ serializer = ModelSerializer(data={'name': 'test'})
+ serializer.is_valid(raise_exception=True)
+ self.assertNotIn('target', serializer.validated_data)
+
class PKNullableForeignKeyTests(TestCase):
def setUp(self):
diff --git a/tests/test_renderers.py b/tests/test_renderers.py
index 5793fc734..a947f8b7d 100644
--- a/tests/test_renderers.py
+++ b/tests/test_renderers.py
@@ -286,14 +286,14 @@ class JSONRendererTests(TestCase):
qs = DummyTestModel.objects.values('id', 'name')
ret = JSONRenderer().render(qs)
data = json.loads(ret.decode('utf-8'))
- self.assertEquals(data, [{'id': o.id, 'name': o.name}])
+ self.assertEqual(data, [{'id': o.id, 'name': o.name}])
def test_render_queryset_values_list(self):
o = DummyTestModel.objects.create(name='dummy')
qs = DummyTestModel.objects.values_list('id', 'name')
ret = JSONRenderer().render(qs)
data = json.loads(ret.decode('utf-8'))
- self.assertEquals(data, [[o.id, o.name]])
+ self.assertEqual(data, [[o.id, o.name]])
def test_render_dict_abc_obj(self):
class Dict(MutableMapping):
@@ -323,7 +323,7 @@ class JSONRendererTests(TestCase):
x[2] = 3
ret = JSONRenderer().render(x)
data = json.loads(ret.decode('utf-8'))
- self.assertEquals(data, {'key': 'string value', '2': 3})
+ self.assertEqual(data, {'key': 'string value', '2': 3})
def test_render_obj_with_getitem(self):
class DictLike(object):
diff --git a/tests/test_routers.py b/tests/test_routers.py
index acab660d8..f45039f80 100644
--- a/tests/test_routers.py
+++ b/tests/test_routers.py
@@ -257,7 +257,7 @@ class TestNameableRoot(TestCase):
def test_router_has_custom_name(self):
expected = 'nameable-root'
- self.assertEqual(expected, self.urls[0].name)
+ self.assertEqual(expected, self.urls[-1].name)
class TestActionKeywordArgs(TestCase):
diff --git a/tests/test_schemas.py b/tests/test_schemas.py
new file mode 100644
index 000000000..7d3308ed9
--- /dev/null
+++ b/tests/test_schemas.py
@@ -0,0 +1,137 @@
+import unittest
+
+from django.conf.urls import include, url
+from django.test import TestCase, override_settings
+
+from rest_framework import filters, pagination, permissions, serializers
+from rest_framework.compat import coreapi
+from rest_framework.routers import DefaultRouter
+from rest_framework.test import APIClient
+from rest_framework.viewsets import ModelViewSet
+
+
+class MockUser(object):
+ def is_authenticated(self):
+ return True
+
+
+class ExamplePagination(pagination.PageNumberPagination):
+ page_size = 100
+
+
+class ExampleSerializer(serializers.Serializer):
+ a = serializers.CharField(required=True)
+ b = serializers.CharField(required=False)
+
+
+class ExampleViewSet(ModelViewSet):
+ pagination_class = ExamplePagination
+ permission_classes = [permissions.IsAuthenticatedOrReadOnly]
+ filter_backends = [filters.OrderingFilter]
+ serializer_class = ExampleSerializer
+
+
+router = DefaultRouter(schema_title='Example API' if coreapi else None)
+router.register('example', ExampleViewSet, base_name='example')
+urlpatterns = [
+ url(r'^', include(router.urls))
+]
+
+
+@unittest.skipUnless(coreapi, 'coreapi is not installed')
+@override_settings(ROOT_URLCONF='tests.test_schemas')
+class TestRouterGeneratedSchema(TestCase):
+ def test_anonymous_request(self):
+ client = APIClient()
+ response = client.get('/', HTTP_ACCEPT='application/vnd.coreapi+json')
+ self.assertEqual(response.status_code, 200)
+ expected = coreapi.Document(
+ url='',
+ title='Example API',
+ content={
+ 'example': {
+ 'list': coreapi.Link(
+ url='/example/',
+ action='get',
+ fields=[
+ coreapi.Field('page', required=False, location='query'),
+ coreapi.Field('ordering', required=False, location='query')
+ ]
+ ),
+ 'retrieve': coreapi.Link(
+ url='/example/{pk}/',
+ action='get',
+ fields=[
+ coreapi.Field('pk', required=True, location='path')
+ ]
+ )
+ }
+ }
+ )
+ self.assertEqual(response.data, expected)
+
+ def test_authenticated_request(self):
+ client = APIClient()
+ client.force_authenticate(MockUser())
+ response = client.get('/', HTTP_ACCEPT='application/vnd.coreapi+json')
+ self.assertEqual(response.status_code, 200)
+ expected = coreapi.Document(
+ url='',
+ title='Example API',
+ content={
+ 'example': {
+ 'list': coreapi.Link(
+ url='/example/',
+ action='get',
+ fields=[
+ coreapi.Field('page', required=False, location='query'),
+ coreapi.Field('ordering', required=False, location='query')
+ ]
+ ),
+ 'create': coreapi.Link(
+ url='/example/',
+ action='post',
+ encoding='application/json',
+ fields=[
+ coreapi.Field('a', required=True, location='form'),
+ coreapi.Field('b', required=False, location='form')
+ ]
+ ),
+ 'retrieve': coreapi.Link(
+ url='/example/{pk}/',
+ action='get',
+ fields=[
+ coreapi.Field('pk', required=True, location='path')
+ ]
+ ),
+ 'update': coreapi.Link(
+ url='/example/{pk}/',
+ action='put',
+ encoding='application/json',
+ fields=[
+ coreapi.Field('pk', required=True, location='path'),
+ coreapi.Field('a', required=True, location='form'),
+ coreapi.Field('b', required=False, location='form')
+ ]
+ ),
+ 'partial_update': coreapi.Link(
+ url='/example/{pk}/',
+ action='patch',
+ encoding='application/json',
+ fields=[
+ coreapi.Field('pk', required=True, location='path'),
+ coreapi.Field('a', required=False, location='form'),
+ coreapi.Field('b', required=False, location='form')
+ ]
+ ),
+ 'destroy': coreapi.Link(
+ url='/example/{pk}/',
+ action='delete',
+ fields=[
+ coreapi.Field('pk', required=True, location='path')
+ ]
+ )
+ }
+ }
+ )
+ self.assertEqual(response.data, expected)
diff --git a/tests/test_serializer_bulk_update.py b/tests/test_serializer_bulk_update.py
index 8d7240a7b..567a32507 100644
--- a/tests/test_serializer_bulk_update.py
+++ b/tests/test_serializer_bulk_update.py
@@ -46,6 +46,7 @@ class BulkCreateSerializerTests(TestCase):
serializer = self.BookSerializer(data=data, many=True)
self.assertEqual(serializer.is_valid(), True)
self.assertEqual(serializer.validated_data, data)
+ self.assertEqual(serializer.errors, [])
def test_bulk_create_errors(self):
"""
@@ -76,6 +77,7 @@ class BulkCreateSerializerTests(TestCase):
serializer = self.BookSerializer(data=data, many=True)
self.assertEqual(serializer.is_valid(), False)
self.assertEqual(serializer.errors, expected_errors)
+ self.assertEqual(serializer.validated_data, [])
def test_invalid_list_datatype(self):
"""
diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py
index aeb092ee0..133600399 100644
--- a/tests/test_serializer_nested.py
+++ b/tests/test_serializer_nested.py
@@ -167,3 +167,32 @@ class TestNestedSerializerWithMany:
expected_errors = {'not_allow_empty': {'non_field_errors': [serializers.ListSerializer.default_error_messages['empty']]}}
assert serializer.errors == expected_errors
+
+
+class TestNestedSerializerWithList:
+ def setup(self):
+ class NestedSerializer(serializers.Serializer):
+ example = serializers.MultipleChoiceField(choices=[1, 2, 3])
+
+ class TestSerializer(serializers.Serializer):
+ nested = NestedSerializer()
+
+ self.Serializer = TestSerializer
+
+ def test_nested_serializer_with_list_json(self):
+ input_data = {
+ 'nested': {
+ 'example': [1, 2],
+ }
+ }
+ serializer = self.Serializer(data=input_data)
+
+ assert serializer.is_valid()
+ assert serializer.validated_data['nested']['example'] == set([1, 2])
+
+ def test_nested_serializer_with_list_multipart(self):
+ input_data = QueryDict('nested.example=1&nested.example=2')
+ serializer = self.Serializer(data=input_data)
+
+ assert serializer.is_valid()
+ assert serializer.validated_data['nested']['example'] == set([1, 2])
diff --git a/tests/test_settings.py b/tests/test_settings.py
index 658c61997..9ba552d28 100644
--- a/tests/test_settings.py
+++ b/tests/test_settings.py
@@ -1,7 +1,5 @@
from __future__ import unicode_literals
-import warnings
-
from django.test import TestCase
from rest_framework.settings import APISettings
@@ -25,13 +23,10 @@ class TestSettings(TestCase):
Make sure user is alerted with an error when a removed setting
is set.
"""
- with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter("always")
+ with self.assertRaises(RuntimeError):
APISettings({
'MAX_PAGINATE_BY': 100
})
- self.assertEqual(len(w), 1)
- self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
class TestSettingTypes(TestCase):
diff --git a/tests/test_validators.py b/tests/test_validators.py
index 9b388951e..32d41f2ba 100644
--- a/tests/test_validators.py
+++ b/tests/test_validators.py
@@ -48,6 +48,18 @@ class AnotherUniquenessSerializer(serializers.ModelSerializer):
fields = '__all__'
+class IntegerFieldModel(models.Model):
+ integer = models.IntegerField()
+
+
+class UniquenessIntegerSerializer(serializers.Serializer):
+ # Note that this field *deliberately* does not correspond with the model field.
+ # This allows us to ensure that `ValueError`, `TypeError` or `DataError` etc
+ # raised by a uniqueness check does not trigger a deceptive "this field is not unique"
+ # validation failure.
+ integer = serializers.CharField(validators=[UniqueValidator(queryset=IntegerFieldModel.objects.all())])
+
+
class TestUniquenessValidation(TestCase):
def setUp(self):
self.instance = UniquenessModel.objects.create(username='existing')
@@ -100,6 +112,10 @@ class TestUniquenessValidation(TestCase):
rs = RelatedModelSerializer(data=data)
self.assertTrue(rs.is_valid())
+ def test_value_error_treated_as_not_unique(self):
+ serializer = UniquenessIntegerSerializer(data={'integer': 'abc'})
+ assert serializer.is_valid()
+
# Tests for `UniqueTogetherValidator`
# -----------------------------------
@@ -239,6 +255,45 @@ class TestUniquenessTogetherValidation(TestCase):
""")
assert repr(serializer) == expected
+ def test_ignore_read_only_fields(self):
+ """
+ When serializer fields are read only, then uniqueness
+ validators should not be added for that field.
+ """
+ class ReadOnlyFieldSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = UniquenessTogetherModel
+ fields = ('id', 'race_name', 'position')
+ read_only_fields = ('race_name',)
+
+ serializer = ReadOnlyFieldSerializer()
+ expected = dedent("""
+ ReadOnlyFieldSerializer():
+ id = IntegerField(label='ID', read_only=True)
+ race_name = CharField(read_only=True)
+ position = IntegerField(required=True)
+ """)
+ assert repr(serializer) == expected
+
+ def test_allow_explict_override(self):
+ """
+ Ensure validators can be explicitly removed..
+ """
+ class NoValidatorsSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = UniquenessTogetherModel
+ fields = ('id', 'race_name', 'position')
+ validators = []
+
+ serializer = NoValidatorsSerializer()
+ expected = dedent("""
+ NoValidatorsSerializer():
+ id = IntegerField(label='ID', read_only=True)
+ race_name = CharField(max_length=100)
+ position = IntegerField()
+ """)
+ assert repr(serializer) == expected
+
def test_ignore_validation_for_null_fields(self):
# None values that are on fields which are part of the uniqueness
# constraint cause the instance to ignore uniqueness validation.
diff --git a/tests/test_versioning.py b/tests/test_versioning.py
index d4d8cfccb..edac11e62 100644
--- a/tests/test_versioning.py
+++ b/tests/test_versioning.py
@@ -85,6 +85,7 @@ class TestRequestVersion:
response = view(request)
assert response.data == {'version': None}
+ @override_settings(ALLOWED_HOSTS=['*'])
def test_host_name_versioning(self):
scheme = versioning.HostNameVersioning
view = RequestVersionView.as_view(versioning_class=scheme)
@@ -173,6 +174,7 @@ class TestURLReversing(URLPatternsTestCase):
response = view(request)
assert response.data == {'url': 'http://testserver/another/'}
+ @override_settings(ALLOWED_HOSTS=['*'])
def test_reverse_host_name_versioning(self):
scheme = versioning.HostNameVersioning
view = ReverseView.as_view(versioning_class=scheme)
@@ -223,6 +225,7 @@ class TestInvalidVersion:
response = view(request)
assert response.status_code == status.HTTP_404_NOT_FOUND
+ @override_settings(ALLOWED_HOSTS=['*'])
def test_invalid_host_name_versioning(self):
scheme = versioning.HostNameVersioning
view = RequestInvalidVersionView.as_view(versioning_class=scheme)
@@ -293,13 +296,17 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase):
class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase):
+ nested = [
+ url(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='nested'),
+ ]
included = [
url(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='namespaced'),
+ url(r'^nested/', include(nested, namespace='nested-namespace'))
]
urlpatterns = [
- url(r'^v1/', include(included, namespace='v1')),
- url(r'^v2/', include(included, namespace='v2')),
+ url(r'^v1/', include(included, namespace='v1', app_name='restframeworkv1')),
+ url(r'^v2/', include(included, namespace='v2', app_name='restframeworkv2')),
url(r'^non-api/(?P\d+)/$', dummy_pk_view, name='non-api-view')
]
@@ -322,6 +329,10 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase):
field = self._create_field('namespaced', 'v2')
assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/'
+ def test_api_url_is_properly_reversed_with_nested(self):
+ field = self._create_field('nested', 'v1:nested-namespace')
+ assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/nested/namespaced/3/'
+
def test_non_api_url_is_properly_reversed_regardless_of_the_version(self):
"""
Regression test for #2711
diff --git a/tests/test_write_only_fields.py b/tests/test_write_only_fields.py
index 83ef366a5..3a289afab 100644
--- a/tests/test_write_only_fields.py
+++ b/tests/test_write_only_fields.py
@@ -21,7 +21,7 @@ class WriteOnlyFieldTests(TestCase):
}
serializer = self.Serializer(data=data)
self.assertTrue(serializer.is_valid())
- self.assertEquals(serializer.validated_data, data)
+ self.assertEqual(serializer.validated_data, data)
def write_only_fields_are_not_present_on_output(self):
instance = {
@@ -29,4 +29,4 @@ class WriteOnlyFieldTests(TestCase):
'password': '123'
}
serializer = self.Serializer(instance)
- self.assertEquals(serializer.data, {'email': 'foo@example.com'})
+ self.assertEqual(serializer.data, {'email': 'foo@example.com'})
diff --git a/tox.ini b/tox.ini
index 0fc41a881..89655aee2 100644
--- a/tox.ini
+++ b/tox.ini
@@ -6,7 +6,8 @@ envlist =
py27-{lint,docs},
{py27,py32,py33,py34,py35}-django18,
{py27,py34,py35}-django19,
- {py27,py34,py35}-django110
+ {py27,py34,py35}-django110,
+ {py27,py34,py35}-django{master}
[testenv]
commands = ./runtests.py --fast {posargs} --coverage -rw
@@ -14,9 +15,10 @@ setenv =
PYTHONDONTWRITEBYTECODE=1
PYTHONWARNINGS=once
deps =
- django18: Django==1.8.13
- django19: Django==1.9.7
- django110: Django==1.10a1
+ django18: Django==1.8.14
+ django19: Django==1.9.8
+ django110: Django==1.10rc1
+ djangomaster: https://github.com/django/django/archive/master.tar.gz
-rrequirements/requirements-testing.txt
-rrequirements/requirements-optionals.txt
basepython =