From 2946251c918f31801cea756171cb5ea153704f6c Mon Sep 17 00:00:00 2001 From: koliber Date: Tue, 18 Aug 2015 14:47:04 +0200 Subject: [PATCH 001/126] Added explicit id field in multi update example If the id field is implicitly created, it is created as `read_only=True`. This causes the data validation step to remove the id values in the validated data. --- docs/api-guide/serializers.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index abdb67afa..d0b6a3c5b 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -774,6 +774,11 @@ Here's an example of how you might choose to implement multiple updates: class BookSerializer(serializers.Serializer): ... + id = serializers.IntegerField( + read_only=False, + required=False + ) + class Meta: list_serializer_class = BookListSerializer From dae5426e20eb8b6f215344d2a868c4ff31af3f99 Mon Sep 17 00:00:00 2001 From: koliber Date: Fri, 28 Aug 2015 15:35:32 +0200 Subject: [PATCH 002/126] Changed formatting and updated docs --- docs/api-guide/serializers.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index d0b6a3c5b..66f3c4d43 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -747,6 +747,8 @@ To support multiple updates you'll need to do so explicitly. When writing your m * How should insertions be handled? Are they invalid, or do they create new objects? * How should removals be handled? Do they imply object deletion, or removing a relationship? Should they be silently ignored, or are they invalid? * How should ordering be handled? Does changing the position of two items imply any state change or is it ignored? + +You will need to add an explicit `id` field to the instance serializer. The default implicitly-generated `id` field is marked as `read_only`. This causes it to be removed on updates. Once you declare it explicitly, it will be available in the list serializer's `update` method. Here's an example of how you might choose to implement multiple updates: @@ -774,10 +776,7 @@ Here's an example of how you might choose to implement multiple updates: class BookSerializer(serializers.Serializer): ... - id = serializers.IntegerField( - read_only=False, - required=False - ) + id = serializers.IntegerField(required=False) class Meta: list_serializer_class = BookListSerializer From b19865f88da68fc64b8035bbb37132fa632f3146 Mon Sep 17 00:00:00 2001 From: Aider Ibragimov Date: Wed, 14 Oct 2015 15:14:35 +0300 Subject: [PATCH 003/126] fix typo in adding jquery string, update docs about detail page link for AdminRenderer --- docs/api-guide/renderers.md | 9 +++++++++ .../templates/rest_framework/admin.html | 2 +- .../templates/rest_framework/admin/list.html | 15 ++++++++------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index 614259458..1cf924341 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -187,6 +187,15 @@ This renderer is suitable for CRUD-style web APIs that should also present a use Note that views that have nested or list serializers for their input won't work well with the `AdminRenderer`, as the HTML forms are unable to properly support them. +**Note**: To get proper links to detail page in `ListCreateAPIView` or `ListAPIView` you should implement `url` field in serializer which return correct link. For example here we use models `get_absolute_url` method: + + class AccountSerializer(serializers.ModelSerializer): + url = serializers.CharField(source='get_absolute_url', read_only=True) + + class Meta: + model = Account + + **.media_type**: `text/html` **.format**: `'.admin'` diff --git a/rest_framework/templates/rest_framework/admin.html b/rest_framework/templates/rest_framework/admin.html index e1751b21c..318a1e706 100644 --- a/rest_framework/templates/rest_framework/admin.html +++ b/rest_framework/templates/rest_framework/admin.html @@ -219,7 +219,7 @@ {% endif %} {% block script %} - + diff --git a/rest_framework/templates/rest_framework/admin/list.html b/rest_framework/templates/rest_framework/admin/list.html index a3ec21af3..048843bb7 100644 --- a/rest_framework/templates/rest_framework/admin/list.html +++ b/rest_framework/templates/rest_framework/admin/list.html @@ -7,14 +7,15 @@ {% for row in results %} {% for key, value in row.items %} - {% if key in columns %} - - {{ value|format_value }} - - {% endif %} + {% if key in columns %} + + {{ value|format_value }} + + {% endif %} {% endfor %} - - + + + {% endfor %} From 5342f2200966788f032fb35fffe4e99840e57960 Mon Sep 17 00:00:00 2001 From: Aider Ibragimov Date: Wed, 14 Oct 2015 15:54:43 +0300 Subject: [PATCH 004/126] return typo back for new pr, update docs --- docs/api-guide/renderers.md | 2 +- rest_framework/templates/rest_framework/admin.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index 1cf924341..fb3dd312c 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -187,7 +187,7 @@ This renderer is suitable for CRUD-style web APIs that should also present a use Note that views that have nested or list serializers for their input won't work well with the `AdminRenderer`, as the HTML forms are unable to properly support them. -**Note**: To get proper links to detail page in `ListCreateAPIView` or `ListAPIView` you should implement `url` field in serializer which return correct link. For example here we use models `get_absolute_url` method: +**Note**: In ModelSerializer to get proper links to detail page in `ListCreateAPIView` or `ListAPIView` you should implement `url` field in serializer which return correct link. For example here we use models `get_absolute_url` method: class AccountSerializer(serializers.ModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) diff --git a/rest_framework/templates/rest_framework/admin.html b/rest_framework/templates/rest_framework/admin.html index 318a1e706..e1751b21c 100644 --- a/rest_framework/templates/rest_framework/admin.html +++ b/rest_framework/templates/rest_framework/admin.html @@ -219,7 +219,7 @@ {% endif %} {% block script %} - + From 4a6d27ccbb9f231474a7c9effe7af3e3b2265725 Mon Sep 17 00:00:00 2001 From: Aider Ibragimov Date: Wed, 14 Oct 2015 17:04:47 +0300 Subject: [PATCH 005/126] update style of the note --- docs/api-guide/renderers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md index fb3dd312c..254835c2e 100644 --- a/docs/api-guide/renderers.md +++ b/docs/api-guide/renderers.md @@ -187,7 +187,7 @@ This renderer is suitable for CRUD-style web APIs that should also present a use Note that views that have nested or list serializers for their input won't work well with the `AdminRenderer`, as the HTML forms are unable to properly support them. -**Note**: In ModelSerializer to get proper links to detail page in `ListCreateAPIView` or `ListAPIView` you should implement `url` field in serializer which return correct link. For example here we use models `get_absolute_url` method: +**Note**: The `AdminRenderer` is only able to include links to detail pages when a properly configured `URL_FIELD_NAME` (`url` by default) attribute is present in the data. For `HyperlinkedModelSerializer` this will be the case, but for `ModelSerializer` or plain `Serializer` classes you'll need to make sure to include the field explicitly. For example here we use models `get_absolute_url` method: class AccountSerializer(serializers.ModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) From f808f08a0d4ee28d7e704b5f647bd8e4d6cf1085 Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Fri, 16 Oct 2015 14:43:43 -0400 Subject: [PATCH 006/126] Require that data is a list. --- rest_framework/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 0d4a51152..94c70afd0 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1461,7 +1461,7 @@ class ListField(Field): """ if html.is_html_input(data): data = html.parse_html_list(data) - if isinstance(data, type('')) or not hasattr(data, '__iter__'): + if not isinstance(data, list): self.fail('not_a_list', input_type=type(data).__name__) if not self.allow_empty and len(data) == 0: self.fail('empty') From b9316154b163ee6ecf2005f986f40f7fe7ef5bcc Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Fri, 16 Oct 2015 16:02:13 -0400 Subject: [PATCH 007/126] Add tuple and Set to allowed ListField data types --- rest_framework/fields.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 94c70afd0..f98917a6a 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +from sets import Set import collections import copy @@ -1461,7 +1462,7 @@ class ListField(Field): """ if html.is_html_input(data): data = html.parse_html_list(data) - if not isinstance(data, list): + if not isinstance(data, (list, tuple, Set)): self.fail('not_a_list', input_type=type(data).__name__) if not self.allow_empty and len(data) == 0: self.fail('empty') From dac1637bb39b36545982e48b56a191eeba54256c Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Fri, 16 Oct 2015 16:06:18 -0400 Subject: [PATCH 008/126] Use set instead of Set --- rest_framework/fields.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index f98917a6a..a19a6e667 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1,5 +1,4 @@ from __future__ import unicode_literals -from sets import Set import collections import copy @@ -1462,7 +1461,7 @@ class ListField(Field): """ if html.is_html_input(data): data = html.parse_html_list(data) - if not isinstance(data, (list, tuple, Set)): + if not isinstance(data, (list, tuple, set)): self.fail('not_a_list', input_type=type(data).__name__) if not self.allow_empty and len(data) == 0: self.fail('empty') From 8fa7c5c914e3617d5e794e82041ed9ce68fe4b8b Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Tue, 20 Oct 2015 08:56:39 -0400 Subject: [PATCH 009/126] Exclude collections.Mapping from allowable data types in ListField --- rest_framework/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index a19a6e667..938fa1398 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1461,7 +1461,7 @@ class ListField(Field): """ if html.is_html_input(data): data = html.parse_html_list(data) - if not isinstance(data, (list, tuple, set)): + if isinstance(data, type('')) or isinstance(data, collections.Mapping) or not hasattr(data, '__iter__'): self.fail('not_a_list', input_type=type(data).__name__) if not self.allow_empty and len(data) == 0: self.fail('empty') From f85ad301ebd4b8a41276da9392f1f312b6432d54 Mon Sep 17 00:00:00 2001 From: nfletton Date: Wed, 4 Nov 2015 15:43:25 -0700 Subject: [PATCH 010/126] Fix regression causing raw data form to not display --- rest_framework/templates/rest_framework/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html index 2cb57a04c..558d634ca 100644 --- a/rest_framework/templates/rest_framework/base.html +++ b/rest_framework/templates/rest_framework/base.html @@ -173,7 +173,7 @@ {% endif %} -
+
{% with form=raw_data_post_form %}
From 240eb672aff743cd04a1991fb147d1477c65c021 Mon Sep 17 00:00:00 2001 From: Ryan Hiebert Date: Thu, 5 Nov 2015 12:12:27 -0600 Subject: [PATCH 011/126] Don't specify basepython tox automatically includes basepython definitions for all the common python versions, and will recognize it in factors of envs in the envlist. --- tox.ini | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tox.ini b/tox.ini index e4f02251a..fb4374bdc 100644 --- a/tox.ini +++ b/tox.ini @@ -8,13 +8,6 @@ envlist = {py27,py34,py35}-django{19} [testenv] -basepython = - py27: python2.7 - py32: python3.2 - py33: python3.3 - py34: python3.4 - py35: python3.5 - commands = ./runtests.py --fast {posargs} --coverage setenv = PYTHONDONTWRITEBYTECODE=1 From 23460bfa41f9dedbdd448c921618a6ed244a0f3b Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Tue, 10 Nov 2015 11:33:54 +0100 Subject: [PATCH 012/126] Add a note about how to turn pagination off --- docs/api-guide/pagination.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index 881fbf14e..778076c5a 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -17,6 +17,8 @@ The built-in styles currently all use links included as part of the content of t Pagination is only performed automatically if you're using the generic views or viewsets. If you're using a regular `APIView`, you'll need to call into the pagination API yourself to ensure you return a paginated response. See the source code for the `mixins.ListModelMixin` and `generics.GenericAPIView` classes for an example. +Pagination can be turned off by setting the pagination class to `None`. + ## Setting the pagination style The default pagination style may be set globally, using the `DEFAULT_PAGINATION_CLASS` settings key. For example, to use the built-in limit/offset pagination, you would do: From 795cf4716daf7cfd2a7bd1fe2159d5d3cfb018a2 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 11 Nov 2015 17:44:46 +0100 Subject: [PATCH 013/126] Fix module name with Python 3.5 --- tests/test_request.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_request.py b/tests/test_request.py index a2bd4cade..24be368b3 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -186,7 +186,10 @@ class TestUserSetter(TestCase): try: self.request.user except AttributeError as error: - self.assertEqual(str(error), "'module' object has no attribute 'MISSPELLED_NAME_THAT_DOESNT_EXIST'") + assert str(error) in ( + "'module' object has no attribute 'MISSPELLED_NAME_THAT_DOESNT_EXIST'", # Python < 3.5 + "module 'rest_framework' has no attribute 'MISSPELLED_NAME_THAT_DOESNT_EXIST'", # Python >= 3.5 + ) else: assert False, 'AttributeError not raised' From 3806af3d15dcbf9c5e1e390d1ae3808f12191342 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Fri, 13 Nov 2015 16:02:19 +0100 Subject: [PATCH 014/126] allow setting a custom Django Paginator in pagination.PageNumberPagination --- docs/api-guide/pagination.md | 1 + rest_framework/pagination.py | 4 ++- tests/test_pagination.py | 59 ++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index 881fbf14e..da94a1a81 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -95,6 +95,7 @@ The `PageNumberPagination` class includes a number of attributes that may be ove To set these attributes you should override the `PageNumberPagination` class, and then enable your custom pagination class as above. +* `django_paginator_class` - The Django Paginator class to use. Default is `django.core.paginator.Paginator`, which should be fine for most usecases. * `page_size` - A numeric value indicating the page size. If set, this overrides the `PAGE_SIZE` setting. Defaults to the same value as the `PAGE_SIZE` settings key. * `page_query_param` - A string value indicating the name of the query parameter to use for the pagination control. * `page_size_query_param` - If set, this is a string value indicating the name of a query parameter that allows the client to set the page size on a per-request basis. Defaults to `None`, indicating that the client may not control the requested page size. diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index fc7b90967..60aa3b74c 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -168,6 +168,8 @@ class PageNumberPagination(BasePagination): # Defaults to `None`, meaning pagination is disabled. page_size = api_settings.PAGE_SIZE + django_paginator_class = DjangoPaginator + # Client can control the page using this query parameter. page_query_param = 'page' @@ -194,7 +196,7 @@ class PageNumberPagination(BasePagination): if not page_size: return None - paginator = DjangoPaginator(queryset, page_size) + paginator = self.django_paginator_class(queryset, page_size) page_number = request.query_params.get(self.page_query_param, 1) if page_number in self.last_page_strings: page_number = paginator.num_pages diff --git a/tests/test_pagination.py b/tests/test_pagination.py index 2e6085672..c6caaf641 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import pytest +from django.core.paginator import Paginator as DjangoPaginator from rest_framework import ( exceptions, filters, generics, pagination, serializers, status @@ -249,6 +250,64 @@ class TestPageNumberPagination: self.paginate_queryset(request) +class TestPageNumberPaginationOverride: + """ + Unit tests for `pagination.PageNumberPagination`. + + the Django Paginator Class is overridden. + """ + + def setup(self): + class OverriddenDjangoPaginator(DjangoPaginator): + # override the count in our overriden Django Paginator + # we will only return one page, with one item + count = 1 + + class ExamplePagination(pagination.PageNumberPagination): + django_paginator_class = OverriddenDjangoPaginator + page_size = 5 + + self.pagination = ExamplePagination() + self.queryset = range(1, 101) + + def paginate_queryset(self, request): + return list(self.pagination.paginate_queryset(self.queryset, request)) + + def get_paginated_content(self, queryset): + response = self.pagination.get_paginated_response(queryset) + return response.data + + def get_html_context(self): + return self.pagination.get_html_context() + + def test_no_page_number(self): + request = Request(factory.get('/')) + queryset = self.paginate_queryset(request) + content = self.get_paginated_content(queryset) + context = self.get_html_context() + assert queryset == [1] + assert content == { + 'results': [1, ], + 'previous': None, + 'next': None, + 'count': 1 + } + assert context == { + 'previous_url': None, + 'next_url': None, + 'page_links': [ + PageLink('http://testserver/', 1, True, False), + ] + } + assert not self.pagination.display_page_controls + assert isinstance(self.pagination.to_html(), type('')) + + def test_invalid_page(self): + request = Request(factory.get('/', {'page': 'invalid'})) + with pytest.raises(exceptions.NotFound): + self.paginate_queryset(request) + + class TestLimitOffset: """ Unit tests for `pagination.LimitOffsetPagination`. From 5fdc4f22cff3e458fd2492d60133e47f607468f5 Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Fri, 13 Nov 2015 10:17:09 -0500 Subject: [PATCH 015/126] Add tests to ensure ListField does not except dictionary as input. --- tests/test_fields.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index 104337627..b0320b2ee 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1437,7 +1437,8 @@ class TestListField(FieldValues): ] invalid_inputs = [ ('not a list', ['Expected a list of items but got type "str".']), - ([1, 2, 'error'], ['A valid integer is required.']) + ([1, 2, 'error'], ['A valid integer is required.']), + ({'one': 'two'}, ['Expected a list of items but got type "dict".']) ] outputs = [ ([1, 2, 3], [1, 2, 3]), @@ -1454,6 +1455,14 @@ class TestListField(FieldValues): "Remove `source=` from the field declaration." ) + def test_collection_types_are_invalid_input(self): + field = serializers.ListField(child=serializers.CharField()) + input_value = ({'one': 'two'}) + + with pytest.raises(serializers.ValidationError) as exc_info: + field.to_internal_value(input_value) + assert exc_info.value.detail == [u'Expected a list of items but got type "dict".'] + class TestEmptyListField(FieldValues): """ From 3ddbf92bf99f47827cd7a8b2292f0dadac043cc2 Mon Sep 17 00:00:00 2001 From: Dawn Pattison Date: Fri, 13 Nov 2015 10:41:57 -0500 Subject: [PATCH 016/126] Remove unicode from exception value. --- tests/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index b0320b2ee..8d3bef106 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1461,7 +1461,7 @@ class TestListField(FieldValues): with pytest.raises(serializers.ValidationError) as exc_info: field.to_internal_value(input_value) - assert exc_info.value.detail == [u'Expected a list of items but got type "dict".'] + assert exc_info.value.detail == ['Expected a list of items but got type "dict".'] class TestEmptyListField(FieldValues): From e4754649455e844c604d92883b614fe8ba81d9db Mon Sep 17 00:00:00 2001 From: Martin Hill Date: Sat, 14 Nov 2015 17:00:07 -0500 Subject: [PATCH 017/126] fix for issue #3634 --- rest_framework/utils/model_meta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index 8eb00e433..c1c0f61f0 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -92,7 +92,7 @@ def _get_fields(opts): def _get_to_field(field): - return field.to_fields[0] if field.to_fields else None + return field.to_fields[0] if hasattr(field, 'to_fields') else None def _get_forward_relationships(opts): From bac6f1fcf41d9c01177f5bbd031618ecd41e57f2 Mon Sep 17 00:00:00 2001 From: Martin Hill Date: Sat, 14 Nov 2015 18:26:29 -0500 Subject: [PATCH 018/126] check if field.to_fields is None --- rest_framework/utils/model_meta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index c1c0f61f0..7a330b1ea 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -92,7 +92,7 @@ def _get_fields(opts): def _get_to_field(field): - return field.to_fields[0] if hasattr(field, 'to_fields') else None + return field.to_fields[0] if hasattr(field, 'to_fields') and field.to_fields else None def _get_forward_relationships(opts): From ff36cbe4baa50302aa566c1d188a5f98393fd895 Mon Sep 17 00:00:00 2001 From: Martin Hill Date: Sat, 14 Nov 2015 23:04:32 -0500 Subject: [PATCH 019/126] same logic, more pythonic --- rest_framework/utils/model_meta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index 7a330b1ea..77952fbf8 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -92,7 +92,7 @@ def _get_fields(opts): def _get_to_field(field): - return field.to_fields[0] if hasattr(field, 'to_fields') and field.to_fields else None + return getattr(field, 'to_fields', None) and field.to_fields[0] def _get_forward_relationships(opts): From ca0841576fc6881648b49d084a982954abd67f5b Mon Sep 17 00:00:00 2001 From: Will Dady Date: Tue, 17 Nov 2015 15:00:00 +1100 Subject: [PATCH 020/126] Removing references to get_paginate_by() as it no longer exists. --- docs/api-guide/generic-views.md | 35 ++++++--------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md index 7970b275f..4a9581212 100644 --- a/docs/api-guide/generic-views.md +++ b/docs/api-guide/generic-views.md @@ -35,14 +35,6 @@ For more complex cases you might also want to override various methods on the vi serializer_class = UserSerializer permission_classes = (IsAdminUser,) - def get_paginate_by(self): - """ - Use smaller pagination for HTML representations. - """ - if self.request.accepted_renderer.format == 'html': - return 20 - return 100 - def list(self, request): # Note the use of `get_queryset()` instead of `self.queryset` queryset = self.get_queryset() @@ -125,22 +117,22 @@ For example: Note that if your API doesn't include any object level permissions, you may optionally exclude the `self.check_object_permissions`, and simply return the object from the `get_object_or_404` lookup. #### `filter_queryset(self, queryset)` - + Given a queryset, filter it with whichever filter backends are in use, returning a new queryset. - + For example: - + def filter_queryset(self, queryset): filter_backends = (CategoryFilter,) - + if 'geo_route' in self.request.query_params: filter_backends = (GeoRouteFilter, CategoryFilter) elif 'geo_point' in self.request.query_params: filter_backends = (GeoPointFilter, CategoryFilter) - + for backend in list(filter_backends): queryset = backend().filter_queryset(self.request, queryset, view=self) - + return queryset #### `get_serializer_class(self)` @@ -156,19 +148,6 @@ For example: return FullAccountSerializer return BasicAccountSerializer -#### `get_paginate_by(self)` - -Returns the page size to use with pagination. By default this uses the `paginate_by` attribute, and may be overridden by the client if the `paginate_by_param` attribute is set. - -You may want to override this method to provide more complex behavior, such as modifying page sizes based on the media type of the response. - -For example: - - def get_paginate_by(self): - if self.request.accepted_renderer.format == 'html': - return 20 - return 100 - **Save and deletion hooks**: The following methods are provided by the mixin classes, and provide easy overriding of the object save or deletion behavior. @@ -416,5 +395,3 @@ The [django-rest-framework-bulk package][django-rest-framework-bulk] implements [DestroyModelMixin]: #destroymodelmixin [django-rest-framework-bulk]: https://github.com/miki725/django-rest-framework-bulk [django-rest-multiple-models]: https://github.com/Axiologue/DjangoRestMultipleModels - - From e2ac1483677a34d8ac7a333df36bbe8d59224bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Padilla?= Date: Tue, 17 Nov 2015 09:58:55 -0400 Subject: [PATCH 021/126] Test against Django 1.9rc1 --- tox.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index fb4374bdc..6e1fa26cf 100644 --- a/tox.ini +++ b/tox.ini @@ -14,7 +14,7 @@ setenv = deps = django17: Django==1.7.10 django18: Django==1.8.6 - django19: https://www.djangoproject.com/download/1.9b1/tarball/ + django19: https://www.djangoproject.com/download/1.9rc1/tarball/ -rrequirements/requirements-testing.txt -rrequirements/requirements-optionals.txt @@ -33,21 +33,21 @@ deps = # Specify explicitly to exclude Django Guardian against Django 1.9 [testenv:py27-django19] deps = - https://www.djangoproject.com/download/1.9b1/tarball/ + https://www.djangoproject.com/download/1.9rc1/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py34-django19] deps = - https://www.djangoproject.com/download/1.9b1/tarball/ + https://www.djangoproject.com/download/1.9rc1/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py35-django19] deps = - https://www.djangoproject.com/download/1.9b1/tarball/ + https://www.djangoproject.com/download/1.9rc1/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 From f7646627f1e7a9d1944ba2232e87feefcc1ceff2 Mon Sep 17 00:00:00 2001 From: "Silvio J. Gutierrez" Date: Tue, 17 Nov 2015 19:09:49 -0500 Subject: [PATCH 022/126] Documentation fix for list serializers. --- docs/api-guide/serializers.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index 0be36fd22..55d67c21e 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -800,6 +800,9 @@ Here's an example of how you might choose to implement multiple updates: return ret class BookSerializer(serializers.Serializer): + # You must explicitly mark the primary key as editable. + id = serializers.IntegerField() + ... class Meta: list_serializer_class = BookListSerializer From 802ee5d0ea234d86fbcd7875a15f3b8a47c02967 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Wed, 18 Nov 2015 15:25:58 +0100 Subject: [PATCH 023/126] Fix template.render deprecation warnings for 1.9+ --- rest_framework/compat.py | 24 +++++++++++++++ rest_framework/filters.py | 20 ++++++------- rest_framework/pagination.py | 15 +++++----- rest_framework/renderers.py | 30 +++++++++---------- rest_framework/templatetags/rest_framework.py | 11 +++---- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 8b782a1c2..c6966a980 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -9,6 +9,7 @@ from __future__ import unicode_literals import django from django.conf import settings from django.db import connection, transaction +from django.template import Context, RequestContext, Template from django.utils import six from django.views.generic import View @@ -191,6 +192,7 @@ try: except ImportError: DecimalValidator = None + def set_rollback(): if hasattr(transaction, 'set_rollback'): if connection.settings_dict.get('ATOMIC_REQUESTS', False): @@ -206,3 +208,25 @@ def set_rollback(): else: # transaction not managed pass + + +def template_render(template, context=None, request=None): + """ + Passing Context or RequestContext to Template.render is deprecated in 1.9+, + see https://github.com/django/django/pull/3883 and + https://github.com/django/django/blob/1.9rc1/django/template/backends/django.py#L82-L84 + + :param template: Template instance + :param context: dict + :param request: Request instance + :return: rendered template as SafeText instance + """ + if django.VERSION < (1, 9) or isinstance(template, Template): + if request: + context = RequestContext(request, context) + else: + context = Context(context) + return template.render(context) + # backends template, e.g. django.template.backends.django.Template + else: + return template.render(context, request=request) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index a62139405..66f1185a3 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -10,12 +10,12 @@ from functools import reduce from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.db import models -from django.template import Context, loader +from django.template import loader from django.utils import six from django.utils.translation import ugettext_lazy as _ from rest_framework.compat import ( - crispy_forms, distinct, django_filters, guardian + crispy_forms, distinct, django_filters, guardian, template_render ) from rest_framework.settings import api_settings @@ -122,11 +122,11 @@ class DjangoFilterBackend(BaseFilterBackend): filter_instance = filter_class(request.query_params, queryset=queryset) else: filter_instance = None - context = Context({ + context = { 'filter': filter_instance - }) + } template = loader.get_template(self.template) - return template.render(context) + return template_render(template, context) class SearchFilter(BaseFilterBackend): @@ -185,12 +185,12 @@ class SearchFilter(BaseFilterBackend): term = self.get_search_terms(request) term = term[0] if term else '' - context = Context({ + context = { 'param': self.search_param, 'term': term - }) + } template = loader.get_template(self.template) - return template.render(context) + return template_render(template, context) class OrderingFilter(BaseFilterBackend): @@ -284,8 +284,8 @@ class OrderingFilter(BaseFilterBackend): def to_html(self, request, queryset, view): template = loader.get_template(self.template) - context = Context(self.get_template_context(request, queryset, view)) - return template.render(context) + context = self.get_template_context(request, queryset, view) + return template_render(template, context) class DjangoObjectPermissionsFilter(BaseFilterBackend): diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index fc7b90967..7f9c135fc 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -10,11 +10,12 @@ from collections import OrderedDict, namedtuple from django.core.paginator import Paginator as DjangoPaginator from django.core.paginator import InvalidPage -from django.template import Context, loader +from django.template import loader from django.utils import six from django.utils.six.moves.urllib import parse as urlparse from django.utils.translation import ugettext_lazy as _ +from rest_framework.compat import template_render from rest_framework.exceptions import NotFound from rest_framework.response import Response from rest_framework.settings import api_settings @@ -273,8 +274,8 @@ class PageNumberPagination(BasePagination): def to_html(self): template = loader.get_template(self.template) - context = Context(self.get_html_context()) - return template.render(context) + context = self.get_html_context() + return template_render(template, context) class LimitOffsetPagination(BasePagination): @@ -389,8 +390,8 @@ class LimitOffsetPagination(BasePagination): def to_html(self): template = loader.get_template(self.template) - context = Context(self.get_html_context()) - return template.render(context) + context = self.get_html_context() + return template_render(template, context) class CursorPagination(BasePagination): @@ -692,5 +693,5 @@ class CursorPagination(BasePagination): def to_html(self): template = loader.get_template(self.template) - context = Context(self.get_html_context()) - return template.render(context) + context = self.get_html_context() + return template_render(template, context) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index ba4d60881..8eb6725d5 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -15,13 +15,13 @@ from django import forms from django.core.exceptions import ImproperlyConfigured from django.core.paginator import Page from django.http.multipartparser import parse_header -from django.template import Context, RequestContext, Template, loader +from django.template import Template, loader from django.test.client import encode_multipart from django.utils import six from rest_framework import VERSION, exceptions, serializers, status from rest_framework.compat import ( - INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS + INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, template_render ) from rest_framework.exceptions import ParseError from rest_framework.request import is_form_media_type, override_method @@ -168,7 +168,7 @@ class TemplateHTMLRenderer(BaseRenderer): template = self.resolve_template(template_names) context = self.resolve_context(data, request, response) - return template.render(context) + return template_render(template, context, request=request) def resolve_template(self, template_names): return loader.select_template(template_names) @@ -176,7 +176,7 @@ class TemplateHTMLRenderer(BaseRenderer): def resolve_context(self, data, request, response): if response.exception: data['status_code'] = response.status_code - return RequestContext(request, data) + return data def get_template_names(self, response, view): if response.template_name: @@ -230,7 +230,7 @@ class StaticHTMLRenderer(TemplateHTMLRenderer): request = renderer_context['request'] template = self.get_exception_template(response) context = self.resolve_context(data, request, response) - return template.render(context) + return template_render(template, context, request=request) return data @@ -333,8 +333,8 @@ class HTMLFormRenderer(BaseRenderer): template_name = style['template_pack'].strip('/') + '/' + style['base_template'] template = loader.get_template(template_name) - context = Context({'field': field, 'style': style}) - return template.render(context) + context = {'field': field, 'style': style} + return template_render(template, context) def render(self, data, accepted_media_type=None, renderer_context=None): """ @@ -350,11 +350,11 @@ class HTMLFormRenderer(BaseRenderer): template_pack = style['template_pack'].strip('/') template_name = template_pack + '/' + self.base_template template = loader.get_template(template_name) - context = Context({ + context = { 'form': form, 'style': style - }) - return template.render(context) + } + return template_render(template, context) class BrowsableAPIRenderer(BaseRenderer): @@ -600,8 +600,8 @@ class BrowsableAPIRenderer(BaseRenderer): return template = loader.get_template(self.filter_template) - context = Context({'elements': elements}) - return template.render(context) + context = {'elements': elements} + return template_render(template, context) def get_context(self, data, accepted_media_type, renderer_context): """ @@ -672,8 +672,7 @@ class BrowsableAPIRenderer(BaseRenderer): template = loader.get_template(self.template) context = self.get_context(data, accepted_media_type, renderer_context) - context = RequestContext(renderer_context['request'], context) - ret = template.render(context) + ret = template_render(template, context, request=renderer_context['request']) # Munge DELETE Response code to allow us to return content # (Do this *after* we've rendered the template so that we include @@ -709,8 +708,7 @@ class AdminRenderer(BrowsableAPIRenderer): template = loader.get_template(self.template) context = self.get_context(data, accepted_media_type, renderer_context) - context = RequestContext(renderer_context['request'], context) - ret = template.render(context) + ret = template_render(template, context, request=renderer_context['request']) # Creation and deletion should use redirects in the admin style. if (response.status_code == status.HTTP_201_CREATED) and ('Location' in response): diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index 482e92470..05a7ce04f 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -4,12 +4,13 @@ import re from django import template from django.core.urlresolvers import NoReverseMatch, reverse -from django.template import Context, loader +from django.template import loader from django.utils import six from django.utils.encoding import force_text, iri_to_uri from django.utils.html import escape, format_html, smart_urlquote from django.utils.safestring import SafeData, mark_safe +from rest_framework.compat import template_render from rest_framework.renderers import HTMLFormRenderer from rest_framework.utils.urls import replace_query_param @@ -128,12 +129,12 @@ def format_value(value): template = loader.get_template('rest_framework/admin/list_value.html') else: template = loader.get_template('rest_framework/admin/simple_list_value.html') - context = Context({'value': value}) - return template.render(context) + context = {'value': value} + return template_render(template, context) elif isinstance(value, dict): template = loader.get_template('rest_framework/admin/dict_value.html') - context = Context({'value': value}) - return template.render(context) + context = {'value': value} + return template_render(template, context) elif isinstance(value, six.string_types): if ( (value.startswith('http:') or value.startswith('https:')) and not From 86928164010c412f7a5583a7b36e580f281b5a59 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Wed, 18 Nov 2015 15:52:57 +0100 Subject: [PATCH 024/126] Sort response headers in api renderer to keep the same order --- rest_framework/renderers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index ba4d60881..86e8cba55 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -9,6 +9,7 @@ REST framework also provides an HTML renderer that renders the browsable API. from __future__ import unicode_literals import json +from collections import OrderedDict import django from django import forms @@ -618,7 +619,7 @@ class BrowsableAPIRenderer(BaseRenderer): raw_data_patch_form = self.get_raw_data_form(data, view, 'PATCH', request) raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form - response_headers = dict(response.items()) + response_headers = OrderedDict(sorted(response.items())) renderer_content_type = '' if renderer: renderer_content_type = '%s' % renderer.media_type From ece79734793c97661b43daa4830777ee82a67128 Mon Sep 17 00:00:00 2001 From: "Silvio J. Gutierrez" Date: Wed, 18 Nov 2015 21:52:20 -0500 Subject: [PATCH 025/126] Updated comment. --- docs/api-guide/serializers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md index 55d67c21e..78c2dd0d9 100644 --- a/docs/api-guide/serializers.md +++ b/docs/api-guide/serializers.md @@ -800,7 +800,8 @@ Here's an example of how you might choose to implement multiple updates: return ret class BookSerializer(serializers.Serializer): - # You must explicitly mark the primary key as editable. + # We need to identify elements in the list using their primary key, + # so use a writable field here, rather than the default which would be read-only. id = serializers.IntegerField() ... From 2acc6a756cddf9db2ba5d8007b9e9871541fa63c Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Wed, 18 Nov 2015 20:17:17 +0100 Subject: [PATCH 026/126] Use related_objects api for Django 1.9+ --- rest_framework/compat.py | 29 +++++++++++++++++++++++++++++ rest_framework/utils/model_meta.py | 8 ++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index c6966a980..56d006efb 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -230,3 +230,32 @@ def template_render(template, context=None, request=None): # backends template, e.g. django.template.backends.django.Template else: return template.render(context, request=request) + + +def get_all_related_objects(opts): + """ + Django 1.8 changed meta api, see + https://docs.djangoproject.com/en/1.8/ref/models/meta/#migrating-old-meta-api + https://code.djangoproject.com/ticket/12663 + https://github.com/django/django/pull/3848 + + :param opts: Options instance + :return: list of relations except many-to-many ones + """ + if django.VERSION < (1, 9): + return opts.get_all_related_objects() + else: + return [r for r in opts.related_objects if not r.field.many_to_many] + + +def get_all_related_many_to_many_objects(opts): + """ + Django 1.8 changed meta api, see docstr in compat.get_all_related_objects() + + :param opts: Options instance + :return: list of many-to-many relations + """ + if django.VERSION < (1, 9): + return opts.get_all_related_many_to_many_objects() + else: + return [r for r in opts.related_objects if r.field.many_to_many] diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index 77952fbf8..f151c6f36 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -13,6 +13,10 @@ from django.core.exceptions import ImproperlyConfigured from django.db import models from django.utils import six +from rest_framework.compat import ( + get_all_related_many_to_many_objects, get_all_related_objects +) + FieldInfo = namedtuple('FieldResult', [ 'pk', # Model field instance 'fields', # Dict of field name -> model field instance @@ -134,7 +138,7 @@ def _get_reverse_relationships(opts): # See: https://code.djangoproject.com/ticket/24208 reverse_relations = OrderedDict() - for relation in opts.get_all_related_objects(): + for relation in get_all_related_objects(opts): accessor_name = relation.get_accessor_name() related = getattr(relation, 'related_model', relation.model) reverse_relations[accessor_name] = RelationInfo( @@ -146,7 +150,7 @@ def _get_reverse_relationships(opts): ) # Deal with reverse many-to-many relationships. - for relation in opts.get_all_related_many_to_many_objects(): + for relation in get_all_related_many_to_many_objects(opts): accessor_name = relation.get_accessor_name() related = getattr(relation, 'related_model', relation.model) reverse_relations[accessor_name] = RelationInfo( From b209fe04fc5720fe7d13c8ff9abadfe09df9f146 Mon Sep 17 00:00:00 2001 From: Steven Loria Date: Fri, 20 Nov 2015 13:51:21 -0500 Subject: [PATCH 027/126] Fix typo in docstring for ReadOnlyField --- rest_framework/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 7d3ae6a6d..1893a32c9 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1565,7 +1565,7 @@ class ReadOnlyField(Field): For example, the following would call `get_expiry_date()` on the object: - class ExampleSerializer(self): + class ExampleSerializer(Serializer): expiry_date = ReadOnlyField(source='get_expiry_date') """ From e786e4c4a142ed42b05b3e4e82ac13c41f898c36 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 23 Nov 2015 13:50:44 +0100 Subject: [PATCH 028/126] doc: clarify that crispy-forms needs to be in INSTALLED_APPS --- docs/api-guide/filtering.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index 6bdbdfedb..9e5f605ff 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -145,11 +145,11 @@ To use REST framework's `DjangoFilterBackend`, first install `django-filter`. pip install django-filter -If you are using the browsable API or admin API you may also want to install `crispy-forms`, which will enhance the presentation of the filter forms in HTML views, by allowing them to render Bootstrap 3 HTML. +If you are using the browsable API or admin API you may also want to install `django-crispy-forms`, which will enhance the presentation of the filter forms in HTML views, by allowing them to render Bootstrap 3 HTML. pip install django-crispy-forms -With crispy forms installed, the browsable API will present a filtering control for `DjangoFilterBackend`, like so: +With crispy forms installed and added to Django's `INSTALLED_APPS`, the browsable API will present a filtering control for `DjangoFilterBackend`, like so: ![Django Filter](../img/django-filter.png) From 3bcb7dba8c7bbc249fbfa19f37345c065828a071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Padilla?= Date: Tue, 24 Nov 2015 14:23:14 -0400 Subject: [PATCH 029/126] Update Django versions --- tox.ini | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tox.ini b/tox.ini index 6e1fa26cf..8d617601a 100644 --- a/tox.ini +++ b/tox.ini @@ -12,9 +12,9 @@ commands = ./runtests.py --fast {posargs} --coverage setenv = PYTHONDONTWRITEBYTECODE=1 deps = - django17: Django==1.7.10 - django18: Django==1.8.6 - django19: https://www.djangoproject.com/download/1.9rc1/tarball/ + django17: Django==1.7.11 + django18: Django==1.8.7 + django19: https://www.djangoproject.com/download/1.9rc2/tarball/ -rrequirements/requirements-testing.txt -rrequirements/requirements-optionals.txt @@ -33,21 +33,21 @@ deps = # Specify explicitly to exclude Django Guardian against Django 1.9 [testenv:py27-django19] deps = - https://www.djangoproject.com/download/1.9rc1/tarball/ + https://www.djangoproject.com/download/1.9rc2/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py34-django19] deps = - https://www.djangoproject.com/download/1.9rc1/tarball/ + https://www.djangoproject.com/download/1.9rc2/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py35-django19] deps = - https://www.djangoproject.com/download/1.9rc1/tarball/ + https://www.djangoproject.com/download/1.9rc2/tarball/ -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 From d6c326623fb10c4413d478fbf7fa7cc7049bb13b Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 25 Nov 2015 07:37:01 +0100 Subject: [PATCH 030/126] Make DRF compatible with multi template engine in Django 1.8 --- rest_framework/compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 56d006efb..de8e77ae7 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -221,7 +221,7 @@ def template_render(template, context=None, request=None): :param request: Request instance :return: rendered template as SafeText instance """ - if django.VERSION < (1, 9) or isinstance(template, Template): + if django.VERSION < (1, 8) or isinstance(template, Template): if request: context = RequestContext(request, context) else: From 8b97bb8f68970881190a3b62cf53495cc0e20786 Mon Sep 17 00:00:00 2001 From: Prashant Tiwari Date: Thu, 26 Nov 2015 06:23:59 +0000 Subject: [PATCH 031/126] Fix for Incorrect regex in URLPathVersioning documentation #3638 --- docs/api-guide/versioning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/versioning.md b/docs/api-guide/versioning.md index 06b0056a4..a062dc096 100644 --- a/docs/api-guide/versioning.md +++ b/docs/api-guide/versioning.md @@ -130,7 +130,7 @@ Your URL conf must include a pattern that matches the version with a `'version'` urlpatterns = [ url( - r'^(?P[v1|v2]+)/bookings/$', + r'^(?P(v1|v2))/bookings/$', bookings_list, name='bookings-list' ), From 6dcb994c9851d74f3daab887eebdd4f48bf077e3 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Thu, 26 Nov 2015 15:29:15 +0200 Subject: [PATCH 032/126] Upgrade transifex-client dependency to 0.11 Version 0.11b3's setup.py had an undeclared dependency on `py2exe` when running on Windows (see https://github.com/transifex/transifex-client/blob/0.11b3/setup.py#L23), which made it impossible to install without having a working `py2exe` to begin with. This has been fixed in 0.11 proper. --- requirements/requirements-packaging.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements-packaging.txt b/requirements/requirements-packaging.txt index 7510dbd79..8f62ee365 100644 --- a/requirements/requirements-packaging.txt +++ b/requirements/requirements-packaging.txt @@ -5,4 +5,4 @@ wheel==0.24.0 twine==1.4.0 # Transifex client for managing translation resources. -transifex-client==0.11b3 +transifex-client==0.11 From 45c66dae42e440f39b3dee01254415eca9718a64 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Thu, 26 Nov 2015 15:40:22 +0200 Subject: [PATCH 033/126] Upgrade isort to 4.2.2. This gets rid of a file encoding bug that occurs on Windows boxes where the default implied encoding is cp1252, but the files themselves aren't. The actual patch that seems to fix this is https://github.com/timothycrosley/isort/commit/1057d5e12edbb3030045b7a7a8c82f0848635fef but it seems like a good idea to upgrade to the latest and greatest. --- requirements/requirements-codestyle.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements-codestyle.txt b/requirements/requirements-codestyle.txt index 1412a4d86..2284a4cab 100644 --- a/requirements/requirements-codestyle.txt +++ b/requirements/requirements-codestyle.txt @@ -3,4 +3,4 @@ flake8==2.4.0 pep8==1.5.7 # Sort and lint imports -isort==3.9.6 +isort==4.2.2 From bdf9c4997d80586954639d95e0d0ed9fc2979553 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Thu, 26 Nov 2015 15:42:49 +0200 Subject: [PATCH 034/126] Add `types` to isort's standard library list. This re-stabilizes sorting after upgrading to 4.2.2. --- .isort.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/.isort.cfg b/.isort.cfg index bd5648e08..4d4a6a509 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -2,5 +2,6 @@ skip=.tox atomic=true multi_line_output=5 +known_standard_library=types known_third_party=pytest,django known_first_party=rest_framework From 47c9bb143c3121048957d1078525caaee9f4a10e Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Thu, 26 Nov 2015 15:48:04 +0200 Subject: [PATCH 035/126] Fix `smart_repr()` to also clean upper-case hex addresses. Windows Pythons seem to like printing addresses in upper-case, while Linux Pythons like lower-case hexes. This led to an amusing (for a given value of "amusing", anyway) situation where some repr tests would fail if the objects they were testing happened to be allocated at an address with a hex digit in the range A..F. --- rest_framework/utils/representation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/representation.py b/rest_framework/utils/representation.py index 920751719..49f829c10 100644 --- a/rest_framework/utils/representation.py +++ b/rest_framework/utils/representation.py @@ -40,7 +40,7 @@ def smart_repr(value): # # Should be presented as # - value = re.sub(' at 0x[0-9a-f]{4,32}>', '>', value) + value = re.sub(' at 0x[0-9A-Fa-f]{4,32}>', '>', value) return value From 570187b959575822febf838464ea46282cf21654 Mon Sep 17 00:00:00 2001 From: Petros Moisiadis Date: Thu, 26 Nov 2015 17:07:57 +0200 Subject: [PATCH 036/126] Updated NestedBoundField to also handle empty string when rendering its form If a NestedBoundField field has a value of `None` and is inside another NestedBoundField field, it will have its value converted to an empty string while the form of its enclosing field is being rendered. So, NestedBoundField fields with an empty string value must be handled the same way as NestedBoundField fields with a `None` value. --- rest_framework/utils/serializer_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/serializer_helpers.py b/rest_framework/utils/serializer_helpers.py index b11d3fd07..cfaeb25e8 100644 --- a/rest_framework/utils/serializer_helpers.py +++ b/rest_framework/utils/serializer_helpers.py @@ -90,7 +90,7 @@ class NestedBoundField(BoundField): """ def __init__(self, field, value, errors, prefix=''): - if value is None: + if value is None or value is '': value = {} super(NestedBoundField, self).__init__(field, value, errors, prefix) From 69688289ce22c874a430910a0b85c0d5a68d1f3c Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Tue, 24 Nov 2015 14:44:00 +0200 Subject: [PATCH 037/126] Ensure `Django{Model,Object}Permissions` don't hide exceptions. Quietly catching `AttributeError` and `TypeError` when calling `get_queryset()` is rather insidious, as those exceptions get caught no matter where they might happen in the call stack. --- rest_framework/permissions.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 292952cfa..4d5832a7a 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -112,15 +112,15 @@ class DjangoModelPermissions(BasePermission): if getattr(view, '_ignore_model_permissions', False): return True - try: + if hasattr(view, 'get_queryset'): queryset = view.get_queryset() - except AttributeError: + else: queryset = getattr(view, 'queryset', None) assert queryset is not None, ( 'Cannot apply DjangoModelPermissions on a view that ' - 'does not have `.queryset` property or overrides the ' - '`.get_queryset()` method.') + 'does not set `.queryset` or have a `.get_queryset()` method.' + ) perms = self.get_required_permissions(request.method, queryset.model) @@ -169,15 +169,15 @@ class DjangoObjectPermissions(DjangoModelPermissions): return [perm % kwargs for perm in self.perms_map[method]] def has_object_permission(self, request, view, obj): - try: + if hasattr(view, 'get_queryset'): queryset = view.get_queryset() - except AttributeError: + else: queryset = getattr(view, 'queryset', None) assert queryset is not None, ( 'Cannot apply DjangoObjectPermissions on a view that ' - 'does not have `.queryset` property or overrides the ' - '`.get_queryset()` method.') + 'does not set `.queryset` or have a `.get_queryset()` method.' + ) model_cls = queryset.model user = request.user From 3594c976b751aca07fcd9c07c4e404d81304fe07 Mon Sep 17 00:00:00 2001 From: Petros Moisiadis Date: Fri, 27 Nov 2015 15:07:29 +0200 Subject: [PATCH 038/126] Added test case for rendering nested fields with none value --- tests/test_bound_fields.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/test_bound_fields.py b/tests/test_bound_fields.py index 71d49a385..f2fac8f0d 100644 --- a/tests/test_bound_fields.py +++ b/tests/test_bound_fields.py @@ -90,3 +90,40 @@ class TestNestedBoundField: assert serializer.is_valid() assert serializer['nested']['bool_field'].as_form_field().value == '' assert serializer['nested']['null_field'].as_form_field().value == '' + + def test_rendering_nested_fields_with_none_value(self): + from rest_framework.renderers import HTMLFormRenderer + + class Nested1(serializers.Serializer): + text_field = serializers.CharField() + + class Nested2(serializers.Serializer): + nested1 = Nested1(allow_null=True) + text_field = serializers.CharField() + + class ExampleSerializer(serializers.Serializer): + nested2 = Nested2() + + serializer = ExampleSerializer(data={'nested2': {'nested1': None, 'text_field': 'test'}}) + assert serializer.is_valid() + renderer = HTMLFormRenderer() + for field in serializer: + rendered = renderer.render_field(field, {}) + expected_packed = ( + '
' + 'Nested2' + '
' + 'Nested1' + '' + '' + '' + '
' + '' + '' + '' + '' + '
' + '' + ) + rendered_packed = ''.join(rendered.split()) + assert rendered_packed == expected_packed From e3f62e230cef1eece90133559c4d4360b9b98a6f Mon Sep 17 00:00:00 2001 From: Nik Nyby Date: Mon, 30 Nov 2015 10:48:56 -0500 Subject: [PATCH 039/126] Add missing link to django-crispy-forms --- docs/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.md b/docs/index.md index edfae2ad8..403b5196c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -258,6 +258,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [eventbrite]: https://www.eventbrite.co.uk/about/ [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 [django-guardian]: https://github.com/lukaszb/django-guardian [0.4]: https://github.com/tomchristie/django-rest-framework/tree/0.4.X [image]: img/quickstart.png From bd8098e31fcc20e10247866bb9faac31e471e1fc Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 30 Nov 2015 17:21:41 +0000 Subject: [PATCH 040/126] Fix template typo. Closes #3682. Thanks for the report! --- docs/topics/html-and-forms.md | 432 +++++++++++++++++----------------- 1 file changed, 218 insertions(+), 214 deletions(-) diff --git a/docs/topics/html-and-forms.md b/docs/topics/html-and-forms.md index 82dd21640..7b8f1ccc2 100644 --- a/docs/topics/html-and-forms.md +++ b/docs/topics/html-and-forms.md @@ -1,215 +1,219 @@ -# HTML & Forms - -REST framework is suitable for returning both API style responses, and regular HTML pages. Additionally, serializers can used as HTML forms and rendered in templates. - -## Rendering HTML - -In order to return HTML responses you'll need to either `TemplateHTMLRenderer`, or `StaticHTMLRenderer`. - -The `TemplateHTMLRenderer` class expects the response to contain a dictionary of context data, and renders an HTML page based on a template that must be specified either in the view or on the response. - -The `StaticHTMLRender` class expects the response to contain a string of the pre-rendered HTML content. - -Because static HTML pages typically have different behavior from API responses you'll probably need to write any HTML views explicitly, rather than relying on the built-in generic views. - -Here's an example of a view that returns a list of "Profile" instances, rendered in an HTML template: - -**views.py**: - - from my_project.example.models import Profile - from rest_framework.renderers import TemplateHTMLRenderer - from rest_framework.response import Response - from rest_framework.views import APIView - - - class ProfileList(APIView): - renderer_classes = [TemplateHTMLRenderer] - template_name = 'profile_list.html' - - def get(self, request): - queryset = Profile.objects.all() - return Response({'profiles': queryset}) - -**profile_list.html**: - - -

Profiles

-
    - {% for profile in profiles %} -
  • {{ profile.name }}
  • - {% endfor %} -
- - -## Rendering Forms - -Serializers may be rendered as forms by using the `render_form` template tag, and including the serializer instance as context to the template. - -The following view demonstrates an example of using a serializer in a template for viewing and updating a model instance: - -**views.py**: - - from django.shortcuts import get_object_or_404 - from my_project.example.models import Profile - from rest_framework.renderers import TemplateHTMLRenderer - from rest_framework.views import APIView - - - class ProfileDetail(APIView): - renderer_classes = [TemplateHTMLRenderer] - template_name = 'profile_detail.html' - - def get(self, request, pk): - profile = get_object_or_404(Profile, pk=pk) - serializer = ProfileSerializer(profile) - return Response({'serializer': serializer, 'profile': profile}) - - def post(self, request, pk): - profile = get_object_or_404(Profile, pk=pk) - serializer = ProfileSerializer(profile) - if not serializer.is_valid(): - return Response({'serializer': serializer, 'profile': profile}) return redirect('profile-list') - -**profile_detail.html**: - - {% load rest_framework %} - - - -

Profile - {{ profile.name }}

- - - {% csrf_token %} - {% render_form serializer %} - - - - - -### Using template packs - -The `render_form` tag takes an optional `template_pack` argument, that specifies which template directory should be used for rendering the form and form fields. - -REST framework includes three built-in template packs, all based on Bootstrap 3. The built-in styles are `horizontal`, `vertical`, and `inline`. The default style is `horizontal`. To use any of these template packs you'll want to also include the Bootstrap 3 CSS. - -The following HTML will link to a CDN hosted version of the Bootstrap 3 CSS: - - - … - - - -Third party packages may include alternate template packs, by bundling a template directory containing the necessary form and field templates. - -Let's take a look at how to render each of the three available template packs. For these examples we'll use a single serializer class to present a "Login" form. - - class LoginSerializer(serializers.Serializer): - email = serializers.EmailField( - max_length=100, - style={'placeholder': 'Email'} - ) - password = serializers.CharField( - max_length=100, - style={'input_type': 'password', 'placeholder': 'Password'} - ) - remember_me = serializers.BooleanField() --- - -#### `rest_framework/vertical` - -Presents form labels above their corresponding control inputs, using the standard Bootstrap layout. - -*This is the default template pack.* - - {% load rest_framework %} - - ... - -
- {% csrf_token %} - {% render_form serializer template_pack='rest_framework/vertical' %} - -
- -![Vertical form example](../img/vertical.png) - ---- - #### `rest_framework/horizontal` - -Presents labels and controls alongside each other, using a 2/10 column split. - -*This is the form style used in the browsable API and admin renderers.* - - {% load rest_framework %} - - ... - -
- {% csrf_token %} - {% render_form serializer %} -
-
- -
-
-
- -![Horizontal form example](../img/horizontal.png) - ---- - -#### `rest_framework/inline` - -A compact form style that presents all the controls inline. - - {% load rest_framework %} - - ... - -
- {% csrf_token %} - {% render_form serializer template_pack='rest_framework/inline' %} - -
- -![Inline form example](../img/inline.png) +# HTML & Forms -## Field styles - -Serializer fields can have their rendering style customized by using the `style` keyword argument. This argument is a dictionary of options that control the template and layout used. - -The most common way to customize the field style is to use the `base_template` style keyword argument to select which template in the template pack should be use. - -For example, to render a `CharField` as an HTML textarea rather than the default HTML input, you would use something like this: - - details = serializers.CharField( - max_length=1000, - style={'base_template': 'textarea.html'} - ) - -If you instead want a field to be rendered using a custom template that is *not part of an included template pack*, you can instead use the `template` style option, to fully specify a template name: - - details = serializers.CharField( - max_length=1000, - style={'template': 'my-field-templates/custom-input.html'} - ) - -Field templates can also use additional style properties, depending on their type. For example, the `textarea.html` template also accepts a `rows` property that can be used to affect the sizing of the control. - - details = serializers.CharField( - max_length=1000, - style={'base_template': 'textarea.html', 'rows': 10} - ) - -The complete list of `base_template` options and their associated style options is listed below. - -base_template | Valid field types | Additional style options -----|----|---- -input.html | Any string, numeric or date/time field | input_type, placeholder, hide_label -textarea.html | `CharField` | rows, placeholder, hide_label -select.html | `ChoiceField` or relational field types | hide_label -radio.html | `ChoiceField` or relational field types | inline, hide_label -select_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | hide_label -checkbox_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | inline, hide_label -checkbox.html | `BooleanField` | hide_label -fieldset.html | Nested serializer | hide_label -list_fieldset.html | `ListField` or nested serializer with `many=True` | hide_label +REST framework is suitable for returning both API style responses, and regular HTML pages. Additionally, serializers can used as HTML forms and rendered in templates. + +## Rendering HTML + +In order to return HTML responses you'll need to either `TemplateHTMLRenderer`, or `StaticHTMLRenderer`. + +The `TemplateHTMLRenderer` class expects the response to contain a dictionary of context data, and renders an HTML page based on a template that must be specified either in the view or on the response. + +The `StaticHTMLRender` class expects the response to contain a string of the pre-rendered HTML content. + +Because static HTML pages typically have different behavior from API responses you'll probably need to write any HTML views explicitly, rather than relying on the built-in generic views. + +Here's an example of a view that returns a list of "Profile" instances, rendered in an HTML template: + +**views.py**: + + from my_project.example.models import Profile + from rest_framework.renderers import TemplateHTMLRenderer + from rest_framework.response import Response + from rest_framework.views import APIView + + + class ProfileList(APIView): + renderer_classes = [TemplateHTMLRenderer] + template_name = 'profile_list.html' + + def get(self, request): + queryset = Profile.objects.all() + return Response({'profiles': queryset}) + +**profile_list.html**: + + +

Profiles

+
    + {% for profile in profiles %} +
  • {{ profile.name }}
  • + {% endfor %} +
+ + +## Rendering Forms + +Serializers may be rendered as forms by using the `render_form` template tag, and including the serializer instance as context to the template. + +The following view demonstrates an example of using a serializer in a template for viewing and updating a model instance: + +**views.py**: + + from django.shortcuts import get_object_or_404 + from my_project.example.models import Profile + from rest_framework.renderers import TemplateHTMLRenderer + from rest_framework.views import APIView + + + class ProfileDetail(APIView): + renderer_classes = [TemplateHTMLRenderer] + template_name = 'profile_detail.html' + + def get(self, request, pk): + profile = get_object_or_404(Profile, pk=pk) + serializer = ProfileSerializer(profile) + return Response({'serializer': serializer, 'profile': profile}) + + def post(self, request, pk): + profile = get_object_or_404(Profile, pk=pk) + serializer = ProfileSerializer(profile) + if not serializer.is_valid(): + return Response({'serializer': serializer, 'profile': profile}) + return redirect('profile-list') + +**profile_detail.html**: + + {% load rest_framework %} + + + +

Profile - {{ profile.name }}

+ +
+ {% csrf_token %} + {% render_form serializer %} + +
+ + + +### Using template packs + +The `render_form` tag takes an optional `template_pack` argument, that specifies which template directory should be used for rendering the form and form fields. + +REST framework includes three built-in template packs, all based on Bootstrap 3. The built-in styles are `horizontal`, `vertical`, and `inline`. The default style is `horizontal`. To use any of these template packs you'll want to also include the Bootstrap 3 CSS. + +The following HTML will link to a CDN hosted version of the Bootstrap 3 CSS: + + + … + + + +Third party packages may include alternate template packs, by bundling a template directory containing the necessary form and field templates. + +Let's take a look at how to render each of the three available template packs. For these examples we'll use a single serializer class to present a "Login" form. + + class LoginSerializer(serializers.Serializer): + email = serializers.EmailField( + max_length=100, + style={'placeholder': 'Email'} + ) + password = serializers.CharField( + max_length=100, + style={'input_type': 'password', 'placeholder': 'Password'} + ) + remember_me = serializers.BooleanField() + +--- + +#### `rest_framework/vertical` + +Presents form labels above their corresponding control inputs, using the standard Bootstrap layout. + +*This is the default template pack.* + + {% load rest_framework %} + + ... + +
+ {% csrf_token %} + {% render_form serializer template_pack='rest_framework/vertical' %} + +
+ +![Vertical form example](../img/vertical.png) + +--- + +#### `rest_framework/horizontal` + +Presents labels and controls alongside each other, using a 2/10 column split. + +*This is the form style used in the browsable API and admin renderers.* + + {% load rest_framework %} + + ... + +
+ {% csrf_token %} + {% render_form serializer %} +
+
+ +
+
+
+ +![Horizontal form example](../img/horizontal.png) + +--- + +#### `rest_framework/inline` + +A compact form style that presents all the controls inline. + + {% load rest_framework %} + + ... + +
+ {% csrf_token %} + {% render_form serializer template_pack='rest_framework/inline' %} + +
+ +![Inline form example](../img/inline.png) + +## Field styles + +Serializer fields can have their rendering style customized by using the `style` keyword argument. This argument is a dictionary of options that control the template and layout used. + +The most common way to customize the field style is to use the `base_template` style keyword argument to select which template in the template pack should be use. + +For example, to render a `CharField` as an HTML textarea rather than the default HTML input, you would use something like this: + + details = serializers.CharField( + max_length=1000, + style={'base_template': 'textarea.html'} + ) + +If you instead want a field to be rendered using a custom template that is *not part of an included template pack*, you can instead use the `template` style option, to fully specify a template name: + + details = serializers.CharField( + max_length=1000, + style={'template': 'my-field-templates/custom-input.html'} + ) + +Field templates can also use additional style properties, depending on their type. For example, the `textarea.html` template also accepts a `rows` property that can be used to affect the sizing of the control. + + details = serializers.CharField( + max_length=1000, + style={'base_template': 'textarea.html', 'rows': 10} + ) + +The complete list of `base_template` options and their associated style options is listed below. + +base_template | Valid field types | Additional style options +----|----|---- +input.html | Any string, numeric or date/time field | input_type, placeholder, hide_label +textarea.html | `CharField` | rows, placeholder, hide_label +select.html | `ChoiceField` or relational field types | hide_label +radio.html | `ChoiceField` or relational field types | inline, hide_label +select_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | hide_label +checkbox_multiple.html | `MultipleChoiceField` or relational fields with `many=True` | inline, hide_label +checkbox.html | `BooleanField` | hide_label +fieldset.html | Nested serializer | hide_label +list_fieldset.html | `ListField` or nested serializer with `many=True` | hide_label From 6d1ed851b5b5bce6c412745dac72b030fbf49d1b Mon Sep 17 00:00:00 2001 From: Adam Wester Date: Sat, 21 Nov 2015 22:03:29 -0500 Subject: [PATCH 041/126] #3228 - add confirm modal for delete --- .../rest_framework/css/bootstrap-tweaks.css | 5 +++++ .../templates/rest_framework/base.html | 22 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/rest_framework/static/rest_framework/css/bootstrap-tweaks.css b/rest_framework/static/rest_framework/css/bootstrap-tweaks.css index f3d20ccac..17085b49d 100644 --- a/rest_framework/static/rest_framework/css/bootstrap-tweaks.css +++ b/rest_framework/static/rest_framework/css/bootstrap-tweaks.css @@ -227,3 +227,8 @@ body a:hover { width: 20px; margin-top: 3px; } + +.modal-footer form { + margin-left: 5px; + margin-right: 5px; +} diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html index 558d634ca..b97e36aa3 100644 --- a/rest_framework/templates/rest_framework/base.html +++ b/rest_framework/templates/rest_framework/base.html @@ -1,6 +1,7 @@ {% load staticfiles %} {% load rest_framework %} {% load i18n %} + @@ -101,9 +102,24 @@ {% endif %} {% if delete_form %} -
- -
+ + + + {% endif %} {% if filter_form %} From c153bcb4794219dde3276aecd5c784fa95a1a643 Mon Sep 17 00:00:00 2001 From: bphillips Date: Tue, 1 Dec 2015 14:09:10 -0500 Subject: [PATCH 042/126] Added validation to UUIDField to properly catch invalid input types (lists, tuples, etc). --- rest_framework/fields.py | 6 ++++-- tests/test_fields.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 1893a32c9..8541bc43a 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -769,9 +769,11 @@ class UUIDField(Field): try: if isinstance(data, six.integer_types): return uuid.UUID(int=data) - else: + elif isinstance(data, six.string_types): return uuid.UUID(hex=data) - except (ValueError, TypeError): + else: + self.fail('invalid', value=data) + except (ValueError): self.fail('invalid', value=data) return data diff --git a/tests/test_fields.py b/tests/test_fields.py index 8d3bef106..9cb59f7da 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -609,7 +609,8 @@ class TestUUIDField(FieldValues): 284758210125106368185219588917561929842: uuid.UUID('d63a6fb6-88d5-40c7-a91c-9edf73283072') } invalid_inputs = { - '825d7aeb-05a9-45b5-a5b7': ['"825d7aeb-05a9-45b5-a5b7" is not a valid UUID.'] + '825d7aeb-05a9-45b5-a5b7': ['"825d7aeb-05a9-45b5-a5b7" is not a valid UUID.'], + (1, 2, 3): ['"(1, 2, 3)" is not a valid UUID.'] } outputs = { uuid.UUID('825d7aeb-05a9-45b5-a5b7-05df87923cda'): '825d7aeb-05a9-45b5-a5b7-05df87923cda' From eba6229b24f07525b630ec398dbeebf34fc9b8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Padilla?= Date: Tue, 1 Dec 2015 21:44:22 -0400 Subject: [PATCH 043/126] Use latest release of Django 1.9 --- tox.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index 8d617601a..a027fa0de 100644 --- a/tox.ini +++ b/tox.ini @@ -14,7 +14,7 @@ setenv = deps = django17: Django==1.7.11 django18: Django==1.8.7 - django19: https://www.djangoproject.com/download/1.9rc2/tarball/ + django19: Django==1.9 -rrequirements/requirements-testing.txt -rrequirements/requirements-optionals.txt @@ -33,21 +33,21 @@ deps = # Specify explicitly to exclude Django Guardian against Django 1.9 [testenv:py27-django19] deps = - https://www.djangoproject.com/download/1.9rc2/tarball/ + Django==1.9 -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py34-django19] deps = - https://www.djangoproject.com/download/1.9rc2/tarball/ + Django==1.9 -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 [testenv:py35-django19] deps = - https://www.djangoproject.com/download/1.9rc2/tarball/ + Django==1.9 -rrequirements/requirements-testing.txt markdown==2.5.2 django-filter==0.10.0 From 44a3d41ce928f10f719a84d4f4286a363ef33d15 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Thu, 3 Dec 2015 21:12:03 +0000 Subject: [PATCH 044/126] Implement __getnewargs__ for #3628 --- rest_framework/relations.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 40261f3f3..744823c48 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -32,6 +32,9 @@ class Hyperlink(six.text_type): ret.name = name return ret + def __getnewargs__(self): + return(str(self), self.name,) + is_hyperlink = True From dfc84d9818858e0d1199b4478ac806ef2a04fb06 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Thu, 3 Dec 2015 21:17:21 +0000 Subject: [PATCH 045/126] Force Build --- trashfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 trashfile diff --git a/trashfile b/trashfile new file mode 100644 index 000000000..e69de29bb From 8501f592168799d986c3a9fd9b061ea3022d6a09 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Fri, 4 Dec 2015 05:30:39 +0000 Subject: [PATCH 046/126] Hyperlink Test Case --- tests/test_relations.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_relations.py b/tests/test_relations.py index fd37e63e3..ada2b55dc 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -206,3 +206,13 @@ class TestManyRelatedField(APISimpleTestCase): mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) assert empty == self.field.get_value(mvd) + +class TestHyperlink: + def setup(self): + self.default_hyperlink = Hyperlink('http://example.com', 'test') + + def test_can_be_pickled(self): + import pickle + upkled = pickle.loads(pickle.dump(self.default_hyperlink)) + assert upickled == self.default_hyperlink + assert upickled.name == self.default_hyperlink.name From 4092cef39255f0ac840f5e7661f0d79bee492ee4 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Fri, 4 Dec 2015 05:42:46 +0000 Subject: [PATCH 047/126] Fixed Test Case for Hyperlink --- tests/test_relations.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_relations.py b/tests/test_relations.py index ada2b55dc..4107465f2 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -209,10 +209,10 @@ class TestManyRelatedField(APISimpleTestCase): class TestHyperlink: def setup(self): - self.default_hyperlink = Hyperlink('http://example.com', 'test') + self.default_hyperlink = serializers.Hyperlink('http://example.com', 'test') def test_can_be_pickled(self): import pickle - upkled = pickle.loads(pickle.dump(self.default_hyperlink)) - assert upickled == self.default_hyperlink - assert upickled.name == self.default_hyperlink.name + upkled = pickle.loads(pickle.dumps(self.default_hyperlink)) + assert upkled == self.default_hyperlink + assert upkled.name == self.default_hyperlink.name From 84b5e41af8592fc3e2530fe50846d8078a09feaf Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Fri, 4 Dec 2015 05:48:56 +0000 Subject: [PATCH 048/126] Fixes #3628 --- trashfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 trashfile diff --git a/trashfile b/trashfile deleted file mode 100644 index e69de29bb..000000000 From 4b59681c60ceec6128666c2825677353895aa9d6 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Fri, 4 Dec 2015 05:56:42 +0000 Subject: [PATCH 049/126] Fixed Class Newlines --- tests/test_relations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_relations.py b/tests/test_relations.py index 4107465f2..9469cd068 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -207,6 +207,7 @@ class TestManyRelatedField(APISimpleTestCase): mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) assert empty == self.field.get_value(mvd) + class TestHyperlink: def setup(self): self.default_hyperlink = serializers.Hyperlink('http://example.com', 'test') From c1b70538a2f674d8685f1eebd54fe8600ab1fb7d Mon Sep 17 00:00:00 2001 From: Marlon Date: Sat, 5 Dec 2015 11:10:39 -0600 Subject: [PATCH 050/126] Resolve #3596 Uses #3597, but without using `Context`. --- rest_framework/filters.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 66f1185a3..ff541ba1e 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -118,10 +118,9 @@ class DjangoFilterBackend(BaseFilterBackend): def to_html(self, request, queryset, view): filter_class = self.get_filter_class(view, queryset) - if filter_class: - filter_instance = filter_class(request.query_params, queryset=queryset) - else: - filter_instance = None + if not filter_class: + return None + filter_instance = filter_class(request.query_params, queryset=queryset) context = { 'filter': filter_instance } From 85db6a681b9d368686977a02d740c43edecfdfe2 Mon Sep 17 00:00:00 2001 From: Kirill Zaborsky Date: Mon, 7 Dec 2015 10:59:57 +0300 Subject: [PATCH 051/126] Fixed versioning regexp booking list regexp was fixed in https://github.com/tomchristie/django-rest-framework/commit/8b97bb8f68970881190a3b62cf53495cc0e20786 but single booking wasn't for some reason, and `v1v2/bookings/123/` shouldn't be allowed here --- docs/api-guide/versioning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/versioning.md b/docs/api-guide/versioning.md index a062dc096..f6e32f47d 100644 --- a/docs/api-guide/versioning.md +++ b/docs/api-guide/versioning.md @@ -135,7 +135,7 @@ Your URL conf must include a pattern that matches the version with a `'version'` name='bookings-list' ), url( - r'^(?P[v1|v2]+)/bookings/(?P[0-9]+)/$', + r'^(?P(v1|v2))/bookings/(?P[0-9]+)/$', bookings_detail, name='bookings-detail' ) From f3949e994d331cb88364dbb432598c11afdd1059 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 7 Dec 2015 18:56:09 +0100 Subject: [PATCH 052/126] Update base translation file. --- .../locale/en_US/LC_MESSAGES/django.po | 138 +++++++++++------- 1 file changed, 82 insertions(+), 56 deletions(-) diff --git a/rest_framework/locale/en_US/LC_MESSAGES/django.po b/rest_framework/locale/en_US/LC_MESSAGES/django.po index 846e5366a..afab87aac 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: 2015-09-21 10:55+0200\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,239 +108,265 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 From e203967e091de8bc5eda7846600ff02e1bef0aad Mon Sep 17 00:00:00 2001 From: knbk Date: Tue, 8 Dec 2015 01:20:48 +0100 Subject: [PATCH 053/126] Add app_name to rest_framework.urls. This allows users in Django 1.9+ to include the authentication urls without specifying the namespace, as in: urlpatterns = [ ... url(r'^auth/', include('rest_framework.urls')) ] --- docs/index.md | 2 +- docs/tutorial/4-authentication-and-permissions.md | 2 +- rest_framework/urls.py | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 403b5196c..622e35abd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -86,7 +86,7 @@ If you're intending to use the browsable API you'll probably also want to add RE url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ] -Note that the URL path can be whatever you want, but you must include `'rest_framework.urls'` with the `'rest_framework'` namespace. +Note that the URL path can be whatever you want, but you must include `'rest_framework.urls'` with the `'rest_framework'` namespace. You may leave out the namespace in Django 1.9+, and REST framework will set it for you. ## Example diff --git a/docs/tutorial/4-authentication-and-permissions.md b/docs/tutorial/4-authentication-and-permissions.md index 887d1e56f..8a9d73e4a 100644 --- a/docs/tutorial/4-authentication-and-permissions.md +++ b/docs/tutorial/4-authentication-and-permissions.md @@ -146,7 +146,7 @@ And, at the end of the file, add a pattern to include the login and logout views namespace='rest_framework')), ] -The `r'^api-auth/'` part of pattern can actually be whatever URL you want to use. The only restriction is that the included urls must use the `'rest_framework'` namespace. +The `r'^api-auth/'` part of pattern can actually be whatever URL you want to use. The only restriction is that the included urls must use the `'rest_framework'` namespace. In Django 1.9+, REST framework will set the namespace, so you may leave it out. Now if you open up the browser again and refresh the page you'll see a 'Login' link in the top right of the page. If you log in as one of the users you created earlier, you'll be able to create code snippets again. diff --git a/rest_framework/urls.py b/rest_framework/urls.py index d88ee8dbd..bdc1d77d0 100644 --- a/rest_framework/urls.py +++ b/rest_framework/urls.py @@ -9,8 +9,8 @@ your API requires authentication: url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')) ] -The urls must be namespaced as 'rest_framework', and you should make sure -your authentication settings include `SessionAuthentication`. +In Django versions older than 1.9, the urls must be namespaced as 'rest_framework', +and you should make sure your authentication settings include `SessionAuthentication`. """ from __future__ import unicode_literals @@ -19,6 +19,7 @@ from django.contrib.auth import views template_name = {'template_name': 'rest_framework/login.html'} +app_name = 'rest_framework' urlpatterns = [ url(r'^login/$', views.login, template_name, name='login'), url(r'^logout/$', views.logout, template_name, name='logout'), From d86a901affd0ec7a0b229cf561838827808e6315 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 21:45:44 -0600 Subject: [PATCH 054/126] Removed Settings raise attribute error --- rest_framework/settings.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index adf737126..188c130c0 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -177,7 +177,7 @@ class APISettings(object): """ def __init__(self, user_settings=None, defaults=None, import_strings=None): if user_settings: - self._user_settings = user_settings + self._user_settings = self.__check_user_settings(user_settings) self.defaults = defaults or DEFAULTS self.import_strings = import_strings or IMPORT_STRINGS @@ -206,6 +206,14 @@ class APISettings(object): setattr(self, attr, val) return val + def __check_user_settings(self, user_settings): + DEPRECEATED_SETTINGS = ( + "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY_SET",) + SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" + for setting in DEPRECEATED_SETTINGS: + if setting in user_settings: + raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % setting, SETTINGS_DOC) + api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS) From 13c66b9dfecf657ace26d6b46c005981ca6f23e0 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 21:53:33 -0600 Subject: [PATCH 055/126] Return error --- rest_framework/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 188c130c0..bc579b15f 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -213,6 +213,7 @@ class APISettings(object): for setting in DEPRECEATED_SETTINGS: if setting in user_settings: raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % setting, SETTINGS_DOC) + return user_settings api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS) From 03c7f149ac0162a78892593d33b5866a1a9b72df Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:17:33 -0600 Subject: [PATCH 056/126] Test case for settings check --- tests/test_settings.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_settings.py b/tests/test_settings.py index cc8d0d51f..5240a3f9b 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -18,6 +18,16 @@ class TestSettings(TestCase): with self.assertRaises(ImportError): settings.DEFAULT_RENDERER_CLASSES + def test_loud_error_raised_on_removed_setting(self): + """ + Make sure user is alerted with an error when a removed setting + is set. + """ + with self.asserRaise(AttributeError): + APISettings({ + 'MAX_PAGINATE_BY': 100 + }) + class TestSettingTypes(TestCase): def test_settings_consistently_coerced_to_list(self): From 4e5c57ab469c94a588312046a8f115b00331eb6b Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:19:58 -0600 Subject: [PATCH 057/126] type on test case --- tests/test_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_settings.py b/tests/test_settings.py index 5240a3f9b..518ba0429 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -23,7 +23,7 @@ class TestSettings(TestCase): Make sure user is alerted with an error when a removed setting is set. """ - with self.asserRaise(AttributeError): + with self.assertRaise(AttributeError): APISettings({ 'MAX_PAGINATE_BY': 100 }) From 1b3e4332e8765dae1b5dc41faa68cc392079fa00 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:24:22 -0600 Subject: [PATCH 058/126] --ammend --- tests/test_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_settings.py b/tests/test_settings.py index 518ba0429..977780164 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -23,7 +23,7 @@ class TestSettings(TestCase): Make sure user is alerted with an error when a removed setting is set. """ - with self.assertRaise(AttributeError): + with self.assertRaises(AttributeError): APISettings({ 'MAX_PAGINATE_BY': 100 }) From 9db4c2ae8aa48e0624facf5740c6741c1ce2f136 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:24:22 -0600 Subject: [PATCH 059/126] --ammend --- tests/test_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_settings.py b/tests/test_settings.py index 518ba0429..977780164 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -23,7 +23,7 @@ class TestSettings(TestCase): Make sure user is alerted with an error when a removed setting is set. """ - with self.assertRaise(AttributeError): + with self.assertRaises(AttributeError): APISettings({ 'MAX_PAGINATE_BY': 100 }) From 5117dad2cafa2691dbdaf4da398775891e368155 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:32:23 -0600 Subject: [PATCH 060/126] removed setting typo --- rest_framework/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index bc579b15f..80c818d11 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -208,7 +208,7 @@ class APISettings(object): def __check_user_settings(self, user_settings): DEPRECEATED_SETTINGS = ( - "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY_SET",) + "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY",) SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" for setting in DEPRECEATED_SETTINGS: if setting in user_settings: From 0f85165b69d8a6db67d3644771c08788a12f68d4 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 22:36:02 -0600 Subject: [PATCH 061/126] Fixed num args for % --- rest_framework/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 80c818d11..49c654f67 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -212,7 +212,7 @@ class APISettings(object): SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" for setting in DEPRECEATED_SETTINGS: if setting in user_settings: - raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % setting, SETTINGS_DOC) + raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) return user_settings From 60c4fe10b1af61fdc859ab8ec969ae5915efdb66 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 23:19:24 -0600 Subject: [PATCH 062/126] Refactor Constants --- rest_framework/settings.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 49c654f67..4690850a6 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -135,6 +135,19 @@ IMPORT_STRINGS = ( ) +SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" + + +# List of settings that have been depreceated +DEPRECEATED_SETTINGS = () + + +# List of settings that have been removed +REMOVED_SETTINGS = ( + "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY", +) + + def perform_import(val, setting_name): """ If the given setting is a string import notation, @@ -207,10 +220,7 @@ class APISettings(object): return val def __check_user_settings(self, user_settings): - DEPRECEATED_SETTINGS = ( - "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY",) - SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" - for setting in DEPRECEATED_SETTINGS: + for setting in REMOVED_SETTINGS: if setting in user_settings: raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) return user_settings From 5802dc0f982e17164abce4f6283c61fcf7fc04b2 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 23:19:24 -0600 Subject: [PATCH 063/126] Initial, fixes #3644 --- rest_framework/settings.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 49c654f67..4690850a6 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -135,6 +135,19 @@ IMPORT_STRINGS = ( ) +SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" + + +# List of settings that have been depreceated +DEPRECEATED_SETTINGS = () + + +# List of settings that have been removed +REMOVED_SETTINGS = ( + "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY", +) + + def perform_import(val, setting_name): """ If the given setting is a string import notation, @@ -207,10 +220,7 @@ class APISettings(object): return val def __check_user_settings(self, user_settings): - DEPRECEATED_SETTINGS = ( - "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY",) - SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" - for setting in DEPRECEATED_SETTINGS: + for setting in REMOVED_SETTINGS: if setting in user_settings: raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) return user_settings From a615e37277f783bb27392549813e597741a70461 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Mon, 7 Dec 2015 23:30:45 -0600 Subject: [PATCH 064/126] Removed depreceated constant --- rest_framework/settings.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 4690850a6..ecaa4b527 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -138,10 +138,6 @@ IMPORT_STRINGS = ( SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" -# List of settings that have been depreceated -DEPRECEATED_SETTINGS = () - - # List of settings that have been removed REMOVED_SETTINGS = ( "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY", From fcc0a70f7c4ca1faf1a9801d369ff53029e450c6 Mon Sep 17 00:00:00 2001 From: Raphael Merx Date: Thu, 10 Dec 2015 15:13:47 -0800 Subject: [PATCH 065/126] Fixed suggestion for format in test renderer Rendered would suggest using format='JSON' when the right argument is format='json'. --- rest_framework/renderers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index dafaf7de6..fa64f88ed 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -780,7 +780,7 @@ class MultiPartRenderer(BaseRenderer): assert not isinstance(value, dict), ( "Test data contained a dictionary value for key '%s', " "but multipart uploads do not support nested data. " - "You may want to consider using format='JSON' in this " + "You may want to consider using format='json' in this " "test case." % key ) return encode_multipart(self.BOUNDARY, data) From 7a5d81c0b490bed5fb2144162a82ef51c0bf6135 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Fri, 11 Dec 2015 07:16:04 +0100 Subject: [PATCH 066/126] Add extra args/kwargs to authtoken's views (#3718) --- rest_framework/authtoken/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/authtoken/views.py b/rest_framework/authtoken/views.py index 743684057..0c6596a7e 100644 --- a/rest_framework/authtoken/views.py +++ b/rest_framework/authtoken/views.py @@ -12,7 +12,7 @@ class ObtainAuthToken(APIView): renderer_classes = (renderers.JSONRenderer,) serializer_class = AuthTokenSerializer - def post(self, request): + def post(self, request, *args, **kwargs): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] From fbd89d6b7e03d1502e1a86202d2c34c7433716c4 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Sat, 12 Dec 2015 02:02:53 -0600 Subject: [PATCH 067/126] Moved SETTINGS_DOC --- rest_framework/settings.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index ecaa4b527..c7b5de9f0 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -135,9 +135,6 @@ IMPORT_STRINGS = ( ) -SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" - - # List of settings that have been removed REMOVED_SETTINGS = ( "PAGINATE_BY", "PAGINATE_BY_PARAM", "MAX_PAGINATE_BY", @@ -216,6 +213,7 @@ class APISettings(object): return val def __check_user_settings(self, user_settings): + SETTINGS_DOC = "http://www.django-rest-framework.org/api-guide/settings/" for setting in REMOVED_SETTINGS: if setting in user_settings: raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) From 82973cfa32ad7dfb5aca6d19cb03db6ff7c3911b Mon Sep 17 00:00:00 2001 From: Karthik Suresh Date: Sat, 12 Dec 2015 21:59:08 +0530 Subject: [PATCH 068/126] Import parser added to docs in API guide Added missing import statements in code snippet of API guide. Closes-Issue: #3727 --- docs/api-guide/parsers.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/api-guide/parsers.md b/docs/api-guide/parsers.md index d5975abd2..84fd6e5ac 100644 --- a/docs/api-guide/parsers.md +++ b/docs/api-guide/parsers.md @@ -51,6 +51,9 @@ using the `APIView` class based views. return Response({'received data': request.data}) Or, if you're using the `@api_view` decorator with function based views. + + from rest_framework.decorators import api_view + from rest_framework.decorators import parser_classes @api_view(['POST']) @parser_classes((JSONParser,)) From bf60c0801003021a951d10967dfa22113350cd8a Mon Sep 17 00:00:00 2001 From: mjparker777 Date: Sun, 13 Dec 2015 12:05:04 -0700 Subject: [PATCH 069/126] Issue 3726 DateTimeField not handling empty values --- rest_framework/fields.py | 3 +++ tests/test_fields.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 8541bc43a..fc917e213 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1061,6 +1061,9 @@ class DateTimeField(Field): self.fail('invalid', format=humanized_format) def to_representation(self, value): + if not value: + return None + output_format = getattr(self, 'format', api_settings.DATETIME_FORMAT) if output_format is None: diff --git a/tests/test_fields.py b/tests/test_fields.py index 9cb59f7da..7f79050ca 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -960,6 +960,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' + None: None, + '': None, } field = serializers.DateTimeField(default_timezone=timezone.UTC()) From 81775dfbae11270d7ebd3060146d0b6a25009475 Mon Sep 17 00:00:00 2001 From: mjparker777 Date: Sun, 13 Dec 2015 12:27:08 -0700 Subject: [PATCH 070/126] added missing comma --- tests/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index 7f79050ca..71bb70cd8 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -959,7 +959,7 @@ 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' + datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): '2001-01-01T13:00:00Z', None: None, '': None, } From fc08236ab84ce7c348216e9662ebec4ac0dea9a8 Mon Sep 17 00:00:00 2001 From: mjparker777 Date: Sun, 13 Dec 2015 16:09:56 -0700 Subject: [PATCH 071/126] updated timefield also --- rest_framework/fields.py | 3 +++ tests/test_fields.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index fc917e213..53a948c06 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1186,6 +1186,9 @@ class TimeField(Field): self.fail('invalid', format=humanized_format) def to_representation(self, value): + if not value: + return None + output_format = getattr(self, 'format', api_settings.TIME_FORMAT) if output_format is None: diff --git a/tests/test_fields.py b/tests/test_fields.py index 71bb70cd8..029a5bddc 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1030,7 +1030,9 @@ class TestTimeField(FieldValues): '99:99': ['Time has wrong format. Use one of these formats instead: hh:mm[:ss[.uuuuuu]].'], } outputs = { - datetime.time(13, 00): '13:00:00' + datetime.time(13, 00): '13:00:00', + None: None, + '': None, } field = serializers.TimeField() From bf18c9f6e37d8d88800647013994e924748a34da Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 14 Dec 2015 07:22:30 +0100 Subject: [PATCH 072/126] 3.3.2 release notes. --- docs/topics/release-notes.md | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index f397e9a1f..767f26c6c 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -40,6 +40,28 @@ You can determine your currently installed version using `pip freeze`: ## 3.3.x series +### 3.3.2 + +**Date**: [16th December 2015][3.3.2-milestone]. + +* `ListField` enforces input is a list. ([#3513][gh3513]) +* Fix regression hiding raw data form. ([#3600][gh3600], [#3578][gh3578]) +* Fix Python 3.5 compatibility. ([#3534][gh3534], [#3626][gh3626]) +* Allow setting a custom Django Paginator in `pagination.PageNumberPagination`. ([#3631][gh3631], [#3684][gh3684]) +* Fix relational fields without `to_fields` attribute. ([#3635][gh3635], [#3634][gh3634]) +* Fix `template.render` deprecation warnings for Django 1.9. ([#3654][gh3654]) +* Sort response headers in browsable API renderer. ([#3655][gh3655]) +* Use related_objects api for Django 1.9+. ([#3656][gh3656], [#3252][gh3252]) +* Add confirm modal when deleting. ([#3228][gh3228], [#3662][gh3662]) +* Reveal previously hidden AttributeErrors and TypeErrors while calling has_[object_]permissions. ([#3668][gh3668]) +* Make DRF compatible with multi template engine in Django 1.8. ([#3672][gh3672]) +* Update `NestedBoundField` to also handle empty string when rendering its form. ([#3677][gh3677]) +* Fix UUID validation to properly catch invalid input types. ([#3687][gh3687], [#3679][gh3679]) +* Fix caching issues. ([#3628][gh3628], [#3701][gh3701]) +* Fix Admin and API browser for views without a filter_class. ([#3705][gh3705], [#3596][gh3596], [#3597][gh3597]) +* Add app_name to rest_framework.urls. ([#3714][gh3714]) +* Improve authtoken's views to support url versioning. ([#3718][gh3718], [#3723][gh3723]) + ### 3.3.1 **Date**: [4th November 2015][3.3.1-milestone]. @@ -347,6 +369,7 @@ For older release notes, [please see the version 2.x documentation][old-release- [3.2.5-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.2.5+Release%22 [3.3.0-milestone]: https://github.com/tomchristie/django-rest-framework/issues?q=milestone%3A%223.3.0+Release%22 [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 [gh2013]: https://github.com/tomchristie/django-rest-framework/issues/2013 @@ -596,3 +619,33 @@ For older release notes, [please see the version 2.x documentation][old-release- [gh3568]: https://github.com/tomchristie/django-rest-framework/issues/3568 [gh3592]: https://github.com/tomchristie/django-rest-framework/issues/3592 [gh3593]: https://github.com/tomchristie/django-rest-framework/issues/3593 + + +[gh3228]: https://github.com/tomchristie/django-rest-framework/issues/3228 +[gh3252]: https://github.com/tomchristie/django-rest-framework/issues/3252 +[gh3513]: https://github.com/tomchristie/django-rest-framework/issues/3513 +[gh3534]: https://github.com/tomchristie/django-rest-framework/issues/3534 +[gh3578]: https://github.com/tomchristie/django-rest-framework/issues/3578 +[gh3596]: https://github.com/tomchristie/django-rest-framework/issues/3596 +[gh3597]: https://github.com/tomchristie/django-rest-framework/issues/3597 +[gh3600]: https://github.com/tomchristie/django-rest-framework/issues/3600 +[gh3626]: https://github.com/tomchristie/django-rest-framework/issues/3626 +[gh3628]: https://github.com/tomchristie/django-rest-framework/issues/3628 +[gh3631]: https://github.com/tomchristie/django-rest-framework/issues/3631 +[gh3634]: https://github.com/tomchristie/django-rest-framework/issues/3634 +[gh3635]: https://github.com/tomchristie/django-rest-framework/issues/3635 +[gh3654]: https://github.com/tomchristie/django-rest-framework/issues/3654 +[gh3655]: https://github.com/tomchristie/django-rest-framework/issues/3655 +[gh3656]: https://github.com/tomchristie/django-rest-framework/issues/3656 +[gh3662]: https://github.com/tomchristie/django-rest-framework/issues/3662 +[gh3668]: https://github.com/tomchristie/django-rest-framework/issues/3668 +[gh3672]: https://github.com/tomchristie/django-rest-framework/issues/3672 +[gh3677]: https://github.com/tomchristie/django-rest-framework/issues/3677 +[gh3679]: https://github.com/tomchristie/django-rest-framework/issues/3679 +[gh3684]: https://github.com/tomchristie/django-rest-framework/issues/3684 +[gh3687]: https://github.com/tomchristie/django-rest-framework/issues/3687 +[gh3701]: https://github.com/tomchristie/django-rest-framework/issues/3701 +[gh3705]: https://github.com/tomchristie/django-rest-framework/issues/3705 +[gh3714]: https://github.com/tomchristie/django-rest-framework/issues/3714 +[gh3718]: https://github.com/tomchristie/django-rest-framework/issues/3718 +[gh3723]: https://github.com/tomchristie/django-rest-framework/issues/3723 From 485c297a04d5b39c2231697914d620843a2edfc5 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 14 Dec 2015 07:31:38 +0100 Subject: [PATCH 073/126] Translations update. --- .../locale/ach/LC_MESSAGES/django.mo | Bin 0 -> 513 bytes .../locale/ach/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/ar/LC_MESSAGES/django.mo | Bin 4888 -> 4888 bytes .../locale/ar/LC_MESSAGES/django.po | 140 +++--- .../locale/be/LC_MESSAGES/django.mo | Bin 655 -> 655 bytes .../locale/be/LC_MESSAGES/django.po | 140 +++--- .../locale/ca/LC_MESSAGES/django.mo | Bin 9749 -> 9749 bytes .../locale/ca/LC_MESSAGES/django.po | 140 +++--- .../locale/ca_ES/LC_MESSAGES/django.mo | Bin 528 -> 528 bytes .../locale/ca_ES/LC_MESSAGES/django.po | 140 +++--- .../locale/cs/LC_MESSAGES/django.mo | Bin 9140 -> 9140 bytes .../locale/cs/LC_MESSAGES/django.po | 140 +++--- .../locale/da/LC_MESSAGES/django.mo | Bin 8905 -> 9682 bytes .../locale/da/LC_MESSAGES/django.po | 155 ++++--- .../locale/da_DK/LC_MESSAGES/django.mo | Bin 0 -> 529 bytes .../locale/da_DK/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/de/LC_MESSAGES/django.mo | Bin 9544 -> 10465 bytes .../locale/de/LC_MESSAGES/django.po | 156 ++++--- .../locale/en/LC_MESSAGES/django.mo | Bin 9476 -> 9770 bytes .../locale/en/LC_MESSAGES/django.po | 140 +++--- .../locale/en_AU/LC_MESSAGES/django.mo | Bin 0 -> 532 bytes .../locale/en_AU/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/en_CA/LC_MESSAGES/django.mo | Bin 529 -> 529 bytes .../locale/en_CA/LC_MESSAGES/django.po | 140 +++--- .../locale/en_US/LC_MESSAGES/django.mo | Bin 378 -> 378 bytes .../locale/es/LC_MESSAGES/django.mo | Bin 10127 -> 10509 bytes .../locale/es/LC_MESSAGES/django.po | 144 +++--- .../locale/et/LC_MESSAGES/django.mo | Bin 8836 -> 8836 bytes .../locale/et/LC_MESSAGES/django.po | 140 +++--- .../locale/fi/LC_MESSAGES/django.mo | Bin 0 -> 10068 bytes .../locale/fi/LC_MESSAGES/django.po | 428 +++++++++++++++++ .../locale/fr/LC_MESSAGES/django.mo | Bin 10193 -> 10501 bytes .../locale/fr/LC_MESSAGES/django.po | 142 +++--- .../locale/fr_CA/LC_MESSAGES/django.mo | Bin 527 -> 527 bytes .../locale/fr_CA/LC_MESSAGES/django.po | 140 +++--- .../locale/gl/LC_MESSAGES/django.mo | Bin 515 -> 515 bytes .../locale/gl/LC_MESSAGES/django.po | 140 +++--- .../locale/gl_ES/LC_MESSAGES/django.mo | Bin 669 -> 669 bytes .../locale/gl_ES/LC_MESSAGES/django.po | 140 +++--- .../locale/he_IL/LC_MESSAGES/django.mo | Bin 0 -> 528 bytes .../locale/he_IL/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/hu/LC_MESSAGES/django.mo | Bin 9228 -> 9228 bytes .../locale/hu/LC_MESSAGES/django.po | 140 +++--- .../locale/id/LC_MESSAGES/django.mo | Bin 510 -> 510 bytes .../locale/id/LC_MESSAGES/django.po | 140 +++--- .../locale/it/LC_MESSAGES/django.mo | Bin 9512 -> 9512 bytes .../locale/it/LC_MESSAGES/django.po | 140 +++--- .../locale/ja/LC_MESSAGES/django.mo | Bin 11341 -> 11341 bytes .../locale/ja/LC_MESSAGES/django.po | 140 +++--- .../locale/ko_KR/LC_MESSAGES/django.mo | Bin 10148 -> 10148 bytes .../locale/ko_KR/LC_MESSAGES/django.po | 140 +++--- .../locale/mk/LC_MESSAGES/django.mo | Bin 10744 -> 10744 bytes .../locale/mk/LC_MESSAGES/django.po | 140 +++--- .../locale/nb/LC_MESSAGES/django.mo | Bin 524 -> 9902 bytes .../locale/nb/LC_MESSAGES/django.po | 311 +++++++------ .../locale/nl/LC_MESSAGES/django.mo | Bin 9267 -> 9267 bytes .../locale/nl/LC_MESSAGES/django.po | 140 +++--- .../locale/nn/LC_MESSAGES/django.mo | Bin 0 -> 524 bytes .../locale/nn/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/no/LC_MESSAGES/django.mo | Bin 0 -> 516 bytes .../locale/no/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/pl/LC_MESSAGES/django.mo | Bin 9602 -> 10528 bytes .../locale/pl/LC_MESSAGES/django.po | 154 ++++--- .../locale/pt/LC_MESSAGES/django.mo | Bin 517 -> 517 bytes .../locale/pt/LC_MESSAGES/django.po | 140 +++--- .../locale/pt_BR/LC_MESSAGES/django.mo | Bin 9974 -> 10343 bytes .../locale/pt_BR/LC_MESSAGES/django.po | 144 +++--- .../locale/pt_PT/LC_MESSAGES/django.mo | Bin 534 -> 534 bytes .../locale/pt_PT/LC_MESSAGES/django.po | 140 +++--- .../locale/ro/LC_MESSAGES/django.mo | Bin 0 -> 556 bytes .../locale/ro/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/ru/LC_MESSAGES/django.mo | Bin 11487 -> 11487 bytes .../locale/ru/LC_MESSAGES/django.po | 140 +++--- .../locale/sk/LC_MESSAGES/django.mo | Bin 9524 -> 9524 bytes .../locale/sk/LC_MESSAGES/django.po | 140 +++--- .../locale/sv/LC_MESSAGES/django.mo | Bin 9519 -> 10151 bytes .../locale/sv/LC_MESSAGES/django.po | 150 +++--- .../locale/tr/LC_MESSAGES/django.mo | Bin 9211 -> 10269 bytes .../locale/tr/LC_MESSAGES/django.po | 157 ++++--- .../locale/tr_TR/LC_MESSAGES/django.mo | Bin 522 -> 1933 bytes .../locale/tr_TR/LC_MESSAGES/django.po | 173 ++++--- .../locale/uk/LC_MESSAGES/django.mo | Bin 590 -> 590 bytes .../locale/uk/LC_MESSAGES/django.po | 140 +++--- .../locale/vi/LC_MESSAGES/django.mo | Bin 510 -> 510 bytes .../locale/vi/LC_MESSAGES/django.po | 140 +++--- .../locale/zh-Hans/LC_MESSAGES/django.mo | Bin 0 -> 9894 bytes .../locale/zh-Hans/LC_MESSAGES/django.po | 429 ++++++++++++++++++ .../locale/zh-Hant/LC_MESSAGES/django.mo | Bin 0 -> 529 bytes .../locale/zh-Hant/LC_MESSAGES/django.po | 426 +++++++++++++++++ .../locale/zh_CN/LC_MESSAGES/django.mo | Bin 9261 -> 9895 bytes .../locale/zh_CN/LC_MESSAGES/django.po | 151 +++--- .../locale/zh_TW/LC_MESSAGES/django.mo | Bin 522 -> 522 bytes .../locale/zh_TW/LC_MESSAGES/django.po | 140 +++--- 93 files changed, 7405 insertions(+), 2197 deletions(-) create mode 100644 rest_framework/locale/ach/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/ach/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/da_DK/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/da_DK/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/en_AU/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/en_AU/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/fi/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/fi/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/he_IL/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/he_IL/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/nn/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/nn/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/no/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/no/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/ro/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/ro/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/zh-Hans/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/zh-Hans/LC_MESSAGES/django.po create mode 100644 rest_framework/locale/zh-Hant/LC_MESSAGES/django.mo create mode 100644 rest_framework/locale/zh-Hant/LC_MESSAGES/django.po diff --git a/rest_framework/locale/ach/LC_MESSAGES/django.mo b/rest_framework/locale/ach/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..a1e8e6bc3273c26f9056a9b7973654150c7fb481 GIT binary patch literal 513 zcmZutO-}+b5XI-h&dX>ANstbGuIq2HhL~Xi-QQ?gvq2<47zi! zVhxktO8`^D7hf> zbjUcnbjOd?!ca#6( zE)QpJ$r%oYz2mz4isy8+vO-bc+msey#m2g6!li0LIO8T0w)GnHv2oPp%}j;Co(gp& rRm`CAA?;xb2IS<7lcnJa_O)4L3{<+iX02)y_F=22pbdVh=@k9|4C|W$ literal 0 HcmV?d00001 diff --git a/rest_framework/locale/ach/LC_MESSAGES/django.po b/rest_framework/locale/ach/LC_MESSAGES/django.po new file mode 100644 index 000000000..0a6f2cce5 --- /dev/null +++ b/rest_framework/locale/ach/LC_MESSAGES/django.po @@ -0,0 +1,426 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" +"Last-Translator: Xavier Ordoquy \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: ach\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.mo b/rest_framework/locale/ar/LC_MESSAGES/django.mo index 1d1fa1cb92b0e65ea0edbd2bb53e0f2b0dbbc97e..6a32487ecfca6f79807a3851b1e2e62bcf32fc0e 100644 GIT binary patch delta 64 zcmbQCHbZU0ZVqEZBV7Y?1w#ufQ)6udLjwb@0Ds+})UwRt%=|oEm&B4(D+MD1LsMO- OI&&*i)6MTVw73955D`!S delta 64 zcmbQCHbZU0ZVqDuOI;&F1w#WXQ&VjNBLf4j0Ds+})UwRt%=|oEm&B4(D+MD1LsMOd PIs*$UQ?t$QIJCF`LAnu8 diff --git a/rest_framework/locale/ar/LC_MESSAGES/django.po b/rest_framework/locale/ar/LC_MESSAGES/django.po index 58197d962..4dbeed9be 100644 --- a/rest_framework/locale/ar/LC_MESSAGES/django.po +++ b/rest_framework/locale/ar/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Arabic (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ar/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "" msgid "Invalid username/password." msgstr "اسم المستخدم/كلمة السر غير صحيحين." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "المستخدم غير مفعل او تم حذفه." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -109,241 +109,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "هذا الحقل مطلوب." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" ليس قيمة منطقية." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "لا يمكن لهذا الحقل ان يكون فارغاً." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "تأكد ان الحقل لا يزيد عن {max_length} محرف." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "تأكد ان الحقل {min_length} محرف على الاقل." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "عليك ان تدخل بريد إلكتروني صالح." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "هذه القيمة لا تطابق النمط المطلوب." -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "الرجاء إدخال رابط إلكتروني صالح." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "الرجاء إدخال رقم صحيح صالح." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "تأكد ان القيمة أقل أو تساوي {max_value}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "تأكد ان القيمة أكبر أو تساوي {min_value}." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "الرجاء إدخال رقم صالح." -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "تأكد ان القيمة لا تحوي أكثر من {max_digits} رقم." -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "صيغة التاريخ و الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "صيغة التاريخ غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "صيغة الوقت غير صحيحة. عليك أن تستخدم واحدة من هذه الصيغ التالية: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ليست واحدة من الخيارات الصالحة." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "لم يتم إرسال أي ملف." -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "الملف الذي تم إرساله فارغ." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "تأكد ان اسم الملف لا يحوي أكثر من {max_length} محرف (الإسم المرسل يحوي {length} محرف)." -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "رقم الصفحة \"{page_number}\" غير صالح : {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "معرف العنصر \"{pk_value}\" غير صالح - العنصر غير موجود." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "قيمة غير صالحة." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/be/LC_MESSAGES/django.mo b/rest_framework/locale/be/LC_MESSAGES/django.mo index 97fb40795c07fa3a3aafb02fc28e5ef648de5b8d..457e2947968bbc7dc1ebf857a6b8239a04ebc03f 100644 GIT binary patch delta 40 qcmeBY?Pr}ZiO\n" "Language-Team: Belarusian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/be/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.mo b/rest_framework/locale/ca/LC_MESSAGES/django.mo index a3fe77afbb163115a952e77ae972bd7cdbfdf38d..06136491b8455aeedb64d6da2b84718255d46f0f 100644 GIT binary patch delta 64 zcmbR0Gu3B9im0)nk*E`L8bpilEToGIV delta 64 zcmbR0Gu3B9im0)HrLK{of}w$xsj0Ssk%0kMfWK}~YFTD+W`3ToOJYf?m4cChp{XuJ Poq>gwsoCb~qICiQK?V_A diff --git a/rest_framework/locale/ca/LC_MESSAGES/django.po b/rest_framework/locale/ca/LC_MESSAGES/django.po index 4d7cf9c20..ce74a5f45 100644 --- a/rest_framework/locale/ca/LC_MESSAGES/django.po +++ b/rest_framework/locale/ca/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Catalan (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ca/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "Header Basic invàlid. Les credencials no estan codificades correctament msgid "Invalid username/password." msgstr "Usuari/Contrasenya incorrectes." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Usuari inactiu o esborrat." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Token header invàlid. No s'han indicat les credencials." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Token header invàlid. El token no ha de contenir espais." -#: authentication.py:177 +#: authentication.py:176 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:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Token invàlid." @@ -108,241 +108,267 @@ 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:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Aquest camp és obligatori." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Aquest camp no pot ser nul." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" no és un booleà." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Aquest camp no pot estar en blanc." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Introdueixi una adreça de correu vàlida." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Aquest valor no compleix el patró requerit." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Introdueixi una URL vàlida." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" no és un UUID vàlid." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Introdueixi una adreça IPv4 o IPv6 vàlida." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Es requereix un nombre enter vàlid." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Valor del text massa gran." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Es requereix un nombre vàlid." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "S'espera un Datetime però s'ha rebut un Date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "S'espera un Date però s'ha rebut un Datetime." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" no és una opció vàlida." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "Aquesta selecció no pot estar buida." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" no és un path vàlid." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "No s'ha enviat cap fitxer." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "No s'ha pogut determinar el nom del fitxer." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "El fitxer enviat està buit." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "Aquesta llista no pot estar buida." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "S'espera un diccionari però s'ha rebut el tipus \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Pàgina invàlida \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Cursor invàlid." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "PK invàlida \"{pk_value}\" - l'objecte no existeix." -#: relations.py:193 +#: relations.py:197 #, 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}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Hyperlink invàlid - Cap match d'URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hyperlink invàlid - Match d'URL incorrecta." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Hyperlink invàlid - L'objecte no existeix." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'objecte amb {slug_name}={value} no existeix." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valor invàlid." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo b/rest_framework/locale/ca_ES/LC_MESSAGES/django.mo index 2aa79c8fb909f5c7dbd84a7d88f041ea148eb4d9..5c2dd5baaa80fcaa53006459b11bf6172a69b04e 100644 GIT binary patch delta 40 rcmbQhGJ$2nBtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@dNTq5(N_vW delta 40 scmbQhGJ$2nBt8R6T_ZyULjx;QQ*8sIi3_B-AtDAAR;Fefk9so#0MSDVLI3~& diff --git a/rest_framework/locale/ca_ES/LC_MESSAGES/django.po b/rest_framework/locale/ca_ES/LC_MESSAGES/django.po index 711ba24f9..fad1d9024 100644 --- a/rest_framework/locale/ca_ES/LC_MESSAGES/django.po +++ b/rest_framework/locale/ca_ES/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.mo b/rest_framework/locale/cs/LC_MESSAGES/django.mo index cc186d881f1e10c3a529ac73b7d8ca5af39b64af..f0dc3dfcf4d6a44d050affcc7d5be2e8bd3c53e5 100644 GIT binary patch delta 43 tcmdnuzQuh*f-s+8cxs|Eu=E=f}0ssOz3cLUS delta 43 ucmdnuzQuh*f-s+frLK{of}w$xsj0Ss(d0Z~DQ<|6frXW++2+Z@iUI%vA_}|! diff --git a/rest_framework/locale/cs/LC_MESSAGES/django.po b/rest_framework/locale/cs/LC_MESSAGES/django.po index 320c034a2..15cb86c80 100644 --- a/rest_framework/locale/cs/LC_MESSAGES/django.po +++ b/rest_framework/locale/cs/LC_MESSAGES/django.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Czech (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/cs/)\n" "MIME-Version: 1.0\n" @@ -35,24 +35,24 @@ msgstr "Chybná hlavička. Přihlašovací údaje nebyly správně zakódovány msgid "Invalid username/password." msgstr "Chybné uživatelské jméno nebo heslo." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Uživatelský účet je neaktivní nebo byl smazán." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Chybná hlavička tokenu. Nebyly zadány přihlašovací údaje." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Chybný token." @@ -110,241 +110,267 @@ 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:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Toto pole je vyžadováno." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Toto pole nesmí být prázdné (null)." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" nelze použít jako typ boolean." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Toto pole nesmí být prázdné." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Zkontrolujte, že toto pole není delší než {max_length} znaků." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Zkontrolujte, že toto pole obsahuje alespoň {min_length} znaků." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Vložte platnou e-mailovou adresu." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Hodnota v tomto poli neodpovídá požadovanému formátu." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Vložte platný odkaz." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" není platné UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Je vyžadováno celé číslo." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Zkontrolujte, že hodnota je menší nebo rovna {max_value}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Řetězec je příliš dlouhý." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Je vyžadováno číslo." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Bylo zadáno pouze datum bez času." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Bylo zadáno datum a čas, místo samotného data." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" není platnou možností." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Nebyl zaslán žádný soubor." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Nebylo možné zjistit jméno souboru." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Zaslaný soubor je prázdný." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format 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}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Chybné čislo stránky \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Chybný kurzor." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Chybný primární klíč \"{pk_value}\" - objekt neexistuje." -#: relations.py:193 +#: relations.py:197 #, 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." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Chybný odkaz - nebyla nalezena žádní shoda." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Chybný odkaz - byla nalezena neplatná shoda." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Chybný odkaz - objekt neexistuje." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt s {slug_name}={value} neexistuje." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Chybná hodnota." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/da/LC_MESSAGES/django.mo b/rest_framework/locale/da/LC_MESSAGES/django.mo index a8eb68ece8ba1b373bc1a5056d552c1e11aedfa1..f6ac0f7d591fd6f98faae73be353464e85743a97 100644 GIT binary patch delta 2335 zcmZwHTWnNC9LMq5wv^HWl|s9KPzDs`(p|TdURZ>dQa~t31={G7F5T1Z+P%P@(B1}y;M>@a{%T`Z<96)DXEBVQp|01}7_$|( z;5~Q(>+k|wK!f2wwkOlX*ycbNz}maV+U4FGo}+eaXn@+h~qdNe?r~o z<6sGfQJEUVWq7D`{!I*V{5b}(y4IM@xC+F!10FyToJ8&YVQj-ws4e=kbX?EdHNmZ@`(iW6zom1K6Pmy)s3Q3Um!p3c zg@^0$F&xD?_)*F4a0SQZ^~SvC7zs6D)f_u(zn9yXBIE?kSNF^fy_0(RinxDFdxg(mt0K7_BMGWRR0ww5rso^MBu z>!ON2`vM)!-%@j|?p<7U+P0b~uv#U?z8 zB+pz#74N6W+_L5l9lhAUuvnd4$Q;Zrq;QRklkjQe%QS~kdwc>lk#S@$=3~?ge@4|r zEgP2i;a|uKO^iItLm0%D(TC-Pet-VA?cglW7gnr7sv|Usbp&7EL{pKfX<~hZwo3cH zlTg7b_0)8sCZMpj%C;t|mYvMM2Z<>hO_@*usg)7>oVo}#{dQ=pDv3@) z+0s^7LSK`65o)U7e>WAD z_EZI{RIBmRFws=tJ%qNahR_$M+E}d7AEBdfc>_^J^b;ziU4)uG8x^A37J}cVLaX3^ z?rP=S+&h&`xeqG+6?-DyaQ;T+?N}$d$J-Y)yN2Vgb)AGWs2Tj{hWs}(e(<$4uLy+N zZF5JswPkszITWhy+aB2AjKy6Z3G_rfCu~=Qnp*><``W{;t@+8bp7Z7Q)-R~Bks+4A z3S1|DtUl|TIuOakW5Z6=vWDEX27kTlIZ?;6{Bi5h__;*PNk#K_8upa=3yE+N31=b~ z#ew?gTrCe+*ULDmnB6^oE@R^(BaV%yqRwzS5q0cnY+oW8k2!XPM2(QBGxK|W^ENUN zOHV~7a+Kcvq@&A9Q{&mPl}ZzLWNdOY5s$IN;=o=y88khP$2B$}#;7SfHhxMOPbc%g I+3UW)0n>d#umAu6 delta 1822 zcmYk+U2Ke59LMqhOv|)8)mE!UYs*wiS#3?r^vz4(w8fMwDr9kIFVIa8ksu>+(-e^y zG}&!Z=lz$n(?j7+nIxE>RD0vquK>hHxrn04VA%)`^Dg%4mU-t+x{dQVZ< zERNkc6Az)@cM0p6-`>z@VqjL5SsQM~D!hQ%_!#T)70$+z3EqjUz@O-EMUD4k46mbp z{|*;pl$Yo|8+jDrHoxDCrOa>rG_->u-$(ib{r9LH7UpA1|V! zb`9CQ{fYDNZ`6Cfp?;T_YZk#dnAD0}XecJzQ41MF{fCEs|1B!ESrg4_aW*OxoBV!1 zYG-#*6aI^ec_FjT#hEV)-?=3~vR@_Mm>)RzN=Buf9i76AfS# z|G{E>hx0Lq?JdAIT#mc33x`n~%wbnr_*z_wM1Iy?i@W+$qXfTKUg%$W5 z*{o%=Jtbi|YN7-Z72ApYvtAygg`LH5cm=s2b`=%6QPcuH;&cr0&^+a+P`4o`khEPi zI4!&3`xN?{Ls1Q|`coXbLC82}A;0I)HwvmLAd$Ef7 z?Kc_$213**Rq<45_i*oYg0^1%ec^lLE=Y^jj#{WIsTov-ObHmK>NIq6E2v{-{8)qe z-PMovb$u36bySL{K1gGwfretIqN85yw!DXuOhvgsO1ZhzglyWq`{0ICD$Kei$~(>P zCYFv=rNhIGsluY7d{9vyC^?&{NE2_-RoAkLI*F=8(tS;*cBLvq%bk;<)d8n2vnS|`gwLd, 2015 # Mikkel Munch Mortensen <3xm@detfalskested.dk>, 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Danish (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/da/)\n" "MIME-Version: 1.0\n" @@ -34,24 +35,24 @@ msgstr "Ugyldig basic header. Legitimationen er ikke base64 encoded på korrekt msgid "Invalid username/password." msgstr "Ugyldigt brugernavn/kodeord." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Inaktiv eller slettet bruger." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Ugyldig token header." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ugyldig token header. Token-strenge må ikke indeholde mellemrum." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Ugyldig token header. Token streng bør ikke indeholde ugyldige karakterer." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Ugyldigt token." @@ -109,241 +110,267 @@ msgstr "Forespørgslens media type, \"{media_type}\", er ikke understøttet." msgid "Request was throttled." msgstr "Forespørgslen blev neddroslet." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Dette felt er påkrævet." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Dette felt må ikke være null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" er ikke en tilladt boolsk værdi." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Dette felt må ikke være tomt." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Tjek at dette felt indeholder mindst {min_length} tegn." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Angiv en gyldig e-mailadresse." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Denne værdi passer ikke med det påkrævede mønster." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Indtast en gyldig URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" er ikke et gyldigt UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Indtast en gyldig IPv4 eller IPv6 adresse." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Et gyldigt heltal er påkrævet." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Strengværdien er for stor." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Et gyldigt tal er påkrævet." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Forventede en datotid, men fik en dato." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Forventede en dato men fik en datotid." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Varighed har forkert format. Brug istedet et af følgende formater: {format}." -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" er ikke et gyldigt valg." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Flere end {count} objekter..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Forventede en liste, men fik noget af typen \"{input_type}\"." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Dette valg kan være tomt." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" er ikke et gyldigt valg af adresse." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Ingen medsendt fil." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Filnavnet kunne ikke afgøres." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Den medsendte fil er tom." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Denne liste er muligvis ikke tom." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Forventede en dictionary, men fik noget af typen \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Ugyldig side \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Ugyldig cursor" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ugyldig primærnøgle \"{pk_value}\" - objektet findes ikke." -#: relations.py:193 +#: relations.py:197 #, 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}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Ugyldigt hyperlink - intet URL match." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ugyldigt hyperlink - forkert URL match." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Ugyldigt hyperlink - objektet findes ikke." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Forkert type. Forventede en URL-streng, fik {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object med {slug_name}={value} findes ikke." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Ugyldig værdi." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/da_DK/LC_MESSAGES/django.mo b/rest_framework/locale/da_DK/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..78170eeb6040287c2812b6f909fbc876fbac9462 GIT binary patch literal 529 zcmZutO-~y!5T$BQd+fP~sl*`>Om;U_MCy>LDhU#Th$w8U-l}PKvN7!1Tif~Ihw$6D z@mrV;Rk-k^Cy(tnetz@x@x#M`;GOW3@KE?(cr0wt7e316S6Lg)9#dy;c^>d0$6xHc zwno9|mP}z`HonPV;i%$`b$8K>YwH3|e4%svu_`=fRzWnq&hX4J1!=_*1y;~a(jKN= zOim!}tKOHRBux?#;*8h2v3NswqI$ifL=at(512VJzNBECg5R{(?BLqv_TTCrPPg`@ z`d(^d*P1$WTYZx@Q>>_9%$O?4Kt}r|v_@UH$7t^=T;<_Yl1~6Ze^Bjgh zvvcgf>YDE?*x}gBZLUqBp#N8geIx}tuV`AX9F=%(UF8*+dbjn%?f_oOVavehA*Ag= Gbnpzw-JjwB literal 0 HcmV?d00001 diff --git a/rest_framework/locale/da_DK/LC_MESSAGES/django.po b/rest_framework/locale/da_DK/LC_MESSAGES/django.po new file mode 100644 index 000000000..c198cfdf6 --- /dev/null +++ b/rest_framework/locale/da_DK/LC_MESSAGES/django.po @@ -0,0 +1,426 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" +"Last-Translator: Xavier Ordoquy \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: da_DK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/de/LC_MESSAGES/django.mo b/rest_framework/locale/de/LC_MESSAGES/django.mo index 0def3e0c53acd717cb45b9f6525f7557d5e3f8e1..0c1034bb047c2a0899cf7fd5ae0b9e8388647a6f 100644 GIT binary patch delta 2734 zcmZwIdu$X%9Ki9p+7_$|g%(~_ruK6rxoQ^>gCkmN|egs=Vkm*4oy+29zR2kr*I)&I#sFp*o3vX0p3<7G`^)#il>k$t24M5 z&m-wli-@O$w1ppez$z@qZCHaQ=2t0&Mj32{KLrTq> zP5k`_Fug0~0c>T-Q5dhlL6jU$1mn-5T=xm`PIVGx!WXa)TY2ktd0pX>YQ!yGc5XUeYTj|gvvt+;bV9s zK8>638SY=-^G{GhcLHVe%wyTj z=;AVb6_a=zW##MHsTysRl|F_N^8FaXze`Kdkk!kAZlLy1S5tFL%6|#?8;x&?|Fx37 z1va*Sa=@Rw>}~?$msK3U3X zt)i|7Mz&%n^;T*rl{ET!T!#eA|0LI7KlR^5BFBF%e&{7SQY2b(Y`Z1@k~=9xZL&Qp7*1vUlRtK5B(@q--dnu0`49 z7f~h0?Ns?t$O+*S;FmIf2dT@cTl|sYKA25gHeigJKU!Xw|Ejz(|9yE)=?=?F7S5Gd zmsZ`}zq3WBU5!h$H9YK^O#b(Z)3bVPlN#0|cFHquM)ede9J}Oj$xPeXX{GF8ok&`) zm5{#|veP1=+O%u5m$V#xZz7#_yj|M%%y=de$-gxH-Kl- z2dz}r=z3p=&^=umb3EUfkZN8T-`C^53Cr<8h;>Srwe^Tk4mFv$T&J~vpU-``tQs1Mn4UNsF;XO z$wS6y%PH)u>kUoYYM4`S3>hP8JF#l&15E{l+lt>|1tS#3)}w!Fe|Kg delta 1964 zcmYk+TTC2P9LMpqE6Dw}l!b!DDFti`Y!_rHAeC*4Sn0N;Sh4hpEv~R~*%pCPtFB4I zn{U$^FNp;8L5(%hiH$z^U}|jT!Kh8tq-v#2OcNDfOw_~}zrUF!@r1LVb7q-6bN>JT zoV6oY2hu+VvMw0fApI`-dA~7}SeVTR?ZZ2b*@_>bh1anb|G_G($?@)M#~S8Gumz{F z8DGJDcoqAxAlGvUA2cRyUSbgCi!~g^x;$fc;~BgU-@}9W8+Kz?zW4nc#+bi@0sI@a zfx-e~w&9M9hfu$B3L|(C8}Jr(v%bkIG^Udaeb|f7;C}oVL+C3qrWnJh|Leu=xQL3( z3hu> zzJ@_uMGM!k9Q~!nWML2qimAa}*ogX_Vbpy|Ojj~^jzJh-L~>$2M?FYc8N0v`YTl2^ z@fdbs8kMR`nfW?uXAP{P1*53kpTs6~uoZ9M2$q!-|IG|0d2G3aZMckAe8zl@y7A=- zW9soUtixYWp)Y0|N<|p;{RnQtXR!lq9K=-|#cFnQ6wl%#_+=&WKg^(!Qa*vL8pX%)0lb2JSj0B<14F1CzsZLl;4=2$?TihCYk>I)RP|p(p56R`doe#vTss-W zPzx@hZn%aDZS9s!&M?Y6iHgwM7{VV=p)RB_nz08Xm_*&bjQYKAk?fedyS>P@qvq*h z1}zLGkU#T6#!ILo`vw)#e^DVXx4eZSs8pQD%$JZg%=^gEV7|f<{0{Yiw~=g`Dt?4# zHqA&R(q@3c{ahHuM{ybXGk@}-f85L}n(xjyf=b2NjGv%VlEbTFVGI?4X;iLX$9wTF z+=I>JX#$_X8omG57+75R9Tl=tP6r?6(6z9lpr-t(se)s471sY7=acE8TXZeBkFMI{ zTyu+5Y2eIp)1-(Vq-%Y*DP$W>53$koTK3Q>2lt)r+xP<6kb9Ep5@(JZMUB;VdblSa zwdU4L6bY7_hHhlP-ulYFLZ-@BYozP-QPX*#mQAOq-NsAcwjF#b$9w5|O;u28D$I>` zfI)s{;>Z1TrGdlM+~H-?D?Hvf_pnhB_0l;b+~cwxRR?-YR7ez!;e2vyAPe=@*af-O z_RXATr#&|>%Z?X*?>tbH}{rS|F4pY6pm$8HZa1?OgyGvn4md}=;n&81S-RD5%n~wYJn-$L&hr3$ZTCLV_cO=pjZnK{bRu_1e!kyib4tph7S${0PkW9>4 zgR_sNPR*aOdKOdOC_0s#Ni8Jfp|RAob3J&}m+h`)msACvC#zPnoc=8_pYulTy5IR} x>yXbryzQ3VQ{Pr`JdqrmNX$$o=H?RCQ}aC6%y`H-UtjKber, 2015 +# Mads Jensen , 2015 +# Niklas P , 2015 # Thomas Tanner, 2015 # Tom Jaster , 2015 # Xavier Ordoquy , 2015 @@ -11,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 18:25+0000\n" +"Last-Translator: Fabian Büchler \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" @@ -37,24 +39,24 @@ msgstr "Ungültiger basic header. Zugangsdaten sind nicht korrekt mit base64 kod msgid "Invalid username/password." msgstr "Ungültiger Benutzername/Passwort" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Benutzer inaktiv oder gelöscht." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Ungültiger token header. Keine Zugangsdaten angegeben." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ungültiger token header. Zugangsdaten sollen keine Leerzeichen enthalten." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Ungültiger Token Header. Tokens dürfen keine ungültigen Zeichen enthalten." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Ungültiges Token" @@ -112,241 +114,267 @@ msgstr "Nicht unterstützter Medientyp \"{media_type}\" in der Anfrage." msgid "Request was throttled." msgstr "Die Anfrage wurde gedrosselt." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Dieses Feld ist erforderlich." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Dieses Feld darf nicht Null sein." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" ist kein gültiger Wahrheitswert." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Dieses Feld darf nicht leer sein." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Stelle sicher, dass dieses Feld mindestens {min_length} Zeichen lang ist." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Gib eine gültige E-Mail Adresse an." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Dieser Wert passt nicht zu dem erforderlichen Muster." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Gib eine gültige URL ein." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" ist keine gültige UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Geben Sie eine gültige UPv4 oder IPv6 Adresse an" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Eine gültige Ganzzahl ist erforderlich." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Zeichenkette zu lang." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Eine gültige Zahl ist erforderlich." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Erwarte eine Datums- und Zeitangabe, erhielt aber ein Datum." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Erwarte ein Datum, erhielt aber eine Datums- und Zeitangabe." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ist keine gültige Option." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Mehr als {count} Ergebnisse" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Diese Auswahl darf nicht leer sein" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" ist ein ungültiger Pfad Wahl." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Es wurde keine Datei übermittelt." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Der Dateiname konnte nicht ermittelt werden." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Die übermittelte Datei ist leer." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Diese Liste darf nicht leer sein." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Erwarte ein Dictionary mit Elementen, erhielt aber den Typ \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Wert muss gültiges JSON sein." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Abschicken" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Ungültige Seite \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Ungültiger Zeiger" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ungültiger pk \"{pk_value}\" - Object existiert nicht." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Falscher Typ. Erwarte pk Wert, erhielt aber {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Ungültiger Hyperlink - entspricht keiner URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ungültiger Hyperlink - URL stimmt nicht überein." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Ungültiger Hyperlink - Objekt existiert nicht." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Falscher Typ. Erwarte URL Zeichenkette, erhielt aber {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt mit {slug_name}={value} existiert nicht." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Ungültiger Wert." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filter" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Feldfilter" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sortierung" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Suche" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/en/LC_MESSAGES/django.mo b/rest_framework/locale/en/LC_MESSAGES/django.mo index a76764b2217853da1d4900e087c05c4ea25d8c47..6e464e9fd9a61820309b12be2e61b93eb2c72253 100644 GIT binary patch delta 2279 zcmciD+iz4=6vy$^(wnpbZ5@gQ^i;4Yz0Q=eb+GmVw56?#baVuZ#A2s(w6$T{YP>Nf zHsFKd!O?^!5R96rJd~J%^57*=9*SU$Pe!9ei4hGNH8J5qAbx){y9WOOcV?Z>-h0lR zvoGtMnd&~;n><&N^Quw$i50|O*=9*Ro6CVRmv2^qr_sZUcqPAmt6CTGF{0%o?%_6f} z+=G1VH4ZxO7~Y0IqgJkXvDsQ|K=tp$dfbn-TI!QjHsb|sM*ot`1;?i0Wv4L*rW@d$eO9wtkvd_^S(FCwdKe_$Q{jck`yv7TDe zbsThoPRzrdScWmzeh%wtPocK-1ZtpHQ0J9%GqnS#90`}Q{&!G$j1KMP>!|iOsF4@n zkU6m$J=$HUfyGhDG>ujGE&8#*XSN+fcq6{zoN>-!fd2D1mu2Q#%KB@M&M`a>mCD-t z3e*yIA|D&#pphq0BR_;ScoM7eC)9vSxvR1}>O72Ei65~QtC>|4M^O_#m87CObiG0N2z09)q}IWhS}%P|5u;YJ$V4`y>xg zX`*r(mEGA)TiM-?wYU#SWIKU6?-VMFub@`0^5#r-ccJ>nQ8{o3_506J$$c4{vBS$; zZwi@n(o(Kt1~ropk-^&!&a0^Y<=jm(Z$a*DeaHoD53a$NP|0~5Jv@V?k^PEFZo4Iu z+_|V6T7m_7{#&W&!kbYS*n!IKaU?D5Y1e)kHM42##LrLzEn##zuMXAjM0U#tQOW!~ zYAfG&?cY%YuUyS}+~3-$c=!-%WP7n4XHePwCn~#FvT@rnjO3HOy|9^^}9=0u+&eCr8RpB+KXbZH=t*-AuY$N)K9D-F$ua=&UN@4?{ZMc`X zwkYZNYq5=lwn0VtqpjJb{U`C$McF%F3g##OdS$%O#>j3!!{a@dzbv1)*F? zwUw36cIWr!`a0sVkwI@LJ~9zYj9W*>**A;6&M62d24ji%? l`2#iejh??L6l|!f_ooi~$_rgrV<;G${lxcf-v2wK;6I?N04@Lk delta 1986 zcma*nTWn2P9LMp0@8zIX+S6&3t?sII+B&_Qs&-n}UWTd)5fYIqNoiC&UdnzzCS!(@ zMleATmmm?+2WiAD=Aj~Si%<_lhzB8Yd69VG`#Wcod6)+)=YKwHuf5OSYpwr(pL2CP zYTV~3vHOkIM2sT-jW*kat#N$O0tsegF&`al#0l7eqwyb1$3E2WA7UoH$6WL!noYw} ztirW87tcm??E{^83=|JCt3(%<;tecD|6sE+T!^*!7l!Z&>U@gNtPX2%93H?Fyn>q0 zU2puYXVQ?!{R%N?u2~x$t>_f$#&@s;?!*5Fj! z>5X5+0LM=;4+kfiEx=MN=lQms4(IG9X5fAA_$_KhUr;L3Ks zfRpexrr}3)Fmbrq2%LhkSdK2cXjOEkV?FAITTwsUi+((V0lbb%)d$psO1N0(n^4Ca zP`TfQMR*#OqG#T5Do@u0>rmIVj9~vAI@=l01WuxgPVFFiaA~R6cy2bMv zY6s$&MJ3kbQrv^Z_!?ELSuC>_mtzP|q0Ya+I!x!GN@250huyJ1Q8PO1o#^v?hGmRL zaWaVIs1_!%2N4?`d)Qb9%x!60;K~7|RB5I*E$SrLp@_X01=%`u`AZfGf z$j2V@MH$#6=m6KWwsY1YKm+yuU6 z68zhS+eE%K>xIM=LPe*1t3?xfODYL9r9-)lCn^YSYaHPag~SX(JEf-D(Jp^)+A;n> z-EdVVd86!L_^(#mR7xm+vj`QUa+*!3sb2oucq@&1GhTnAz{8Edh96A@KAZTB@DZvP zy@nHX_Xax3`y3*XXd;yFC4`z@zvOU_>O~c$S}f7yq-XSg_OFQRU6(Zw+p{1$C#|D> z{l*sO_tmYP%}z&Ko71|wy`?#?_h9y%n4XuZe-8_k<`(2T`GHU{m=h@I=}OD+MTP<; Qp\n" "Language-Team: English (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/en/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "Invalid basic header. Credentials not correctly base64 encoded." msgid "Invalid username/password." msgstr "Invalid username/password." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "User inactive or deleted." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Invalid token header. No credentials provided." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Invalid token header. Token string should not contain spaces." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "Invalid token header. Token string should not contain invalid characters." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Invalid token." @@ -108,241 +108,267 @@ msgstr "Unsupported media type \"{media_type}\" in request." msgid "Request was throttled." msgstr "Request was throttled." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "This field is required." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "This field may not be null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" is not a valid boolean." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "This field may not be blank." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Ensure this field has no more than {max_length} characters." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Ensure this field has at least {min_length} characters." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Enter a valid email address." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "This value does not match the required pattern." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Enter a valid URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" is not a valid UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Enter a valid IPv4 or IPv6 address." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "A valid integer is required." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "String value too large." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "A valid number is required." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Expected a datetime but got a date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Expected a date but got a datetime." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" is not a valid choice." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "More than {count} items..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Expected a list of items but got type \"{input_type}\"." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "This selection may not be empty." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" is not a valid path choice." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "No file was submitted." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "No filename could be determined." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "The submitted file is empty." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "This list may not be empty." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Expected a dictionary of items but got type \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Value must be valid JSON." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Submit" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Invalid page \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Invalid cursor" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Invalid pk \"{pk_value}\" - object does not exist." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Incorrect type. Expected pk value, received {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Invalid hyperlink - No URL match." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Invalid hyperlink - Incorrect URL match." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Invalid hyperlink - Object does not exist." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Incorrect type. Expected URL string, received {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object with {slug_name}={value} does not exist." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Invalid value." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filters" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Field filters" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordering" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Search" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/en_AU/LC_MESSAGES/django.mo b/rest_framework/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..ffaa53bd68f864439f560a728412f0a50afe9bdb GIT binary patch literal 532 zcmZutO-}+b5Y^~ukDfh@i3f-dyNe-W5#tvoCK3s*#+#|^uvC|JZM%R!#6Rc3-{LG9 zy!eurPN#43`sQnE^J9&%&fI41GB=p}%nEJhCqEwXS!q@nSo1<7kJl+akafyv0hcdQ zX9kA7y9CBoPHArJYcQn3SdV>|sT9x4%wb{#1cTcIFDyyVqj)Jj31~)f3*#n6hY+_# z>tHX6qlkq#q?xKL{?Q$ZR%p75B?N|_NRB&Py;I?I)tK<%t_-pX9bI@BiK7a|Pj^Lc}N+Nm)us_8IYCPqta zy-JMn|NSukwF*f;o!y7^pnu)({jD!5)m5&IGidm0zV2u=ENBdC6h$%GjwBpo`_zb(\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" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/en_CA/LC_MESSAGES/django.mo b/rest_framework/locale/en_CA/LC_MESSAGES/django.mo index 61db1951b6317a491b6b1d1f64be82cb221be65e..bdf76870d71a111c67706885ed6ced967314d70e 100644 GIT binary patch delta 40 rcmbQpGLdD%BtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@`Y-|j(WeSU delta 40 scmbQpGLdD%Bt8R6T_ZyULjx;QQ*8sIi3_B-AtDAAR;FefkNPkI0MU~QMF0Q* diff --git a/rest_framework/locale/en_CA/LC_MESSAGES/django.po b/rest_framework/locale/en_CA/LC_MESSAGES/django.po index 49436f2a3..f23a59fb6 100644 --- a/rest_framework/locale/en_CA/LC_MESSAGES/django.po +++ b/rest_framework/locale/en_CA/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/en_US/LC_MESSAGES/django.mo b/rest_framework/locale/en_US/LC_MESSAGES/django.mo index 2060cb51feeef21b427092c3286739465ff7cf4f..c99892e4bc9bddbab7066c13c43ad5dbcc12944a 100644 GIT binary patch delta 24 fcmeyx^owai51*ltu7SCNp@o&Hv9^KX#90pjW6B5I delta 24 fcmeyx^owai51)ahu92aFp@EgDskVX9#90pjW4Q;} diff --git a/rest_framework/locale/es/LC_MESSAGES/django.mo b/rest_framework/locale/es/LC_MESSAGES/django.mo index 875788154f4b7c52923d48d42fbb55bc79610bde..287a794806c6cd9280e7195b9cca8e2ea602bb37 100644 GIT binary patch delta 2422 zcmYk+S!`5Q9LMp4T`5&4P$)~~mWn9tOlL}K>qvn@7oaT#idfcoX)nW-S#*|y5E$bI zKB&>bM4}>S;+6;|1C259!Qcai8ly3opm9MHG`L25(P;esW(LB^{O5DdnLBsR`Jext zr~98=m->2g;d6$znV3ynxxttejur7nJ6mE*4Ss|cUdDM?UTVzE*oalQ7WMu6a26g! z559`^_$e;K|F8?&$7fBMLv*^C_ym{Y^fF^M;2^f(NxTa$VGq_$FeZRe)aP$uFJ8o2 zY$!KoG7g{?v;#H&NZ!{`_dAEp+G@#-#_%$2ysW3c0Ry>7E@E2T;o|}yE z;seOb9OF&boy6PlM^xr2CK|H<7oz63p$`wDSE+uN&Pu$5ZRnqryI~Y(GCq(WA3^Qp z4b;xY^8S>cFRsY#d;#ic+ECx$g7a}VPQ#bc!ck03q4NcuLcEM*+5C z6;pE;)}zIE1!`d~s+f*o9e#y=EUh$VBL;8=9?p9r?^$eQ{vw_mXH4ZZ@_!2x-?6+~ zv6xc!q6aP9f;zMPsG4{U=inGN;m^1jYxuRh@m}17qqq?(*hM?;%KJ91W&9g4p(q84VVa~WyCI~n$%GV&Pe^V6u*|A5L+J%vDdm?)~aA3|m9 z5UQ9{r|9(4xq<`O!S=M1=dlxiMctsu%2j-m3%4ux)xBHuOdpsM?GRMmc&AODF;`QNw|oA^}=pGC^R zWRQ={7-}JZpo)4Tg{7kIMvV`ks(%z~_WpF&vK`8xd)Oz+vI(7a!D>brqt(9Ku?x}3a-GnywZjc1oLJm+<;)x|pHNs8jX73grya5O z4MmfY#D2?7IN`Y0n|^W9XlZ|J*onE3V0vvueUW3whIXd+Rm>GM;cO8FZ-z81^h8facv=kxn~Wo!C9>zolc?nWb? z4m;rltVW-|*`w=PEq`;Mxv9=aE9SKutOtuY-uoTyCLsTG`yH^MuJH@=y=vUcIMm4hfAuo-B>hk4LjD59lk%B-9Hl< zyLv{^tiChHvmagEz7ul7P9zak3iixBU#=8H?69l3bYE@Dyk*JwkR3D2ZOwDjupM{p u;iwg|V?o<%IwK>l9m~8>`$56%&X5ukjd2yZi94}uW~>o*;HC%XxBL%iX*wVP delta 2022 zcmZYAUrZcT6vy!cEL|)@TUr*13d0|zK%om|fl>;z^q;jY3N4|E;wYPj1X)V~!8X|# zO*E$J!?Y$%8iI*Ni7(dm%@(VPT3_^~Q6s4}yh)5nW1>M5_4}JyO^i33`P{j?J9F^;k!XIKA{)%0=Ess@W0vj-e`M8Yw-fi51 zwG1j#{aA}rsPTD>;uqL}zvKN_v(9W6_qWq@7_-Y*g4fdLOQ;pCpjMKsy#=Y3g^0cdG(Zy@nffX!Q4&wk`LQU)!e+GR z&&D}$L-Vi|FJp_I{~yx>4%1Ri29e3zBx*Cgj#|l8Jcd8xF6`k$rSv%*!YionZ{``) zb-GcTbOX+wd#M`!E}fH<+no|8;L&RFtL?TRt^wq z%8bggTPL(Iv6JBC>bImnW4cEPr8!0@?P{5X_C}XZXnJX|uWSv`Nw7C9n{bHjgq|dA zVzmyU#qR|Nm6#W$pZay_aVnMccem2iM(ih)T0H?ux%Pt^8T?OEUD>b3WAE2gAMz^r zx9RoULmVM;30?>O{|+i=4-$HE_7XX|lWMAZ=`m7MP1pOq;62T|$ZsKzUT#iFYB~H! zcB(&bZOEJ1kn)-f>LQa9qvI!?X?JWY?o1{U&X_xKGTxASzF=RLw_JEGKf0s7snKbS zw#Q<1(I)R~q$D>Oing`KTD&(RMb4l*JsO{IdM8E_r>16|j+sQz>mC~&PfU-xsinyI za7K@JySOyTyTnW&0AcN\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 15:54+0000\n" +"Last-Translator: Miguel González \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" @@ -38,24 +38,24 @@ msgstr "Cabecera básica inválida. Las credenciales incorrectamente codificadas msgid "Invalid username/password." msgstr "Nombre de usuario/contraseña inválidos." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Usuario inactivo o borrado." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Cabecera token inválida. Las credenciales no fueron suministradas." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Cabecera token inválida. La cadena token no debe contener espacios." -#: authentication.py:177 +#: authentication.py:176 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:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Token inválido." @@ -113,241 +113,267 @@ msgstr "Tipo de medio \"{media_type}\" incompatible en la solicitud." msgid "Request was throttled." msgstr "Solicitud fue regulada (throttled)." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Este campo es requerido." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Este campo no puede ser nulo." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" no es un booleano válido." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Este campo no puede estar en blanco." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Introduzca una dirección de correo electrónico válida." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Este valor no coincide con el patrón requerido." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Introduzca una URL válida." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" no es un UUID válido." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Introduzca una dirección IPv4 o IPv6 válida." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Introduzca un número entero válido." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Cadena demasiado larga." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Se requiere un número válido." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Se esperaba un fecha/hora en vez de una fecha." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Se esperaba una fecha en vez de una fecha/hora." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" no es una elección válida." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Más de {count} elementos..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "Esta selección no puede estar vacía." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" no es una elección de ruta válida." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "No se envió ningún archivo." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "No se pudo determinar un nombre de archivo." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "El archivo enviado está vació." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "Esta lista no puede estar vacía." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Se esperaba un diccionario de elementos en vez del tipo \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "El valor debe ser JSON válido." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Enviar" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Página \"{page_number}\" inválida: {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Cursor inválido" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Clave primaria \"{pk_value}\" inválida - objeto no existe." -#: relations.py:193 +#: relations.py:197 #, 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}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Hiperenlace inválido - No hay URL coincidentes." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hiperenlace inválido - Coincidencia incorrecta de la URL." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Hiperenlace inválido - Objeto no existe." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objeto con {slug_name}={value} no existe." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valor inválido." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filtros" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Filtros de campo" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordenamiento" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Buscar" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/et/LC_MESSAGES/django.mo b/rest_framework/locale/et/LC_MESSAGES/django.mo index 880d55b246acf178ca7b0cf7c5a52fa8c3516a16..d0d064b1814c573673e8f9b7145b8226e7040ec9 100644 GIT binary patch delta 43 tcmZp1ZE@X@Ak1fIq-$WVU}#}wYOHNwI5|&PiW@3qZe?n^d9v_FJ^=G%3nl;n delta 43 ucmZp1ZE@X@Ak1fAscU4YU}#`vYN~BuG&xULiW?$iU}0rywt2GfM?L`aO$#Of diff --git a/rest_framework/locale/et/LC_MESSAGES/django.po b/rest_framework/locale/et/LC_MESSAGES/django.po index e642aaf0d..da2db4967 100644 --- a/rest_framework/locale/et/LC_MESSAGES/django.po +++ b/rest_framework/locale/et/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Estonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/et/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "Sobimatu lihtpäis. Kasutajatunnus pole korrektselt base64-kodeeritud." msgid "Invalid username/password." msgstr "Sobimatu kasutajatunnus/salasõna." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Kasutaja on inaktiivne või kustutatud." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Sobimatu lubakaardi päis. Kasutajatunnus on esitamata." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Sobimatu lubakaart." @@ -109,241 +109,267 @@ msgstr "Meedia tüüpi {media_type} päringus ei toetata." msgid "Request was throttled." msgstr "Liiga palju päringuid." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Väli on kohustuslik." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Väli ei tohi olla tühi." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" pole kehtiv kahendarv." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "See väli ei tohi olla tühi." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Sisestage kehtiv e-posti aadress." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Väärtus ei ühti etteantud mustriga." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Sisestage korrektne URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" pole kehtiv UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Sisendiks peab olema täisarv." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Sõne on liiga pikk." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Sisendiks peab olema arv." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Ootasin kuupäev-kellaaeg andmetüüpi, kuid sain hoopis kuupäeva." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Valesti formaaditud kuupäev. Kasutage mõnda neist: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Ootasin kuupäeva andmetüüpi, kuid sain hoopis kuupäev-kellaaja." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Valesti formaaditud kellaaeg. Kasutage mõnda neist: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" on sobimatu valik." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Ootasin kirjete järjendit, kuid sain \"{input_type}\" - tüübi." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Ühtegi faili ei esitatud." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Ei suutnud tuvastada failinime." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Esitatud fail oli tühi." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Ootasin kirjete sõnastikku, kuid sain \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Sobimatu lehekülg \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Sobimatu kursor." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Sobimatu primaarvõti \"{pk_value}\" - objekti pole olemas." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Sobimatu andmetüüp. Ootasin primaarvõtit, sain {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Sobimatu hüperlink - ei leidnud URLi vastet." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Sobimatu hüperlink - vale URLi vaste." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Sobimatu hüperlink - objekti ei eksisteeri." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekti {slug_name}={value} ei eksisteeri." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Sobimatu väärtus." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.mo b/rest_framework/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..2b7144816b59ad8a52ee9d5312b1dee78ee06bca GIT binary patch literal 10068 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 Ha+di&9Y>U^ literal 0 HcmV?d00001 diff --git a/rest_framework/locale/fi/LC_MESSAGES/django.po b/rest_framework/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 000000000..c6c24c647 --- /dev/null +++ b/rest_framework/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,428 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Aarni Koskela, 2015 +# Aarni Koskela, 2015 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 16:26+0000\n" +"Last-Translator: Aarni Koskela\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" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "Epäkelpo perusotsake. Ei annettuja tunnuksia." + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "Epäkelpo perusotsake. Tunnusmerkkijono ei saa sisältää välilyöntejä." + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "Epäkelpo perusotsake. Tunnukset eivät ole base64-koodattu." + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "Epäkelpo käyttäjänimi tai salasana." + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "Käyttäjä ei-aktiivinen tai poistettu." + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "Epäkelpo Token-otsake. Ei annettuja tunnuksia." + +#: authentication.py:170 +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:176 +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:185 +msgid "Invalid token." +msgstr "Epäkelpo Token." + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "Käyttäjätili ei ole käytössä." + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "Ei voitu kirjautua annetuilla tunnuksilla." + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "Pitää sisältää \"username\" ja \"password\"." + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "Sattui palvelinvirhe." + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "Pyyntö on virheellisen muotoinen." + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "Väärät autentikaatiotunnukset." + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "Autentikaatiotunnuksia ei annettu." + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "Sinulla ei ole lupaa suorittaa tätä toimintoa." + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "Ei löydy." + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "Metodi \"{method}\" ei ole sallittu." + +#: exceptions.py:120 +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." + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "Pyyntö hidastettu." + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "Tämä kenttä vaaditaan." + +#: fields.py:267 +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 +msgid "\"{input}\" is not a valid boolean." +msgstr "\"{input}\" ei ole kelvollinen totuusarvo." + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "Tämä kenttä ei voi olla tyhjä." + +#: fields.py:670 fields.py:1656 +#, python-brace-format +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 +msgid "Ensure this field has at least {min_length} characters." +msgstr "Arvo tulee olla vähintään {min_length} merkkiä pitkä." + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "Syötä kelvollinen sähköpostiosoite." + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "Arvo ei täsmää vaadittuun kuvioon." + +#: fields.py:730 +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 +msgid "Enter a valid URL." +msgstr "Syötä oikea URL-osoite." + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "{value} ei ole kelvollinen UUID." + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "Syötä kelvollinen kokonaisluku." + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +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 +msgid "String value too large." +msgstr "Liian suuri merkkijonoarvo." + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "Kelvollinen luku vaaditaan." + +#: fields.py:887 +#, python-brace-format +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 +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 +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 +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 +msgid "Expected a datetime but got a date." +msgstr "Odotettiin päivämäärää ja aikaa, saatiin vain päivämäärä." + +#: fields.py:1079 +#, python-brace-format +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:1080 +msgid "Expected a date but got a datetime." +msgstr "Odotettiin päivämäärää, saatiin päivämäärä ja aika." + +#: fields.py:1148 +#, python-brace-format +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:1207 +#, python-brace-format +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:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "\"{input}\" ei ole kelvollinen valinta." + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "Enemmän kuin {count} kappaletta..." + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "Odotettiin listaa, saatiin tyyppi {input_type}." + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "Valinta ei saa olla tyhjä." + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\" ei ole kelvollinen polku." + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "Yhtään tiedostoa ei ole lähetetty." + +#: fields.py:1340 +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:1341 +msgid "No filename could be determined." +msgstr "Tiedostonimeä ei voitu päätellä." + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "Lähetetty tiedosto on tyhjä." + +#: fields.py:1343 +#, python-brace-format +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:1391 +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:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "Lista ei saa olla tyhjä." + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "Odotettiin sanakirjaa, saatiin tyyppi {input_type}." + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Arvon pitää olla kelvollista JSONia." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Lähetä" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "Epäkelpo sivu ({page_number}): {message}" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "Epäkelpo kursori" + +#: relations.py:196 +#, 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:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "Väärä tyyppi. Odotettiin pääavainarvoa, saatiin {data_type}." + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "Epäkelpo linkki - URL ei täsmää." + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "Epäkelpo linkki - epäkelpo URL-osuma." + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "Epäkelpo linkki - objektia ei ole." + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "Epäkelpo tyyppi. Odotettiin URL-merkkijonoa, saatiin {data_type}." + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "Objektia ({slug_name}={value}) ei ole." + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "Suotimet" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Kenttäsuotimet" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Järjestys" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Haku" + +#: templates/rest_framework/horizontal/radio.html:2 +#: templates/rest_framework/inline/radio.html:2 +#: templates/rest_framework/vertical/radio.html:2 +msgid "None" +msgstr "Ei mitään" + +#: 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 "Ei valittavia kohteita." + +#: validators.py:24 +msgid "This field must be unique." +msgstr "Arvon tulee olla uniikki." + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "Kenttien {field_names} tulee muodostaa uniikki joukko." + +#: validators.py:226 +#, python-brace-format +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 +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 +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "Kentän tulee olla uniikki vuoden {date_field} suhteen." + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "Epäkelpo versio Accept-otsakkeessa." + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "Epäkelpo versio URL-polussa." + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "Epäkelpo versio palvelinosoitteessa." + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "Epäkelpo versio kyselyparametrissa." + +#: views.py:88 +msgid "Permission denied." +msgstr "Pääsy evätty." diff --git a/rest_framework/locale/fr/LC_MESSAGES/django.mo b/rest_framework/locale/fr/LC_MESSAGES/django.mo index 9626fd35444715525dd1a03abe7460db17cfc360..03bcfa949ca022d3279d332353a6188676be4fe5 100644 GIT binary patch delta 2276 zcmYk+T~JhI9LMoL2rL3gC?HYRp@j%}e=!jw#duL6NtOu1Y!HsH@m331PS##jS{F6V zY);WkNoA8cj$W*lSIv}-*<>$rlQm9LPDKsVOc&l|+4r}5VtQu(=kuIrch7mA|MNfR zLg%wx;UAVK9Wq)UaT9SR(JYMTlR41N`OFINb98V4i!dYA>}IUNJlu}@|HF7A9>j8d z8_VzlZo+@C6`PjE4BK;b+8Fp6H{!}PvmWflwRjTO<2<&bKi#YWCs5xX!w$TReyq$e zTaE$Lg!Z7upZ0tgb-gcejh5=W&Ww*Wa$s@Rj#^;=b)$V)kEd`0{(*O6`7*N#d=&ZE zEC>DWB;Jm{p)!}1X|@_`QRBO?3J+q1Qhl1v7M#aMtiC>e!3oUg{3-8z2DOr-sFj`f z{M{Q*$%?OhHEL@bQUBkG#rPQJ;$d{~0}QXA^DUhuTtKpHe_|#6g>09Vl24_yj)N}H zhAFrUSEB2kKZ#YGKZDxR_fZr58}++15ApdvJ8DT(s`4;N@d(_Ocvg1E2 zLx=OtsEGwp#WaJZcnPa9HOFiRHsB5TvgZlUb6CUpWjvc;mXk~Vm6}UTuMm?cBydjZ*Idk<9`XT0$rQ7OLa zS$A9f{VM zCMKNG{?L$HVS(x0W5KEDM_DaP@_J%lj!jQaIlEo`G&tyN4RmgcB;>rfth%PWYOPaU z->{~(w5mGtdQN`2H?)qS=qEW*U!EorawnZZ*BKb@AA2M=D+VG7c?Ho!tI|`FnOVq< z9QKzi?Q#c(U1sJ+KJyp(TE_QI>~lkr1^>0^Lg9%-e@DM2;7*5}!HM9MbLJQqcBaQ; N^NCN*jl5Fa@Gm{F1!w>O delta 1975 zcmZwITWl0n9LMp0?}ddH7urI_I^eDpO3Svebi1{-v=ju2#TE!g2q8^r&`P&eDJpTKrn#@H5h}UG29XjlK5Z{TlERNgzs->`e4FI|NEIaJ3DjE z|NPH%f5&(2?oZ+Dw~V%im`;42X|^4EbNHae^2}ynH9FXdQS8SuJc3j49P0Pq!I!(Eky}IKPQiIKI$q8P;I~&$l5C_|As06t4#7cTqEXfSO6!B;R^e|2ou6 z_o0^J5bF0I;4J(Ki}4S1F#j>L$v7Lcu>oDOXw4kV!BHR6|1 zGd>hJj4HmrumNkI@VC+m9~YNyRGWBIKM=i>nC0cWrVKSLGc2G$QbN*)W{0BihEcRb8$VgGp!3%E8CFex8tY*e2Vhi{{9{0VZ2T|*7vZ&Zy`Jng$1mBCB+3XYcXH`X>K7@NOi\n" "Language-Team: French (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/fr/)\n" "MIME-Version: 1.0\n" @@ -37,24 +37,24 @@ msgstr "En-tête « basic » non valide. Encodage base64 des informations d'iden msgid "Invalid username/password." msgstr "Nom d'utilisateur et/ou mot de passe non valide(s)." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Utilisateur inactif ou supprimé." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "En-tête « token » non valide. Informations d'identification non fournies." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 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:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Token non valide." @@ -112,241 +112,267 @@ msgstr "Type de média \"{media_type}\" non supporté." msgid "Request was throttled." msgstr "Requête ralentie." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Ce champ est obligatoire." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." -msgstr "Ce champ ne peut être null." +msgstr "Ce champ ne peut être nul." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" n'est pas un booléen valide." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Ce champ ne peut être vide." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Saisissez une adresse email valable." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Cette valeur ne satisfait pas le motif imposé." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Saisissez une URL valide." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" n'est pas un UUID valide." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Saisissez une adresse IPv4 ou IPv6 valide." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Un nombre entier valide est requis." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Chaîne de caractères trop longue." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Un nombre valide est requis." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Attendait une date + heure mais a reçu une date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Attendait une date mais a reçu une date + heure." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" n'est pas un choix valide." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "Plus de {count} éléments..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "Cette sélection ne peut être vide." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" n'est pas un choix de chemin valide." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Aucun fichier n'a été soumis." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Le nom de fichier n'a pu être déterminé." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Le fichier soumis est vide." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "Cette liste ne peut pas être vide." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Attendait un dictionnaire d'éléments mais a reçu \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "La valeur doit être un JSON valide." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Envoyer" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Page \"{page_number}\" non valide : {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Curseur non valide" -#: relations.py:192 +#: relations.py:196 #, 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:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Type incorrect. Attendait une clé primaire, a reçu {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Lien non valide : pas d'URL correspondante." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Lien non valide : URL correspondante incorrecte." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Lien non valide : l'objet n'existe pas." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'object avec {slug_name}={value} n'existe pas." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valeur non valide." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filtres" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Filtres de champ" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordre" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Recherche" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo b/rest_framework/locale/fr_CA/LC_MESSAGES/django.mo index 4f1c6c5a54d2015a623aa16ca719cb0c2ee25075..eb0b496dbe39cfc698a45415b04692e5e6e72255 100644 GIT binary patch delta 40 qcmeBY>1UZRiO1UZRiO;}N*T_)8(7?*nRNKI4;sPmdh=_rOm8sdrqh5>v(DMpE diff --git a/rest_framework/locale/fr_CA/LC_MESSAGES/django.po b/rest_framework/locale/fr_CA/LC_MESSAGES/django.po index 11ec107ea..62a559dc5 100644 --- a/rest_framework/locale/fr_CA/LC_MESSAGES/django.po +++ b/rest_framework/locale/fr_CA/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/gl/LC_MESSAGES/django.mo b/rest_framework/locale/gl/LC_MESSAGES/django.mo index 7446c524a616e0ce5c85ff6ba8bcd3a4ef5292a8..b8c3db3045fc5b4dda9854bbe77e7ce09310e5c9 100644 GIT binary patch delta 40 qcmZo>X=a%)iOX=a%)iO;}N*T_)8(7?*nRNKI4;sPmdh=_rOm8sdrqjrn{%`*xc diff --git a/rest_framework/locale/gl/LC_MESSAGES/django.po b/rest_framework/locale/gl/LC_MESSAGES/django.po index 526f8d706..f7e11d4d1 100644 --- a/rest_framework/locale/gl/LC_MESSAGES/django.po +++ b/rest_framework/locale/gl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Galician (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/gl/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo b/rest_framework/locale/gl_ES/LC_MESSAGES/django.mo index 3bce3c307f9381f0a8596c5530d5114964c8596d..0e5a00ac0b310b974fe6c52fac423d96ee92527f 100644 GIT binary patch delta 41 rcmbQsI+u0AM?OO%T?2CkLklZYV{HS&iT|azp(5s1rly-!7%Le8@%aj@ delta 41 scmbQsI+u0AM?M2fT_ZyULjx;QQ*8sIiT|azAtDAAR;Ff~RTwK70rBMutN;K2 diff --git a/rest_framework/locale/gl_ES/LC_MESSAGES/django.po b/rest_framework/locale/gl_ES/LC_MESSAGES/django.po index c34d39523..363d49463 100644 --- a/rest_framework/locale/gl_ES/LC_MESSAGES/django.po +++ b/rest_framework/locale/gl_ES/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -34,24 +34,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -109,241 +109,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valor non válido." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/he_IL/LC_MESSAGES/django.mo b/rest_framework/locale/he_IL/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..53ecccd1e9183668dd55954698190ac1a59165e1 GIT binary patch literal 528 zcmZut!A|2a5Cy?0N6s7ui9;)xCh4l8xD+8u5tUj|mF$WeGR-tKq;_`fHtmP(uW{UO zS*NVZg(p3EY`^jIo4-egfA&1~J&!$4Jr6w3Ju9?5Km6sTUn|WHV>WLzbvQ`z7qL}F z3%GleIx{foKP50@xuDYUdoZEGu)~qfREoFD%wl2$1mnj9drZ>#R=ksr1T>?#g>e(3 z3y9mI_2VpxqsR+!LMv5Se51P%t=3uO5e%hun6T6~m(H+&XSq_u@W`q8z1+an+I&_w zxzc8(WMgU;*S<|>OPLWSBo_i6=#{C2+Q71;ybiUwbA<@QvMd{}dR)zDU3G@(HZ3xF z+g)0WzdsN2|2E;AUIxRk9*hQ~{@3W@MilgncBFlVP2q>(Xzjuxmr8eFI+tw8b$=%J z*#6R0-\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" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/hu/LC_MESSAGES/django.mo b/rest_framework/locale/hu/LC_MESSAGES/django.mo index 79f7c7329c3eca4e9496a981a0345c1edcfd8aaf..a35f73215aa61525aa091d4b18b5df07ae899836 100644 GIT binary patch delta 64 zcmeD2=<(RFO~}~LNY}tz!O+6W)L7fV(7=Ezz+X2gwJftZGe1w)C9x#cO2Np$&{P+y O&fLn>bn{CgWkCQ\n" "Language-Team: Hungarian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/hu/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "Érvénytelen basic fejlécmező. Az azonosítók base64 kódolása nem msgid "Invalid username/password." msgstr "Érvénytelen felhasználónév/jelszó." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "A felhasználó nincs aktiválva vagy törölve lett." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Érvénytelen token fejlécmező. Nem voltak megadva azonosítók." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Érvénytelen token." @@ -109,241 +109,267 @@ 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:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Ennek a mezőnek a megadása kötelező." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Ez a mező nem lehet null értékű." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "Az \"{input}\" nem egy érvényes logikai érték." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Ez a mező nem lehet üres." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Adjon meg egy érvényes e-mail címet!" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Ez az érték nem illeszkedik a szükséges mintázatra." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Adjon meg egy érvényes URL-t!" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Egy érvényes egész szám megadása szükséges." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "A karakterlánc túl hosszú." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Egy érvényes szám megadása szükséges." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 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:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 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:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "Az \"{input}\" nem egy érvényes elem." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Elemek listája helyett \"{input_type}\" lett elküldve." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Semmilyen fájl sem került feltöltésre." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "A fájlnév nem megállapítható." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "A küldött fájl üres." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Érvénytelen oldal \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, 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:193 +#: relations.py:197 #, 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." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Érvénytelen link - Nem illeszkedő URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Érvénytelen link. - Eltérő URL illeszkedés." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Érvénytelen link - Az objektum nem létezik." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Nem létezik olyan objektum, amelynél {slug_name}={value}." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Érvénytelen érték." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/id/LC_MESSAGES/django.mo b/rest_framework/locale/id/LC_MESSAGES/django.mo index 0324ef5414254039b5a7cde12434e6c0a4cde9e8..ac3fe2c0fc77def64903095adf7d6c8acb8a178e 100644 GIT binary patch delta 40 rcmeyz{EvCUBtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@S~3Cv@@oqU delta 40 scmeyz{EvCUBt8R6T_ZyULjx;QQ*8sIi3_B-AtDAAR;Fefk6JPU0P\n" "Language-Team: Indonesian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/id/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/it/LC_MESSAGES/django.mo b/rest_framework/locale/it/LC_MESSAGES/django.mo index 6e7625826fe760f69c81c683f58112faf59f5d52..fde0bde4669aec8382323aaa8ffc27630d30b4b0 100644 GIT binary patch delta 64 zcmZ4CwZdzIwurHzk*E<|*Qvv`y5)oDa delta 64 zcmZ4CwZdzIwurHTrLK{of}w$xsj0Ssk%0kMfWK}~YFTD+W`3ToOJYf?m4cChp{XuJ Poq>gwsoCZ@ky8QyJG>EA diff --git a/rest_framework/locale/it/LC_MESSAGES/django.po b/rest_framework/locale/it/LC_MESSAGES/django.po index da519aa59..4889f61b7 100644 --- a/rest_framework/locale/it/LC_MESSAGES/django.po +++ b/rest_framework/locale/it/LC_MESSAGES/django.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Italian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/it/)\n" "MIME-Version: 1.0\n" @@ -37,24 +37,24 @@ msgstr "Credenziali non correttamente codificate in base64." msgid "Invalid username/password." msgstr "Nome utente/password non validi" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Utente inattivo o eliminato." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Header del token non valido. Credenziali non fornite." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Token invalido." @@ -112,241 +112,267 @@ msgstr "Tipo di media \"{media_type}\"non supportato." msgid "Request was throttled." msgstr "La richiesta è stata limitata (throttled)." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Campo obbligatorio." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Il campo non può essere nullo." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" non è un valido valore booleano." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Questo campo non può essere omesso." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Assicurati che questo campo abbia almeno {min_length} caratteri." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Inserisci un indirizzo email valido." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Questo valore non corrisponde alla sequenza richiesta." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Inserisci un URL valido" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" non è un UUID valido." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "È richiesto un numero intero valido." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Stringa troppo lunga." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "È richiesto un numero valido." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Atteso un oggetto di tipo datetime ma l'oggetto ricevuto è di tipo date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Atteso un oggetto di tipo date ma l'oggetto ricevuto è di tipo datetime." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" non è una scelta valida." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Non è stato inviato alcun file." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Il nome del file non può essere determinato." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Il file inviato è vuoto." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format 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}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Pagina \"{page_number}\" non valida: {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Cursore non valido" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Pk \"{pk_value}\" non valido - l'oggetto non esiste." -#: relations.py:193 +#: relations.py:197 #, 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}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Collegamento non valido - Nessuna corrispondenza di URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Collegamento non valido - Corrispondenza di URL non corretta." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Collegamento non valido - L'oggetto non esiste." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "L'oggetto con {slug_name}={value} non esiste." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valore non valido." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.mo b/rest_framework/locale/ja/LC_MESSAGES/django.mo index 9f92c5652b1aafd5df871322765262c2f6d050e7..4a583925ea55167ec2eb31cbe8b3ef97729c5aee 100644 GIT binary patch delta 64 zcmX>baW-N@im0)nk*E`L8+r$84G7=&H delta 64 zcmX>baW-N@im0)HrLK{of}w$xsj0Ssk%0kMfWK}~YFTD+W`3ToOJYf?m4cChp{XuJ Poq>gwsoCb~qT9p(V%!oU diff --git a/rest_framework/locale/ja/LC_MESSAGES/django.po b/rest_framework/locale/ja/LC_MESSAGES/django.po index c8148e269..ea9ba1728 100644 --- a/rest_framework/locale/ja/LC_MESSAGES/django.po +++ b/rest_framework/locale/ja/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Japanese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ja/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "不正な基本ヘッダです。認証情報がBASE64で正しくエン msgid "Invalid username/password." msgstr "ユーザ名かパスワードが違います。" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "ユーザが無効か削除されています。" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "不正なトークンヘッダです。認証情報が含まれていません。" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "不正なトークンヘッダです。トークン文字列に空白を含めてはいけません。" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "不正なトークンヘッダです。トークン文字列に不正な文字を含めてはいけません。" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "不正なトークンです。" @@ -108,241 +108,267 @@ msgstr "リクエストのメディアタイプ \"{media_type}\" はサポート msgid "Request was throttled." msgstr "リクエストの処理は絞られました。" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "この項目は必須です。" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "この項目はnullにできません。" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" は有効なブーリアンではありません。" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "この項目は空にできません。" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "この項目が{max_length}文字より長くならないようにしてください。" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "この項目は少なくとも{min_length}文字以上にしてください。" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "有効なメールアドレスを入力してください。" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "この値は所要のパターンにマッチしません。" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "文字、数字、アンダースコア、またはハイフンから成る有効な \"slug\" を入力してください。" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "有効なURLを入力してください。" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" は有効なUUIDではありません。" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "有効なIPv4またはIPv6アドレスを入力してください。" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "有効な整数を入力してください。" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "この値は{max_value}以下にしてください。" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "この値は{min_value}以上にしてください。" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "文字列が長過ぎます。" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "有効な数値を入力してください。" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "合計で最大{max_digits}桁以下になるようにしてください。" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "小数点以下の桁数を{max_decimal_places}を超えないようにしてください。" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "整数部の桁数を{max_whole_digits}を超えないようにしてください。" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "日時の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "日付ではなく日時を入力してください。" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "日付の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "日時ではなく日付を入力してください。" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "時刻の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "機関の形式が違います。以下のどれかの形式にしてください: {format}。" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\"は有効な選択肢ではありません。" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "\"{input_type}\" 型のデータではなく項目のリストを入力してください。" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "空でない項目を選択してください。" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\"は有効なパスの選択肢ではありません。" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "ファイルが添付されていません。" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "添付されたデータはファイルではありません。フォームのエンコーディングタイプを確認してください。" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "ファイル名が取得できませんでした。" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "添付ファイルの中身が空でした。" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "ファイル名は最大{max_length}文字にしてください({length}文字でした)。" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "有効な画像をアップロードしてください。アップロードされたファイルは画像でないか壊れた画像です。" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "リストは空ではいけません。" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "\"{input_type}\" 型のデータではなく項目の辞書を入力してください。" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "ページ番号 \"{page_number}\" は不正です: {message}。" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "カーソルが不正です。" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "主キー \"{pk_value}\" は不正です - データが存在しません。" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "不正な型です。{data_type} 型ではなく主キーの値を入力してください。" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "ハイパーリンクが不正です - URLにマッチしません。" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "ハイパーリンクが不正です - 不正なURLにマッチします。" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "ハイパーリンクが不正です - リンク先が存在しません。" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "不正なデータ型です。{data_type} 型ではなくURL文字列を入力してください。" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} のデータが存在しません。" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "不正な値です。" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo b/rest_framework/locale/ko_KR/LC_MESSAGES/django.mo index 8e97250aa5ab595dde0a13441fdf37f75fa27a55..f9a7261f8b404f226268ff099443cefbc8bf6c49 100644 GIT binary patch delta 64 zcmZ4Dzr=sTZy{qtBV7Y?1w#ufQ)6udLjwb@0Ds+})UwRt%=|oEm&B4(D+MD1LsMO- OI&&*i)6IIqWg-A-n-Qe| delta 64 zcmZ4Dzr=sTZy{p?OI;&F1w#WXQ&VjNBLf4j0Ds+})UwRt%=|oEm&B4(D+MD1LsMOd PIs*$UQ?t!_!et@=YDE#H diff --git a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po index 87388145d..901907c86 100644 --- a/rest_framework/locale/ko_KR/LC_MESSAGES/django.po +++ b/rest_framework/locale/ko_KR/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -34,24 +34,24 @@ msgstr "기본 헤더(basic header)가 유효하지 않습니다. 인증데이 msgid "Invalid username/password." msgstr "아이디/비밀번호가 유효하지 않습니다." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "계정이 중지되었거나 삭제되었습니다." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "토큰 헤더가 유효하지 않습니다. 인증데이터(credentials)가 제공되지 않았습니다." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 빈칸(spaces)를 포함하지 않아야 합니다." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "토큰 헤더가 유효하지 않습니다. 토큰 문자열은 유효하지 않은 문자를 포함하지 않아야 합니다." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "토큰이 유효하지 않습니다." @@ -109,241 +109,267 @@ msgstr "요청된 \"{media_type}\"가 지원되지 않는 미디어 형태입니 msgid "Request was throttled." msgstr "요청이 지연(throttled)되었습니다." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "이 항목을 채워주십시오." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "이 칸은 null일 수 없습니다." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\"이 유효하지 않은 부울(boolean)입니다." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "이 칸은 blank일 수 없습니다." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "이 칸이 글자 수가 {max_length} 이하인지 확인하십시오." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "이 칸이 글자 수가 적어도 {min_length} 이상인지 확인하십시오." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "유효한 이메일 주소를 입력하십시오." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "형식에 맞지 않는 값입니다." -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "문자, 숫자, 밑줄( _ ) 또는 하이픈( - )으로 이루어진 유효한 \"slug\"를 입력하십시오." -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "유효한 URL을 입력하십시오." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\"가 유효하지 않은 UUID 입니다." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "유효한 IPv4 또는 IPv6 주소를 입력하십시오." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "유효한 정수(integer)를 넣어주세요." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "이 값이 {max_value}보다 작거나 같은지 확인하십시오." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "이 값이 {min_value}보다 크거나 같은지 확인하십시오." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "문자열 값이 너무 큽니다." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "유효한 숫자를 넣어주세요." -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "전체 숫자(digits)가 {max_digits} 이하인지 확인하십시오." -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "소수점 자릿수가 {max_decimal_places} 이하인지 확인하십시오." -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "소수점 자리 앞에 숫자(digits)가 {max_whole_digits} 이하인지 확인하십시오." -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Datetime의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "예상된 datatime 대신 date를 받았습니다." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Date의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "예상된 date 대신 datetime을 받았습니다." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Time의 포멧이 잘못되었습니다. 이 형식들 중 한가지를 사용하세요: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\"이 유효하지 않은 선택(choice)입니다." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "아이템 리스트가 예상되었으나 \"{input_type}\"를 받았습니다." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "파일이 제출되지 않았습니다." -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "제출된 데이터는 파일이 아닙니다. 제출된 서식의 인코딩 형식을 확인하세요." -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "파일명을 알 수 없습니다." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "제출된 파일이 비어있습니다." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "이 파일명의 글자수가 최대 {max_length}를 넘지 않는지 확인하십시오. (이것은 {length}가 있습니다)." -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "유효한 이미지 파일을 업로드 하십시오. 업로드 하신 파일은 이미지 파일이 아니거나 손상된 이미지 파일입니다." -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "아이템 딕셔너리가 예상되었으나 \"{input_type}\" 타입을 받았습니다." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "유효하지 않은 page \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "커서(cursor)가 유효하지 않습니다." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "유효하지 않은 pk \"{pk_value}\" - 객체가 존재하지 않습니다." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "잘못된 형식입니다. pk 값 대신 {data_type}를 받았습니다." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "유효하지 않은 하이퍼링크 - 일치하는 URL이 없습니다." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "유효하지 않은 하이퍼링크 - URL이 일치하지 않습니다." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "유효하지 않은 하이퍼링크 - 객체가 존재하지 않습니다." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "잘못된 형식입니다. URL 문자열을 예상했으나 {data_type}을 받았습니다." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} 객체가 존재하지 않습니다." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "값이 유효하지 않습니다." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.mo b/rest_framework/locale/mk/LC_MESSAGES/django.mo index a788d7fe4bd613bf1789a337e53617e251c14609..64ef673cf5ab76c91f523b4cc26f5a4d3bd7ccd6 100644 GIT binary patch delta 64 zcmewn{3Ce7HX&m}BV7Y?1w#ufQ)6udLjwb@0Ds+})UwRt%=|oEm&B4(D+MD1LsMO- OI&&*i)6Fl1_{9N;8WLsz delta 64 zcmewn{3Ce7HX&mJOI;&F1w#WXQ&VjNBLf4j0Ds+})UwRt%=|oEm&B4(D+MD1LsMOd PIs*$UQ?t!4h4{q*hr|+Q diff --git a/rest_framework/locale/mk/LC_MESSAGES/django.po b/rest_framework/locale/mk/LC_MESSAGES/django.po index b6655f58c..554460c61 100644 --- a/rest_framework/locale/mk/LC_MESSAGES/django.po +++ b/rest_framework/locale/mk/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Macedonian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/mk/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "Невалиден основен header. Податоците за ав msgid "Invalid username/password." msgstr "Невалидно корисничко име/лозинка." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Корисникот е деактивиран или избришан." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Невалиден токен header. Не се внесени податоци за најава." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Невалиден токен во header. Токенот не треба да содржи празни места." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Невалиден токен." @@ -109,241 +109,267 @@ msgstr "Media типот „{media_type}“ не е поддржан." msgid "Request was throttled." msgstr "Request-от е забранет заради ограничувања." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Ова поле е задолжително." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Ова поле не смее да биде недефинирано." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" не е валиден boolean." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Ова поле не смее да биде празно." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Ова поле не смее да има повеќе од {max_length} знаци." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Ова поле мора да има барем {min_length} знаци." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Внесете валидна email адреса." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Ова поле не е по правилната шема/барање." -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Внесете валидно име што содржи букви, бројки, долни црти или црти." -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Внесете валиден URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Задолжителен е валиден цел број." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Вредноста треба да биде помала или еднаква на {max_value}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Вредноста треба да биде поголема или еднаква на {min_value}." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Вредноста е преголема." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Задолжителен е валиден број." -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Не смее да има повеќе од {max_digits} цифри вкупно." -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Не смее да има повеќе од {max_decimal_places} децимални места." -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Не смее да има повеќе од {max_whole_digits} цифри пред децималната точка." -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Датата и времето се со погрешен формат. Користете го овој формат: {format}." -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Очекувано беше дата и време, а внесено беше само дата." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Датата е со погрешен формат. Користете го овој формат: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Очекувана беше дата, а внесени беа и дата и време." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Времето е со погрешен формат. Користете го овој формат: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "„{input}“ не е валиден избор." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Очекувана беше листа, а внесено беше „{input_type}“." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Ниеден фајл не е качен (upload-иран)." -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Испратените податоци не се фајл. Проверете го encoding-от на формата." -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Не може да се открие име на фајлот." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Качениот (upload-иран) фајл е празен." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Името на фајлот треба да има највеќе {max_length} знаци (а има {length})." -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Качете (upload-ирајте) валидна слика. Фајлот што го качивте не е валидна слика или е расипан." -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Невалидна страна „{page_number}“: {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Невалиден pk „{pk_value}“ - објектот не постои." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Неточен тип. Очекувано беше pk, а внесено {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Невалиден хиперлинк - не е внесен URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Невалиден хиперлинк - внесен е неправилен URL." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Невалиден хиперлинк - Објектот не постои." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Неточен тип. Очекувано беше URL, a внесено {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Објектот со {slug_name}={value} не постои." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Невалидна вредност." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.mo b/rest_framework/locale/nb/LC_MESSAGES/django.mo index 8bf83c6442c2e4c3d948937ecad82dd257705e64..56b7a969b10a76a0c3873834588c5530d9f93a4e 100644 GIT binary patch literal 9902 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 RuR>lL=bvINrB+4O{{``Vz)b)E delta 138 zcmZ4I+rwgUPl#nI0}wC*u?!Ha05LNV>i{tbSOD=Qprj>`2C0F8$s%G=dY8(*& diff --git a/rest_framework/locale/nb/LC_MESSAGES/django.po b/rest_framework/locale/nb/LC_MESSAGES/django.po index 6462590d2..34b527154 100644 --- a/rest_framework/locale/nb/LC_MESSAGES/django.po +++ b/rest_framework/locale/nb/LC_MESSAGES/django.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Petter Kjelkenes , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 15:34+0000\n" +"Last-Translator: Petter Kjelkenes \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" @@ -19,382 +20,408 @@ msgstr "" #: authentication.py:72 msgid "Invalid basic header. No credentials provided." -msgstr "" +msgstr "Ugyldig basic header. Ingen legitimasjon gitt." #: authentication.py:75 msgid "Invalid basic header. Credentials string should not contain spaces." -msgstr "" +msgstr "Ugylid basic header. Legitimasjonsstreng bør ikke inneholde mellomrom." #: authentication.py:81 msgid "Invalid basic header. Credentials not correctly base64 encoded." -msgstr "" +msgstr "Ugyldig basic header. Legitimasjonen ikke riktig Base64 kodet." #: authentication.py:98 msgid "Invalid username/password." -msgstr "" +msgstr "Ugyldig brukernavn eller passord." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." -msgstr "" +msgstr "Bruker inaktiv eller slettet." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." -msgstr "" +msgstr "Ugyldig token header. Ingen legitimasjon gitt." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." -msgstr "" +msgstr "Ugyldig token header. Token streng skal ikke inneholde mellomrom." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Ugyldig token header. Tokenstrengen skal ikke inneholde ugyldige tegn." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." -msgstr "" +msgstr "Ugyldig token." #: authtoken/serializers.py:20 msgid "User account is disabled." -msgstr "" +msgstr "Brukerkonto er deaktivert." #: authtoken/serializers.py:23 msgid "Unable to log in with provided credentials." -msgstr "" +msgstr "Kan ikke logge inn med gitt legitimasjon." #: authtoken/serializers.py:26 msgid "Must include \"username\" and \"password\"." -msgstr "" +msgstr "Må inkludere \"username\" og \"password\"." #: exceptions.py:49 msgid "A server error occurred." -msgstr "" +msgstr "En serverfeil skjedde." #: exceptions.py:84 msgid "Malformed request." -msgstr "" +msgstr "Misformet forespørsel." #: exceptions.py:89 msgid "Incorrect authentication credentials." -msgstr "" +msgstr "Ugyldig autentiseringsinformasjon." #: exceptions.py:94 msgid "Authentication credentials were not provided." -msgstr "" +msgstr "Manglende autentiseringsinformasjon." #: exceptions.py:99 msgid "You do not have permission to perform this action." -msgstr "" +msgstr "Du har ikke tilgang til å utføre denne handlingen." #: exceptions.py:104 views.py:81 msgid "Not found." -msgstr "" +msgstr "Ikke funnet." #: exceptions.py:109 #, python-brace-format msgid "Method \"{method}\" not allowed." -msgstr "" +msgstr "Metoden \"{method}\" ikke gyldig." #: exceptions.py:120 msgid "Could not satisfy the request Accept header." -msgstr "" +msgstr "Kunne ikke tilfredsstille request Accept header." #: exceptions.py:132 #, python-brace-format msgid "Unsupported media type \"{media_type}\" in request." -msgstr "" +msgstr "Ugyldig media type \"{media_type}\" i request." #: exceptions.py:145 msgid "Request was throttled." -msgstr "" +msgstr "Forespørselen ble strupet." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." -msgstr "" +msgstr "Dette feltet er påkrevd." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." -msgstr "" +msgstr "Dette feltet må ikke være tomt." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." -msgstr "" +msgstr "\"{input}\" er ikke en gyldig bolsk verdi." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." -msgstr "" +msgstr "Dette feltet må ikke være blankt." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." -msgstr "" +msgstr "Forsikre deg om at dette feltet ikke har mer enn {max_length} tegn." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." -msgstr "" +msgstr "Forsikre deg at dette feltet har minst {min_length} tegn." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." -msgstr "" +msgstr "Oppgi en gyldig epost-adresse." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." -msgstr "" +msgstr "Denne verdien samsvarer ikke med de påkrevde mønsteret." -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." -msgstr "" +msgstr "Skriv inn en gyldig \"slug\" som består av bokstaver, tall, understrek eller bindestrek." -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." -msgstr "" +msgstr "Skriv inn en gyldig URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." -msgstr "" +msgstr "\"{value}\" er ikke en gyldig UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Skriv inn en gyldig IPv4 eller IPv6-adresse." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." -msgstr "" +msgstr "En gyldig heltall er nødvendig." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." -msgstr "" +msgstr "Sikre denne verdien er mindre enn eller lik {max_value}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." -msgstr "" +msgstr "Sikre denne verdien er større enn eller lik {min_value}." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." -msgstr "" +msgstr "Strengverdien for stor." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." -msgstr "" +msgstr "Et gyldig nummer er nødvendig." -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." -msgstr "" +msgstr "Pass på at det ikke er flere enn {max_digits} siffer totalt." -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." -msgstr "" +msgstr "Pass på at det ikke er flere enn {max_decimal_places} desimaler." -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." -msgstr "" +msgstr "Pass på at det ikke er flere enn {max_whole_digits} siffer før komma." -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Datetime har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." -msgstr "" +msgstr "Forventet en datetime, men fikk en date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Dato har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." -msgstr "" +msgstr "Forventet en date, men fikk en datetime." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Tid har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Varighet har feil format. Bruk et av disse formatene i stedet: {format}." -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." -msgstr "" +msgstr "\"{input}\" er ikke et gyldig valg." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Mer enn {count} elementer ..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." -msgstr "" +msgstr "Forventet en liste over elementer, men fikk type \"{input_type}\"." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Dette valget kan ikke være tomt." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" er ikke en gyldig bane valg." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." -msgstr "" +msgstr "Ingen fil ble sendt." -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." -msgstr "" +msgstr "De innsendte data var ikke en fil. Kontroller kodingstypen på skjemaet." -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." -msgstr "" +msgstr "Kunne ikke finne filnavn." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." -msgstr "" +msgstr "Den innsendte filen er tom." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." -msgstr "" +msgstr "Sikre dette filnavnet har på det meste {max_length} tegn (det har {length})." -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "Last opp et gyldig bilde. Filen du lastet opp var enten ikke et bilde eller en ødelagt bilde." -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Denne listen kan ikke være tom." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." -msgstr "" +msgstr "Forventet en dictionary av flere ting, men fikk typen \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Verdien må være gyldig JSON." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Send inn" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." -msgstr "" +msgstr "Ugyldig side \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" -msgstr "" +msgstr "Ugyldig markør" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." -msgstr "" +msgstr "Ugyldig pk \"{pk_value}\" - objektet eksisterer ikke." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." -msgstr "" +msgstr "Feil type. Forventet pk verdi, fikk {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "Ugyldig hyperkobling - No URL match." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "Ugyldig hyperkobling - Incorrect URL match." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "Ugyldig hyperkobling - Objektet eksisterer ikke." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." -msgstr "" +msgstr "Feil type. Forventet URL streng, fikk {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." -msgstr "" +msgstr "Objekt med {slug_name}={value} finnes ikke." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." -msgstr "" +msgstr "Ugyldig verdi." -#: serializers.py:310 +#: serializers.py:326 #, python-brace-format msgid "Invalid data. Expected a dictionary, but got {datatype}." -msgstr "" +msgstr "Ugyldige data. Forventet en dicitonary, men fikk {datatype}." + +#: templates/rest_framework/admin.html:118 +#: templates/rest_framework/base.html:128 +msgid "Filters" +msgstr "Filtre" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Feltfiltre" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sortering" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Søk" #: 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 "Ingen" #: 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 "Ingenting å velge." #: validators.py:24 msgid "This field must be unique." -msgstr "" +msgstr "Dette feltet må være unikt." #: validators.py:78 #, python-brace-format msgid "The fields {field_names} must make a unique set." -msgstr "" +msgstr "Feltene {field_names} må gjøre et unikt sett." #: validators.py:226 #, python-brace-format msgid "This field must be unique for the \"{date_field}\" date." -msgstr "" +msgstr "Dette feltet må være unikt for \"{date_field}\" dato." #: validators.py:241 #, python-brace-format msgid "This field must be unique for the \"{date_field}\" month." -msgstr "" +msgstr "Dette feltet må være unikt for \"{date_field}\" måned." #: validators.py:254 #, python-brace-format msgid "This field must be unique for the \"{date_field}\" year." -msgstr "" +msgstr "Dette feltet må være unikt for \"{date_field}\" år." #: versioning.py:42 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "Ugyldig versjon på \"Accept\" header." #: versioning.py:73 versioning.py:115 msgid "Invalid version in URL path." -msgstr "" +msgstr "Ugyldig versjon i URL-banen." #: versioning.py:144 msgid "Invalid version in hostname." -msgstr "" +msgstr "Ugyldig versjon i vertsnavn." #: versioning.py:166 msgid "Invalid version in query parameter." -msgstr "" +msgstr "Ugyldig versjon i søkeparameter." #: views.py:88 msgid "Permission denied." -msgstr "" +msgstr "Tillatelse avslått." diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.mo b/rest_framework/locale/nl/LC_MESSAGES/django.mo index aedfef2c5ca0c6fcab0cd15c9e2eb9d8bc2d2bf7..7cb2a85ef4ecd0d9b1aed5e976094840cccca922 100644 GIT binary patch delta 64 zcmdn&vDssTwurHzk*E<|*tNZ{!nGtdT delta 64 zcmdn&vDssTwurHTrLK{of}w$xsj0Ssk%0kMfWK}~YFTD+W`3ToOJYf?m4cChp{XuJ Poq>gwsoCZ@k*oXwKtmC7 diff --git a/rest_framework/locale/nl/LC_MESSAGES/django.po b/rest_framework/locale/nl/LC_MESSAGES/django.po index 11d2c080e..f53b6097c 100644 --- a/rest_framework/locale/nl/LC_MESSAGES/django.po +++ b/rest_framework/locale/nl/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Dutch (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/nl/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "Ongeldige basic header. login gegevens zijn niet correct base64 versleut msgid "Invalid username/password." msgstr "Ongeldige gebruikersnaam/wachtwoord." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Gebruiker inactief of verwijderd." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Ongeldige token header. Geen login gegevens opgegeven" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ongeldige token header. Token kan geen spaties bevatten." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Ongeldige token." @@ -109,241 +109,267 @@ msgstr "Ongeldig media type \"{media_type}\" in aanvraag." msgid "Request was throttled." msgstr "Aanvraag was verstikt." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Dit veld is verplicht." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Dit veld mag niet leeg zijn." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" is een ongeldige boolean waarde." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Dit veld mag niet leeg zijn." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Zorg ervoor dat dit veld minimaal {min_length} karakters bevat." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Voer een geldig e-mailadres in." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Deze waarde voldoet niet aan het benodigde formaat." -#: fields.py:723 +#: fields.py:730 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." -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Voer een geldige URL in." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" in een ongeldige UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Een geldig getal is vereist." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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}." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Tekstuele waarde is te lang." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Een geldig nummer is verplicht." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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." -#: fields.py:879 +#: fields.py:888 #, python-brace-format 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." -#: fields.py:880 +#: fields.py:889 #, python-brace-format 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." -#: fields.py:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Verwacht een datetime, in plaats kreeg een date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Verwacht een date, in plaats kreeg een datetime" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" is een ongeldige keuze." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Verwacht een lijst met items, kreeg een type \"{input_type}\" in plaats." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Er is geen bestand opgestuurd" -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Bestandsnaam kan niet vastgesteld worden." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Het verstuurde bestand is leeg." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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})." -#: fields.py:1363 +#: fields.py:1391 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," -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Verwacht een dictionary van items, in plaats kreeg een type \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Ongeldige pagina \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Ongeldige cursor." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ongeldige pk \"{pk_value}\" - object bestaat niet." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Ongeldig type. Verwacht een pk waarde, ontving {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Ongeldige hyperlink - Geen overeenkomende URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ongeldige hyperlink - Ongeldige URL" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Ongeldige hyperlink - Object bestaat niet." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Ongeldig type. Verwacht een URL, ontving {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Object met {slug_name}={value} bestaat niet." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Ongeldige waarde." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/nn/LC_MESSAGES/django.mo b/rest_framework/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..fd5f5ec26a9568288476ae9a57dea07605386ff3 GIT binary patch literal 524 zcmZut!EO^l3@w7w9yxO`5{FjB+1;S1VL}k1O{GetjlzPs4q0bA?Z&fsCfVde_%S}9 z-%@Xj(o3K8G#<~hJv0QnWPreth6uY9<%WX2J#!JL$s9cF(*Hys68%SnX1)d7osHJ#jBN^yt`2h1i zW+#vj&EUgvmS>p?aZVf8jd(_PVg`fbOp$!EAz~qxLv5oM1HbIXk-(Ld{?B>`pSJ!n z`cgag8)th9zxu3YT&- z;ghcW%aQ~qyzr&t%E0iqi+e)`n3Gw(7F*-FmsQY2^KcF0{s\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" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/no/LC_MESSAGES/django.mo b/rest_framework/locale/no/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..00f5db6b594908affee647eec4ca29a8464fd10b GIT binary patch literal 516 zcmZut%TB{E5Cp*~N6s7;i313>Ns20pOA(?J35h~g0^(|#Z7`(X;J8is5Pph};9J-L zDi=l?dA*+TK0Y_r-&X{y!cF0}a80-`tkD*J$m5ZmwPuN-<7XOsyiD<)Txr-UIDghQ zV;J>s6PP$XrHb84FrtE;$3dBy6whW^i3uwRhBpcJ9BD6BJlCESG^4nMaTB9Mh})`l zuouNqBtjg~+|(uh(H*K*YcCQ6SGx3=IBm;Zdv*#Q^xTkx8<+Cy>w?cN{Y2m{n*T!~W{G?q;zI&HkVEa#3_c9@eeLLpV s*i1qD(fH*c3M>c1eCBkH7wo2`B#Q5A*==^\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" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.mo b/rest_framework/locale/pl/LC_MESSAGES/django.mo index 90b5b93d7cc629fb169c02e9991fa62449848f1c..30e6022558e4409c426bb205e867ca23c1fc9ef3 100644 GIT binary patch delta 2698 zcmZYATTB#Z6u|Ls5f=m%1iYcv4{vP+R+gKHT0yNhR1j3WG&I99vIBd8Wmf`?Zlg8y z$zHbB5MpcFhuWsqhegvUNgrer8*O??8dIY__@a%PHoYZHFX{ixuEw-qIQyHKo&9FM zbIuG$8csJyZ|9|-P>lV=T;kU>rJ{IkA|H$^8A=u57pU<*F2>23NoF+o*b#jg1`m3hQuYmQuTM4=%@ZxDxMT11`)~suqJN-+zo- z@eVG;Ws{Z4!xoeqI)HNgXvz;!=DUhjveb+zO7W*w^TFa&1Ih|pP%bopH8_fE@FA|l z(y2cc&fzn74<&Qca+F$%6)4BsundRLC8_?5jm>x$SED;OIbjeB**~1x zA4XZp8I+Y>OZh|UxN}-^*)K=wk;Z)TU(H502c(wo zqwL>6x$|iS$rDRZv%d-D#w?U(8pdM0iEhlCuGC(v#o72)%Cjl2U^&O{;2#d9rq3Y% z6&%Q+g{9`}P-Elp&}ZA zepMYPB@3Z6!Qm{z9^)>UDC3tysnW+bAozhRf`3{(ITr2~vlUB&g#ksrnQtvl_(={1T;C zzQc7miH4zCY8%RhEF|mdW#km~4sOHC*oxCwoz&h!DcKm#;ri+x8)QeNvy4()f*Wur zuEr6p!S7K@lt(&Poa#m9Rwqzy>=Mf3_ai#+(U5+SA*+`RtsrFnO+-{CkRQv~MMx&( zZ6!lGTSgkOlaRXc*0ejF2DeuMb{V##tXhVwQik+FJ|PV#C3|wnLRnALZl*1%Z?c~_ z!^!qWqAqo8AJ!B5iF86TAa#`HB7t^E&>))0FM8JdtLls=O8Km%)Z#~Sr4aguuNZvK4AI6W~fhXNE*MBeKjr53LG?iR)_X@ zjgaAy@8glFF2}53$kbu45zsGrf{{S@kha36zt820ozA(C*%<0DLsp_1HVk(-Eq=ooHXA-OhA8QJC*2 zXbSoaJH?^P@qRnUp@I1IIR_@pTbnpCKHL!?6-H;`2;Z9BdQgXh-Dbe_$M(&io7bK? z!{gP10i&B!;w$HS9Yw9y_^`+9;*Jtyj|)Na{AM7`NmS!K{dsmn&}Vi9f{Bswq1cN> zZfDD2q}%9~m>4s4`@r~+?jg&DOYJkbuxHSe vwM+cx3^RUl;YmkDs}Ty@*OB5_sR@!v8t`k6HGZtqGX0O%pzWG9EiV5T!&|Ch delta 1964 zcmYk+e@skr(KX=^LZe{%g;?Ubu6o13=E{wp@y`r)wIA8p}ZZPi@s{W<5h@r*C8=Q(hmbDr<> zJ%G5EVlU(OFo=Jn z7Lb)`Oa(rg^Z;s}acso*aWnpktvugkWEs=Ug)Z#C)3_V2VHkZIjLF6b>i;@$E6$=a za|s{A8_Dad7-3w%O}f7u+i?c@F`w|O2ybf4^UWPPdgE2p3W5)LZbMz~MXm4@D)kGv z1>eRH-a-pkFc1AX#sn~gB*hftHmpL;a|m@`3=;)(UZE4g3&@_BZ%{9io69ONj2iDn z?eQQsVFI;PSCiva)XFyV6g{vLwfCp68Xc^|JNPW-=8^x0>5TB&@(kAFTj-+@zr)8F zFK_hrES=XbXBfc^WHm0uSJMJdF2HTi4E~qSP;9Eq;zV zaDK;jtmEcpjN>tU2P^dbr*RtSK&a-IzJh-AVH&}^xT^(sGO2y-B~(aj8|Ra0AuK`* z+C@A?aIU$T+>e<=4Utdu5PH7bQj?19Yx;VjHiB|+v(dHYZ!FAxab4ofaqB~UHSMvQ zYC+l5*U(9jEcc9PMH1jWU+Gd&JxQpk9-7>qcOIy_j!+$_@e#O9g{M8>PV0=Qn#c*RdOd)uG9W*x0Z&9UYw-vL@qkYcx7B zJQQ{of*<&tvHYVx`|ifqvLh|E^>tQVq_wfJI#O@H6e`N}E=8JK8=LG)p@PaI(dpRG zgw;23B0fGfXSL17yNY%D$&3C?$PH&E>?~L2`<<#SOFsMl*1G=y DBk$dh diff --git a/rest_framework/locale/pl/LC_MESSAGES/django.po b/rest_framework/locale/pl/LC_MESSAGES/django.po index c9b3798cc..9254cb73e 100644 --- a/rest_framework/locale/pl/LC_MESSAGES/django.po +++ b/rest_framework/locale/pl/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: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 19:44+0000\n" +"Last-Translator: Janusz Harkot \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" @@ -36,24 +36,24 @@ msgstr "Niepoprawny podstawowy nagłówek. Niewłaściwe kodowanie base64 danych msgid "Invalid username/password." msgstr "Niepoprawna nazwa użytkownika lub hasło." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Użytkownik nieaktywny lub usunięty." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Niepoprawny nagłówek tokena. Brak danych uwierzytelniających." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Błędny nagłówek z tokenem. Token nie może zawierać błędnych znaków." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Niepoprawny token." @@ -111,241 +111,267 @@ msgstr "Brak wsparcia dla żądanego typu danych \"{media_type}\"." msgid "Request was throttled." msgstr "Żądanie zostało zdławione." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "To pole jest wymagane." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Pole nie może mieć wartości null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" nie jest poprawną wartością logiczną." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "To pole nie może być puste." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Upewnij się, że pole ma co najmniej {min_length} znaków." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Podaj poprawny adres e-mail." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Ta wartość nie pasuje do wymaganego wzorca." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Wprowadź poprawny adres URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" nie jest poprawnym UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Wprowadź poprawny adres IPv4 lub IPv6." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Wymagana poprawna liczba całkowita." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Za długi ciąg znaków." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Wymagana poprawna liczba." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Oczekiwano datę z czasem, otrzymano tylko datę." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Oczekiwano daty a otrzymano datę z czasem." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" nie jest poprawnym wyborem." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Więcej niż {count} elementów..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Oczekiwano listy elementów, a otrzymano dane typu \"{input_type}\"." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Zaznaczenie nie może być puste." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" nie jest poprawną ścieżką." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Nie przesłano pliku." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Nie można określić nazwy pliku." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Przesłany plik jest pusty." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Lista nie może być pusta." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Oczekiwano słownika, ale otrzymano \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +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:5 +msgid "Submit" +msgstr "Wyślij" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Niepoprawna strona \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Niepoprawny wskaźnik" -#: relations.py:192 +#: relations.py:196 #, 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:193 +#: relations.py:197 #, 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}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Błędny hyperlink - nie znaleziono pasującego adresu URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Błędny hyperlink - błędne dopasowanie adresu URL." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Błędny hyperlink - obiekt nie istnieje." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Obiekt z polem {slug_name}={value} nie istnieje" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Niepoprawna wartość." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filtry" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Pola filtrów" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Kolejność" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Szukaj" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/pt/LC_MESSAGES/django.mo b/rest_framework/locale/pt/LC_MESSAGES/django.mo index 84ad8acc7f10da60ac704ac616a4e774c76fd809..476e41490ac1dbe53c9500f7e5ede967a600905a 100644 GIT binary patch delta 40 qcmZo=X=Rx(iO\n" "Language-Team: Portuguese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/pt/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo b/rest_framework/locale/pt_BR/LC_MESSAGES/django.mo index fc203d9bb61c23dc24ae159d085e26bbc5426d61..0f2dac6156a0b7c2706b41f35d99b96bc6e84094 100644 GIT binary patch delta 2374 zcmYk-TWl0n9LMnky%*HBP+HK+v{ew=ExTJTb)isN+Hx%wJblquu0)ItiuKXcm=3+Cde+P!~C^jk8pHo?d}3vmZlp%b(ZVVL$|)RKOR8t5I=bu)OF+ELUV>6t?Q7gE_vht~2Gs{Ipc zUIvxxBIPg41>A#LwCKyvWjr{8de=t0) zc@0}x1L(jy97T=zO`L^igZ^Jo1J36u8psk{ff-zbU!j(?j9I9?4Yljv!EJaeXs^tW z2VL+gZpSOQ92fD_PCS4c@f>OsRn+8`pcOUXO{kfV27ZM4{WWYui;cjxGB#?-_Te1d zk4rFfii&3PGxlKB%$$Q5qx~7Ozs#SgndVu!2X>)SxgT}I4>5#4pq41FHh0XL@oCyg zT#a9&?pIOgXEtN%si>n3b)#N<3=bk>GADxmbI3k2H&8RbjjV#H<47noi;+p2T|xUW zl1y_NIqK#D>N%HDOMU}Obp9)Onr=K3*+(XdN>w*nxISnnQ8OMvE!F$TWK030(Sv3q z_cR@-fe&Ic9tk{)`u%UnYMNR$R4vapOR3Ojo<*hZ2zKHb)MmVmi?NwQJcvnTHOwW{ zjQ>I1u#&gSe2n4*yj#?#qJ6-|H%}5>#7ZKg2WylnPZ3Iy(y5}+s!Sv{5z3NMxs+go z`)LIKq^w60;+Ktq8Z;-_f4geH_ZRII#+~6EoZA@sa*{rRQi$C|ThP|ASxzYR`Giuf zY^^0okpD{N6q^mi{iT&g39*9EMpx1DD6^eff2B}`tlcZc_iDL{Hrm~?g-Sc2W7`;X zu0xKrUwG~NZ^0I9%60kwS5(!J(`o1&lwY0n94o!sPFM%~lf#Mh zA>FigihH~P$8!^d+1~QT0>}3HcV`clPcQ5n-Z|u^$Fk*}dDWZk_^@LQ z4X4u9PRAOtCh(6PNd>?I_br%4$pQ6t@gN`8torFu-95L#1)RW z$KE>}ZyOx4-T2tIl}C%JH8;<;1{|y39(pe6&(*U{NA`AA%~-1D<@~C3wwu!T_sut< z`QE9$TB7+T?8HDad%12-Vf%2Z-}YXsuPf|KjJUQpR$G5EugZ=mJ$^ruv{H`ePt_Xv L@?<>w#jM!>KE@-) delta 1996 zcmZY9e@N7K9LMpudUocey+ zKHtxe_xJnT(MLzzpTmKRMma`2N!-jeJB2UhbD=mvvnWQSTksu>;B9p9CoIK(Fo59_Gd9o4(A`d@f{F&}Mg4IY%kUh=@dE0IzCul; zh#%|w8dQ59>da5zPCSb`nj3z53AL~&v(WEa(7}OH_Foe?Lx+;%8rI?itjG0h&0fGm z_yk_{y@d(dKjM6jS!iAMf4?$&9c2l#(?puE0>@DkeH)*~kNy51%Gm!VI{u_X6Nr<_ z?Kp{t@l(`U1-QG~-Kgxnj4$FZe!GR`>HAq6#5=ebYgujwzKXq=LFL8@W}}_1cd2N` zov0O$`_7>T_zv4}?M4y?`>_RG)WmOM5B}lXP9h{}UqFuA?w}U7fEvGYb9U$YQRBI< zQ>mkJ19cP&*oYdpo2L)3d)5F9K?QPY`cyc?|bB9 z54mV!rOa{%COloUSEy)!%czxoiyB}FHRDxWv@;3pz?V_U^*(B+?&AnLPA@(f_R3|ZsijWp)J*FwNole zQti@m(Gl{Z^pbY9-^q!%UUq8x^(s9;>>*-AoZyJPqPNYe&{vazu? zo=BgIl!vli@m;M1& diff --git a/rest_framework/locale/pt_BR/LC_MESSAGES/django.po b/rest_framework/locale/pt_BR/LC_MESSAGES/django.po index 7fdefbd5c..ce372f321 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: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 16:20+0000\n" +"Last-Translator: Craig Blaszczyk \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" @@ -37,24 +37,24 @@ msgstr "Cabeçalho básico inválido. Credenciais codificadas em base64 incorret msgid "Invalid username/password." msgstr "Usuário ou senha inválido." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Usuário inativo ou removido." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Cabeçalho de token inválido. Credenciais não fornecidas." -#: authentication.py:171 +#: authentication.py:170 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:177 +#: authentication.py:176 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:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Token inválido." @@ -112,241 +112,267 @@ msgstr "Tipo de mídia \"{media_type}\" no pedido não é suportado." msgid "Request was throttled." msgstr "Pedido foi limitado." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Este campo é obrigatório." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Este campo não pode ser nulo." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" não é um valor boleano válido." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Este campo não pode ser em branco." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Insira um endereço de email válido." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Este valor não corresponde ao padrão exigido." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Entrar um URL válido." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" não é um UUID válido." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Informe um endereço IPv4 ou IPv6 válido." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Um número inteiro válido é exigido." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Valor da string é muito grande." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Um número válido é necessário." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Necessário uma data e hora mas recebeu uma data." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Necessário uma data mas recebeu uma data e hora." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" não é um escolha válido." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Mais de {count} itens..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "Esta seleção não pode estar vazia." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "\"{input}\" não é uma escolha válida para um caminho." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Nenhum arquivo foi submetido." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Nome do arquivo não pode ser determinado." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "O arquivo submetido está vázio." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "Esta lista não pode estar vazia." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Esperado um dicionário de itens mas recebeu tipo \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Valor devo ser JSON válido." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Enviar" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Página inválida \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Cursor inválido" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Pk inválido \"{pk_value}\" - objeto não existe." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Tipo incorreto. Esperado valor pk, recebeu {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Hyperlink inválido - Sem combinação para a URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Hyperlink inválido - Combinação URL incorreta." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Hyperlink inválido - Objeto não existe." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Tipo incorreto. Necessário string URL, recebeu {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objeto com {slug_name}={value} não existe." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Valor inválido." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filtra" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Filtra de campo" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordenando" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Buscar" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo b/rest_framework/locale/pt_PT/LC_MESSAGES/django.mo index 18198f0165df6a89e65af76d6971af1b19fb4fd3..e548456051a5ec9e9b922612cb0df728e89ccd07 100644 GIT binary patch delta 40 rcmbQnGL2=zBtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@1~LKw(>DrK delta 40 scmbQnGL2=zBt8R6T_ZyULjx;QQ*8sIi3_B-AtDAAR;Fefj|MUV0MjE1Q~&?~ diff --git a/rest_framework/locale/pt_PT/LC_MESSAGES/django.po b/rest_framework/locale/pt_PT/LC_MESSAGES/django.po index 45c8fe2d3..32cdd5c47 100644 --- a/rest_framework/locale/pt_PT/LC_MESSAGES/django.po +++ b/rest_framework/locale/pt_PT/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.mo b/rest_framework/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..11567edc3997d7f53610509d959deeedacc7a2ae GIT binary patch literal 556 zcmZut%}(1u5T+_8AA9a$E49cLop?7WB5Z0vK#-6c5v6X`>o(q)rS^_H-uxi(8hyP! zM4x~$pm5=nKF!STH^2Yh?f%_iykWj)eq_F7er9$UGXL}E5!+6)#gy>Y&I4Q(@WWE; z&}(sVYkY}fHvX221)18ek$y)r+aLv)w52QHY+1IDqZZNhI)`(zCU7cTm|(T&OEm!1 z2YD#eP!A6FrIM0`FtaPywRlB$s0V|6$%ww1Hb73sx0MM!k~ zywl2gTshO5V|~nNzFeBpLT*j1#SClXo$(^R38B$xx?Zn)p{wc^cGIP##p9Ylmiukj z1oirRT0PfK3DYE+TusI=2U9&6oud!d^W=98pCH&xNSn$yKN9mBL#++j_xuuuFS>4) zg(VpKITp^BS`2@=u-!uo!f0A8$y9KORJU6A<}qxugOPZ0v)E^uI*~e#WB-Y-e5{U= Z`}^l0%Ve^*7yA!vljNkYRg#RNod>tOr6vFX literal 0 HcmV?d00001 diff --git a/rest_framework/locale/ro/LC_MESSAGES/django.po b/rest_framework/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 000000000..6d0d3d551 --- /dev/null +++ b/rest_framework/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,426 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" +"Last-Translator: Xavier Ordoquy \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.mo b/rest_framework/locale/ru/LC_MESSAGES/django.mo index cf41cba12a94b4f3650726a4190b0737734b741a..063bf0b74ce2591559b1b8838125b25d00533c66 100644 GIT binary patch delta 43 tcmcZ~c|USPf-s+8cxs|Eu=E=f7k^mNX3u*uW delta 43 ucmcZ~c|USPf-s+frLK{of}w$xsj0Ss(d0Z~DQ<|6frXW++2+Z@K9T?yVGC*i diff --git a/rest_framework/locale/ru/LC_MESSAGES/django.po b/rest_framework/locale/ru/LC_MESSAGES/django.po index 9a2fb7c02..eae0fe286 100644 --- a/rest_framework/locale/ru/LC_MESSAGES/django.po +++ b/rest_framework/locale/ru/LC_MESSAGES/django.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Russian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/ru/)\n" "MIME-Version: 1.0\n" @@ -36,24 +36,24 @@ msgstr "Недопустимый заголовок. Учетные данные msgid "Invalid username/password." msgstr "Недопустимые имя пользователя или пароль." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Пользователь неактивен или удален." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Недопустимый заголовок токена. Не предоставлены учетные данные." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Недопустимый заголовок токена. Токен не должен содержать пробелов." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Недопустимый токен." @@ -111,241 +111,267 @@ msgstr "Неподдерживаемый тип данных \"{media_type}\" в msgid "Request was throttled." msgstr "Запрос был проигнорирован." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Это поле обязательно." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Это поле не может быть null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" не является корректным булевым значением." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Это поле не может быть пустым." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "Убедитесь что в этом поле не больше {max_length} символов." -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Убедитесь что в этом поле как минимум {min_length} символов." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Введите корректный адрес электронной почты." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Значение не соответствует требуемому паттерну." -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "Введите корректный \"slug\", состоящий из букв, цифр, знаков подчеркивания или дефисов." -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Введите корректный URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" не является корректным UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Требуется целочисленное значение." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "Убедитесь что значение меньше или равно {max_value}." -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "Убедитесь что значение больше или равно {min_value}." -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Слишком длинное значение." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Требуется численное значение." -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "Убедитесь что в числе не больше {max_digits} знаков." -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "Убедитесь что в числе не больше {max_decimal_places} знаков в дробной части." -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "Убедитесь что в цисле не больше {max_whole_digits} знаков в целой части." -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат datetime. Используйте один из этих форматов: {format}." -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Ожидался datetime, но был получен date." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат date. Используйте один из этих форматов: {format}." -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Ожидался date, но был получен datetime." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "Неправильный формат времени. Используйте один из этих форматов: {format}." -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" не является корректным значением." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Ожидался list со значениями, но был получен \"{input_type}\"." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Не был загружен файл." -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "Загруженный файл не является корректным файлом. " -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Невозможно определить имя файла." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Загруженный файл пуст." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "Убедитесь что имя файла меньше {max_length} символов (сейчас {length})." -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "Загрузите корректное изображение. Загруженный файл не является изображением, либо является испорченным." -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Ожидался словарь со значениями, но был получен \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Недопустимая страница \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Не корректный курсор" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Недопустимый первичный ключ \"{pk_value}\" - объект не существует." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Некорректный тип. Ожилалось значение первичного ключа, получен {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Недопустимая ссылка - нет совпадения по URL." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Недопустимая ссылка - некорректное совпадение по URL," -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Недопустимая ссылка - объект не существует." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Некорректный тип. Ожидался URL, получен {data_type}." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Объект с {slug_name}={value} не существует." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Недопустимое значение." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.mo b/rest_framework/locale/sk/LC_MESSAGES/django.mo index f80b9568a755d7631bcf4e58b21356c634a058fb..89c3f462f467c716641e1049cc4135cb2654d59a 100644 GIT binary patch delta 43 tcmdnuwZ&^gf-s+8cxs|Eu=E=ef1px#w3qt?^ delta 43 ucmdnuwZ&^gf-s+frLK{of}w$xsj0Ss(d0Z~DQ<|6frXW++2+Z@3k3lL84E)I diff --git a/rest_framework/locale/sk/LC_MESSAGES/django.po b/rest_framework/locale/sk/LC_MESSAGES/django.po index ee171b51d..cdd82c107 100644 --- a/rest_framework/locale/sk/LC_MESSAGES/django.po +++ b/rest_framework/locale/sk/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \n" "Language-Team: Slovak (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/sk/)\n" "MIME-Version: 1.0\n" @@ -34,24 +34,24 @@ msgstr "Nesprávna hlavička. Prihlasovacie údaje nie sú správne zakódované msgid "Invalid username/password." msgstr "Nesprávne prihlasovacie údaje." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Daný používateľ je neaktívny, alebo zmazaný." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Nesprávna token hlavička. Neboli poskytnuté prihlasovacie údaje." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Nesprávna token hlavička. Token hlavička nesmie obsahovať medzery." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Nesprávny token." @@ -109,241 +109,267 @@ 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:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Toto pole je povinné." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Toto pole nemôže byť nulové." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" je validný boolean." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Toto pole nemože byť prázdne." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Uistite sa, že toto pole má viac ako {min_length} znakov." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Vložte správnu emailovú adresu." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Toto pole nezodpovedá požadovanému formátu." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Zadajte platnú URL adresu." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" nie je platné UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Je vyžadované celé číslo." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Zadaný textový reťazec je príliš dlhý." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Je vyžadované číslo." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Vložený len dátum - date namiesto dátumu a času - datetime." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Vložený dátum a čas - datetime namiesto jednoduchého dátumu - date." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" je nesprávny výber z daných možností." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Nebol odoslaný žiadny súbor." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Nebolo možné určiť meno súboru." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Odoslaný súbor je prázdny." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format 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}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Nesprávne číslo stránky \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Nesprávny kurzor." -#: relations.py:192 +#: relations.py:196 #, 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:193 +#: relations.py:197 #, 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." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Nesprávny hypertextový odkaz - žiadna zhoda." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Nesprávny hypertextový odkaz - chybná URL." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Nesprávny hypertextový odkaz - požadovný objekt neexistuje." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt, ktorého atribút \"{slug_name}\" je \"{value}\" neexistuje." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Nesprávna hodnota." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.mo b/rest_framework/locale/sv/LC_MESSAGES/django.mo index e2e4717ba5abaf40f031f585f33f966b56535eb2..a6c04ef4bde5b3070f8f7ab5b52f16f3f4f2616d 100644 GIT binary patch delta 2548 zcmZY9TWl0n9LMof=!Kg|OK*U{6sjO?mtLThN@WXJpsh5prGStoOS^4{?xpNbfr_vp zXwbwcX5|52Bnp8TLXE2pCO)|)f|3xGXkx?%Vgf=;3_&ANjNjkxR82V9|9oc7&gIPi z{LhTGp6!VLSde|f&~_4!5%(q-6UQq#Y-pGAj48v*XyF}v9H&h(W**jJDQ-qxzX#{w zF|5LOu@b++HTXBSVDsd(aq}`e>*=_PUM!hnOc!p)6*!7d;Z1DAg;R}b#0cvD_plvr z;6hwF&6oo8p$624>Obmw7InWbak*YK?-678nI<;8oM}V7p%3+-5p2K@aW(#eYq4s& zF&^BD{LCpfI&Tyg<1JL?@*g#33D%+dyRjONp+~8{$j(N*iA`8DBXh$D&gS^Adwdf0 zCg)IZcE$B)w?8*O^X5xXQ`3aHeitsn{aB1|qlIG_pUKX5>}2B|B+KSkT#A1p(`72i zr&79%jc%|WbFmvsFyI~^!fK9RL`~^OsDVB}oj03@>9`hEBONoze?2>cbZ9Q$K^=dO z8hL(U=EO?0INpF7n2jo?lURX2U=2cxoFSKplUEs+H;7#EV<76BDQxy%lHY zX?Et5kImSP>+pTlg}-4Jt|V`o!{bPD%thoE+Mj@-*6kujKWP!GI|OtYD{AhWFMP#M^Y8o&_h|F=-r zkGjWKQQxwkP|Nf-YB}D=Jgxt7o~k#j#710&S`GV=teO{4sXK`(vQwz3`Wl%XQ(m4K zxED1=y{PZUtGF6JKri0KCamL6E;V~4&o?LBj*pR_xz0u@oA^X#K&{Bnyu_v(&!aLk zm8Wq}vji>dKo!*xX5n~KL96K{Dg5-jx8MdMt_Ri;YFi1-jnbp0rJ^>0P}Q=G4PVW4 z9Z=ZmX#qnf%_c&FQQMLs{h3v<^1)0`iQAo~iY?>Z#5dTOR`(xO>Uhg#XFcI{JD$U4 zLdBU)D1}7i)u*Pa(r2%M@TjEK^3q$X3AYhGqJz-)RZSJ7rqWf}P9#)Ks=$pzKB4MU z%OUg;P&Mr!)GVTyC?iyrX2C%_JT&YaT9CM%yDE{BSCT#CcLtJk@(Oc`TI@iu*Xpx_ zP9PdHEg6%ZX;ZUHBhi564EV#=!Jf!)*g0g`P9PNXcoOw9#wK+{djnBB+@H8Jqq02U zkM;~0pQ8?IpFcRvg^`FA^hf&x9^)I{9kQKdRsMyn`k)YX$zS(ysK4L&MyGD|w9FYqk11HYMr`Uz=W2TUEWns%dCk zURP0Flek(qyH;HdR!x0lO?^c*ZA!a8=2Ue?{oz>9??j@FR%^sRXooCcgm(!JhkKLN zMcc9xJ;heO)t4HJT7j??ON|ZgOP%gd9xZ-8r=TTuI_PAQ<>o5+*PM~;SuMdp)JmQH zFIADHq|YHA>^^)-^60|htodE;(?Y2;vGMEs OnQXg1lfvK2SN;Rz@N)?O delta 1940 zcmYk+Z){Ul7{~Fauz%ecxQ>>wSt)dL%ynfQD{KQs$AGy%xF8G=jaqTR#j%cMotv5I z3&F%_qU1`ViBX6q(?}$ydndjin`XX-n3$mGcxBXRf(c@x`2F?P#FL);IrrS&d(L^z zbMM^X<-W}KzJl{cIY_;q`r!(*Qy3}aK>4A_Y$N`NAzWE(_5jvm6?UWUdje~42Al9a zMsNZ5;P1E}x0blRh&^T*yGkR$1+Ula2=?K2yofvSTkJ=FsaXdmQP6l1oEP%`gX)IcBSUCetEBlQ1;?O4z3wFOD+$4}M~e|6lULwnstN+<9v9>%Y5 z8`dzZPJ9#(;yK)lw@~+OX7nRCirR_=ROo+3es+(8CQ?nfWDhE`lNlNb8dq=w{*CPz zB;E?;Q5?WG@Nv9>32Y0JXgGtK*sG|JE}@d|4{X37@2c!UMeZ~v@FMDU%q-LBqS3(U zY`;B^%I4Yp`Fp5PUq*g*jRUvXZPb9ikQuvTov8Z`p$1H&`rk+0H=jShj{3Cxgd}^$ zexsq+<{#9G8hA{aTC*o{2({9AQ=j53=>S6_X;l(#BEA`v0OFV0>dY za>dKBBHvzx#f+c(8a1K9!Z*bHRFyKS_ELkZ@CDAzT z@s8y_xO&0%P?hgaSxL3CTpY=^mUs)ZhssL}oau_J)9PysOiql9oeWJSN7KWh$y6#d znw&T}9L>J$`_z*iTYKE&Ec;(y-Q3>P5(~weJL2)i<`!o*P+jVFHMe!doeP1gx?{QEZ;KZ}3)9IPe&gqofN{o(-rKU!b(G#gto!OEs>A$-S^y;(QzamMSn{|hCx(cJ(5 diff --git a/rest_framework/locale/sv/LC_MESSAGES/django.po b/rest_framework/locale/sv/LC_MESSAGES/django.po index daebfb63a..91ee9d7a7 100644 --- a/rest_framework/locale/sv/LC_MESSAGES/django.po +++ b/rest_framework/locale/sv/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: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 16:16+0000\n" +"Last-Translator: Joakim Soderlund\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" @@ -35,24 +35,24 @@ msgstr "Ogiltig \"basic\"-header. Användaruppgifterna är inte korrekt base64-k msgid "Invalid username/password." msgstr "Ogiltigt användarnamn/lösenord." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Användaren borttagen eller inaktiv." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Ogiltig \"token\"-header. Inga användaruppgifter tillhandahölls." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Ogiltig \"token\"-header. Strängen ska inte innehålla mellanslag." -#: authentication.py:177 +#: authentication.py:176 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:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Ogiltig \"token\"." @@ -110,241 +110,267 @@ 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:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Det här fältet är obligatoriskt." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Det här fältet får inte vara null." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" är inte ett giltigt booleskt värde." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Det här fältet får inte vara blankt." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "Se till att detta fält har minst {min_length} tecken." -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Ange en giltig mejladress." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Det här värdet matchar inte mallen." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Ange en giltig URL." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value} är inte ett giltigt UUID." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "Ange en giltig IPv4- eller IPv6-adress." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Ett giltigt heltal krävs." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "Textvärdet är för långt." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Ett giltigt nummer krävs." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Förväntade en datumtid men fick ett datum." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Förväntade ett datum men fick en datumtid." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format 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:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" är inte ett giltigt val." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "Fler än {count} objekt..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format 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:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Det här valet får inte vara tomt." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" är inte ett giltigt val för en sökväg." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Ingen fil skickades." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Inget filnamn kunde bestämmas." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Den skickade filen var tom." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Den här listan får inte vara tom." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "Förväntade en \"dictionary\" med element men fick typen \"{input_type}\"." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Värdet måste vara giltig JSON." + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Skicka" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Ogiltigt sida \"{page_number}\": {message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Ogiltig cursor." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Ogiltigt pk \"{pk_value}\" - Objektet finns inte." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Felaktig typ. Förväntade pk-värde, fick {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Ogiltig hyperlänk - Ingen URL matchade." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Ogiltig hyperlänk - Felaktig URL-matching." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Ogiltig hyperlänk - Objektet finns inte." -#: relations.py:228 +#: relations.py:232 #, 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:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "Objekt med {slug_name}={value} finns inte." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Ogiltigt värde." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filter" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Fältfilter" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Ordning" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Sök" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.mo b/rest_framework/locale/tr/LC_MESSAGES/django.mo index aa35f51c9f0950dcfdec9520ac13aaf39a63a2ff..c3412b330afad6bfa535bb4507c7190eb378dae1 100644 GIT binary patch delta 2704 zcmZYAdu$X%9Ki9pQjSudZD}dbPHD9Yz2mMx!9wYS+ENPiY2~4iZEtDU?%l!O6;lY@ zA3h+OkmyMaiKa#qAWA@T*zli;K&*lwf0+gQv9h}K3JS;Ls?-r%8N#D9bUpZe1MzK zH(Mz`9zg!oCw$0#7w|d!9cAb8<|wrsSE2Op!2ljZzijno8m)K_YcV)CJzx|Ua(y&& zeF|kIXHiymBjX>Les5lS<;zh*Q;YKaD_DWAV-b#`#xYD3(D;c)Hr_{eS^b48@i7uE zwSxVWEnUrr4A6pJ+=KJc%v>MA0M~D#g!C(vi9SKOZy_&}>nfBSX)j>^t7#0;A+h`v z<@yfF%=6}@Z>&Vk^=6cbSt!YL3RmFI7{r`HrFLQsF2D~mp3gXrRrKG*s~)8ai`f5X z>A1u6B<3DcSz=XzvejKEGe3w+@C3@%osEXdoA5U7#3EKBIkO+- z`Vz_x%}y}NOEh}X!E@M#CG3+7G=!V+GRnj}%t9tqiOaAFSK~m&k5I3B5|5!g|24{jZ{Tz}|6WET-_%@`TqsBR@oPibs!o*Og(0lP z7&hTWlu-POvZC1}5Syq_?rOUF?L z_!}iBDmcuN?QxWqpGJ*8qMU|@=)s91VUQwuK;pZrZ$`I7+|reCJ<85X7$j7ai;oNDnQ*sgOXiyylkV`+ZlTs^ z`sA23PK-m#C#ywuLtsT_KMM5T--$a$&l_Fu1-EH=groPoeTt z;Qj+@ML8k-1h{1?pS{#N>Q1*O9seTQrBum{Ha~(G5Y2ESL+KQXunBSjloimox z?u1OoiVP&5&Z#Un4X1xlb;qScGvF`}Mx)v`oB`9Xx`+G1Ry22v+$5 zYjtp4&6-s!0>MBax1-(HWgfI*jOS}I;%1Gm3Ix~qFIyJh>>^Jx8w$`p~t-D(F24~1}!qy?HejsdEc536i9#7IPESxbCwVCmiGgjD2 z9Vu#xQ58>Tim(t1xXn$~hqLP^nQkZM(U|>*Z z#2A8mVZ6Xz8G^|YpA)?r4L(Lqh(cUqG-zUcu@?r3#$be~km&b!dwY_z&pCI!=brQb z|L=Wi`;ES-pTi4J8QLKIHu|*Rm;-ooA%AGEEHb7NUquTq;7a@r%P<(o-50}KnRjCy zK7lt@jSL@_h31#mXhQ zh-|?-n2({Z&tMWiL*0KBH=xBLTIXT@MDbB?ejKZKzL{a56MX3TgZ{z%8tR1QOLHMl zU=8yDjNk-XcmkK>>!_@KiX7g2i48c1TIWC1ec_NXrML#CwBv3D%1IWrk#ndYT=M3B zpmJNZ%$OFeMWteoH=jYB>>Jbre?{fIoTtX|L2Sh1_yC^6ax7U+{57a&`%T!7=Y7T; z#cJlgD{?v8kBZ0(sExgg6?hR4=o=Ge`c^4yPF=M1*tHRPwJf!(QwHlwaTgM0C# zDF%BOR1x>>cnojH@30g9!X&QcxC-qEs@P7Vitl5r!^^0RLRAkPh ze*Y&bh1C?0if{sTpjnLT{hwpt<3fOL(Y0H(yK=bUS1k;B^E`Zy+)xt$w|KkpZn~nO z*K{*INRQJMi7oVeTa+L0eD{^g&z0j2I%Q!fYPVX!Z3?SWqNWrnjQOS$skPIoIrpR+ zkzl#+KDcj?RQ^>f{d7Iw{VXcPYMXMHTTuB@Q{L57AAFPCFe}7LmzoMN-}E*u_9lMp zp|7X&2ATzQHKkXnBQq)YJ?>

Qq4~XB54g(|RnS^WjplxL-Hr(he3x?fF2$X)f5| zbLI-i{q}ItPtJWyzV_Sc;*fnf^oxCDnPWGHvQg{e#&QGtx5b3#Yxm- diff --git a/rest_framework/locale/tr/LC_MESSAGES/django.po b/rest_framework/locale/tr/LC_MESSAGES/django.po index 30b587036..0d3efc20c 100644 --- a/rest_framework/locale/tr/LC_MESSAGES/django.po +++ b/rest_framework/locale/tr/LC_MESSAGES/django.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dogukan Tufekci , 2015 # Emrah BİLBAY , 2015 # Ertaç Paprat , 2015 # Mesut Can Gürle , 2015 @@ -13,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-08 16:12+0000\n" +"Last-Translator: Recep KIRMIZI \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" @@ -39,24 +40,24 @@ msgstr "Geçersiz yetkilendirme başlığı. Uygunluk kriterleri base64 formatı msgid "Invalid username/password." msgstr "Geçersiz kullanıcı adı/parola" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "Kullanıcı aktif değil ya da silinmiş." -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "Geçersiz token başlığı. Kimlik bilgileri eksik." -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "Geçersiz token başlığı. Token'da boşluk olmamalı." -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." -msgstr "" +msgstr "Geçersiz token başlığı. Token geçersiz karakter içermemeli." -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "Geçersiz token." @@ -114,241 +115,267 @@ msgstr "İstekte desteklenmeyen medya tipi: \"{media_type}\"." msgid "Request was throttled." msgstr "Üst üste çok fazla istek yapıldı." -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "Bu alan zorunlu." -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "\"{input}\" geçerli bir boolean değil." -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "Bu alan boş bırakılmamalı." -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format 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:664 +#: fields.py:671 #, python-brace-format 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:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "Geçerli bir e-posta adresi girin." -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "Bu değer gereken düzenli ifade deseni ile uyuşmuyor." -#: fields.py:723 +#: fields.py:730 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:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "Geçerli bir URL girin." -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "\"{value}\" geçerli bir UUID değil." -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "Geçerli bir IPv4 ya da IPv6 adresi girin." -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "Geçerli bir tam sayı girin." -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format 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:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format 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:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "String değeri çok uzun." -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "Geçerli bir numara gerekiyor." -#: fields.py:878 +#: fields.py:887 #, python-brace-format 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:879 +#: fields.py:888 #, python-brace-format 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:880 +#: fields.py:889 #, python-brace-format 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:994 +#: fields.py:1004 #, python-brace-format 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:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "Datetime değeri bekleniyor, ama date değeri geldi." -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format 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:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "Date tipi beklenmekteydi, fakat datetime tipi geldi." -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format 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:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." -msgstr "" +msgstr "Duration biçimi yanlış. {format} biçimlerinden birini kullanın." -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" geçerli bir seçim değil." -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "{count} elemandan daha fazla..." -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "Elemanların listesi beklenirken \"{input_type}\" alındı." -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "Bu seçim boş bırakılmamalı." -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "\"{input}\" geçerli bir yol seçimi değil." -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "Hiçbir dosya verilmedi." -#: fields.py:1314 +#: fields.py:1340 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:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "Hiçbir dosya adı belirlenemedi." -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "Gönderilen dosya boş." -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format 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:1363 +#: fields.py:1391 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:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "Bu liste boş olmamalı." -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format 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ı." -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "Değer geçerli bir JSON olmalı" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "Gönder" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "Geçersiz sayfa \"{page_number}\":{message}." -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "Sayfalandırma imleci geçersiz" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "Geçersiz pk \"{pk_value}\" - obje bulunamadı." -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "Hatalı tip. Pk değeri beklenirken, alınan {data_type}." -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "Geçersiz bağlantı - Hiçbir URL eşleşmedi." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "Geçersiz bağlantı - Yanlış URL eşleşmesi." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "Geçersiz bağlantı - Obje bulunamadı." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "Hatalı tip. URL metni bekleniyor, {data_type} alındı." -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "{slug_name}={value} değerini taşıyan obje bulunamadı." -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "Geçersiz değer." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "Filtreler" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "Alan filtreleri" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "Sıralama" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "Arama" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo b/rest_framework/locale/tr_TR/LC_MESSAGES/django.mo index 580ae75400d243a901a498104f6b7672420619d2..1d3475bb273c9669249a5d57c620a3730379cb67 100644 GIT binary patch literal 1933 zcmai!O>Y}T7{?bVg_`$@69V)!psH=UerXjo+BB%7Nohp$qSQrjs>a^O_Qbn0?#!$c zr<8BOp{Lvk2M)~z2`L98J2wt|0uD$V_z2wikG+W<$%v80znz)?JTEiz_>YU{z7NnY zqJN0~6Z%K!w_m~!+6(Y)@DQ8_e+93A|A3dknU{m$8n_I4od!PuzstwZ!A~&$5%l(d z%lUUcfBuyqIEVRbU;!+FK9&e9gKOZ>9{4+aJ_p~!{PwGe5&RaM1%ClAgMWcD;G5@z z;9al;ehS_J{XPbZ;11~X{2}K6yo~XmppWCiYp?;n5BhzVzzDnvehexQ;S3vG2G|xL zv;fn=Tj<{R1$3l&+I(K#mbd$QKKn+_6TFju_!xZiXX=|jqhVWBU6II`>Y1_H1Si8- zI8mgP-453s$0R70btknFrgxocnWLt5^wg_dufxxZryE-snnbELg|w>b+89`%M_Ugl z6|UZzE?n3Dr`V`%dpogaOA4-eS6VkV=5(9Yc$ir>N~B!s2y1t=iN{OGHsgsQ8;i6^ zDw_GcUgwURp%#mn%~Xxgqa)lz8r`vhmbT7&ox1Z$#-@k81_I};uWQBlan#V6LV%lW zQfY_5#H=J^s@h^|NKRr)PltT$&D&>`X4c_6+l-6Jl!R@vjN_=bq#f-TNot%g!@SY{ z1jE%h{Av_(M9bSkH8pLmJgic~2Zp0+7q+;gjSJUoQ^w&^*0f<&M^xC{sD^h93;znj zW#KrY8|BJeSh*3FZ&77Fn!7n$u9V9VhFjc~K9ecBThZLyY#FWaKv)-6jZiibPMe6n z7G24PHcYIaWIejQi;MGLckrBaSBhd?r=MY)YG$IzVUSj ziAtrNot>id)@6ft{nk=EOgA(Pzo+SjmFe@PB==Kt=5ckabhWUyy0$VtyGpTKxT}?8 zg(UFiBXYd!N}WVVwLtZjFu0M$N7Z}b{8;D1X|M@bP#CdP&4}h}(w(LR8{Su8Gs%od z!h71JHX_v-4((!PfkvN;<%L4<1@{m9MedPI6MPpZX7DIwk(Q((+y8kl=^wSJ#_a^p zs;A9$5~-lBFlXv_Y;IV=l$Y=~LM4O4go1>%GTK`9x5g! zR;Eo<&Nz&Amf#8ohjo|}F@8#Pye}K(j40;8zAvVkFGVd&h*7;YalDU^2m6CV6$@&f z9+T}Knf_7QKPm=3(w8tniI-b7zP@86UQpk8qa=Prk>>p5Drj~=HEXh!~K8a#5 zc(I578pCnSu}orF49=D|31poJgM@3W_C_~c^Eb(kdZL4>heN|{iL{rpp?pHAlT;vk HxWe+kSs_Hn delta 100 zcmeC>?_#mIC&V(90SFj@SO$nyfS4JGb$}QIEP(g|P|^}egVeylQ}SzH+bG*1lU diff --git a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po index 52e6e5072..a5f7d420b 100644 --- a/rest_framework/locale/tr_TR/LC_MESSAGES/django.po +++ b/rest_framework/locale/tr_TR/LC_MESSAGES/django.po @@ -3,12 +3,13 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# José Alaguna , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -31,28 +32,28 @@ msgstr "" #: authentication.py:98 msgid "Invalid username/password." -msgstr "" +msgstr "Geçersiz kullanıcı adı / şifre." -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." -msgstr "" +msgstr "Geçersiz simge." #: authtoken/serializers.py:20 msgid "User account is disabled." @@ -88,7 +89,7 @@ msgstr "" #: exceptions.py:104 views.py:81 msgid "Not found." -msgstr "" +msgstr "Bulunamadı." #: exceptions.py:109 #, python-brace-format @@ -108,246 +109,272 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" -msgstr "" +msgstr "Geçersiz imleç." -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." -msgstr "" +msgstr "Geçersiz hyper link - URL maçı yok." -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." -msgstr "" +msgstr "Geçersiz hyper link - Yanlış URL maçı." -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." -msgstr "" +msgstr "Geçersiz hyper link - Nesne yok.." -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." -msgstr "" +msgstr "Geçersiz değer." -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" 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 "Hiç kimse" #: templates/rest_framework/horizontal/select_multiple.html:2 #: templates/rest_framework/inline/select_multiple.html:2 @@ -357,12 +384,12 @@ msgstr "" #: validators.py:24 msgid "This field must be unique." -msgstr "" +msgstr "Bu alan benzersiz olmalıdır." #: validators.py:78 #, python-brace-format msgid "The fields {field_names} must make a unique set." -msgstr "" +msgstr "{field_names} alanları benzersiz bir set yapmak gerekir." #: validators.py:226 #, python-brace-format @@ -381,20 +408,20 @@ msgstr "" #: versioning.py:42 msgid "Invalid version in \"Accept\" header." -msgstr "" +msgstr "\"Kabul et\" başlığında geçersiz sürümü." #: versioning.py:73 versioning.py:115 msgid "Invalid version in URL path." -msgstr "" +msgstr "URL yolu geçersiz sürümü." #: versioning.py:144 msgid "Invalid version in hostname." -msgstr "" +msgstr "Hostname geçersiz sürümü." #: versioning.py:166 msgid "Invalid version in query parameter." -msgstr "" +msgstr "Sorgu parametresi geçersiz sürümü." #: views.py:88 msgid "Permission denied." -msgstr "" +msgstr "İzin reddedildi." diff --git a/rest_framework/locale/uk/LC_MESSAGES/django.mo b/rest_framework/locale/uk/LC_MESSAGES/django.mo index 5e8e0ed5fdf2006196b2af0bb7046f233db246e2..7af39663903d2da845740b0073b6508f19ca6236 100644 GIT binary patch delta 40 rcmX@da*k!fBtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@b}|A0\n" "Language-Team: Ukrainian (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/uk/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/vi/LC_MESSAGES/django.mo b/rest_framework/locale/vi/LC_MESSAGES/django.mo index 10a4c9b6c067bf89e20214259394c1408e1eb85a..0be6ed259ca6319ac2213a93cc2cff7c1d55bcb0 100644 GIT binary patch delta 40 rcmeyz{EvCUBtAnUT?2CkLklZYV{HS&i3_B-p(5s1rluQ@S~3Cv@@oqU delta 40 scmeyz{EvCUBt8R6T_ZyULjx;QQ*8sIi3_B-AtDAAR;Fefk6JPU0P\n" "Language-Team: Vietnamese (http://www.transifex.com/django-rest-framework-1/django-rest-framework/language/vi/)\n" "MIME-Version: 1.0\n" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/zh-Hans/LC_MESSAGES/django.mo b/rest_framework/locale/zh-Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..892ed14940ab9937a1ee281502a20c3cdc19317d GIT binary patch literal 9894 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 literal 0 HcmV?d00001 diff --git a/rest_framework/locale/zh-Hans/LC_MESSAGES/django.po b/rest_framework/locale/zh-Hans/LC_MESSAGES/django.po new file mode 100644 index 000000000..983ff1ba0 --- /dev/null +++ b/rest_framework/locale/zh-Hans/LC_MESSAGES/django.po @@ -0,0 +1,429 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Ping , 2015 +# hunter007 , 2015 +# nypisces , 2015 +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-11 03:03+0000\n" +"Last-Translator: hunter007 \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh-Hans\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "无效的Basic认证头,没有提供认证信息。" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "认证字符串不应该包含空格(基本认证HTTP头无效)。" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "用户名或者密码错误。" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "用户未激活或者已删除。" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "没有提供认证信息(认证令牌HTTP头无效)。" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "无效的Token。Token字符串不能包含非法的字符。" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "认证令牌无效。" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "用户账户已禁用。" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "无法使用提供的认证信息登录。" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "必须包含 “用户名” 和 “密码”。" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "服务器出现了错误。" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "错误的请求。" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "不正确的身份认证信息。" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "身份认证信息未提供。" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "您没有执行该操作的权限。" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "未找到。" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "方法 “{method}” 不被允许。" + +#: exceptions.py:120 +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}”。" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "请求超过了限速。" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "该字段是必填项。" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "该字段不能为 null。" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "“{input}” 不是合法的布尔值。" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "该字段不能为空。" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "请确保这个字段不能超过 {max_length} 个字符。" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "请确保这个字段至少包含 {min_length} 个字符。" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "请输入合法的邮件地址。" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "输入值不匹配要求的模式。" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "请输入合法的URL。" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "“{value}”不是合法的UUID。" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "请输入一个有效的IPv4或IPv6地址。" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "请填写合法的整数值。" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "请确保该值大于或者等于 {min_value}。" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "字符串值太长。" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "请填写合法的数字。" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "请确保总计不超过 {max_digits} 个数字。" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "请确保总计不超过 {max_decimal_places} 个小数位。" + +#: fields.py:889 +#, python-brace-format +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 +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "日期时间格式错误。请从这些格式中选择:{format}。" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "期望为日期时间,获得的是日期。" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "日期格式错误。请从这些格式中选择:{format}。" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "期望为日期,获得的是日期时间。" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "时间格式错误。请从这些格式中选择:{format}。" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "“{input}” 不是合法选项。" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "多于{count}条记录。" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "这项选择不能为空。" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "\"{input}\"不是一个有效路径选项。" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "没有提交任何文件。" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "提交的数据不是一个文件。请检查表单的编码类型。" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "无法检测到文件名。" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "提交的是空文件。" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "列表不能为空。" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "值必须是有效的 JSON 数据。" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "提交" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "无效页面 “{page_number}”:{message}。" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "无效游标" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "无效主键 “{pk_value}” - 对象不存在。" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "类型错误。期望为主键,获得的类型为 {data_type}。" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "无效超链接 -没有匹配的URL。" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "无效超链接 -错误的URL匹配。" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "无效超链接 -对象不存在。" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "属性 {slug_name} 为 {value} 的对象不存在。" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "过滤器" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "过滤器字段" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "排序" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "无" + +#: 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 "没有可选项。" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "该字段必须唯一。" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "字段 {field_names} 必须能构成唯一集合。" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "该字段必须在日期 “{date_field}” 唯一。" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "该字段必须在月份 “{date_field}” 唯一。" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "该字段必须在年 “{date_field}” 唯一。" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "“Accept” HTTP头包含无效版本。" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "URL路径包含无效版本。" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "主机名包含无效版本。" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "请求参数里包含无效版本。" + +#: views.py:88 +msgid "Permission denied." +msgstr "没有权限。" diff --git a/rest_framework/locale/zh-Hant/LC_MESSAGES/django.mo b/rest_framework/locale/zh-Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0e9d3a3370df531ef82d539da31f1d2f99af8d03 GIT binary patch literal 529 zcmZutO-}+b5Y^~ukDfiu!Gi{e-Ng{Gh%q8Y6A1)YX941CU(C;PKwj@2b;d;IsxJ_qMnGq%=Cj#1IrO6TSL#ZlflQ|rYy)Q%<&gb*0FAda)7G-ysE)%0Aw%#Ph z`2X`TUt5KrW4x8xhetv8uG{(hz_=O(ZKFMDPV!Okmv~zEu*jv-O&E@)b>v%*$qhFC wbmc%Jve?l>lPaAFXuK%D$t7Uz7WDI}l{wxRJ8=SZvD~^=+=NxxikiXJFSA&pApigX literal 0 HcmV?d00001 diff --git a/rest_framework/locale/zh-Hant/LC_MESSAGES/django.po b/rest_framework/locale/zh-Hant/LC_MESSAGES/django.po new file mode 100644 index 000000000..a04ed527a --- /dev/null +++ b/rest_framework/locale/zh-Hant/LC_MESSAGES/django.po @@ -0,0 +1,426 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Django REST framework\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" +"Last-Translator: Xavier Ordoquy \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh-Hant\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: authentication.py:72 +msgid "Invalid basic header. No credentials provided." +msgstr "" + +#: authentication.py:75 +msgid "Invalid basic header. Credentials string should not contain spaces." +msgstr "" + +#: authentication.py:81 +msgid "Invalid basic header. Credentials not correctly base64 encoded." +msgstr "" + +#: authentication.py:98 +msgid "Invalid username/password." +msgstr "" + +#: authentication.py:101 authentication.py:188 +msgid "User inactive or deleted." +msgstr "" + +#: authentication.py:167 +msgid "Invalid token header. No credentials provided." +msgstr "" + +#: authentication.py:170 +msgid "Invalid token header. Token string should not contain spaces." +msgstr "" + +#: authentication.py:176 +msgid "" +"Invalid token header. Token string should not contain invalid characters." +msgstr "" + +#: authentication.py:185 +msgid "Invalid token." +msgstr "" + +#: authtoken/serializers.py:20 +msgid "User account is disabled." +msgstr "" + +#: authtoken/serializers.py:23 +msgid "Unable to log in with provided credentials." +msgstr "" + +#: authtoken/serializers.py:26 +msgid "Must include \"username\" and \"password\"." +msgstr "" + +#: exceptions.py:49 +msgid "A server error occurred." +msgstr "" + +#: exceptions.py:84 +msgid "Malformed request." +msgstr "" + +#: exceptions.py:89 +msgid "Incorrect authentication credentials." +msgstr "" + +#: exceptions.py:94 +msgid "Authentication credentials were not provided." +msgstr "" + +#: exceptions.py:99 +msgid "You do not have permission to perform this action." +msgstr "" + +#: exceptions.py:104 views.py:81 +msgid "Not found." +msgstr "" + +#: exceptions.py:109 +#, python-brace-format +msgid "Method \"{method}\" not allowed." +msgstr "" + +#: exceptions.py:120 +msgid "Could not satisfy the request Accept header." +msgstr "" + +#: exceptions.py:132 +#, python-brace-format +msgid "Unsupported media type \"{media_type}\" in request." +msgstr "" + +#: exceptions.py:145 +msgid "Request was throttled." +msgstr "" + +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 +#: validators.py:162 +msgid "This field is required." +msgstr "" + +#: fields.py:267 +msgid "This field may not be null." +msgstr "" + +#: fields.py:603 fields.py:634 +#, python-brace-format +msgid "\"{input}\" is not a valid boolean." +msgstr "" + +#: fields.py:669 +msgid "This field may not be blank." +msgstr "" + +#: fields.py:670 fields.py:1656 +#, python-brace-format +msgid "Ensure this field has no more than {max_length} characters." +msgstr "" + +#: fields.py:671 +#, python-brace-format +msgid "Ensure this field has at least {min_length} characters." +msgstr "" + +#: fields.py:708 +msgid "Enter a valid email address." +msgstr "" + +#: fields.py:719 +msgid "This value does not match the required pattern." +msgstr "" + +#: fields.py:730 +msgid "" +"Enter a valid \"slug\" consisting of letters, numbers, underscores or " +"hyphens." +msgstr "" + +#: fields.py:742 +msgid "Enter a valid URL." +msgstr "" + +#: fields.py:755 +#, python-brace-format +msgid "\"{value}\" is not a valid UUID." +msgstr "" + +#: fields.py:791 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: fields.py:816 +msgid "A valid integer is required." +msgstr "" + +#: fields.py:817 fields.py:852 fields.py:885 +#, python-brace-format +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 +msgid "Ensure this value is greater than or equal to {min_value}." +msgstr "" + +#: fields.py:819 fields.py:854 fields.py:890 +msgid "String value too large." +msgstr "" + +#: fields.py:851 fields.py:884 +msgid "A valid number is required." +msgstr "" + +#: fields.py:887 +#, python-brace-format +msgid "Ensure that there are no more than {max_digits} digits in total." +msgstr "" + +#: fields.py:888 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_decimal_places} decimal places." +msgstr "" + +#: fields.py:889 +#, python-brace-format +msgid "" +"Ensure that there are no more than {max_whole_digits} digits before the " +"decimal point." +msgstr "" + +#: fields.py:1004 +#, python-brace-format +msgid "Datetime has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1005 +msgid "Expected a datetime but got a date." +msgstr "" + +#: fields.py:1079 +#, python-brace-format +msgid "Date has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1080 +msgid "Expected a date but got a datetime." +msgstr "" + +#: fields.py:1148 +#, python-brace-format +msgid "Time has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1207 +#, python-brace-format +msgid "Duration has wrong format. Use one of these formats instead: {format}." +msgstr "" + +#: fields.py:1232 fields.py:1281 +#, python-brace-format +msgid "\"{input}\" is not a valid choice." +msgstr "" + +#: fields.py:1235 relations.py:62 relations.py:431 +#, python-brace-format +msgid "More than {count} items..." +msgstr "" + +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 +#, python-brace-format +msgid "Expected a list of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1283 +msgid "This selection may not be empty." +msgstr "" + +#: fields.py:1320 +#, python-brace-format +msgid "\"{input}\" is not a valid path choice." +msgstr "" + +#: fields.py:1339 +msgid "No file was submitted." +msgstr "" + +#: fields.py:1340 +msgid "" +"The submitted data was not a file. Check the encoding type on the form." +msgstr "" + +#: fields.py:1341 +msgid "No filename could be determined." +msgstr "" + +#: fields.py:1342 +msgid "The submitted file is empty." +msgstr "" + +#: fields.py:1343 +#, python-brace-format +msgid "" +"Ensure this filename has at most {max_length} characters (it has {length})." +msgstr "" + +#: fields.py:1391 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: fields.py:1430 relations.py:428 serializers.py:521 +msgid "This list may not be empty." +msgstr "" + +#: fields.py:1483 +#, python-brace-format +msgid "Expected a dictionary of items but got type \"{input_type}\"." +msgstr "" + +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 +#, python-brace-format +msgid "Invalid page \"{page_number}\": {message}." +msgstr "" + +#: pagination.py:407 +msgid "Invalid cursor" +msgstr "" + +#: relations.py:196 +#, python-brace-format +msgid "Invalid pk \"{pk_value}\" - object does not exist." +msgstr "" + +#: relations.py:197 +#, python-brace-format +msgid "Incorrect type. Expected pk value, received {data_type}." +msgstr "" + +#: relations.py:229 +msgid "Invalid hyperlink - No URL match." +msgstr "" + +#: relations.py:230 +msgid "Invalid hyperlink - Incorrect URL match." +msgstr "" + +#: relations.py:231 +msgid "Invalid hyperlink - Object does not exist." +msgstr "" + +#: relations.py:232 +#, python-brace-format +msgid "Incorrect type. Expected URL string, received {data_type}." +msgstr "" + +#: relations.py:391 +#, python-brace-format +msgid "Object with {slug_name}={value} does not exist." +msgstr "" + +#: relations.py:392 +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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +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 "" + +#: 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 "" + +#: validators.py:24 +msgid "This field must be unique." +msgstr "" + +#: validators.py:78 +#, python-brace-format +msgid "The fields {field_names} must make a unique set." +msgstr "" + +#: validators.py:226 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" date." +msgstr "" + +#: validators.py:241 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" month." +msgstr "" + +#: validators.py:254 +#, python-brace-format +msgid "This field must be unique for the \"{date_field}\" year." +msgstr "" + +#: versioning.py:42 +msgid "Invalid version in \"Accept\" header." +msgstr "" + +#: versioning.py:73 versioning.py:115 +msgid "Invalid version in URL path." +msgstr "" + +#: versioning.py:144 +msgid "Invalid version in hostname." +msgstr "" + +#: versioning.py:166 +msgid "Invalid version in query parameter." +msgstr "" + +#: views.py:88 +msgid "Permission denied." +msgstr "" diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo b/rest_framework/locale/zh_CN/LC_MESSAGES/django.mo index 39e31b65508d43fd949ee7d87ec274fd6fa7c909..c1552b71f9b251bbe8dc876caf4308d059b54060 100644 GIT binary patch delta 2539 zcmZY9d2AF_9Ki9n&`ZwVEg(1)P@&yr+X96`xrB1J!E%aX78u&a?Jn+4C4^&--L_t9*)BC z1C&a|3X}zHL>b>>c?RWvH*lhCHF2O){8R}CHm4S$?63l5qOCX?KfxLJD?W$zK}tFB zRph7M;~?j?;x`fw=yomRgAWhZA* zc6QUU#~M#aiS2wG%A+Ykx&B3b2De})oBf zYJ7{!85qoL5<=bb2);o78s=dR@nbGkj*?teXva4!+fZJwD3+mpIQPWu$P1?4Lb>h; z&c|RI4GE=2h^wmS;)c`*Ae=(?}kvuTUoZ8HuXun-h!Ja3n~o%yJXT z`TMaiHlWON0%d_sm>}=}T^bUiC`xGmH2+|X1dx?xqGWp>7GfdJ#Y&X(n=QYvyo)?d z^%qJ6(^$Q@03`>4DA!%U5zMb{(2$kiM}8`S?M=sAlw{n5@^;kWGQ5RygB&uCAgHM* z*S%!98*TJ^i|kg4Y*IEfg<48ApFj69cLinw@+~nZmAbx3{dKF`K%Gnr96z zL3zkh_|BW}>|}IEN=r#Jk4jC$mDCEVAFsOsXV+eEL+*Hn(?kjjz)nTMz_b% z{Q*@PGwc}9KQ7zn*EOTc<<+*W_tkif9h%$Fs{;;4Xj1Z}q;mfT-S75Rh8`s6jn-ZM z^;N3EkOA#Am#2mceLl_O@>l8(RZ+99+HHjGDJ`~19(Tads$E+(ug}od>6%`>+1Tn( z%c|S~Euee!^@iK${oe`U?^0d1>=ovXt82IeS2B%zgSN1uyew3het1xRf!$f8~!WjDg73^0)~B=-{lQ>T!znItW~is-S6bWXR4y{VJl?O6OG+1=Ob6@Lh0JI_`~l++TRZSpp6?9J$X8M@T%elT_1ng z*>)ka>+{H|rk=WvUv}+QogF74%}2x8BO7c*k=pw1Mr)$ZwnN=}u5`Awcb#kJ0y(w2 zqoJqqvz}cCqi>%3_ut{>oHe$Qa@UT1J&l*6M_Xgt=sLF744D?KJ0CsN5{er=_8;M@ BnB)Ke delta 1954 zcmYk+TTEO<9LMolF3VD+w7@Qx+IoOOt1Qbxfo|89VkuGz*r2Vp*rcwysThPvx=0Oi zD>n5(A50Ed8ug(`6;r86-4`zytu0NAX^e?!qA^vmNHm%lA53`C@9&)R;3RWCGjncp z{_{UG*MDhW`c`qyjG+ur@1$PHGUgc!=W?L@hJwJl>1nVJ`;P7!$_?>inD7hu>li zRuvdij9sV+9Y&3(JkOz?_bImGD%SFT(|Cvb;6oVW#A~=4zr;?=FEl2C{kRq{zz9xb4_?JxSXjjKc)#hTQHg^Zz!Ylcr%_+>uIHjRzJ&Tx z|2lUmDsT(^7>4jMwD37B!CB0~c_dioGB)A@ruCpdXz0d&u?$1&-I+&_H8RIg6PZJu zzvlISK&|;IwqcNmX=(aU{nMxq`vmpEo2XpyGpl;+DIxw%G*S#4!8xozU#aT`Y^L9e zU;B)C3h$;LW44OW}@QZK}vszR)iL(Qi4Qu%A0H3jE4-if4-lenygv(8}d z(}ALdSHuITLYo@agGBVwP?y16|&b^eWhNQ zx`*0GwF?53_EKIr(-O$f%{)}NCdZywpRrqt>q95ThDMHCrL!yZ@7(_I ggXL2T%NH*GHuKppr=~K^HRpU8f9)ead#bMXKYfSSDgXcg diff --git a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po index 920d70ad5..a5e6cde2f 100644 --- a/rest_framework/locale/zh_CN/LC_MESSAGES/django.po +++ b/rest_framework/locale/zh_CN/LC_MESSAGES/django.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# hunter007 , 2015 # Lele Long , 2015 # Ming Chen , 2015 msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" -"Last-Translator: Xavier Ordoquy \n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-11 03:00+0000\n" +"Last-Translator: hunter007 \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" @@ -35,24 +36,24 @@ msgstr "认证字符串base64编码错误(基本认证HTTP头无效)。" msgid "Invalid username/password." msgstr "用户名或者密码错误。" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "用户未激活或者已删除。" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "没有提供认证信息(认证令牌HTTP头无效)。" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "认证令牌字符串不应该包含空格(无效的认证令牌HTTP头)。" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "无效的Token。Token字符串不能包含非法的字符。" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "认证令牌无效。" @@ -110,241 +111,267 @@ msgstr "不支持请求中的媒体类型 “{media_type}”。" msgid "Request was throttled." msgstr "请求超过了限速。" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "该字段是必填项。" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "该字段不能为 null。" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "“{input}” 不是合法的布尔值。" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "该字段不能为空。" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "请确保这个字段不能超过 {max_length} 个字符。" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "请确保这个字段至少包含 {min_length} 个字符。" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "请输入合法的邮件地址。" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "输入值不匹配要求的模式。" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "请输入合法的“短语“,只能包含字母,数字,下划线或者中划线。" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "请输入合法的URL。" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "“{value}”不是合法的UUID。" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "请输入一个有效的IPv4或IPv6地址。" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "请填写合法的整数值。" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "请确保该值小于或者等于 {max_value}。" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "请确保该值大于或者等于 {min_value}。" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "字符串值太长。" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "请填写合法的数字。" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "请确保总计不超过 {max_digits} 个数字。" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "请确保总计不超过 {max_decimal_places} 个小数位。" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "请确保小数点前不超过 {max_whole_digits} 个数字。" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "日期时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "期望为日期时间,得到的是日期。" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "日期格式错误。请从这些格式中选择:{format}。" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "期望为日期,得到的是日期时间。" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "时间格式错误。请从这些格式中选择:{format}。" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "持续时间的格式错误。使用这些格式中的一个:{format}。" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "“{input}” 不是合法选项。" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." -msgstr "" +msgstr "多于{count}条记录。" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "期望为一个包含物件的列表,得到的类型是“{input_type}”。" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." -msgstr "" +msgstr "这项选择不能为空。" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." -msgstr "" +msgstr "“{input}” 不是有效路径选项。" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "没有提交任何文件。" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "提交的数据不是一个文件。请检查表单的编码类型。" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "无法检测到文件名。" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "提交的是空文件。" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "确保该文件名最多包含 {max_length} 个字符 ( 当前长度为{length} ) 。" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "请上传有效图片。您上传的该文件不是图片或者图片已经损坏。" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." -msgstr "" +msgstr "列表字段不能为空值。" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "期望是包含类目的字典,得到类型为 “{input_type}”。" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "值必须是有效的 JSON 数据。" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "保存" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "无效页面 “{page_number}”:{message}。" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "无效游标" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "无效主键 “{pk_value}” - 对象不存在。" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "类型错误。期望为主键,得到的类型为 {data_type}。" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "无效超链接 -没有匹配的URL。" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "无效超链接 -错误的URL匹配。" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "无效超链接 -对象不存在。" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "类型错误。期望为URL字符串,实际的类型是 {data_type}。" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "属性 {slug_name} 为 {value} 的对象不存在。" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "无效值。" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "过滤器" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "过滤器字段" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "排序" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "查找" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 diff --git a/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo b/rest_framework/locale/zh_TW/LC_MESSAGES/django.mo index b82d4c1c668d8d0f909d6cdf82a77d680bc60d80..e202136e7681b20ca558f9b9d0109c9d62dcf020 100644 GIT binary patch delta 40 qcmeBT>0+5MiO0+5MiO;}N*T_)8(7?*nRNKI4;sPmdh=_rOm8sdrqppkq&tnQO diff --git a/rest_framework/locale/zh_TW/LC_MESSAGES/django.po b/rest_framework/locale/zh_TW/LC_MESSAGES/django.po index a2bfc894c..5ca07eeaa 100644 --- a/rest_framework/locale/zh_TW/LC_MESSAGES/django.po +++ b/rest_framework/locale/zh_TW/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Django REST framework\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-21 10:55+0200\n" -"PO-Revision-Date: 2015-09-21 08:56+0000\n" +"POT-Creation-Date: 2015-12-07 18:53+0100\n" +"PO-Revision-Date: 2015-12-07 17:55+0000\n" "Last-Translator: Xavier Ordoquy \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" @@ -33,24 +33,24 @@ msgstr "" msgid "Invalid username/password." msgstr "" -#: authentication.py:101 authentication.py:189 +#: authentication.py:101 authentication.py:188 msgid "User inactive or deleted." msgstr "" -#: authentication.py:168 +#: authentication.py:167 msgid "Invalid token header. No credentials provided." msgstr "" -#: authentication.py:171 +#: authentication.py:170 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: authentication.py:177 +#: authentication.py:176 msgid "" "Invalid token header. Token string should not contain invalid characters." msgstr "" -#: authentication.py:186 +#: authentication.py:185 msgid "Invalid token." msgstr "" @@ -108,241 +108,267 @@ msgstr "" msgid "Request was throttled." msgstr "" -#: fields.py:262 relations.py:191 relations.py:224 validators.py:79 +#: fields.py:266 relations.py:195 relations.py:228 validators.py:79 #: validators.py:162 msgid "This field is required." msgstr "" -#: fields.py:263 +#: fields.py:267 msgid "This field may not be null." msgstr "" -#: fields.py:599 fields.py:627 +#: fields.py:603 fields.py:634 #, python-brace-format msgid "\"{input}\" is not a valid boolean." msgstr "" -#: fields.py:662 +#: fields.py:669 msgid "This field may not be blank." msgstr "" -#: fields.py:663 fields.py:1594 +#: fields.py:670 fields.py:1656 #, python-brace-format msgid "Ensure this field has no more than {max_length} characters." msgstr "" -#: fields.py:664 +#: fields.py:671 #, python-brace-format msgid "Ensure this field has at least {min_length} characters." msgstr "" -#: fields.py:701 +#: fields.py:708 msgid "Enter a valid email address." msgstr "" -#: fields.py:712 +#: fields.py:719 msgid "This value does not match the required pattern." msgstr "" -#: fields.py:723 +#: fields.py:730 msgid "" "Enter a valid \"slug\" consisting of letters, numbers, underscores or " "hyphens." msgstr "" -#: fields.py:735 +#: fields.py:742 msgid "Enter a valid URL." msgstr "" -#: fields.py:748 +#: fields.py:755 #, python-brace-format msgid "\"{value}\" is not a valid UUID." msgstr "" -#: fields.py:782 +#: fields.py:791 msgid "Enter a valid IPv4 or IPv6 address." msgstr "" -#: fields.py:807 +#: fields.py:816 msgid "A valid integer is required." msgstr "" -#: fields.py:808 fields.py:843 fields.py:876 +#: fields.py:817 fields.py:852 fields.py:885 #, python-brace-format msgid "Ensure this value is less than or equal to {max_value}." msgstr "" -#: fields.py:809 fields.py:844 fields.py:877 +#: fields.py:818 fields.py:853 fields.py:886 #, python-brace-format msgid "Ensure this value is greater than or equal to {min_value}." msgstr "" -#: fields.py:810 fields.py:845 fields.py:881 +#: fields.py:819 fields.py:854 fields.py:890 msgid "String value too large." msgstr "" -#: fields.py:842 fields.py:875 +#: fields.py:851 fields.py:884 msgid "A valid number is required." msgstr "" -#: fields.py:878 +#: fields.py:887 #, python-brace-format msgid "Ensure that there are no more than {max_digits} digits in total." msgstr "" -#: fields.py:879 +#: fields.py:888 #, python-brace-format msgid "" "Ensure that there are no more than {max_decimal_places} decimal places." msgstr "" -#: fields.py:880 +#: fields.py:889 #, python-brace-format msgid "" "Ensure that there are no more than {max_whole_digits} digits before the " "decimal point." msgstr "" -#: fields.py:994 +#: fields.py:1004 #, python-brace-format msgid "Datetime has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:995 +#: fields.py:1005 msgid "Expected a datetime but got a date." msgstr "" -#: fields.py:1060 +#: fields.py:1079 #, python-brace-format msgid "Date has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1061 +#: fields.py:1080 msgid "Expected a date but got a datetime." msgstr "" -#: fields.py:1125 +#: fields.py:1148 #, python-brace-format msgid "Time has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1180 +#: fields.py:1207 #, python-brace-format msgid "Duration has wrong format. Use one of these formats instead: {format}." msgstr "" -#: fields.py:1205 fields.py:1254 +#: fields.py:1232 fields.py:1281 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: fields.py:1208 relations.py:58 relations.py:427 +#: fields.py:1235 relations.py:62 relations.py:431 #, python-brace-format msgid "More than {count} items..." msgstr "" -#: fields.py:1255 fields.py:1401 relations.py:423 serializers.py:504 +#: fields.py:1282 fields.py:1429 relations.py:427 serializers.py:520 #, python-brace-format msgid "Expected a list of items but got type \"{input_type}\"." msgstr "" -#: fields.py:1256 +#: fields.py:1283 msgid "This selection may not be empty." msgstr "" -#: fields.py:1294 +#: fields.py:1320 #, python-brace-format msgid "\"{input}\" is not a valid path choice." msgstr "" -#: fields.py:1313 +#: fields.py:1339 msgid "No file was submitted." msgstr "" -#: fields.py:1314 +#: fields.py:1340 msgid "" "The submitted data was not a file. Check the encoding type on the form." msgstr "" -#: fields.py:1315 +#: fields.py:1341 msgid "No filename could be determined." msgstr "" -#: fields.py:1316 +#: fields.py:1342 msgid "The submitted file is empty." msgstr "" -#: fields.py:1317 +#: fields.py:1343 #, python-brace-format msgid "" "Ensure this filename has at most {max_length} characters (it has {length})." msgstr "" -#: fields.py:1363 +#: fields.py:1391 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: fields.py:1402 relations.py:424 serializers.py:505 +#: fields.py:1430 relations.py:428 serializers.py:521 msgid "This list may not be empty." msgstr "" -#: fields.py:1452 +#: fields.py:1483 #, python-brace-format msgid "Expected a dictionary of items but got type \"{input_type}\"." msgstr "" -#: pagination.py:192 +#: fields.py:1530 +msgid "Value must be valid JSON." +msgstr "" + +#: filters.py:35 templates/rest_framework/filters/django_filter.html:5 +msgid "Submit" +msgstr "" + +#: pagination.py:189 #, python-brace-format msgid "Invalid page \"{page_number}\": {message}." msgstr "" -#: pagination.py:462 +#: pagination.py:407 msgid "Invalid cursor" msgstr "" -#: relations.py:192 +#: relations.py:196 #, python-brace-format msgid "Invalid pk \"{pk_value}\" - object does not exist." msgstr "" -#: relations.py:193 +#: relations.py:197 #, python-brace-format msgid "Incorrect type. Expected pk value, received {data_type}." msgstr "" -#: relations.py:225 +#: relations.py:229 msgid "Invalid hyperlink - No URL match." msgstr "" -#: relations.py:226 +#: relations.py:230 msgid "Invalid hyperlink - Incorrect URL match." msgstr "" -#: relations.py:227 +#: relations.py:231 msgid "Invalid hyperlink - Object does not exist." msgstr "" -#: relations.py:228 +#: relations.py:232 #, python-brace-format msgid "Incorrect type. Expected URL string, received {data_type}." msgstr "" -#: relations.py:387 +#: relations.py:391 #, python-brace-format msgid "Object with {slug_name}={value} does not exist." msgstr "" -#: relations.py:388 +#: relations.py:392 msgid "Invalid value." msgstr "" -#: serializers.py:310 +#: 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/base.html:128 +msgid "Filters" +msgstr "" + +#: templates/rest_framework/filters/django_filter.html:2 +#: templates/rest_framework/filters/django_filter_crispyforms.html:4 +msgid "Field filters" +msgstr "" + +#: templates/rest_framework/filters/ordering.html:3 +msgid "Ordering" +msgstr "" + +#: templates/rest_framework/filters/search.html:2 +msgid "Search" +msgstr "" + #: templates/rest_framework/horizontal/radio.html:2 #: templates/rest_framework/inline/radio.html:2 #: templates/rest_framework/vertical/radio.html:2 From 5224feded47c5f85514ac89c79e3de49060b0d99 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 14 Dec 2015 07:32:50 +0100 Subject: [PATCH 074/126] Update the release date. --- docs/topics/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index 767f26c6c..d21f8e51b 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -42,7 +42,7 @@ You can determine your currently installed version using `pip freeze`: ### 3.3.2 -**Date**: [16th December 2015][3.3.2-milestone]. +**Date**: [14th December 2015][3.3.2-milestone]. * `ListField` enforces input is a list. ([#3513][gh3513]) * Fix regression hiding raw data form. ([#3600][gh3600], [#3578][gh3578]) From ef8bde2d427c4dd39ac58a1649f47938f783be2d Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 14 Dec 2015 07:33:17 +0100 Subject: [PATCH 075/126] Bump version to 3.3.2 --- rest_framework/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/__init__.py b/rest_framework/__init__.py index d18b6d55f..0e5199996 100644 --- a/rest_framework/__init__.py +++ b/rest_framework/__init__.py @@ -8,7 +8,7 @@ ______ _____ _____ _____ __ """ __title__ = 'Django REST framework' -__version__ = '3.3.1' +__version__ = '3.3.2' __author__ = 'Tom Christie' __license__ = 'BSD 2-Clause' __copyright__ = 'Copyright 2011-2015 Tom Christie' From c45fdee2ab7afe33c40bcf4a6239e4f5a90b026c Mon Sep 17 00:00:00 2001 From: NY Date: Tue, 15 Dec 2015 15:22:03 +0800 Subject: [PATCH 076/126] Fix transfix config for Django --- .tx/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tx/config b/.tx/config index 271fa1e35..e151a7e6f 100644 --- a/.tx/config +++ b/.tx/config @@ -1,9 +1,9 @@ [main] host = https://www.transifex.com +lang_map = sr@latin:sr_Latn, zh-Hans:zh_Hans, zh-Hant:zh_Hant [django-rest-framework.djangopo] file_filter = rest_framework/locale//LC_MESSAGES/django.po source_file = rest_framework/locale/en_US/LC_MESSAGES/django.po source_lang = en_US type = PO - From 613e0d41ac32e0f4253a84a5ebb87d443c9aaf67 Mon Sep 17 00:00:00 2001 From: NY Date: Tue, 15 Dec 2015 15:22:19 +0800 Subject: [PATCH 077/126] Update config --- .tx/config | 1 + 1 file changed, 1 insertion(+) diff --git a/.tx/config b/.tx/config index e151a7e6f..dea9db7c9 100644 --- a/.tx/config +++ b/.tx/config @@ -7,3 +7,4 @@ file_filter = rest_framework/locale//LC_MESSAGES/django.po source_file = rest_framework/locale/en_US/LC_MESSAGES/django.po source_lang = en_US type = PO + From ffc10edd7e79ce7aa77defd642c03974580feeb5 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Tue, 15 Dec 2015 10:24:49 -0500 Subject: [PATCH 078/126] Fix minor typo on Pagination documentation --- docs/api-guide/pagination.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index da096bde7..4bc85d698 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -178,7 +178,7 @@ Proper usage of cursor pagination should have an ordering field that satisfies t * Should be a non-nullable value that can be coerced to a string. * The field should have a database index. -Using an ordering field that does not satisfy these constraints will generally still work, but you'll be loosing some of the benefits of cursor pagination. +Using an ordering field that does not satisfy these constraints will generally still work, but you'll be losing some of the benefits of cursor pagination. For more technical details on the implementation we use for cursor pagination, the ["Building cursors for the Disqus API"][disqus-cursor-api] blog post gives a good overview of the basic approach. From 8c0d736f234b4c82dbd662e1a7998d71f0ff4614 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Tue, 15 Dec 2015 10:28:23 -0500 Subject: [PATCH 079/126] Also fix usecases to use cases --- docs/api-guide/pagination.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/pagination.md b/docs/api-guide/pagination.md index 4bc85d698..d6c80d93a 100644 --- a/docs/api-guide/pagination.md +++ b/docs/api-guide/pagination.md @@ -97,7 +97,7 @@ The `PageNumberPagination` class includes a number of attributes that may be ove To set these attributes you should override the `PageNumberPagination` class, and then enable your custom pagination class as above. -* `django_paginator_class` - The Django Paginator class to use. Default is `django.core.paginator.Paginator`, which should be fine for most usecases. +* `django_paginator_class` - The Django Paginator class to use. Default is `django.core.paginator.Paginator`, which should be fine for most use cases. * `page_size` - A numeric value indicating the page size. If set, this overrides the `PAGE_SIZE` setting. Defaults to the same value as the `PAGE_SIZE` settings key. * `page_query_param` - A string value indicating the name of the query parameter to use for the pagination control. * `page_size_query_param` - If set, this is a string value indicating the name of a query parameter that allows the client to set the page size on a per-request basis. Defaults to `None`, indicating that the client may not control the requested page size. From 44ae037e81d0ca24e28a3506564a92e1ac247eb1 Mon Sep 17 00:00:00 2001 From: Peter Baehr Date: Tue, 15 Dec 2015 21:17:52 -0500 Subject: [PATCH 080/126] Move urls.py changes down and add necessary import The previous location of editting urls.py did not allow migrations to be created and the default import needs to be modified --- docs/tutorial/1-serialization.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/tutorial/1-serialization.md b/docs/tutorial/1-serialization.md index 890f8d561..bd3fce33d 100644 --- a/docs/tutorial/1-serialization.md +++ b/docs/tutorial/1-serialization.md @@ -48,12 +48,6 @@ We'll need to add our new `snippets` app and the `rest_framework` app to `INSTAL 'snippets', ) -We also need to wire up the root urlconf, in the `tutorial/urls.py` file, to include our snippet app's URLs. - - urlpatterns = [ - url(r'^', include('snippets.urls')), - ] - Okay, we're ready to roll. ## Creating a model to work with @@ -299,6 +293,14 @@ Finally we need to wire these views up. Create the `snippets/urls.py` file: url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P[0-9]+)/$', views.snippet_detail), ] + +We also need to wire up the root urlconf, in the `tutorial/urls.py` file, to include our snippet app's URLs. + + from django.conf.urls import url, include + + urlpatterns = [ + url(r'^', include('snippets.urls')), + ] It's worth noting that there are a couple of edge cases we're not dealing with properly at the moment. If we send malformed `json`, or if a request is made with a method that the view doesn't handle, then we'll end up with a 500 "server error" response. Still, this'll do for now. From aab7da48910babe2f72347685c449a1e72006a5e Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 16 Dec 2015 13:08:37 +0100 Subject: [PATCH 081/126] Updated py.test and pytest-django to test against python 3.5. --- requirements/requirements-testing.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/requirements-testing.txt b/requirements/requirements-testing.txt index 6900028d3..caa58765a 100644 --- a/requirements/requirements-testing.txt +++ b/requirements/requirements-testing.txt @@ -1,4 +1,4 @@ # PyTest for running the tests. -pytest==2.6.4 -pytest-django==2.8.0 +pytest==2.8.5 +pytest-django==2.9.1 pytest-cov==1.8.1 From a4ce897d28604b52a3babf0bb49c61e074acbed2 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 16 Dec 2015 13:27:40 +0100 Subject: [PATCH 082/126] Display py.test internal warnings --- runtests.py | 4 ++-- tox.ini | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtests.py b/runtests.py index 504cd1d37..a7e8b45a9 100755 --- a/runtests.py +++ b/runtests.py @@ -8,8 +8,8 @@ import sys import pytest PYTEST_ARGS = { - 'default': ['tests', '--tb=short', '-s'], - 'fast': ['tests', '--tb=short', '-q', '-s'], + 'default': ['tests', '--tb=short', '-s', '-rw'], + 'fast': ['tests', '--tb=short', '-q', '-s', '-rw'], } FLAKE8_ARGS = ['rest_framework', 'tests', '--ignore=E501'] diff --git a/tox.ini b/tox.ini index a027fa0de..93e642f37 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,7 @@ envlist = {py27,py34,py35}-django{19} [testenv] -commands = ./runtests.py --fast {posargs} --coverage +commands = ./runtests.py --fast {posargs} --coverage -rw setenv = PYTHONDONTWRITEBYTECODE=1 deps = From fb94be18be9fb7fe241037db6d49d6a3669d4455 Mon Sep 17 00:00:00 2001 From: Dan Lipsitt Date: Wed, 16 Dec 2015 10:42:10 -0800 Subject: [PATCH 083/126] docstring typo fix: DateAndFiles -> DataAndFiles --- rest_framework/parsers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py index 2dc808f1a..95de41c23 100644 --- a/rest_framework/parsers.py +++ b/rest_framework/parsers.py @@ -126,7 +126,7 @@ class FileUploadParser(BaseParser): def parse(self, stream, media_type=None, parser_context=None): """ Treats the incoming bytestream as a raw file upload and returns - a `DateAndFiles` object. + a `DataAndFiles` object. `.data` will be None (we expect request body to be a file content). `.files` will be a `QueryDict` containing one 'file' element. From c78980771d75e774cec94772902dc13e1027b3a7 Mon Sep 17 00:00:00 2001 From: Tom Linford Date: Wed, 16 Dec 2015 15:36:07 -0800 Subject: [PATCH 084/126] AutoFilterSet should subclass from self.default_filter_set --- rest_framework/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index ff541ba1e..42e77d910 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -99,7 +99,7 @@ class DjangoFilterBackend(BaseFilterBackend): return filter_class if filter_fields: - class AutoFilterSet(FilterSet): + class AutoFilterSet(self.default_filter_set): class Meta: model = queryset.model fields = filter_fields From dab6bf4b1a40b74abcf88099dfecbc419fbde391 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Wed, 16 Dec 2015 18:32:32 -0600 Subject: [PATCH 085/126] Changed error to warning message --- rest_framework/settings.py | 3 ++- tests/test_settings.py | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index c7b5de9f0..08a776cf4 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -17,6 +17,7 @@ This module provides the `api_setting` object, that is used to access REST framework settings, checking for user settings first, then falling back to the defaults. """ +import warnings from __future__ import unicode_literals from django.conf import settings @@ -216,7 +217,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: - raise AttributeError("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC)) + warnings.warn("The '%s' setting has been removed. Please refer to '%s' for available settings." % (setting, SETTINGS_DOC), DeprecationWarning) return user_settings diff --git a/tests/test_settings.py b/tests/test_settings.py index 977780164..007586ff2 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -18,15 +18,18 @@ class TestSettings(TestCase): with self.assertRaises(ImportError): settings.DEFAULT_RENDERER_CLASSES - def test_loud_error_raised_on_removed_setting(self): + def test_warning_raised_on_removed_setting(self): """ Make sure user is alerted with an error when a removed setting is set. """ - with self.assertRaises(AttributeError): + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") APISettings({ 'MAX_PAGINATE_BY': 100 }) + self.assertEqual(len(w), 1) + self.assertTrue(issubclass(w[-1].category, DeprecationWarning)) class TestSettingTypes(TestCase): From 62e2a9706f1848603bb67bba8ed1c8886fe51585 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Wed, 16 Dec 2015 18:37:50 -0600 Subject: [PATCH 086/126] Fixed import order settings --- rest_framework/settings.py | 2 +- tests/test_settings.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 08a776cf4..af4aaa73c 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -17,8 +17,8 @@ This module provides the `api_setting` object, that is used to access REST framework settings, checking for user settings first, then falling back to the defaults. """ -import warnings from __future__ import unicode_literals +import warnings from django.conf import settings from django.test.signals import setting_changed diff --git a/tests/test_settings.py b/tests/test_settings.py index 007586ff2..b9953c8e2 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +import warnings from django.test import TestCase From c389aeb051a5b2b75160480ae09aec99385b531f Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Wed, 16 Dec 2015 18:46:23 -0600 Subject: [PATCH 087/126] Lint import ordring --- rest_framework/settings.py | 1 + tests/test_settings.py | 1 + 2 files changed, 2 insertions(+) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index af4aaa73c..9679cad59 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -18,6 +18,7 @@ REST framework settings, checking for user settings first, then falling back to the defaults. """ from __future__ import unicode_literals + import warnings from django.conf import settings diff --git a/tests/test_settings.py b/tests/test_settings.py index b9953c8e2..658c61997 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals + import warnings from django.test import TestCase From d9c360845d79e4df4be96264c325b2bab5a036db Mon Sep 17 00:00:00 2001 From: mjparker777 Date: Thu, 17 Dec 2015 12:21:44 -0700 Subject: [PATCH 088/126] changed datefield to match code layout of datetime and time changes --- rest_framework/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 53a948c06..7bac2a21f 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1121,11 +1121,11 @@ class DateField(Field): self.fail('invalid', format=humanized_format) def to_representation(self, value): - output_format = getattr(self, 'format', api_settings.DATE_FORMAT) - if not value: return None + output_format = getattr(self, 'format', api_settings.DATE_FORMAT) + if output_format is None: return value From 66de876dee32f3e99a1c75bef8f544045960a9b3 Mon Sep 17 00:00:00 2001 From: Atul Varma Date: Sat, 19 Dec 2015 10:34:39 -0500 Subject: [PATCH 089/126] Update bootstrap version in browsable-api.md --- docs/topics/browsable-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/browsable-api.md b/docs/topics/browsable-api.md index 0e12f9254..3df95f0b2 100644 --- a/docs/topics/browsable-api.md +++ b/docs/topics/browsable-api.md @@ -17,7 +17,7 @@ By default, the API will return the format specified by the headers, which in th ## Customizing -The browsable API is built with [Twitter's Bootstrap][bootstrap] (v 2.1.1), making it easy to customize the look-and-feel. +The browsable API is built with [Twitter's Bootstrap][bootstrap] (v 3.3.5), making it easy to customize the look-and-feel. To customize the default style, create a template called `rest_framework/api.html` that extends from `rest_framework/base.html`. For example: From 1aedaafba40bfd8b82b2354fe17a4662f57124d3 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 21 Dec 2015 13:40:23 +0000 Subject: [PATCH 090/126] Add DRF docs to the list --- docs/img/drfdocs.png | Bin 0 -> 305016 bytes docs/img/rest-framework-docs.png | Bin 76612 -> 0 bytes docs/topics/documenting-your-api.md | 23 +++++++++++++++++------ 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 docs/img/drfdocs.png delete mode 100644 docs/img/rest-framework-docs.png diff --git a/docs/img/drfdocs.png b/docs/img/drfdocs.png new file mode 100644 index 0000000000000000000000000000000000000000..8821c8f13f1b906c7b6d212c9b685538e99102d3 GIT binary patch literal 305016 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≺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%0DT};YQtZNohpd4Gh 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 literal 0 HcmV?d00001 diff --git a/docs/img/rest-framework-docs.png b/docs/img/rest-framework-docs.png deleted file mode 100644 index 736a0095500cce86611e6fa80ddabbdedb878f4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76612 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

yMZfoSE<{aD_|fOb~6MCO4H4^wZO- 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 Date: Mon, 21 Dec 2015 13:45:11 +0000 Subject: [PATCH 091/126] Minor changes --- docs/topics/documenting-your-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index 8511c8a32..cfb5560dc 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -14,9 +14,9 @@ The most common way to document Web APIs today is to produce documentation that #### DRF Docs -[DRF Docs][drfdocs-repo] allows you to Document Web APIs made with Django Rest Framework. It's made to work out of the box and its setup should not take more than a couple of minutes. Complete documentation can be found on the [website][drfdocs-website] while there is also an available [demo][drfdocs-demo] for people to see what it looks like. +[DRF Docs][drfdocs-repo] allows you to document Web APIs made with Django Rest Framework and it is authored by Emmanouil Konstantinidis. It's made to work out of the box and its setup should not take more than a couple of minutes. Complete documentation can be found on the [website][drfdocs-website] while there is also a [demo][drfdocs-demo] available for people to see what it looks like. -Features include customizing the template with your branding and settings for hiding the docs depending on the environment. +Features include customizing the template with your branding, settings for hiding the docs depending on the environment and more. ![Screenshot - DRF docs][image-drf-docs] @@ -28,7 +28,7 @@ Marc Gibbons' [Django REST Swagger][django-rest-swagger] integrates REST framewo Django REST Swagger supports REST framework versions 2.3 and above. -Mark is also the author of the [REST Framework Docs][rest-framework-docs] package is which offers clean, simple autogenerated documentation for your API but is depracated and has moved to Django REST Swagger. +Mark is also the author of the [REST Framework Docs][rest-framework-docs] package which offers clean, simple autogenerated documentation for your API but is deprecated and has moved to Django REST Swagger. ![Screenshot - Django REST Swagger][image-django-rest-swagger] From 958290724ca1bc83cd1b2c814e9b0d3832a9c73d Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 21 Dec 2015 13:47:04 +0000 Subject: [PATCH 092/126] Rest is "REST" --- docs/topics/documenting-your-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index cfb5560dc..6f0125e70 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -14,7 +14,7 @@ The most common way to document Web APIs today is to produce documentation that #### DRF Docs -[DRF Docs][drfdocs-repo] allows you to document Web APIs made with Django Rest Framework and it is authored by Emmanouil Konstantinidis. It's made to work out of the box and its setup should not take more than a couple of minutes. Complete documentation can be found on the [website][drfdocs-website] while there is also a [demo][drfdocs-demo] available for people to see what it looks like. +[DRF Docs][drfdocs-repo] allows you to document Web APIs made with Django REST Framework and it is authored by Emmanouil Konstantinidis. It's made to work out of the box and its setup should not take more than a couple of minutes. Complete documentation can be found on the [website][drfdocs-website] while there is also a [demo][drfdocs-demo] available for people to see what it looks like. Features include customizing the template with your branding, settings for hiding the docs depending on the environment and more. From 4204557bc5086fbf9c8da9476a9efde92e10b8ed Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 21 Dec 2015 13:55:11 +0000 Subject: [PATCH 093/126] Remove title and hr --- docs/topics/documenting-your-api.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index 6f0125e70..de5e24eb2 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -33,11 +33,6 @@ Mark is also the author of the [REST Framework Docs][rest-framework-docs] packag ![Screenshot - Django REST Swagger][image-django-rest-swagger] ---- - -#### REST Framework Docs - - --- #### Apiary From 1925ec7d3337d7abf39ffa4f6f53ade50800f665 Mon Sep 17 00:00:00 2001 From: Emmanouil Konstantinidis Date: Mon, 21 Dec 2015 13:59:05 +0000 Subject: [PATCH 094/126] Both are highly recommended --- docs/topics/documenting-your-api.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index de5e24eb2..50a4c22e2 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -18,6 +18,8 @@ The most common way to document Web APIs today is to produce documentation that Features include customizing the template with your branding, settings for hiding the docs depending on the environment and more. +Both this package and Django REST Swagger are fully documented, well supported, and come highly recommended. + ![Screenshot - DRF docs][image-drf-docs] --- @@ -30,6 +32,7 @@ Django REST Swagger supports REST framework versions 2.3 and above. Mark is also the author of the [REST Framework Docs][rest-framework-docs] package which offers clean, simple autogenerated documentation for your API but is deprecated and has moved to Django REST Swagger. +Both this package and DRF docs are fully documented, well supported, and come highly recommended. ![Screenshot - Django REST Swagger][image-django-rest-swagger] From c5003e8dc18b80cce6eab27d6c63fbf36f998400 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 21 Dec 2015 18:02:24 +0100 Subject: [PATCH 095/126] Update the Django-guardian version for Django 1.9 --- requirements/requirements-optionals.txt | 2 +- tox.ini | 21 --------------------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/requirements/requirements-optionals.txt b/requirements/requirements-optionals.txt index 3ada43ebd..bd488f052 100644 --- a/requirements/requirements-optionals.txt +++ b/requirements/requirements-optionals.txt @@ -1,4 +1,4 @@ # Optional packages which may be used with REST framework. markdown==2.5.2 -django-guardian==1.3.0 +django-guardian==1.3.2 django-filter==0.10.0 diff --git a/tox.ini b/tox.ini index a027fa0de..b094192c4 100644 --- a/tox.ini +++ b/tox.ini @@ -30,24 +30,3 @@ deps = -rrequirements/requirements-testing.txt -rrequirements/requirements-documentation.txt -# Specify explicitly to exclude Django Guardian against Django 1.9 -[testenv:py27-django19] -deps = - Django==1.9 - -rrequirements/requirements-testing.txt - markdown==2.5.2 - django-filter==0.10.0 - -[testenv:py34-django19] -deps = - Django==1.9 - -rrequirements/requirements-testing.txt - markdown==2.5.2 - django-filter==0.10.0 - -[testenv:py35-django19] -deps = - Django==1.9 - -rrequirements/requirements-testing.txt - markdown==2.5.2 - django-filter==0.10.0 From f15026be1071845aba46a31da47a7dd3a4ba3fdb Mon Sep 17 00:00:00 2001 From: Michael Lissner Date: Tue, 22 Dec 2015 10:31:18 -0800 Subject: [PATCH 096/126] Fixes #3756, adding the name to the HTML title, if it exists. --- rest_framework/templates/rest_framework/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/templates/rest_framework/base.html b/rest_framework/templates/rest_framework/base.html index b97e36aa3..5eb2c9729 100644 --- a/rest_framework/templates/rest_framework/base.html +++ b/rest_framework/templates/rest_framework/base.html @@ -12,7 +12,7 @@ {% endblock %} - {% block title %}Django REST framework{% endblock %} + {% block title %}{% if name %}{{ name }} – {% endif %}Django REST framework{% endblock %} {% block style %} {% block bootstrap_theme %} From 5fc938cbd166fdf02685baa316ecca5703450d5d Mon Sep 17 00:00:00 2001 From: Robert Romano Date: Wed, 23 Dec 2015 12:54:17 -0800 Subject: [PATCH 097/126] The Internet Engineering Task Force approved the new HTTP status code 451. Adding to status.py and docs appropriately. --- docs/api-guide/status-codes.md | 1 + rest_framework/status.py | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/api-guide/status-codes.md b/docs/api-guide/status-codes.md index d81e092c5..e2652bcfd 100644 --- a/docs/api-guide/status-codes.md +++ b/docs/api-guide/status-codes.md @@ -89,6 +89,7 @@ The 4xx class of status code is intended for cases in which the client seems to HTTP_428_PRECONDITION_REQUIRED HTTP_429_TOO_MANY_REQUESTS HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE + HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS ## Server Error - 5xx diff --git a/rest_framework/status.py b/rest_framework/status.py index 90a755089..ed1b4784b 100644 --- a/rest_framework/status.py +++ b/rest_framework/status.py @@ -65,6 +65,7 @@ HTTP_417_EXPECTATION_FAILED = 417 HTTP_428_PRECONDITION_REQUIRED = 428 HTTP_429_TOO_MANY_REQUESTS = 429 HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 +HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451 HTTP_500_INTERNAL_SERVER_ERROR = 500 HTTP_501_NOT_IMPLEMENTED = 501 HTTP_502_BAD_GATEWAY = 502 From c8915c07160f3286d8d7d9c1258739cee067e054 Mon Sep 17 00:00:00 2001 From: Robert Romano Date: Wed, 23 Dec 2015 12:58:14 -0800 Subject: [PATCH 098/126] Change tab to spaces --- docs/api-guide/status-codes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/status-codes.md b/docs/api-guide/status-codes.md index e2652bcfd..398c04804 100644 --- a/docs/api-guide/status-codes.md +++ b/docs/api-guide/status-codes.md @@ -89,7 +89,7 @@ The 4xx class of status code is intended for cases in which the client seems to HTTP_428_PRECONDITION_REQUIRED HTTP_429_TOO_MANY_REQUESTS HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE - HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS + HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS ## Server Error - 5xx From 9bab640b0a9908cf9777da6efae8dcd1e158a980 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Thu, 24 Dec 2015 14:00:49 -0500 Subject: [PATCH 099/126] Added tests for min_value and max_value on a DecimalField This adds tests for a regression where the `min_value` and `max_value` arguments are not being set for a DRF `DecimalField` even though the corresponding `MinValueValidator` and `MaxValueValidator` is being set on the model fields. Note that this only appears to be a regression for Django < 1.9, as these regression tests pass on newer versions of Django. --- tests/test_model_serializer.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 57e540e7a..e2c3a7a47 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -899,3 +899,29 @@ class TestDecimalFieldMappings(TestCase): serializer = TestSerializer() assert len(serializer.fields['decimal_field'].validators) == 2 + + def test_min_value_is_passed(self): + """ + Test that the `MinValueValidator` is converted to the `min_value` + argument for the field. + """ + class TestSerializer(serializers.ModelSerializer): + class Meta: + model = DecimalFieldModel + + serializer = TestSerializer() + + assert serializer.fields['decimal_field'].min_value == 1 + + def test_max_value_is_passed(self): + """ + Test that the `MaxValueValidator` is converted to the `max_value` + argument for the field. + """ + class TestSerializer(serializers.ModelSerializer): + class Meta: + model = DecimalFieldModel + + serializer = TestSerializer() + + assert serializer.fields['decimal_field'].max_value == 3 From 87605e1e39d8069805345ac72ae5a13088a2df53 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Thu, 24 Dec 2015 14:10:48 -0500 Subject: [PATCH 100/126] Don't filter out the DecimalValidator if it is not supported Previously, all validators set on a DecimalField in Django would be stripped when converted to a Django REST framework field. This was because any validator that was an instance of `DecimalValidator` would be removed, and when `DecimalValidator` wasn't supported (so it was `None`), all validators would be removed. This fixes the issue by only removing the `DecimalValidator` instances if the `DecimalValidator` is supported. --- rest_framework/utils/field_mapping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index 1d8cb22f2..22a38050d 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -130,7 +130,7 @@ def get_field_kwargs(field_name, model_field): # Our decimal validation is handled in the field code, not validator code. # (In Django 1.9+ this differs from previous style) - if isinstance(model_field, models.DecimalField): + if isinstance(model_field, models.DecimalField) and DecimalValidator: validator_kwarg = [ validator for validator in validator_kwarg if DecimalValidator and not isinstance(validator, DecimalValidator) From d797389cf784b3e55179f5bcea51379d2d37f42c Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Thu, 24 Dec 2015 18:17:58 -0500 Subject: [PATCH 101/126] Fixed broken test for Django < 1.9 This test was incorrectly checking that there were no validators set in older versions of Django, even though it should have been checking for the two validators that were set up on the model field level. The originally regression test that this fixes was added in https://github.com/tomchristie/django-rest-framework/commit/7d79cf35b7be01b175d8c25276a4414e8144a16b when fixing an issue with the `DecimalValidator`. --- tests/test_model_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index e2c3a7a47..2976b1984 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -884,7 +884,7 @@ class TestDecimalFieldMappings(TestCase): serializer = TestSerializer() - assert len(serializer.fields['decimal_field'].validators) == 0 + assert len(serializer.fields['decimal_field'].validators) == 2 @pytest.mark.skipif(DecimalValidator is None, reason='DecimalValidator is available in Django 1.9+') From ff0292a757ea446545dc4425562a7653b5b9bc64 Mon Sep 17 00:00:00 2001 From: Leonid Shvechikov Date: Sun, 27 Dec 2015 17:14:33 +0300 Subject: [PATCH 102/126] Fix update model example in html-and-forms.md --- docs/topics/html-and-forms.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/topics/html-and-forms.md b/docs/topics/html-and-forms.md index 7b8f1ccc2..73e03acc1 100644 --- a/docs/topics/html-and-forms.md +++ b/docs/topics/html-and-forms.md @@ -66,9 +66,10 @@ The following view demonstrates an example of using a serializer in a template f def post(self, request, pk): profile = get_object_or_404(Profile, pk=pk) - serializer = ProfileSerializer(profile) + serializer = ProfileSerializer(profile, data=request.POST) if not serializer.is_valid(): return Response({'serializer': serializer, 'profile': profile}) + serializer.save() return redirect('profile-list') **profile_detail.html**: From ff29fdd8755d7e61f9722d03fe4c3c33809ea716 Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Wed, 30 Dec 2015 15:44:19 -0600 Subject: [PATCH 103/126] don't import authtoken model until needed --- rest_framework/authentication.py | 12 +++++++++--- rest_framework/authtoken/models.py | 8 -------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py index 9e73ef632..30e137c93 100644 --- a/rest_framework/authentication.py +++ b/rest_framework/authentication.py @@ -10,7 +10,6 @@ from django.middleware.csrf import CsrfViewMiddleware from django.utils.translation import ugettext_lazy as _ from rest_framework import HTTP_HEADER_ENCODING, exceptions -from rest_framework.authtoken.models import Token def get_authorization_header(request): @@ -149,7 +148,14 @@ class TokenAuthentication(BaseAuthentication): Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a """ - model = Token + model = None + + def get_model(self): + if self.model is not None: + return self.model + from rest_framework.authtoken.models import Token + return Token + """ A custom token model may be used, but must have the following properties. @@ -180,7 +186,7 @@ class TokenAuthentication(BaseAuthentication): def authenticate_credentials(self, key): try: - token = self.model.objects.select_related('user').get(key=key) + token = self.get_model().objects.select_related('user').get(key=key) except self.model.DoesNotExist: raise exceptions.AuthenticationFailed(_('Invalid token.')) diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py index b329ee65f..2fef61e53 100644 --- a/rest_framework/authtoken/models.py +++ b/rest_framework/authtoken/models.py @@ -21,14 +21,6 @@ class Token(models.Model): user = models.OneToOneField(AUTH_USER_MODEL, related_name='auth_token') created = models.DateTimeField(auto_now_add=True) - class Meta: - # Work around for a bug in Django: - # https://code.djangoproject.com/ticket/19422 - # - # Also see corresponding ticket: - # https://github.com/tomchristie/django-rest-framework/issues/705 - abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS - def save(self, *args, **kwargs): if not self.key: self.key = self.generate_key() From ef491685a0ed309030da99e2fc4e9fb48bf081fc Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Thu, 31 Dec 2015 21:14:57 -0600 Subject: [PATCH 104/126] Initial fixes #3636 and fixes #3637 --- docs/api-guide/filtering.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index 9e5f605ff..ccbfccbcb 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -177,7 +177,7 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha from rest_framework import filters from rest_framework import generics - class ProductFilter(django_filters.FilterSet): + class ProductFilter(filters.FilterSet): min_price = django_filters.NumberFilter(name="price", lookup_type='gte') max_price = django_filters.NumberFilter(name="price", lookup_type='lte') class Meta: @@ -199,12 +199,12 @@ You can also span relationships using `django-filter`, let's assume that each product has foreign key to `Manufacturer` model, so we create filter that filters using `Manufacturer` name. For example: - import django_filters from myapp.models import Product from myapp.serializers import ProductSerializer + from rest_framework import filters from rest_framework import generics - class ProductFilter(django_filters.FilterSet): + class ProductFilter(filters.FilterSet): class Meta: model = Product fields = ['category', 'in_stock', 'manufacturer__name'] @@ -218,9 +218,11 @@ This is nice, but it exposes the Django's double underscore convention as part o import django_filters from myapp.models import Product from myapp.serializers import ProductSerializer + from rest_framework import filters from rest_framework import generics - class ProductFilter(django_filters.FilterSet): + + class ProductFilter(filters.FilterSet): manufacturer = django_filters.CharFilter(name="manufacturer__name") class Meta: From 183f8fad445e7ba4fe19768c775a63d12a7419a1 Mon Sep 17 00:00:00 2001 From: Luis San Pablo Date: Thu, 31 Dec 2015 21:18:41 -0600 Subject: [PATCH 105/126] Class formatting --- docs/api-guide/filtering.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md index ccbfccbcb..c32300783 100644 --- a/docs/api-guide/filtering.md +++ b/docs/api-guide/filtering.md @@ -221,7 +221,6 @@ This is nice, but it exposes the Django's double underscore convention as part o from rest_framework import filters from rest_framework import generics - class ProductFilter(filters.FilterSet): manufacturer = django_filters.CharFilter(name="manufacturer__name") From 2d7d3b79a04affc1ae5ba3a0bb3cdb768fe74e4c Mon Sep 17 00:00:00 2001 From: craigglennie Date: Sat, 2 Jan 2016 13:15:25 -0800 Subject: [PATCH 106/126] Make code block consistent in serialization tutorial All the other code blocks in the Serialization tutorial can be copied and pasted, but there is one that includes the >>> shell prompt characters. This commit removes those characters, and also makes the output consistent with other code blocks by making it a comment. --- docs/tutorial/1-serialization.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/tutorial/1-serialization.md b/docs/tutorial/1-serialization.md index bd3fce33d..4e4d78172 100644 --- a/docs/tutorial/1-serialization.md +++ b/docs/tutorial/1-serialization.md @@ -193,16 +193,16 @@ Open the file `snippets/serializers.py` again, and replace the `SnippetSerialize One nice property that serializers have is that you can inspect all the fields in a serializer instance, by printing its representation. Open the Django shell with `python manage.py shell`, then try the following: - >>> from snippets.serializers import SnippetSerializer - >>> serializer = SnippetSerializer() - >>> print(repr(serializer)) - SnippetSerializer(): - id = IntegerField(label='ID', read_only=True) - title = CharField(allow_blank=True, max_length=100, required=False) - code = CharField(style={'base_template': 'textarea.html'}) - linenos = BooleanField(required=False) - language = ChoiceField(choices=[('Clipper', 'FoxPro'), ('Cucumber', 'Gherkin'), ('RobotFramework', 'RobotFramework'), ('abap', 'ABAP'), ('ada', 'Ada')... - style = ChoiceField(choices=[('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful')... + from snippets.serializers import SnippetSerializer + serializer = SnippetSerializer() + print(repr(serializer)) + # SnippetSerializer(): + # id = IntegerField(label='ID', read_only=True) + # title = CharField(allow_blank=True, max_length=100, required=False) + # code = CharField(style={'base_template': 'textarea.html'}) + # linenos = BooleanField(required=False) + # language = ChoiceField(choices=[('Clipper', 'FoxPro'), ('Cucumber', 'Gherkin'), ('RobotFramework', 'RobotFramework'), ('abap', 'ABAP'), ('ada', 'Ada')... + # style = ChoiceField(choices=[('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful')... It's important to remember that `ModelSerializer` classes don't do anything particularly magical, they are simply a shortcut for creating serializer classes: From a7723261124c2fff7033f20680dd0bc3bc78fa8e Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Mon, 28 Dec 2015 10:38:53 -0500 Subject: [PATCH 107/126] Merged two DecimalValidator tests together These two tests were previously added in https://github.com/tomchristie/django-rest-framework/commit/7d79cf35b7be01b175d8c25276a4414e8144a16b but we have now discovered that there are not actually two separate cases, there was just a bug in the code that made it look that way. This also removes a redundant check to see if `DecimalValidator` was defined. --- rest_framework/utils/field_mapping.py | 2 +- tests/test_model_serializer.py | 20 ++------------------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index 22a38050d..af7ab0231 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -133,7 +133,7 @@ def get_field_kwargs(field_name, model_field): if isinstance(model_field, models.DecimalField) and DecimalValidator: validator_kwarg = [ validator for validator in validator_kwarg - if DecimalValidator and not isinstance(validator, DecimalValidator) + if not isinstance(validator, DecimalValidator) ] # Ensure that max_length is passed explicitly as a keyword arg, diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 2976b1984..af8ce66dd 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -22,7 +22,7 @@ from django.utils import six from rest_framework import serializers from rest_framework.compat import DurationField as ModelDurationField -from rest_framework.compat import DecimalValidator, unicode_repr +from rest_framework.compat import unicode_repr def dedent(blocktext): @@ -872,25 +872,9 @@ class DecimalFieldModel(models.Model): class TestDecimalFieldMappings(TestCase): - @pytest.mark.skipif(DecimalValidator is not None, - reason='DecimalValidator is available in Django 1.9+') - def test_decimal_field_has_no_decimal_validator(self): - """ - Test that a DecimalField has no validators before Django 1.9. - """ - class TestSerializer(serializers.ModelSerializer): - class Meta: - model = DecimalFieldModel - - serializer = TestSerializer() - - assert len(serializer.fields['decimal_field'].validators) == 2 - - @pytest.mark.skipif(DecimalValidator is None, - reason='DecimalValidator is available in Django 1.9+') def test_decimal_field_has_decimal_validator(self): """ - Test that a DecimalField has DecimalValidator in Django 1.9+. + Test that a `DecimalField` has no `DecimalValidator`. """ class TestSerializer(serializers.ModelSerializer): class Meta: From 1712c00001b57110b13d3e2fa926da0ef8ce3c5a Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Tue, 5 Jan 2016 09:42:22 -0600 Subject: [PATCH 108/126] update invalid token case --- rest_framework/authentication.py | 5 +++-- tests/test_authentication.py | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py index 30e137c93..0ca90873e 100644 --- a/rest_framework/authentication.py +++ b/rest_framework/authentication.py @@ -185,9 +185,10 @@ class TokenAuthentication(BaseAuthentication): return self.authenticate_credentials(token) def authenticate_credentials(self, key): + model = self.get_model() try: - token = self.get_model().objects.select_related('user').get(key=key) - except self.model.DoesNotExist: + token = model.objects.select_related('user').get(key=key) + except model.DoesNotExist: raise exceptions.AuthenticationFailed(_('Invalid token.')) if not token.user.is_active: diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 91434124e..f7129905b 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -162,6 +162,12 @@ class TokenAuthTests(TestCase): response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_fail_post_form_passing_nonexistent_token_auth(self): + # use a nonexistent token key + auth = 'Token wxyz6789' + response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + def test_fail_post_form_passing_invalid_token_auth(self): # add an 'invalid' unicode character auth = 'Token ' + self.key + "¸" From 2b8c036b4832b0f9bf328b85d9a3c39738c7f3c4 Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Tue, 5 Jan 2016 09:58:16 -0600 Subject: [PATCH 109/126] test custom token model --- tests/test_authentication.py | 45 +++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index f7129905b..2d888840b 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -9,6 +9,7 @@ from django.contrib.auth.models import User from django.http import HttpResponse from django.test import TestCase from django.utils import six +from django.db import models from rest_framework import ( HTTP_HEADER_ENCODING, exceptions, permissions, renderers, status @@ -25,6 +26,15 @@ from rest_framework.views import APIView factory = APIRequestFactory() +class CustomToken(models.Model): + key = models.CharField(max_length=40, primary_key=True) + user = models.OneToOneField(User) + + +class CustomTokenAuthentication(TokenAuthentication): + model = CustomToken + + class MockView(APIView): permission_classes = (permissions.IsAuthenticated,) @@ -42,6 +52,7 @@ urlpatterns = [ url(r'^session/$', MockView.as_view(authentication_classes=[SessionAuthentication])), url(r'^basic/$', MockView.as_view(authentication_classes=[BasicAuthentication])), url(r'^token/$', MockView.as_view(authentication_classes=[TokenAuthentication])), + url(r'^customtoken/$', MockView.as_view(authentication_classes=[CustomTokenAuthentication])), url(r'^auth-token/$', 'rest_framework.authtoken.views.obtain_auth_token'), url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')), ] @@ -142,9 +153,11 @@ class SessionAuthTests(TestCase): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) -class TokenAuthTests(TestCase): +class BaseTokenAuthTests(object): """Token authentication""" urls = 'tests.test_authentication' + model = None + path = None def setUp(self): self.csrf_client = APIClient(enforce_csrf_checks=True) @@ -154,30 +167,30 @@ class TokenAuthTests(TestCase): self.user = User.objects.create_user(self.username, self.email, self.password) self.key = 'abcd1234' - self.token = Token.objects.create(key=self.key, user=self.user) + self.token = self.model.objects.create(key=self.key, user=self.user) def test_post_form_passing_token_auth(self): """Ensure POSTing json over token auth with correct credentials passes and does not require CSRF""" auth = 'Token ' + self.key - response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + response = self.csrf_client.post(self.path, {'example': 'example'}, HTTP_AUTHORIZATION=auth) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_fail_post_form_passing_nonexistent_token_auth(self): # use a nonexistent token key auth = 'Token wxyz6789' - response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + response = self.csrf_client.post(self.path, {'example': 'example'}, HTTP_AUTHORIZATION=auth) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) def test_fail_post_form_passing_invalid_token_auth(self): # add an 'invalid' unicode character auth = 'Token ' + self.key + "¸" - response = self.csrf_client.post('/token/', {'example': 'example'}, HTTP_AUTHORIZATION=auth) + response = self.csrf_client.post(self.path, {'example': 'example'}, HTTP_AUTHORIZATION=auth) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) def test_post_json_passing_token_auth(self): """Ensure POSTing form over token auth with correct credentials passes and does not require CSRF""" auth = "Token " + self.key - response = self.csrf_client.post('/token/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) + response = self.csrf_client.post(self.path, {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_post_json_makes_one_db_query(self): @@ -185,29 +198,34 @@ class TokenAuthTests(TestCase): auth = "Token " + self.key def func_to_test(): - return self.csrf_client.post('/token/', {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) + return self.csrf_client.post(self.path, {'example': 'example'}, format='json', HTTP_AUTHORIZATION=auth) self.assertNumQueries(1, func_to_test) def test_post_form_failing_token_auth(self): """Ensure POSTing form over token auth without correct credentials fails""" - response = self.csrf_client.post('/token/', {'example': 'example'}) + response = self.csrf_client.post(self.path, {'example': 'example'}) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) def test_post_json_failing_token_auth(self): """Ensure POSTing json over token auth without correct credentials fails""" - response = self.csrf_client.post('/token/', {'example': 'example'}, format='json') + response = self.csrf_client.post(self.path, {'example': 'example'}, format='json') self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + +class TokenAuthTests(BaseTokenAuthTests, TestCase): + model = Token + path = '/token/' + def test_token_has_auto_assigned_key_if_none_provided(self): """Ensure creating a token with no key will auto-assign a key""" self.token.delete() - token = Token.objects.create(user=self.user) + token = self.model.objects.create(user=self.user) self.assertTrue(bool(token.key)) def test_generate_key_returns_string(self): """Ensure generate_key returns a string""" - token = Token() + token = self.model() key = token.generate_key() self.assertTrue(isinstance(key, six.string_types)) @@ -242,6 +260,11 @@ class TokenAuthTests(TestCase): self.assertEqual(response.data['token'], self.key) +class CustomTokenAuthTests(BaseTokenAuthTests, TestCase): + model = CustomToken + path = '/customtoken/' + + class IncorrectCredentialsTests(TestCase): def test_incorrect_credentials(self): """ From 4f40714169c2c676fd76be596c3dd543bad06c84 Mon Sep 17 00:00:00 2001 From: "S. Andrew Sheppard" Date: Tue, 5 Jan 2016 10:20:22 -0600 Subject: [PATCH 110/126] fix import order --- tests/test_authentication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 2d888840b..285a3210c 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -6,10 +6,10 @@ import base64 from django.conf.urls import include, url from django.contrib.auth.models import User +from django.db import models from django.http import HttpResponse from django.test import TestCase from django.utils import six -from django.db import models from rest_framework import ( HTTP_HEADER_ENCODING, exceptions, permissions, renderers, status From 651319e2da0cd46319a622220a864c1da63b8001 Mon Sep 17 00:00:00 2001 From: Craig de Stigter Date: Wed, 6 Jan 2016 16:04:23 +1300 Subject: [PATCH 111/126] Fix nested validation error being rendered incorrectly. Previously an extra list wrapped nested validation errors raised from serializer's validate() methods. That was inconsistent with the format of validation errors raised by validate_ methods. i.e. these two resulted in *different* behaviour: def validate_foo(self): raise ValidationError(['bar']) def validate(self): raise ValidationError({'foo': ['bar']}) --- rest_framework/serializers.py | 2 +- tests/test_validation.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 99d36a8a5..ada1c1620 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -306,7 +306,7 @@ def get_validation_error_detail(exc): # If errors may be a dict we use the standard {key: list of values}. # Here we ensure that all the values are *lists* of errors. return { - key: value if isinstance(value, list) else [value] + key: value if isinstance(value, (list, dict)) else [value] for key, value in exc.detail.items() } elif isinstance(exc.detail, list): diff --git a/tests/test_validation.py b/tests/test_validation.py index 855ff20e0..b6f274219 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -49,6 +49,24 @@ class ShouldValidateModelSerializer(serializers.ModelSerializer): fields = ('renamed',) +class TestNestedValidationError(TestCase): + def test_nested_validation_error_detail(self): + """ + Ensure nested validation error detail is rendered correctly. + """ + e = serializers.ValidationError({ + 'nested': { + 'field': ['error'], + } + }) + + self.assertEqual(serializers.get_validation_error_detail(e), { + 'nested': { + 'field': ['error'], + } + }) + + class TestPreSaveValidationExclusionsSerializer(TestCase): def test_renamed_fields_are_model_validated(self): """ From 5fa8a318556bfecc0b344833b5e03fb862a7892e Mon Sep 17 00:00:00 2001 From: m1kola Date: Wed, 6 Jan 2016 17:58:45 +0300 Subject: [PATCH 112/126] Typo fix in docs/api-guide/relations.md `slug field` in code snippet was replaced to `slug_field` --- docs/api-guide/relations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-guide/relations.md b/docs/api-guide/relations.md index 51e5f78c4..322ab1a13 100644 --- a/docs/api-guide/relations.md +++ b/docs/api-guide/relations.md @@ -459,7 +459,7 @@ In cases where the cutoff is being enforced you may want to instead use a plain assigned_to = serializers.SlugRelatedField( queryset=User.objects.all(), - slug field='username', + slug_field='username', style={'base_template': 'input.html'} ) From 7cd39331440750345720ec816ffdab62c6a87383 Mon Sep 17 00:00:00 2001 From: Kevin Massey Date: Wed, 6 Jan 2016 15:04:51 -0500 Subject: [PATCH 113/126] Fixes #3804, avoiding update of Meta.extra_kwargs Added unit test to cover. --- rest_framework/serializers.py | 2 +- tests/test_model_serializer.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 99d36a8a5..c69a20ff1 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1212,7 +1212,7 @@ class ModelSerializer(Serializer): Return a dictionary mapping field names to a dictionary of additional keyword arguments. """ - extra_kwargs = getattr(self.Meta, 'extra_kwargs', {}) + extra_kwargs = copy.deepcopy(getattr(self.Meta, 'extra_kwargs', {})) read_only_fields = getattr(self.Meta, 'read_only_fields', None) if read_only_fields is not None: diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index af8ce66dd..f3243e33a 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -909,3 +909,34 @@ class TestDecimalFieldMappings(TestCase): serializer = TestSerializer() assert serializer.fields['decimal_field'].max_value == 3 + + +class TestMetaInheritance(TestCase): + def test_extra_kwargs_not_altered(self): + class TestSerializer(serializers.ModelSerializer): + non_model_field = serializers.CharField() + + class Meta: + model = OneFieldModel + read_only_fields = ('char_field', 'non_model_field') + fields = read_only_fields + extra_kwargs = {} + + class ChildSerializer(TestSerializer): + class Meta(TestSerializer.Meta): + read_only_fields = () + + test_expected = dedent(""" + TestSerializer(): + char_field = CharField(read_only=True) + non_model_field = CharField() + """) + + child_expected = dedent(""" + ChildSerializer(): + char_field = CharField(max_length=100) + non_model_field = CharField() + """) + self.assertEqual(unicode_repr(ChildSerializer()), child_expected) + self.assertEqual(unicode_repr(TestSerializer()), test_expected) + self.assertEqual(unicode_repr(ChildSerializer()), child_expected) From d4cdb21de9da55a4c8b33d71494f26fee4fc2e89 Mon Sep 17 00:00:00 2001 From: Mads Jensen Date: Wed, 6 Jan 2016 22:51:11 +0100 Subject: [PATCH 114/126] Fixes #3786 Minor fix for dictionary key lookup in settings file --- rest_framework/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9679cad59..946b905c6 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -196,7 +196,7 @@ class APISettings(object): return self._user_settings def __getattr__(self, attr): - if attr not in self.defaults.keys(): + if attr not in self.defaults: raise AttributeError("Invalid API setting: '%s'" % attr) try: From f71d8afdb032237815e59b2bc5df0c9c38a93d99 Mon Sep 17 00:00:00 2001 From: Jerel Unruh Date: Thu, 7 Jan 2016 13:42:02 -0600 Subject: [PATCH 115/126] Added documentation for the Third Party jsonapi.org package --- docs/topics/third-party-resources.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/topics/third-party-resources.md b/docs/topics/third-party-resources.md index fc507deab..ed15269ed 100644 --- a/docs/topics/third-party-resources.md +++ b/docs/topics/third-party-resources.md @@ -202,6 +202,7 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque * [django-rest-framework-mongoengine][django-rest-framework-mongoengine] - Serializer class that supports using MongoDB as the storage layer for Django REST framework. * [djangorestframework-gis][djangorestframework-gis] - Geographic add-ons * [djangorestframework-hstore][djangorestframework-hstore] - Serializer class to support django-hstore DictionaryField model field and its schema-mode feature. +* [djangorestframework-jsonapi][djangorestframework-jsonapi] - Provides a parser, renderer, serializers, and other tools to help build an API that is compliant with the jsonapi.org spec. ### Serializer fields @@ -222,11 +223,13 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque ### Parsers * [djangorestframework-msgpack][djangorestframework-msgpack] - Provides MessagePack renderer and parser support. +* [djangorestframework-jsonapi][djangorestframework-jsonapi] - Provides a parser, renderer, serializers, and other tools to help build an API that is compliant with the jsonapi.org spec. * [djangorestframework-camel-case][djangorestframework-camel-case] - Provides camel case JSON renderers and parsers. ### Renderers * [djangorestframework-csv][djangorestframework-csv] - Provides CSV renderer support. +* [djangorestframework-jsonapi][djangorestframework-jsonapi] - Provides a parser, renderer, serializers, and other tools to help build an API that is compliant with the jsonapi.org spec. * [drf_ujson][drf_ujson] - Implements JSON rendering using the UJSON package. * [rest-pandas][rest-pandas] - Pandas DataFrame-powered renderers including Excel, CSV, and SVG formats. @@ -351,3 +354,4 @@ To submit new content, [open an issue][drf-create-issue] or [create a pull reque [cookiecutter-django-rest]: https://github.com/agconti/cookiecutter-django-rest [drf-haystack]: http://drf-haystack.readthedocs.org/en/latest/ [django-rest-framework-version-transforms]: https://github.com/mrhwick/django-rest-framework-version-transforms +[djangorestframework-jsonapi]: https://github.com/django-json-api/django-rest-framework-json-api From 6b207d93d69c1576ae3d29230b393c566855c577 Mon Sep 17 00:00:00 2001 From: Mikalai Radchuk Date: Sun, 10 Jan 2016 23:50:11 +0300 Subject: [PATCH 116/126] DateField.to_representation unicode compatibility --- rest_framework/fields.py | 2 +- tests/test_fields.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 7bac2a21f..deca9d90d 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1139,7 +1139,7 @@ class DateField(Field): ) if output_format.lower() == ISO_8601: - if (isinstance(value, str)): + if isinstance(value, six.string_types): value = datetime.datetime.strptime(value, '%Y-%m-%d').date() return value.isoformat() diff --git a/tests/test_fields.py b/tests/test_fields.py index 029a5bddc..4b3a36f03 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -6,7 +6,7 @@ from decimal import Decimal import django import pytest from django.http import QueryDict -from django.utils import timezone +from django.utils import six, timezone import rest_framework from rest_framework import serializers @@ -895,6 +895,7 @@ class TestDateField(FieldValues): outputs = { datetime.date(2001, 1, 1): '2001-01-01', '2001-01-01': '2001-01-01', + six.text_type('2016-01-10'): '2016-01-10', None: None, '': None, } From a76c3ed051f7d8e26db82450a20cdb9f4a683116 Mon Sep 17 00:00:00 2001 From: areski Date: Thu, 7 Jan 2016 18:46:54 +0100 Subject: [PATCH 117/126] Fixed TimeField not handling empty values --- rest_framework/fields.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index deca9d90d..67dd3b6c7 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1204,6 +1204,8 @@ class TimeField(Field): ) if output_format.lower() == ISO_8601: + if (isinstance(value, str)): + value = datetime.datetime.strptime(value, '%H:%M:%S').time() return value.isoformat() return value.strftime(output_format) From 4e017963034502531313cba0620299ce06fc94e8 Mon Sep 17 00:00:00 2001 From: areski Date: Mon, 11 Jan 2016 12:16:26 +0100 Subject: [PATCH 118/126] Test for TimeField not handling empty values --- rest_framework/fields.py | 2 +- tests/test_fields.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 67dd3b6c7..a2b0f3bf1 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1204,7 +1204,7 @@ class TimeField(Field): ) if output_format.lower() == ISO_8601: - if (isinstance(value, str)): + 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/tests/test_fields.py b/tests/test_fields.py index 4b3a36f03..43441c2e7 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1032,6 +1032,7 @@ class TestTimeField(FieldValues): } outputs = { datetime.time(13, 00): '13:00:00', + '00:00:00': '00:00:00', None: None, '': None, } From 04b2f021a6ba98c750c0013f9c8ff062661c6918 Mon Sep 17 00:00:00 2001 From: Zach Wernberg Date: Mon, 11 Jan 2016 08:13:07 -0600 Subject: [PATCH 119/126] update copyright 2016 --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 9b1945e7b..c09c00285 100644 --- a/docs/index.md +++ b/docs/index.md @@ -232,7 +232,7 @@ Send a description of the issue via email to [rest-framework-security@googlegrou ## License -Copyright (c) 2011-2015, Tom Christie +Copyright (c) 2011-2016, Tom Christie All rights reserved. Redistribution and use in source and binary forms, with or without From a9c394f5b7b417d5432bd5c6974cf0e65575be1b Mon Sep 17 00:00:00 2001 From: Mads Jensen Date: Wed, 13 Jan 2016 12:54:56 +0100 Subject: [PATCH 120/126] 2015 update in __init__.py file --- rest_framework/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/__init__.py b/rest_framework/__init__.py index 0e5199996..74c317f35 100644 --- a/rest_framework/__init__.py +++ b/rest_framework/__init__.py @@ -11,7 +11,7 @@ __title__ = 'Django REST framework' __version__ = '3.3.2' __author__ = 'Tom Christie' __license__ = 'BSD 2-Clause' -__copyright__ = 'Copyright 2011-2015 Tom Christie' +__copyright__ = 'Copyright 2011-2016 Tom Christie' # Version synonym VERSION = __version__ From 717e27c8667410670f002b2929dd66302a547087 Mon Sep 17 00:00:00 2001 From: Nicolas Delaby Date: Thu, 14 Jan 2016 14:59:31 +0100 Subject: [PATCH 121/126] Document how to tweak authtoken.admin.TokenAdmin With focus on large user base, but can be extended. --- docs/api-guide/authentication.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/api-guide/authentication.md b/docs/api-guide/authentication.md index 3ade3a661..3d1cfd1e8 100644 --- a/docs/api-guide/authentication.md +++ b/docs/api-guide/authentication.md @@ -165,6 +165,8 @@ The `curl` command line tool may be useful for testing token authenticated APIs. #### Generating Tokens +##### By using signals + If you want every user to have an automatically generated Token, you can simply catch the User's `post_save` signal. from django.conf import settings @@ -187,6 +189,8 @@ If you've already created some users, you can generate tokens for all existing u for user in User.objects.all(): Token.objects.get_or_create(user=user) +##### By exposing an api endpoint + When using `TokenAuthentication`, you may want to provide a mechanism for clients to obtain a token given the username and password. REST framework provides a built-in view to provide this behavior. To use it, add the `obtain_auth_token` view to your URLconf: from rest_framework.authtoken import views @@ -202,6 +206,17 @@ 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. +##### 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`. + +`your_app/admin.py`: + + from rest_framework.authtoken.admin import TokenAdmin + + TokenAdmin.raw_id_fields = ('user',) + + #### Schema migrations The `rest_framework.authtoken` app includes both Django native migrations (for Django versions >1.7) and South migrations (for Django versions <1.7) that will create the authtoken table. From 215e1b6c6b1cfcc94756151769c1735ddba3662a Mon Sep 17 00:00:00 2001 From: Mads Jensen Date: Thu, 14 Jan 2016 15:14:33 +0100 Subject: [PATCH 122/126] Regarding #3729 python -Werror generates warnings informing that on_delete is a required keyword in Django 2.0 --- rest_framework/authtoken/models.py | 3 ++- tests/models.py | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py index 2fef61e53..65dd99702 100644 --- a/rest_framework/authtoken/models.py +++ b/rest_framework/authtoken/models.py @@ -18,7 +18,8 @@ class Token(models.Model): The default authorization token model. """ key = models.CharField(max_length=40, primary_key=True) - user = models.OneToOneField(AUTH_USER_MODEL, related_name='auth_token') + user = models.OneToOneField(AUTH_USER_MODEL, related_name='auth_token', + on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) def save(self, *args, **kwargs): diff --git a/tests/models.py b/tests/models.py index c265182b7..8ec274d8b 100644 --- a/tests/models.py +++ b/tests/models.py @@ -49,7 +49,8 @@ class ForeignKeyTarget(RESTFrameworkModel): class ForeignKeySource(RESTFrameworkModel): name = models.CharField(max_length=100) target = models.ForeignKey(ForeignKeyTarget, related_name='sources', - help_text='Target', verbose_name='Target') + help_text='Target', verbose_name='Target', + on_delete=models.CASCADE) # Nullable ForeignKey @@ -57,7 +58,8 @@ class NullableForeignKeySource(RESTFrameworkModel): name = models.CharField(max_length=100) target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True, related_name='nullable_sources', - verbose_name='Optional target object') + verbose_name='Optional target object', + on_delete=models.CASCADE) # OneToOne @@ -68,4 +70,4 @@ class OneToOneTarget(RESTFrameworkModel): class NullableOneToOneSource(RESTFrameworkModel): name = models.CharField(max_length=100) target = models.OneToOneField(OneToOneTarget, null=True, blank=True, - related_name='nullable_source') + related_name='nullable_source', on_delete=models.CASCADE) From 40b5774a3335ff0f186bc324758fd6e9da69c94a Mon Sep 17 00:00:00 2001 From: Brad Montgomery Date: Thu, 14 Jan 2016 12:00:30 -0600 Subject: [PATCH 123/126] QueryParameterVersioning does not use default version QueryParameterVersioning does not fall back to the value used in the `DEFAULT_VERSION` setting, while other versioning schemes do. This looks like a minor change, and incorporates the `self.default_version` set in the superclass. I'll sheepishly admit that I edited this inline without running any tests or anything, so please let me know if this needs more work. --- rest_framework/versioning.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py index 7b1422c92..e27c7b316 100644 --- a/rest_framework/versioning.py +++ b/rest_framework/versioning.py @@ -166,7 +166,7 @@ class QueryParameterVersioning(BaseVersioning): invalid_version_message = _('Invalid version in query parameter.') def determine_version(self, request, *args, **kwargs): - version = request.query_params.get(self.version_param) + version = request.query_params.get(self.version_param, self.default_version) if not self.is_allowed_version(version): raise exceptions.NotFound(self.invalid_version_message) return version From a37a8748cc3d104bb85a712930cf405eb7d934a7 Mon Sep 17 00:00:00 2001 From: Ramon Moraes Date: Fri, 15 Jan 2016 11:44:25 -0300 Subject: [PATCH 124/126] Update permissions.md Adding additional note about the behavior of set permission classes per view as suggest on #3834 --- docs/api-guide/permissions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api-guide/permissions.md b/docs/api-guide/permissions.md index 0f5947d63..bbac824da 100644 --- a/docs/api-guide/permissions.md +++ b/docs/api-guide/permissions.md @@ -100,6 +100,8 @@ Or, if you're using the `@api_view` decorator with function based views. } return Response(content) +__Note:__ when you set new permission classes through class attribute or decorators you're telling the view to ignore the default list set over the __settings.py__ file. + --- # API Reference From b24fb53d98c118ddff2a380784f66607aefbd158 Mon Sep 17 00:00:00 2001 From: Prayag Verma Date: Mon, 18 Jan 2016 12:28:24 +0530 Subject: [PATCH 125/126] Update license year range to 2016 --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 2b97cc51b..aca195ec4 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -Copyright (c) 2011-2015, Tom Christie +Copyright (c) 2011-2016, Tom Christie All rights reserved. Redistribution and use in source and binary forms, with or without From 221d6979c69c1fcb77ad320f2cf3b54b861fa3bf Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 18 Jan 2016 18:54:00 +0100 Subject: [PATCH 126/126] Fix the request data source. --- docs/topics/html-and-forms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/html-and-forms.md b/docs/topics/html-and-forms.md index 73e03acc1..6660607fe 100644 --- a/docs/topics/html-and-forms.md +++ b/docs/topics/html-and-forms.md @@ -66,7 +66,7 @@ The following view demonstrates an example of using a serializer in a template f def post(self, request, pk): profile = get_object_or_404(Profile, pk=pk) - serializer = ProfileSerializer(profile, data=request.POST) + serializer = ProfileSerializer(profile, data=request.data) if not serializer.is_valid(): return Response({'serializer': serializer, 'profile': profile}) serializer.save()