From 72a96edda11f0ffbf511c72fad8a8c6689b96d59 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 14 Oct 2025 16:46:09 +0300 Subject: [PATCH] Features: 3.1.0 --- blog/admin.py | 2 +- blog/apps.py | 2 +- blog/elasticsearch/documents.py | 4 +- blog/filters.py | 2 +- blog/viewsets.py | 2 +- blog/widgets.py | 8 +- core/abstract.py | 8 +- core/admin.py | 100 ++++----- core/apps.py | 2 +- core/elasticsearch/__init__.py | 17 +- core/elasticsearch/documents.py | 15 +- core/filters.py | 63 +++--- core/graphene/__init__.py | 6 +- core/graphene/mutations.py | 90 +++++--- core/graphene/object_types.py | 72 +++---- core/locale/ar_AR/LC_MESSAGES/django.mo | Bin 98120 -> 98180 bytes core/locale/ar_AR/LC_MESSAGES/django.po | 78 +++---- core/locale/cs_CZ/LC_MESSAGES/django.mo | Bin 83771 -> 83821 bytes core/locale/cs_CZ/LC_MESSAGES/django.po | 78 +++---- core/locale/da_DK/LC_MESSAGES/django.mo | Bin 82098 -> 82146 bytes core/locale/da_DK/LC_MESSAGES/django.po | 78 +++---- core/locale/de_DE/LC_MESSAGES/django.mo | Bin 86871 -> 86914 bytes core/locale/de_DE/LC_MESSAGES/django.po | 78 +++---- core/locale/en_GB/LC_MESSAGES/django.mo | Bin 79203 -> 79251 bytes core/locale/en_GB/LC_MESSAGES/django.po | 78 +++---- core/locale/en_US/LC_MESSAGES/django.mo | Bin 79194 -> 79242 bytes core/locale/en_US/LC_MESSAGES/django.po | 78 +++---- core/locale/es_ES/LC_MESSAGES/django.mo | Bin 84998 -> 85053 bytes core/locale/es_ES/LC_MESSAGES/django.po | 78 +++---- core/locale/fa_IR/LC_MESSAGES/django.po | 80 ++++---- core/locale/fr_FR/LC_MESSAGES/django.mo | Bin 87597 -> 87659 bytes core/locale/fr_FR/LC_MESSAGES/django.po | 78 +++---- core/locale/he_IL/LC_MESSAGES/django.mo | Bin 90975 -> 91025 bytes core/locale/he_IL/LC_MESSAGES/django.po | 78 +++---- core/locale/hi_IN/LC_MESSAGES/django.po | 80 ++++---- core/locale/hr_HR/LC_MESSAGES/django.po | 80 ++++---- core/locale/id_ID/LC_MESSAGES/django.mo | Bin 82104 -> 82150 bytes core/locale/id_ID/LC_MESSAGES/django.po | 78 +++---- core/locale/it_IT/LC_MESSAGES/django.mo | Bin 85136 -> 85192 bytes core/locale/it_IT/LC_MESSAGES/django.po | 78 +++---- core/locale/ja_JP/LC_MESSAGES/django.mo | Bin 90060 -> 90105 bytes core/locale/ja_JP/LC_MESSAGES/django.po | 78 +++---- core/locale/kk_KZ/LC_MESSAGES/django.po | 80 ++++---- core/locale/ko_KR/LC_MESSAGES/django.mo | Bin 85166 -> 85212 bytes core/locale/ko_KR/LC_MESSAGES/django.po | 78 +++---- core/locale/nl_NL/LC_MESSAGES/django.mo | Bin 84737 -> 84786 bytes core/locale/nl_NL/LC_MESSAGES/django.po | 78 +++---- core/locale/no_NO/LC_MESSAGES/django.mo | Bin 82654 -> 82710 bytes core/locale/no_NO/LC_MESSAGES/django.po | 78 +++---- core/locale/pl_PL/LC_MESSAGES/django.mo | Bin 84126 -> 84179 bytes core/locale/pl_PL/LC_MESSAGES/django.po | 78 +++---- core/locale/pt_BR/LC_MESSAGES/django.mo | Bin 84658 -> 84715 bytes core/locale/pt_BR/LC_MESSAGES/django.po | 78 +++---- core/locale/ro_RO/LC_MESSAGES/django.mo | Bin 86353 -> 86410 bytes core/locale/ro_RO/LC_MESSAGES/django.po | 78 +++---- core/locale/ru_RU/LC_MESSAGES/django.mo | Bin 111830 -> 111912 bytes core/locale/ru_RU/LC_MESSAGES/django.po | 78 +++---- core/locale/sv_SE/LC_MESSAGES/django.mo | Bin 82745 -> 82801 bytes core/locale/sv_SE/LC_MESSAGES/django.po | 78 +++---- core/locale/th_TH/LC_MESSAGES/django.mo | Bin 133338 -> 133416 bytes core/locale/th_TH/LC_MESSAGES/django.po | 78 +++---- core/locale/tr_TR/LC_MESSAGES/django.mo | Bin 84806 -> 84849 bytes core/locale/tr_TR/LC_MESSAGES/django.po | 78 +++---- core/locale/vi_VN/LC_MESSAGES/django.mo | Bin 95015 -> 95068 bytes core/locale/vi_VN/LC_MESSAGES/django.po | 78 +++---- core/locale/zh_Hans/LC_MESSAGES/django.mo | Bin 74324 -> 74369 bytes core/locale/zh_Hans/LC_MESSAGES/django.po | 78 +++---- core/management/commands/await_services.py | 7 +- core/management/commands/check_translated.py | 10 +- core/management/commands/clear_unwanted.py | 26 +-- core/management/commands/deepl_translate.py | 20 +- .../commands/delete_never_ordered_products.py | 9 +- .../delete_products_by_description.py | 9 +- core/management/commands/fetch_products.py | 6 +- core/management/commands/fix_prices.py | 3 +- core/management/commands/rebuild_slugs.py | 7 +- .../management/commands/set_default_caches.py | 4 +- core/models.py | 60 +++--- core/serializers/simple.py | 50 ++--- core/serializers/utility.py | 53 ++--- core/signals.py | 47 +++-- core/sitemaps.py | 11 +- core/tasks.py | 7 +- core/templatetags/conditions.py | 4 +- core/tests.py | 3 - core/urls.py | 4 +- core/utils/__init__.py | 37 +++- core/utils/caching.py | 18 +- core/utils/constance.py | 12 -- core/utils/db.py | 10 +- core/utils/emailing.py | 35 ++-- core/utils/languages.py | 2 +- core/validators.py | 12 +- core/vendors/__init__.py | 14 +- core/views.py | 23 ++- core/viewsets.py | 47 +++-- core/widgets.py | 26 ++- evibes/ftpstorage.py | 3 +- evibes/locale/ar_AR/LC_MESSAGES/django.mo | Bin 3364 -> 3414 bytes evibes/locale/ar_AR/LC_MESSAGES/django.po | 56 ++--- evibes/locale/cs_CZ/LC_MESSAGES/django.mo | Bin 2847 -> 2893 bytes evibes/locale/cs_CZ/LC_MESSAGES/django.po | 56 ++--- evibes/locale/da_DK/LC_MESSAGES/django.mo | Bin 2806 -> 2859 bytes evibes/locale/da_DK/LC_MESSAGES/django.po | 56 ++--- evibes/locale/de_DE/LC_MESSAGES/django.mo | Bin 2814 -> 2864 bytes evibes/locale/de_DE/LC_MESSAGES/django.po | 56 ++--- evibes/locale/en_GB/LC_MESSAGES/django.mo | Bin 2695 -> 2745 bytes evibes/locale/en_GB/LC_MESSAGES/django.po | 56 ++--- evibes/locale/en_US/LC_MESSAGES/django.mo | Bin 2700 -> 2750 bytes evibes/locale/en_US/LC_MESSAGES/django.po | 56 ++--- evibes/locale/es_ES/LC_MESSAGES/django.mo | Bin 2908 -> 2955 bytes evibes/locale/es_ES/LC_MESSAGES/django.po | 56 ++--- evibes/locale/fa_IR/LC_MESSAGES/django.po | 58 +++--- evibes/locale/fr_FR/LC_MESSAGES/django.mo | Bin 2948 -> 2999 bytes evibes/locale/fr_FR/LC_MESSAGES/django.po | 56 ++--- evibes/locale/he_IL/LC_MESSAGES/django.mo | Bin 3051 -> 3105 bytes evibes/locale/he_IL/LC_MESSAGES/django.po | 56 ++--- evibes/locale/hi_IN/LC_MESSAGES/django.po | 58 +++--- evibes/locale/hr_HR/LC_MESSAGES/django.po | 58 +++--- evibes/locale/id_ID/LC_MESSAGES/django.mo | Bin 2700 -> 2751 bytes evibes/locale/id_ID/LC_MESSAGES/django.po | 56 ++--- evibes/locale/it_IT/LC_MESSAGES/django.mo | Bin 2891 -> 2937 bytes evibes/locale/it_IT/LC_MESSAGES/django.po | 56 ++--- evibes/locale/ja_JP/LC_MESSAGES/django.mo | Bin 2990 -> 3045 bytes evibes/locale/ja_JP/LC_MESSAGES/django.po | 56 ++--- evibes/locale/kk_KZ/LC_MESSAGES/django.po | 58 +++--- evibes/locale/ko_KR/LC_MESSAGES/django.mo | Bin 2776 -> 2838 bytes evibes/locale/ko_KR/LC_MESSAGES/django.po | 56 ++--- evibes/locale/nl_NL/LC_MESSAGES/django.mo | Bin 2804 -> 2853 bytes evibes/locale/nl_NL/LC_MESSAGES/django.po | 56 ++--- evibes/locale/no_NO/LC_MESSAGES/django.mo | Bin 2815 -> 2863 bytes evibes/locale/no_NO/LC_MESSAGES/django.po | 56 ++--- evibes/locale/pl_PL/LC_MESSAGES/django.mo | Bin 2837 -> 2887 bytes evibes/locale/pl_PL/LC_MESSAGES/django.po | 56 ++--- evibes/locale/pt_BR/LC_MESSAGES/django.mo | Bin 2869 -> 2917 bytes evibes/locale/pt_BR/LC_MESSAGES/django.po | 56 ++--- evibes/locale/ro_RO/LC_MESSAGES/django.mo | Bin 2895 -> 2946 bytes evibes/locale/ro_RO/LC_MESSAGES/django.po | 56 ++--- evibes/locale/ru_RU/LC_MESSAGES/django.mo | Bin 3453 -> 3509 bytes evibes/locale/ru_RU/LC_MESSAGES/django.po | 56 ++--- evibes/locale/sv_SE/LC_MESSAGES/django.mo | Bin 2823 -> 2871 bytes evibes/locale/sv_SE/LC_MESSAGES/django.po | 56 ++--- evibes/locale/th_TH/LC_MESSAGES/django.mo | Bin 3926 -> 4008 bytes evibes/locale/th_TH/LC_MESSAGES/django.po | 56 ++--- evibes/locale/tr_TR/LC_MESSAGES/django.mo | Bin 2872 -> 2924 bytes evibes/locale/tr_TR/LC_MESSAGES/django.po | 56 ++--- evibes/locale/vi_VN/LC_MESSAGES/django.mo | Bin 3082 -> 3137 bytes evibes/locale/vi_VN/LC_MESSAGES/django.po | 56 ++--- evibes/locale/zh_Hans/LC_MESSAGES/django.mo | Bin 2648 -> 2694 bytes evibes/locale/zh_Hans/LC_MESSAGES/django.po | 56 ++--- evibes/pagination.py | 6 +- evibes/settings/base.py | 29 +-- evibes/settings/caches.py | 3 +- evibes/settings/constance.py | 8 +- evibes/settings/drf.py | 16 +- evibes/utils/misc.py | 3 +- payments/admin.py | 12 +- payments/apps.py | 2 +- payments/forms.py | 2 +- payments/gateways/__init__.py | 7 +- payments/graphene/mutations.py | 1 + payments/locale/ar_AR/LC_MESSAGES/django.po | 6 +- payments/locale/cs_CZ/LC_MESSAGES/django.po | 6 +- payments/locale/da_DK/LC_MESSAGES/django.po | 6 +- payments/locale/de_DE/LC_MESSAGES/django.po | 6 +- payments/locale/en_GB/LC_MESSAGES/django.po | 6 +- payments/locale/en_US/LC_MESSAGES/django.po | 6 +- payments/locale/es_ES/LC_MESSAGES/django.po | 6 +- payments/locale/fa_IR/LC_MESSAGES/django.po | 6 +- payments/locale/fr_FR/LC_MESSAGES/django.po | 6 +- payments/locale/he_IL/LC_MESSAGES/django.po | 6 +- payments/locale/hi_IN/LC_MESSAGES/django.po | 6 +- payments/locale/hr_HR/LC_MESSAGES/django.po | 6 +- payments/locale/id_ID/LC_MESSAGES/django.po | 6 +- payments/locale/it_IT/LC_MESSAGES/django.po | 6 +- payments/locale/ja_JP/LC_MESSAGES/django.po | 6 +- payments/locale/kk_KZ/LC_MESSAGES/django.po | 6 +- payments/locale/ko_KR/LC_MESSAGES/django.po | 6 +- payments/locale/nl_NL/LC_MESSAGES/django.po | 6 +- payments/locale/no_NO/LC_MESSAGES/django.po | 6 +- payments/locale/pl_PL/LC_MESSAGES/django.po | 6 +- payments/locale/pt_BR/LC_MESSAGES/django.po | 6 +- payments/locale/ro_RO/LC_MESSAGES/django.po | 6 +- payments/locale/ru_RU/LC_MESSAGES/django.po | 6 +- payments/locale/sv_SE/LC_MESSAGES/django.po | 6 +- payments/locale/th_TH/LC_MESSAGES/django.po | 6 +- payments/locale/tr_TR/LC_MESSAGES/django.po | 6 +- payments/locale/vi_VN/LC_MESSAGES/django.po | 6 +- payments/locale/zh_Hans/LC_MESSAGES/django.po | 6 +- payments/serializers.py | 6 +- payments/signals.py | 9 +- payments/tests.py | 193 ------------------ payments/utils/__init__.py | 2 +- payments/utils/cbr.py | 6 +- payments/utils/currencies.py | 4 +- payments/utils/emailing.py | 8 +- payments/views.py | 6 +- payments/viewsets.py | 2 +- poetry.lock | 134 ++++++------ pyproject.toml | 8 +- vibes_auth/admin.py | 15 +- vibes_auth/apps.py | 2 +- vibes_auth/forms.py | 2 +- vibes_auth/graphene/mutations.py | 10 + vibes_auth/locale/ar_AR/LC_MESSAGES/django.mo | Bin 13369 -> 14599 bytes vibes_auth/locale/ar_AR/LC_MESSAGES/django.po | 133 ++++++------ vibes_auth/locale/cs_CZ/LC_MESSAGES/django.mo | Bin 11106 -> 12106 bytes vibes_auth/locale/cs_CZ/LC_MESSAGES/django.po | 129 ++++++------ vibes_auth/locale/da_DK/LC_MESSAGES/django.mo | Bin 10933 -> 11933 bytes vibes_auth/locale/da_DK/LC_MESSAGES/django.po | 131 ++++++------ vibes_auth/locale/de_DE/LC_MESSAGES/django.mo | Bin 11695 -> 12771 bytes vibes_auth/locale/de_DE/LC_MESSAGES/django.po | 155 +++++++------- vibes_auth/locale/en_GB/LC_MESSAGES/django.mo | Bin 10537 -> 11489 bytes vibes_auth/locale/en_GB/LC_MESSAGES/django.po | 133 ++++++------ vibes_auth/locale/en_US/LC_MESSAGES/django.mo | Bin 10526 -> 11478 bytes vibes_auth/locale/en_US/LC_MESSAGES/django.po | 133 ++++++------ vibes_auth/locale/es_ES/LC_MESSAGES/django.mo | Bin 11477 -> 12549 bytes vibes_auth/locale/es_ES/LC_MESSAGES/django.po | 133 ++++++------ vibes_auth/locale/fa_IR/LC_MESSAGES/django.po | 81 ++++---- vibes_auth/locale/fr_FR/LC_MESSAGES/django.mo | Bin 11982 -> 13113 bytes vibes_auth/locale/fr_FR/LC_MESSAGES/django.po | 141 +++++++------ vibes_auth/locale/he_IL/LC_MESSAGES/django.mo | Bin 11944 -> 13068 bytes vibes_auth/locale/he_IL/LC_MESSAGES/django.po | 116 ++++++----- vibes_auth/locale/hi_IN/LC_MESSAGES/django.po | 81 ++++---- vibes_auth/locale/hr_HR/LC_MESSAGES/django.po | 81 ++++---- vibes_auth/locale/id_ID/LC_MESSAGES/django.mo | Bin 10962 -> 11973 bytes vibes_auth/locale/id_ID/LC_MESSAGES/django.po | 128 ++++++------ vibes_auth/locale/it_IT/LC_MESSAGES/django.mo | Bin 11426 -> 12465 bytes vibes_auth/locale/it_IT/LC_MESSAGES/django.po | 126 ++++++------ vibes_auth/locale/ja_JP/LC_MESSAGES/django.mo | Bin 12649 -> 13794 bytes vibes_auth/locale/ja_JP/LC_MESSAGES/django.po | 152 +++++++------- vibes_auth/locale/kk_KZ/LC_MESSAGES/django.po | 81 ++++---- vibes_auth/locale/ko_KR/LC_MESSAGES/django.mo | Bin 11610 -> 12661 bytes vibes_auth/locale/ko_KR/LC_MESSAGES/django.po | 148 +++++++------- vibes_auth/locale/nl_NL/LC_MESSAGES/django.mo | Bin 11205 -> 12211 bytes vibes_auth/locale/nl_NL/LC_MESSAGES/django.po | 133 ++++++------ vibes_auth/locale/no_NO/LC_MESSAGES/django.mo | Bin 10986 -> 11977 bytes vibes_auth/locale/no_NO/LC_MESSAGES/django.po | 136 ++++++------ vibes_auth/locale/pl_PL/LC_MESSAGES/django.mo | Bin 11298 -> 12328 bytes vibes_auth/locale/pl_PL/LC_MESSAGES/django.po | 132 ++++++------ vibes_auth/locale/pt_BR/LC_MESSAGES/django.mo | Bin 11239 -> 12282 bytes vibes_auth/locale/pt_BR/LC_MESSAGES/django.po | 137 +++++++------ vibes_auth/locale/ro_RO/LC_MESSAGES/django.mo | Bin 11599 -> 12681 bytes vibes_auth/locale/ro_RO/LC_MESSAGES/django.po | 124 +++++------ vibes_auth/locale/ru_RU/LC_MESSAGES/django.mo | Bin 14759 -> 16270 bytes vibes_auth/locale/ru_RU/LC_MESSAGES/django.po | 139 +++++++------ vibes_auth/locale/sv_SE/LC_MESSAGES/django.mo | Bin 11164 -> 12163 bytes vibes_auth/locale/sv_SE/LC_MESSAGES/django.po | 134 ++++++------ vibes_auth/locale/th_TH/LC_MESSAGES/django.mo | Bin 16764 -> 18574 bytes vibes_auth/locale/th_TH/LC_MESSAGES/django.po | 158 ++++++++------ vibes_auth/locale/tr_TR/LC_MESSAGES/django.mo | Bin 11405 -> 12460 bytes vibes_auth/locale/tr_TR/LC_MESSAGES/django.po | 128 ++++++------ vibes_auth/locale/vi_VN/LC_MESSAGES/django.mo | Bin 12209 -> 13361 bytes vibes_auth/locale/vi_VN/LC_MESSAGES/django.po | 146 +++++++------ .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 10104 -> 10975 bytes .../locale/zh_Hans/LC_MESSAGES/django.po | 125 ++++++------ vibes_auth/models.py | 64 +----- vibes_auth/tests.py | 116 ----------- vibes_auth/utils/emailing.py | 13 +- vibes_auth/validators.py | 6 +- vibes_auth/views.py | 13 +- vibes_auth/viewsets.py | 22 +- 262 files changed, 4744 insertions(+), 4468 deletions(-) delete mode 100644 core/utils/constance.py diff --git a/blog/admin.py b/blog/admin.py index b6dd7447..b207d677 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -34,7 +34,7 @@ class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixi @register(PostTag) -class PostTagAdmin(ModelAdmin): # type: ignore [misc, type-arg] +class PostTagAdmin(ModelAdmin): # type: ignore [type-arg] list_display = ("tag_name", "name") search_fields = ("tag_name", "name") ordering = ("tag_name",) diff --git a/blog/apps.py b/blog/apps.py index eac2df44..2783a0aa 100644 --- a/blog/apps.py +++ b/blog/apps.py @@ -11,6 +11,6 @@ class BlogConfig(AppConfig): hide = False # noinspection PyUnresolvedReferences - def ready(self): + def ready(self) -> None: import blog.elasticsearch.documents import blog.signals # noqa: F401 diff --git a/blog/elasticsearch/documents.py b/blog/elasticsearch/documents.py index 69eef8fd..f266efaf 100644 --- a/blog/elasticsearch/documents.py +++ b/blog/elasticsearch/documents.py @@ -6,7 +6,7 @@ from core.elasticsearch import COMMON_ANALYSIS, ActiveOnlyMixin, add_multilang_f from core.elasticsearch.documents import BaseDocument -class PostDocument(ActiveOnlyMixin, BaseDocument): +class PostDocument(ActiveOnlyMixin, BaseDocument): # type: ignore [misc] title = fields.TextField( attr="title", analyzer="standard", @@ -30,7 +30,7 @@ class PostDocument(ActiveOnlyMixin, BaseDocument): model = Post fields = ["uuid"] - def prepare_title(self, instance): + def prepare_title(self, instance: Post) -> str: return getattr(instance, "title", "") or "" diff --git a/blog/filters.py b/blog/filters.py index 42986097..115e9d99 100644 --- a/blog/filters.py +++ b/blog/filters.py @@ -4,7 +4,7 @@ from blog.models import Post from core.filters import CaseInsensitiveListFilter -class PostFilter(FilterSet): +class PostFilter(FilterSet): # type: ignore [misc] uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") slug = CharFilter(field_name="slug", lookup_expr="exact") author = UUIDFilter(field_name="author__uuid", lookup_expr="exact") diff --git a/blog/viewsets.py b/blog/viewsets.py index deb26f23..48ff8c87 100644 --- a/blog/viewsets.py +++ b/blog/viewsets.py @@ -7,7 +7,7 @@ from blog.serializers import PostSerializer from core.permissions import EvibesPermission -class PostViewSet(ReadOnlyModelViewSet): +class PostViewSet(ReadOnlyModelViewSet): # type: ignore [type-arg] """ Encapsulates operations for managing and retrieving Post entities in a read-only model view set. diff --git a/blog/widgets.py b/blog/widgets.py index f312b9a7..ae5d640b 100644 --- a/blog/widgets.py +++ b/blog/widgets.py @@ -1,4 +1,7 @@ +from typing import Any + from django import forms +from django.forms.renderers import BaseRenderer from django.utils.safestring import mark_safe @@ -7,7 +10,10 @@ class MarkdownEditorWidget(forms.Textarea): css = {"all": ("https://cdnjs.cloudflare.com/ajax/libs/easymde/2.14.0/easymde.min.css",)} js = ("https://cdnjs.cloudflare.com/ajax/libs/easymde/2.14.0/easymde.min.js",) - def render(self, name, value, attrs=None, renderer=None): + def render(self, name: str, value: str, attrs: dict[Any, Any] | None = None, renderer: BaseRenderer | None = None): + if not attrs: + attrs = {} + attrs["class"] = "markdown-editor" textarea_html = super().render(name, value, attrs, renderer) textarea_id = attrs.get("id", f"id_{name}") init_js = f""" diff --git a/core/abstract.py b/core/abstract.py index b32aa480..a3c11847 100644 --- a/core/abstract.py +++ b/core/abstract.py @@ -20,16 +20,16 @@ class NiceModel(Model): verbose_name=_("is active"), help_text=_("if set to false, this object can't be seen by users without needed permission"), ) - created = CreationDateTimeField(_("created"), help_text=_("when the object first appeared on the database")) - modified = ModificationDateTimeField(_("modified"), help_text=_("when the object was last modified")) + created = CreationDateTimeField(_("created"), help_text=_("when the object first appeared on the database")) # type: ignore [no-untyped-call] + modified = ModificationDateTimeField(_("modified"), help_text=_("when the object was last modified")) # type: ignore [no-untyped-call] - def save( + def save( # type: ignore [override] self, *, force_insert: bool = False, force_update: bool = False, using: str | None = None, - update_fields: Collection | None = None, + update_fields: Collection[str] | None = None, update_modified: bool = True, ) -> None: self.update_modified = update_modified diff --git a/core/admin.py b/core/admin.py index a3f28ade..82ad95ae 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,13 +1,16 @@ from contextlib import suppress -from typing import ClassVar, Type +from typing import Any, ClassVar, Type from constance.admin import Config from constance.admin import ConstanceAdmin as BaseConstanceAdmin -from django.apps import apps +from django.apps import AppConfig, apps +from django.conf import settings from django.contrib.admin import ModelAdmin, TabularInline, action, register, site from django.contrib.gis.admin import GISModelAdmin from django.contrib.messages import constants as messages from django.db.models import Model +from django.db.models.query import QuerySet +from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ from modeltranslation.translator import NotRegistered, translator from modeltranslation.utils import get_translation_fields @@ -36,16 +39,15 @@ from core.models import ( Vendor, Wishlist, ) -from evibes.settings import CONSTANCE_CONFIG class FieldsetsMixin: - general_fields: list = [] - relation_fields: list = [] - additional_fields: list = [] + general_fields: list[str] | None = [] + relation_fields: list[str] | None = [] + additional_fields: list[str] | None = [] model: ClassVar[Type[Model]] - def get_fieldsets(self, request, obj=None): + def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[tuple[str, dict[str, list[str]]]]: if request: pass @@ -54,14 +56,16 @@ class FieldsetsMixin: fieldsets = [] - def add_translations_fieldset(fss): + def add_translations_fieldset( + fss: list[tuple[str, dict[str, list[str]]]], + ) -> list[tuple[str, dict[str, list[str]]]]: with suppress(NotRegistered): transoptions = translator.get_options_for_model(self.model) translation_fields = [] for orig in transoptions.local_fields: translation_fields += get_translation_fields(orig) if translation_fields: - fss = list(fss) + [(_("translations"), {"fields": translation_fields})] + fss = list(fss) + [(_("translations"), {"fields": translation_fields})] # type: ignore [list-item] return fss if self.general_fields: @@ -95,8 +99,8 @@ class FieldsetsMixin: ts.append(name) if ts: fieldsets.append((_("timestamps"), {"fields": ts, "classes": ["collapse"]})) - fieldsets = add_translations_fieldset(fieldsets) - return fieldsets + fieldsets = add_translations_fieldset(fieldsets) # type: ignore [arg-type, assignment] + return fieldsets # type: ignore [return-value] # noinspection PyUnresolvedReferences @@ -110,29 +114,29 @@ class ActivationActionsMixin: ] @action(description=_("activate selected %(verbose_name_plural)s").lower(), permissions=["change"]) - def activate_selected(self, request, queryset): + def activate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None: try: queryset.update(is_active=True) - self.message_user( + self.message_user( # type: ignore [attr-defined] request=request, message=_("selected items have been activated.").lower(), level=messages.SUCCESS ) except Exception as e: - self.message_user(request=request, message=str(e), level=messages.ERROR) + self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined] @action(description=_("deactivate selected %(verbose_name_plural)s").lower(), permissions=["change"]) - def deactivate_selected(self, request, queryset): + def deactivate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None: try: queryset.update(is_active=False) - self.message_user( + self.message_user( # type: ignore [attr-defined] request=request, message=_("selected items have been deactivated.").lower(), level=messages.SUCCESS ) except Exception as e: - self.message_user(request=request, message=str(e), level=messages.ERROR) + self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined] -class AttributeValueInline(TabularInline): +class AttributeValueInline(TabularInline): # type: ignore [type-arg] model = AttributeValue extra = 0 autocomplete_fields = ["attribute"] @@ -142,7 +146,7 @@ class AttributeValueInline(TabularInline): icon = "fa-solid fa-list-ul" -class ProductImageInline(TabularInline): +class ProductImageInline(TabularInline): # type: ignore [type-arg] model = ProductImage extra = 0 is_navtab = True @@ -151,7 +155,7 @@ class ProductImageInline(TabularInline): icon = "fa-regular fa-images" -class StockInline(TabularInline): +class StockInline(TabularInline): # type: ignore [type-arg] model = Stock extra = 0 is_navtab = True @@ -160,7 +164,7 @@ class StockInline(TabularInline): icon = "fa-solid fa-boxes-stacked" -class OrderProductInline(TabularInline): +class OrderProductInline(TabularInline): # type: ignore [type-arg] model = OrderProduct extra = 0 readonly_fields = ("product", "quantity", "buy_price") @@ -174,7 +178,7 @@ class OrderProductInline(TabularInline): return super().get_queryset(request).select_related("product").only("product__name") -class CategoryChildrenInline(TabularInline): +class CategoryChildrenInline(TabularInline): # type: ignore [type-arg] model = Category fk_name = "parent" extra = 0 @@ -186,7 +190,7 @@ class CategoryChildrenInline(TabularInline): @register(AttributeGroup) -class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = AttributeGroup # type: ignore [misc] list_display = ( @@ -210,7 +214,7 @@ class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): @register(Attribute) -class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Attribute # type: ignore [misc] list_display = ( @@ -251,7 +255,7 @@ class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ @register(AttributeValue) -class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = AttributeValue # type: ignore [misc] list_display = ( @@ -336,7 +340,7 @@ class CategoryAdmin(FieldsetsMixin, ActivationActionsMixin, DraggableMPTTAdmin): @register(Brand) -class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Brand # type: ignore [misc] list_display = ( @@ -373,7 +377,7 @@ class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i @register(Product) -class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Product # type: ignore [misc] list_display = ( @@ -436,7 +440,7 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: @register(ProductTag) -class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = ProductTag # type: ignore [misc] list_display = ("tag_name",) @@ -454,7 +458,7 @@ class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # ty @register(CategoryTag) -class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = CategoryTag # type: ignore [misc] list_display = ( @@ -480,7 +484,7 @@ class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # t @register(Vendor) -class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Vendor # type: ignore [misc] list_display = ( @@ -518,7 +522,7 @@ class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: @register(Feedback) -class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Feedback # type: ignore [misc] list_display = ( @@ -551,7 +555,7 @@ class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type @register(Order) -class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Order # type: ignore [misc] list_display = ( @@ -602,7 +606,7 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i @register(OrderProduct) -class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = OrderProduct # type: ignore [misc] list_display = ( @@ -640,7 +644,7 @@ class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # @register(PromoCode) -class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = PromoCode # type: ignore [misc] list_display = ( @@ -684,7 +688,7 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ @register(Promotion) -class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Promotion # type: ignore [misc] list_display = ( @@ -711,7 +715,7 @@ class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ @register(Stock) -class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Stock # type: ignore [misc] list_display = ( @@ -755,7 +759,7 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i @register(Wishlist) -class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = Wishlist # type: ignore [misc] list_display = ( @@ -781,7 +785,7 @@ class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type @register(ProductImage) -class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = ProductImage # type: ignore [misc] list_display = ( @@ -817,7 +821,7 @@ class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # @register(Address) -class AddressAdmin(FieldsetsMixin, GISModelAdmin): +class AddressAdmin(FieldsetsMixin, GISModelAdmin): # type: ignore [misc] # noinspection PyClassVar model = Address # type: ignore [misc] list_display = ( @@ -867,7 +871,7 @@ class AddressAdmin(FieldsetsMixin, GISModelAdmin): @register(CustomerRelationshipManagementProvider) -class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin): +class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = CustomerRelationshipManagementProvider # type: ignore [misc] list_display = ( @@ -896,7 +900,7 @@ class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin): @register(OrderCrmLink) -class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin): +class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin): # type: ignore [misc, type-arg] # noinspection PyClassVar model = OrderCrmLink # type: ignore [misc] list_display = ( @@ -938,22 +942,22 @@ class ConstanceConfig: swapped = False is_composite_pk = False - def get_change_permission(self): + def get_change_permission(self) -> str: return f"change_{self.model_name}" @property - def app_config(self): + def app_config(self) -> AppConfig: return apps.get_app_config(self.app_label) @property - def label(self): + def label(self) -> str: return f"{self.app_label}.{self.object_name}" @property - def label_lower(self): + def label_lower(self) -> str: return f"{self.app_label}.{self.model_name}" - def get_ordered_objects(self): + def get_ordered_objects(self) -> bool: return False _meta = Meta() @@ -963,6 +967,6 @@ class ConstanceConfig: site.unregister([Config]) # noinspection PyTypeChecker site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore [list-item] -site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment] +site.site_title = settings.CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment] site.site_header = "eVibes" -site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment] +site.index_title = settings.CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment] diff --git a/core/apps.py b/core/apps.py index 3cd3db0a..749486f9 100644 --- a/core/apps.py +++ b/core/apps.py @@ -11,6 +11,6 @@ class CoreConfig(AppConfig): hide = False # noinspection PyUnresolvedReferences - def ready(self): + def ready(self) -> None: import core.elasticsearch.documents import core.signals # noqa: F401 diff --git a/core/elasticsearch/__init__.py b/core/elasticsearch/__init__.py index eff8e46c..e695c99a 100644 --- a/core/elasticsearch/__init__.py +++ b/core/elasticsearch/__init__.py @@ -113,7 +113,7 @@ def process_query( request: Request | None = None, indexes: tuple[str, ...] = ("categories", "brands", "products"), use_transliteration: bool = True, -) -> dict[str, list[dict]] | None: +) -> dict[str, list[dict[str, Any]]] | None: if not query: raise ValueError(_("no search term provided.")) @@ -235,7 +235,7 @@ def process_query( ): hit_cache.append(h) if getattr(h, "uuid", None): - uuids_by_index.setdefault(h.meta.index, []).append(str(h.uuid)) + uuids_by_index.setdefault(h.meta.index, []).append({"uuid": str(h.uuid)}) products_by_uuid = {} brands_by_uuid = {} @@ -329,9 +329,9 @@ def _lang_analyzer(lang_code: str) -> str: class ActiveOnlyMixin: def get_queryset(self) -> QuerySet[Any]: - return super().get_queryset().filter(is_active=True) + return super().get_queryset().filter(is_active=True) # type: ignore [no-any-return, misc] - def should_index_object(self, obj) -> bool: + def should_index_object(self, obj) -> bool: # type: ignore [no-untyped-def] return getattr(obj, "is_active", False) @@ -436,7 +436,7 @@ COMMON_ANALYSIS = { } -def add_multilang_fields(cls) -> None: +def add_multilang_fields(cls: Any) -> None: for code, _lang in settings.LANGUAGES: lc = code.replace("-", "_").lower() name_field = f"name_{lc}" @@ -480,10 +480,11 @@ def add_multilang_fields(cls) -> None: setattr(cls, f"prepare_{desc_field}", make_prepare(desc_field)) -def populate_index(): +def populate_index() -> None: for doc in registry.get_documents(set(registry.get_models())): qs = doc().get_indexing_queryset() doc().update(qs, parallel=True, refresh=True) + return None def process_system_query( @@ -493,7 +494,7 @@ def process_system_query( size_per_index: int = 25, language_code: str | None = None, use_transliteration: bool = True, -) -> dict[str, list[dict]]: +) -> dict[str, list[dict[str, Any]]]: if not query: raise ValueError(_("no search term provided.")) @@ -526,7 +527,7 @@ def process_system_query( **({"fuzziness": fuzzy} if fuzzy else {}), ) - results: dict[str, list[dict]] = {idx: [] for idx in indexes} + results: dict[str, list[dict[str, Any]]] = {idx: [] for idx in indexes} for idx in indexes: s = Search(index=[idx]).query(mm).extra(size=size_per_index, track_total_hits=False) diff --git a/core/elasticsearch/documents.py b/core/elasticsearch/documents.py index 4e1bb8e9..a7904383 100644 --- a/core/elasticsearch/documents.py +++ b/core/elasticsearch/documents.py @@ -1,3 +1,6 @@ +from typing import Any + +from django.db.models import Model, QuerySet from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry from health_check.db.models import TestModel @@ -6,7 +9,7 @@ from core.elasticsearch import COMMON_ANALYSIS, ActiveOnlyMixin, add_multilang_f from core.models import Brand, Category, Product -class BaseDocument(Document): +class BaseDocument(Document): # type: ignore [misc] name = fields.TextField( attr="name", analyzer="standard", @@ -39,10 +42,10 @@ class BaseDocument(Document): "index": {"max_ngram_diff": 20}, } - def prepare_name(self, instance): + def prepare_name(self, instance: Model) -> str: return getattr(instance, "name", "") or "" - def prepare_description(self, instance): + def prepare_description(self, instance: Model) -> str: return getattr(instance, "description", "") or "" @@ -103,7 +106,7 @@ class ProductDocument(ActiveOnlyMixin, BaseDocument): }, ) - def get_queryset(self): + def get_queryset(self) -> QuerySet[Product]: return ( super() .get_queryset() @@ -156,7 +159,7 @@ add_multilang_fields(BrandDocument) registry.register_document(BrandDocument) -class TestModelDocument(Document): +class TestModelDocument(Document): # type: ignore [misc] class Index: name = "testmodels" @@ -164,7 +167,7 @@ class TestModelDocument(Document): model = TestModel fields = ["title"] ignore_signals = True - related_models: list = [] + related_models: list[Any] = [] auto_refresh = False diff --git a/core/filters.py b/core/filters.py index 5fd261fa..713cc480 100644 --- a/core/filters.py +++ b/core/filters.py @@ -1,6 +1,7 @@ import json import logging import uuid +from typing import Any from django.core.exceptions import BadRequest from django.db.models import ( @@ -19,6 +20,7 @@ from django.db.models import ( When, ) from django.db.models.functions import Coalesce +from django.http import HttpRequest from django.utils.http import urlsafe_base64_decode from django.utils.translation import gettext_lazy as _ from django_filters import ( @@ -31,6 +33,8 @@ from django_filters import ( OrderingFilter, UUIDFilter, ) +from graphene import Context +from rest_framework.request import Request from core.elasticsearch import process_query from core.models import Address, Brand, Category, Feedback, Order, Product, Stock, Wishlist @@ -38,8 +42,8 @@ from core.models import Address, Brand, Category, Feedback, Order, Product, Stoc logger = logging.getLogger("django") -class CaseInsensitiveListFilter(BaseInFilter, CharFilter): - def filter(self, qs, value): +class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # type: ignore [misc] + def filter(self, qs: QuerySet[Any], value: Any) -> QuerySet[Any]: if not value: return qs @@ -61,7 +65,7 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # noinspection PyUnusedLocal -class ProductFilter(FilterSet): +class ProductFilter(FilterSet): # type: ignore [misc] search = CharFilter(field_name="name", method="search_products", label=_("Search")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) name = CharFilter(lookup_expr="icontains", label=_("Name")) @@ -121,7 +125,15 @@ class ProductFilter(FilterSet): "order_by", ] - def __init__(self, data=None, queryset=None, *, request=None, prefix=None): + # noinspection PyTypeHints + def __init__( + self, + data: dict[Any, Any] | None = None, + queryset: QuerySet[Product] | None = None, + *, + request: HttpRequest | Request | Context = None, + prefix: str | None = None, + ) -> None: super().__init__(data=data, queryset=queryset, request=request, prefix=prefix) ordering_param = self.data.get("order_by", "") if ordering_param: @@ -133,7 +145,7 @@ class ProductFilter(FilterSet): .annotate(avg_rating=Avg("rating")) .values("avg_rating") ) - self.queryset = self.queryset.annotate( + self.queryset: QuerySet[Product] = self.queryset.annotate( rating=Coalesce( Subquery(feedback_qs, output_field=FloatField()), Value(0, output_field=FloatField()), @@ -148,7 +160,7 @@ class ProductFilter(FilterSet): ) ) - def search_products(self, queryset: QuerySet[Product], name, value): + def search_products(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]: if not value: return queryset @@ -156,17 +168,17 @@ class ProductFilter(FilterSet): return queryset.filter(uuid__in=uuids) - def filter_include_flag(self, queryset, name, value): + def filter_include_flag(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]: if not self.data.get("category_uuid"): raise BadRequest(_("there must be a category_uuid to use include_subcategories flag")) return queryset - def filter_include_personal_ordered(self, queryset, name, value): + def filter_include_personal_ordered(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]: if self.data.get("include_personal_ordered", False): queryset = queryset.filter(stocks__isnull=False, stocks__quantity__gt=0, stocks__price__gt=0) return queryset - def filter_attributes(self, queryset, name, value): + def filter_attributes(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]: if not value: return queryset @@ -228,7 +240,7 @@ class ProductFilter(FilterSet): return queryset - def filter_category(self, queryset, name, value): + def filter_category(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]: if not value: return queryset @@ -247,7 +259,7 @@ class ProductFilter(FilterSet): return queryset.filter(category__uuid=value) @staticmethod - def _infer_type(value): + def _infer_type(value: str) -> Any: try: parsed_value = json.loads(value) if isinstance(parsed_value, list | dict): @@ -271,7 +283,7 @@ class ProductFilter(FilterSet): return value @property - def qs(self): + def qs(self) -> QuerySet[Product]: qs = super().qs ordering_param = self.data.get("order_by", "") @@ -320,7 +332,8 @@ class ProductFilter(FilterSet): return qs.distinct() -class OrderFilter(FilterSet): +# noinspection PyUnusedLocal +class OrderFilter(FilterSet): # type: ignore [misc] search = CharFilter( method="filter_search", label=_("Search (ID, product name or part number)"), @@ -367,7 +380,7 @@ class OrderFilter(FilterSet): "max_buy_time", ] - def filter_search(self, queryset, _name, value): + def filter_search(self, queryset: QuerySet[Order], name: str, value: str): return queryset.filter( Q(human_readable_id__icontains=value) | Q(order_products__product__name__icontains=value) @@ -375,7 +388,7 @@ class OrderFilter(FilterSet): ).distinct() -class WishlistFilter(FilterSet): +class WishlistFilter(FilterSet): # type: ignore [misc] uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") user_email = CharFilter(field_name="user__email", lookup_expr="iexact", label=_("User email")) user = UUIDFilter(field_name="user__uuid", lookup_expr="exact", label=_("User UUID")) @@ -395,7 +408,7 @@ class WishlistFilter(FilterSet): # noinspection PyUnusedLocal -class CategoryFilter(FilterSet): +class CategoryFilter(FilterSet): # type: ignore [misc] search = CharFilter(field_name="name", method="search_categories", label=_("Search")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") name = CharFilter(lookup_expr="icontains", label=_("Name")) @@ -424,7 +437,7 @@ class CategoryFilter(FilterSet): "whole", ] - def search_categories(self, queryset: QuerySet[Product], name, value): + def search_categories(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]: if not value: return queryset @@ -432,7 +445,7 @@ class CategoryFilter(FilterSet): return queryset.filter(uuid__in=uuids) - def filter_order_by(self, queryset, _name, value): + def filter_order_by(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]: if not value: return queryset @@ -456,7 +469,7 @@ class CategoryFilter(FilterSet): qs = queryset.order_by(order_expression).prefetch_related(None) - def create_ordered_tree_prefetch(max_depth=10): + def create_ordered_tree_prefetch(max_depth=10) -> Prefetch | None: if field == "?": def build_random_prefetch(depth): @@ -494,7 +507,7 @@ class CategoryFilter(FilterSet): return qs - def filter_whole_categories(self, queryset, _name, value): + def filter_whole_categories(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]: has_own_products = Exists(Product.objects.filter(category=OuterRef("pk"))) has_desc_products = Exists( Product.objects.filter( @@ -509,7 +522,7 @@ class CategoryFilter(FilterSet): return annotated.filter(has_products=True).distinct() return annotated.filter(has_products=False).distinct() - def filter_parent_uuid(self, queryset, _name, value): + def filter_parent_uuid(self, queryset: QuerySet[Category], name: str, value: str): if value in ("", "null", "None"): return queryset.filter(parent=None) @@ -522,7 +535,7 @@ class CategoryFilter(FilterSet): # noinspection PyUnusedLocal -class BrandFilter(FilterSet): +class BrandFilter(FilterSet): # type: ignore [misc] search = CharFilter(field_name="name", method="search_brands", label=_("Search")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") name = CharFilter(lookup_expr="icontains", label=_("Name")) @@ -543,7 +556,7 @@ class BrandFilter(FilterSet): model = Brand fields = ["uuid", "name", "slug", "priority"] - def search_brands(self, queryset: QuerySet[Product], name, value): + def search_brands(self, queryset: QuerySet[Brand], name: str, value: str) -> QuerySet[Brand]: if not value: return queryset @@ -552,7 +565,7 @@ class BrandFilter(FilterSet): return queryset.filter(uuid__in=uuids) -class FeedbackFilter(FilterSet): +class FeedbackFilter(FilterSet): # type: ignore [misc] uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) product_uuid = UUIDFilter( field_name="order_product__product__uuid", @@ -581,7 +594,7 @@ class FeedbackFilter(FilterSet): fields = ["uuid", "product_uuid", "user_uuid", "order_by"] -class AddressFilter(FilterSet): +class AddressFilter(FilterSet): # type: ignore [misc] uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) user_uuid = UUIDFilter(field_name="user__uuid", lookup_expr="exact", label=_("User UUID")) user_email = CharFilter(field_name="user__email", lookup_expr="iexact", label=_("User email")) diff --git a/core/graphene/__init__.py b/core/graphene/__init__.py index 1fe565b9..382eefd7 100644 --- a/core/graphene/__init__.py +++ b/core/graphene/__init__.py @@ -1,10 +1,12 @@ +from typing import Any + from graphene import Mutation class BaseMutation(Mutation): # type: ignore [misc] - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args: list[Any], **kwargs: dict[Any, Any]) -> None: super().__init__(*args, **kwargs) @staticmethod - def mutate(**kwargs) -> None: + def mutate(**kwargs: Any) -> None: pass diff --git a/core/graphene/mutations.py b/core/graphene/mutations.py index 2abe75cf..77945258 100644 --- a/core/graphene/mutations.py +++ b/core/graphene/mutations.py @@ -1,4 +1,5 @@ import logging +from typing import Any import requests from django.core.cache import cache @@ -31,6 +32,7 @@ from payments.graphene.object_types import TransactionType logger = logging.getLogger("django") +# noinspection PyUnusedLocal class CacheOperator(BaseMutation): class Meta: description = _("cache I/O") @@ -46,10 +48,11 @@ class CacheOperator(BaseMutation): data = GenericScalar(description=_("cached data")) @staticmethod - def mutate(_parent, info, key, data=None, timeout=None): + def mutate(parent, info, key, data=None, timeout=None) -> dict[Any, Any]: # type: ignore [override] return camelize(web_cache(info.context, key, data, timeout)) +# noinspection PyUnusedLocal class RequestCursedURL(BaseMutation): class Meta: description = _("request a CORSed URL") @@ -60,7 +63,7 @@ class RequestCursedURL(BaseMutation): data = GenericScalar(description=_("camelized JSON data from the requested URL")) @staticmethod - def mutate(_parent, info, url): + def mutate(parent, info, url) -> dict[str, Any]: # type: ignore [override] if not is_url_safe(url): raise BadRequest(_("only URLs starting with http(s):// are allowed")) try: @@ -75,6 +78,7 @@ class RequestCursedURL(BaseMutation): return {"data": {"error": str(e)}} +# noinspection PyUnusedLocal,PyTypeChecker class AddOrderProduct(BaseMutation): class Meta: description = _("add a product to the order") @@ -87,7 +91,7 @@ class AddOrderProduct(BaseMutation): order = Field(OrderType) @staticmethod - def mutate(_parent, info, product_uuid, order_uuid, attributes=None): + def mutate(parent, info, product_uuid, order_uuid, attributes=None): # type: ignore [override] user = info.context.user try: order = Order.objects.get(uuid=order_uuid) @@ -101,6 +105,7 @@ class AddOrderProduct(BaseMutation): raise Http404(_(f"order {order_uuid} not found")) from dne +# noinspection PyUnusedLocal class RemoveOrderProduct(BaseMutation): class Meta: description = _("remove a product from the order") @@ -113,7 +118,7 @@ class RemoveOrderProduct(BaseMutation): order = Field(OrderType) @staticmethod - def mutate(_parent, info, product_uuid, order_uuid, attributes=None): + def mutate(parent, info, product_uuid, order_uuid, attributes=None) -> AddOrderProduct | None: # type: ignore [override] user = info.context.user try: order = Order.objects.get(uuid=order_uuid) @@ -127,6 +132,7 @@ class RemoveOrderProduct(BaseMutation): raise Http404(_(f"order {order_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class RemoveAllOrderProducts(BaseMutation): class Meta: description = _("remove all products from the order") @@ -137,7 +143,7 @@ class RemoveAllOrderProducts(BaseMutation): order = Field(OrderType) @staticmethod - def mutate(_parent, info, order_uuid): + def mutate(parent, info, order_uuid): # type: ignore [override] user = info.context.user order = Order.objects.get(uuid=order_uuid) if not (user.has_perm("core.delete_orderproduct") or user == order.user): @@ -148,6 +154,7 @@ class RemoveAllOrderProducts(BaseMutation): return RemoveAllOrderProducts(order=order) +# noinspection PyUnusedLocal,PyTypeChecker class RemoveOrderProductsOfAKind(BaseMutation): class Meta: description = _("remove a product from the order") @@ -159,7 +166,7 @@ class RemoveOrderProductsOfAKind(BaseMutation): order = Field(OrderType) @staticmethod - def mutate(_parent, info, product_uuid, order_uuid): + def mutate(parent, info, product_uuid, order_uuid): # type: ignore [override] user = info.context.user order = Order.objects.get(uuid=order_uuid) if not (user.has_perm("core.delete_orderproduct") or user == order.user): @@ -170,6 +177,7 @@ class RemoveOrderProductsOfAKind(BaseMutation): return RemoveOrderProductsOfAKind(order=order) +# noinspection PyUnusedLocal,PyTypeChecker class BuyOrder(BaseMutation): class Meta: description = _("buy an order") @@ -189,7 +197,7 @@ class BuyOrder(BaseMutation): @staticmethod def mutate( - _parent, + parent, info, order_uuid=None, order_hr_id=None, @@ -199,7 +207,7 @@ class BuyOrder(BaseMutation): shipping_address=None, billing_address=None, chosen_products=None, - ): + ): # type: ignore [override] if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]): raise BadRequest(_("please provide either order_uuid or order_hr_id - mutually exclusive")) user = info.context.user @@ -232,6 +240,7 @@ class BuyOrder(BaseMutation): raise Http404(_(f"order {order_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class BulkOrderAction(BaseMutation): class Meta: description = _("perform an action on a list of products in the order") @@ -246,13 +255,13 @@ class BulkOrderAction(BaseMutation): @staticmethod def mutate( - _parent, + parent, info, action, products, order_uuid=None, order_hr_id=None, - ): + ): # type: ignore [override] if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]): raise BadRequest(_("please provide either order_uuid or order_hr_id - mutually exclusive")) user = info.context.user @@ -279,6 +288,7 @@ class BulkOrderAction(BaseMutation): raise Http404(_(f"order {order_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class BulkWishlistAction(BaseMutation): class Meta: description = _("perform an action on a list of products in the wishlist") @@ -292,12 +302,12 @@ class BulkWishlistAction(BaseMutation): @staticmethod def mutate( - _parent, + parent, info, action, products, wishlist_uuid=None, - ): + ): # type: ignore [override] if not wishlist_uuid: raise BadRequest(_("please provide wishlist_uuid value")) user = info.context.user @@ -319,6 +329,7 @@ class BulkWishlistAction(BaseMutation): raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne +# noinspection PyUnusedLocal class BuyUnregisteredOrder(BaseMutation): class Meta: description = _("purchase an order without account creation") @@ -338,7 +349,7 @@ class BuyUnregisteredOrder(BaseMutation): @staticmethod def mutate( - _parent, + parent, info, products, customer_name, @@ -349,7 +360,7 @@ class BuyUnregisteredOrder(BaseMutation): customer_shipping_address=None, promocode_uuid=None, is_business=False, - ): + ): # type: ignore [override] order = Order.objects.create(status="MOMENTAL") transaction = order.buy_without_registration( products=products, @@ -362,9 +373,11 @@ class BuyUnregisteredOrder(BaseMutation): payment_method=payment_method, is_business=is_business, ) + # noinspection PyTypeChecker return BuyUnregisteredOrder(transaction=transaction) +# noinspection PyUnusedLocal,PyTypeChecker class AddWishlistProduct(BaseMutation): class Meta: description = _("add a product to the wishlist") @@ -376,7 +389,7 @@ class AddWishlistProduct(BaseMutation): wishlist = Field(WishlistType) @staticmethod - def mutate(_parent, info, product_uuid, wishlist_uuid): + def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override] user = info.context.user try: wishlist = Wishlist.objects.get(uuid=wishlist_uuid) @@ -392,6 +405,7 @@ class AddWishlistProduct(BaseMutation): raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class RemoveWishlistProduct(BaseMutation): class Meta: description = _("remove a product from the wishlist") @@ -403,7 +417,7 @@ class RemoveWishlistProduct(BaseMutation): wishlist = Field(WishlistType) @staticmethod - def mutate(_parent, info, product_uuid, wishlist_uuid): + def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override] user = info.context.user try: wishlist = Wishlist.objects.get(uuid=wishlist_uuid) @@ -419,6 +433,7 @@ class RemoveWishlistProduct(BaseMutation): raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class RemoveAllWishlistProducts(BaseMutation): class Meta: description = _("remove all products from the wishlist") @@ -429,7 +444,7 @@ class RemoveAllWishlistProducts(BaseMutation): wishlist = Field(WishlistType) @staticmethod - def mutate(_parent, info, wishlist_uuid): + def mutate(parent, info, wishlist_uuid): # type: ignore [override] user = info.context.user try: wishlist = Wishlist.objects.get(uuid=wishlist_uuid) @@ -446,6 +461,7 @@ class RemoveAllWishlistProducts(BaseMutation): raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class BuyWishlist(BaseMutation): class Meta: description = _("buy all products from the wishlist") @@ -459,7 +475,7 @@ class BuyWishlist(BaseMutation): transaction = Field(TransactionType, required=False) @staticmethod - def mutate(_parent, info, wishlist_uuid, force_balance=False, force_payment=False): + def mutate(parent, info, wishlist_uuid, force_balance=False, force_payment=False): # type: ignore [override] user = info.context.user try: wishlist = Wishlist.objects.get(uuid=wishlist_uuid) @@ -489,6 +505,7 @@ class BuyWishlist(BaseMutation): raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class BuyProduct(BaseMutation): class Meta: description = _("buy a product") @@ -507,13 +524,13 @@ class BuyProduct(BaseMutation): @staticmethod def mutate( - _parent, + parent, info, product_uuid, attributes=None, force_balance=False, force_payment=False, - ): + ): # type: ignore [override] user = info.context.user order = Order.objects.create(user=user, status="MOMENTAL") order.add_product(product_uuid=product_uuid, attributes=format_attributes(attributes)) @@ -527,6 +544,7 @@ class BuyProduct(BaseMutation): raise TypeError(_(f"wrong type came from order.buy() method: {type(instance)!s}")) +# noinspection PyUnusedLocal,PyTypeChecker class FeedbackProductAction(BaseMutation): class Meta: description = _("add or delete a feedback for orderproduct") @@ -540,7 +558,7 @@ class FeedbackProductAction(BaseMutation): feedback = Field(FeedbackType, required=False) @staticmethod - def mutate(_parent, info, order_product_uuid, action, comment=None, rating=None): + def mutate(parent, info, order_product_uuid, action, comment=None, rating=None): # type: ignore [override] user = info.context.user try: order_product = OrderProduct.objects.get(uuid=order_product_uuid) @@ -559,6 +577,7 @@ class FeedbackProductAction(BaseMutation): raise Http404(_(f"order product {order_product_uuid} not found")) from dne +# noinspection PyUnusedLocal,PyTypeChecker class CreateProduct(BaseMutation): class Arguments: name = String(required=True) @@ -568,7 +587,7 @@ class CreateProduct(BaseMutation): product = Field(ProductType) @staticmethod - def mutate(_parent, info, name, category_uuid, description=None): + def mutate(parent, info, name, category_uuid, description=None): # type: ignore [override] if not info.context.user.has_perm("core.add_product"): raise PermissionDenied(permission_denied_message) category = Category.objects.get(uuid=category_uuid) @@ -576,6 +595,7 @@ class CreateProduct(BaseMutation): return CreateProduct(product=product) +# noinspection PyUnusedLocal,PyTypeChecker class UpdateProduct(BaseMutation): class Arguments: uuid = UUID(required=True) @@ -586,7 +606,7 @@ class UpdateProduct(BaseMutation): product = Field(ProductType) @staticmethod - def mutate(_parent, info, uuid, name=None, description=None, category_uuid=None): + def mutate(parent, info, uuid, name=None, description=None, category_uuid=None): # type: ignore [override] user = info.context.user if not user.has_perm("core.change_product"): raise PermissionDenied(permission_denied_message) @@ -601,6 +621,7 @@ class UpdateProduct(BaseMutation): return UpdateProduct(product=product) +# noinspection PyUnusedLocal,PyTypeChecker class DeleteProduct(BaseMutation): class Arguments: uuid = UUID(required=True) @@ -608,7 +629,7 @@ class DeleteProduct(BaseMutation): ok = Boolean() @staticmethod - def mutate(_parent, info, uuid): + def mutate(parent, info, uuid): # type: ignore [override] user = info.context.user if not user.has_perm("core.delete_product"): raise PermissionDenied(permission_denied_message) @@ -617,6 +638,7 @@ class DeleteProduct(BaseMutation): return DeleteProduct(ok=True) +# noinspection PyUnusedLocal,PyTypeChecker class CreateAddress(BaseMutation): class Arguments: raw_data = String(required=True, description=_("original address string provided by the user")) @@ -624,13 +646,14 @@ class CreateAddress(BaseMutation): address = Field(AddressType) @staticmethod - def mutate(_parent, info, raw_data): + def mutate(parent, info, raw_data): # type: ignore [override] user = info.context.user if info.context.user.is_authenticated else None address = Address.objects.create(raw_data=raw_data, user=user) return CreateAddress(address=address) +# noinspection PyUnusedLocal class DeleteAddress(BaseMutation): class Arguments: uuid = UUID(required=True) @@ -638,7 +661,7 @@ class DeleteAddress(BaseMutation): success = Boolean() @staticmethod - def mutate(_parent, info, uuid): + def mutate(parent, info, uuid): # type: ignore [override] try: address = Address.objects.get(uuid=uuid) if ( @@ -647,6 +670,7 @@ class DeleteAddress(BaseMutation): or info.context.user == address.user ): address.delete() + # noinspection PyTypeChecker return DeleteAddress(success=True) raise PermissionDenied(permission_denied_message) @@ -656,6 +680,7 @@ class DeleteAddress(BaseMutation): raise Http404(_(f"{name} does not exist: {uuid}")) from dne +# noinspection PyUnusedLocal class AutocompleteAddress(BaseMutation): class Arguments: q = String() @@ -664,7 +689,7 @@ class AutocompleteAddress(BaseMutation): suggestions = GenericScalar() @staticmethod - def mutate(_parent, info, q, limit): + def mutate(parent, info, q, limit): # type: ignore [override] if 1 > limit > 10: raise BadRequest(_("limit must be between 1 and 10")) try: @@ -672,9 +697,11 @@ class AutocompleteAddress(BaseMutation): except Exception as e: raise BadRequest(f"geocoding error: {e!s}") from e + # noinspection PyTypeChecker return AutocompleteAddress(suggestions=suggestions) +# noinspection PyUnusedLocal class ContactUs(BaseMutation): class Arguments: email = String(required=True) @@ -687,7 +714,7 @@ class ContactUs(BaseMutation): error = String() @staticmethod - def mutate(_parent, info, email, name, subject, message, phone_number=None): + def mutate(parent, info, email, name, subject, message, phone_number=None): # type: ignore [override] try: contact_us_email.delay( { @@ -698,12 +725,14 @@ class ContactUs(BaseMutation): "message": message, } ) + # noinspection PyTypeChecker return ContactUs(received=True) except Exception as e: + # noinspection PyTypeChecker return ContactUs(received=False, error=str(e)) -# noinspection PyArgumentList +# noinspection PyArgumentList PyUnusedLocal class Search(BaseMutation): class Arguments: query = String(required=True) @@ -714,9 +743,10 @@ class Search(BaseMutation): description = _("elasticsearch - works like a charm") @staticmethod - def mutate(_parent, info, query): + def mutate(parent, info, query): # type: ignore [override] data = process_query(query=query, request=info.context) + # noinspection PyTypeChecker return Search( results=SearchResultsType( products=data["products"], diff --git a/core/graphene/object_types.py b/core/graphene/object_types.py index b80fdcc9..8d97f7b9 100644 --- a/core/graphene/object_types.py +++ b/core/graphene/object_types.py @@ -3,7 +3,7 @@ from typing import Any from constance import config from django.core.cache import cache -from django.db.models import Max, Min +from django.db.models import Max, Min, QuerySet from django.db.models.functions import Length from django.utils.translation import gettext_lazy as _ from graphene import ( @@ -60,7 +60,7 @@ from payments.graphene.object_types import TransactionType logger = logging.getLogger("django") -class SEOMetaType(ObjectType): +class SEOMetaType(ObjectType): # type: ignore [misc] title = String() description = String() canonical = String() @@ -71,7 +71,7 @@ class SEOMetaType(ObjectType): hreflang = String() -class AttributeType(DjangoObjectType): +class AttributeType(DjangoObjectType): # type: ignore [misc] values = List(lambda: AttributeValueType, description=_("attribute values")) class Meta: @@ -81,7 +81,7 @@ class AttributeType(DjangoObjectType): filter_fields = ["uuid"] description = _("attributes") - def resolve_values(self, info): + def resolve_values(self, info) -> QuerySet[AttributeValue]: base_qs = AttributeValue.objects.filter(attribute=self) product_uuid = getattr(info.context, "_product_uuid", None) @@ -91,7 +91,7 @@ class AttributeType(DjangoObjectType): return base_qs -class AttributeGroupType(DjangoObjectType): +class AttributeGroupType(DjangoObjectType): # type: ignore [misc] attributes = List(lambda: AttributeType, description=_("grouped attributes")) class Meta: @@ -101,7 +101,7 @@ class AttributeGroupType(DjangoObjectType): filter_fields = ["uuid"] description = _("groups of attributes") - def resolve_attributes(self: AttributeGroup, info): + def resolve_attributes(self: AttributeGroup, info) -> QuerySet[Attribute]: product_uuid = getattr(info.context, "_product_uuid", None) qs = self.attributes.all() @@ -112,7 +112,7 @@ class AttributeGroupType(DjangoObjectType): return qs -class BrandType(DjangoObjectType): +class BrandType(DjangoObjectType): # type: ignore [misc] categories = List(lambda: CategoryType, description=_("categories")) seo_meta = Field(SEOMetaType, description=_("SEO Meta snapshot")) @@ -123,18 +123,18 @@ class BrandType(DjangoObjectType): filter_fields = ["uuid", "name"] description = _("brands") - def resolve_categories(self: Brand, info): + def resolve_categories(self: Brand, info) -> QuerySet[Category]: if info.context.user.has_perm("core.view_category"): return self.categories.all() return self.categories.filter(is_active=True) - def resolve_big_logo(self: Brand, info): + def resolve_big_logo(self: Brand, info) -> str | None: return info.context.build_absolute_uri(self.big_logo.url) if self.big_logo else "" - def resolve_small_logo(self: Brand, info): + def resolve_small_logo(self: Brand, info) -> str | None: return info.context.build_absolute_uri(self.small_logo.url) if self.small_logo else "" - def resolve_seo_meta(self: Brand, info): + def resolve_seo_meta(self: Brand, info) -> dict[str, str | list[Any] | dict[str, str] | None]: lang = graphene_current_lang() base = f"https://{config.BASE_DOMAIN}" canonical = f"{base}/{lang}/brand/{self.slug}" @@ -177,17 +177,17 @@ class BrandType(DjangoObjectType): } -class FilterableAttributeType(ObjectType): +class FilterableAttributeType(ObjectType): # type: ignore [misc] attribute_name = String(required=True) possible_values = List(String, required=True) -class MinMaxPriceType(ObjectType): +class MinMaxPriceType(ObjectType): # type: ignore [misc] min_price = Float() max_price = Float() -class CategoryType(DjangoObjectType): +class CategoryType(DjangoObjectType): # type: ignore [misc] children = List( lambda: CategoryType, description=_("categories"), @@ -340,7 +340,7 @@ class CategoryType(DjangoObjectType): } -class VendorType(DjangoObjectType): +class VendorType(DjangoObjectType): # type: ignore [misc] markup_percent = Float(description=_("markup percentage")) class Meta: @@ -351,7 +351,7 @@ class VendorType(DjangoObjectType): description = _("vendors") -class AddressType(DjangoObjectType): +class AddressType(DjangoObjectType): # type: ignore [misc] latitude = Float(description=_("Latitude (Y coordinate)")) longitude = Float(description=_("Longitude (X coordinate)")) @@ -381,7 +381,7 @@ class AddressType(DjangoObjectType): return self.location.y if self.location else None -class FeedbackType(DjangoObjectType): +class FeedbackType(DjangoObjectType): # type: ignore [misc] comment = String(description=_("comment")) rating = Int(description=_("rating value from 1 to 10, inclusive, or 0 if not set.")) @@ -393,7 +393,7 @@ class FeedbackType(DjangoObjectType): description = _("represents feedback from a user.") -class OrderProductType(DjangoObjectType): +class OrderProductType(DjangoObjectType): # type: ignore [misc] attributes = GenericScalar(description=_("attributes")) notifications = GenericScalar(description=_("notifications")) download_url = String(description=_("download url for this order product if applicable")) @@ -429,7 +429,7 @@ class OrderProductType(DjangoObjectType): return self.download_url -class OrderType(DjangoObjectType): +class OrderType(DjangoObjectType): # type: ignore [misc] order_products = DjangoFilterConnectionField( OrderProductType, description=_("a list of order products in this order") ) @@ -482,7 +482,7 @@ class OrderType(DjangoObjectType): return None -class ProductImageType(DjangoObjectType): +class ProductImageType(DjangoObjectType): # type: ignore [misc] image = String(description=_("image url")) class Meta: @@ -496,7 +496,7 @@ class ProductImageType(DjangoObjectType): return info.context.build_absolute_uri(self.image.url) if self.image else "" -class ProductType(DjangoObjectType): +class ProductType(DjangoObjectType): # type: ignore [misc] category = Field(CategoryType, description=_("category")) images = DjangoFilterConnectionField(ProductImageType, description=_("images")) feedbacks = DjangoFilterConnectionField(FeedbackType, description=_("feedbacks")) @@ -605,7 +605,7 @@ class ProductType(DjangoObjectType): } -class AttributeValueType(DjangoObjectType): +class AttributeValueType(DjangoObjectType): # type: ignore [misc] value = String(description=_("attribute value")) class Meta: @@ -616,7 +616,7 @@ class AttributeValueType(DjangoObjectType): description = _("attribute value") -class PromoCodeType(DjangoObjectType): +class PromoCodeType(DjangoObjectType): # type: ignore [misc] discount = Float() discount_type = String() @@ -640,7 +640,7 @@ class PromoCodeType(DjangoObjectType): return "percent" if self.discount_percent else "amount" -class PromotionType(DjangoObjectType): +class PromotionType(DjangoObjectType): # type: ignore [misc] products = DjangoFilterConnectionField(ProductType, description=_("products on sale")) class Meta: @@ -651,7 +651,7 @@ class PromotionType(DjangoObjectType): description = _("promotions") -class StockType(DjangoObjectType): +class StockType(DjangoObjectType): # type: ignore [misc] vendor = Field(VendorType, description=_("vendor")) product = Field(ProductType, description=_("product")) @@ -663,7 +663,7 @@ class StockType(DjangoObjectType): description = _("stocks") -class WishlistType(DjangoObjectType): +class WishlistType(DjangoObjectType): # type: ignore [misc] products = DjangoFilterConnectionField(ProductType, description=_("wishlisted products")) class Meta: @@ -673,7 +673,7 @@ class WishlistType(DjangoObjectType): description = _("wishlists") -class ProductTagType(DjangoObjectType): +class ProductTagType(DjangoObjectType): # type: ignore [misc] product_set = DjangoFilterConnectionField(ProductType, description=_("tagged products")) class Meta: @@ -684,7 +684,7 @@ class ProductTagType(DjangoObjectType): description = _("product tags") -class CategoryTagType(DjangoObjectType): +class CategoryTagType(DjangoObjectType): # type: ignore [misc] category_set = DjangoFilterConnectionField(CategoryType, description=_("tagged categories")) class Meta: @@ -695,7 +695,7 @@ class CategoryTagType(DjangoObjectType): description = _("categories tags") -class ConfigType(ObjectType): +class ConfigType(ObjectType): # type: ignore [misc] project_name = String(description=_("project name")) base_domain = String(description=_("company email")) company_name = String(description=_("company name")) @@ -712,7 +712,7 @@ class ConfigType(ObjectType): description = _("company configuration") -class LanguageType(ObjectType): +class LanguageType(ObjectType): # type: ignore [misc] code = String(description=_("language code")) name = String(description=_("language name")) flag = String(description=_("language flag, if exists :)")) @@ -721,40 +721,40 @@ class LanguageType(ObjectType): description = _("supported languages") -class SearchProductsResultsType(ObjectType): +class SearchProductsResultsType(ObjectType): # type: ignore [misc] uuid = UUID() name = String() slug = String() image = String() -class SearchCategoriesResultsType(ObjectType): +class SearchCategoriesResultsType(ObjectType): # type: ignore [misc] uuid = UUID() name = String() slug = String() image = String() -class SearchBrandsResultsType(ObjectType): +class SearchBrandsResultsType(ObjectType): # type: ignore [misc] uuid = UUID() name = String() slug = String() image = String() -class SearchPostsResultsType(ObjectType): +class SearchPostsResultsType(ObjectType): # type: ignore [misc] uuid = UUID() name = String() slug = String() -class SearchResultsType(ObjectType): +class SearchResultsType(ObjectType): # type: ignore [misc] products = List(description=_("products search results"), of_type=SearchProductsResultsType) categories = List(description=_("products search results"), of_type=SearchCategoriesResultsType) brands = List(description=_("products search results"), of_type=SearchBrandsResultsType) posts = List(description=_("posts search results"), of_type=SearchPostsResultsType) -class BulkProductInput(InputObjectType): +class BulkProductInput(InputObjectType): # type: ignore [misc] uuid = UUID(required=True) attributes = GenericScalar(required=False) diff --git a/core/locale/ar_AR/LC_MESSAGES/django.mo b/core/locale/ar_AR/LC_MESSAGES/django.mo index 0d51414670b501021132d5b88e279435876eefa7..aa3601790d2458969caea4863d917e24099fee32 100644 GIT binary patch delta 12574 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

lQ)niZIk#OF^xLv0hg(4{K4eALH;5 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 G{eJ-7gKDGz diff --git a/core/locale/ar_AR/LC_MESSAGES/django.po b/core/locale/ar_AR/LC_MESSAGES/django.po index 94db8689..9e0ef9e3 100644 --- a/core/locale/ar_AR/LC_MESSAGES/django.po +++ b/core/locale/ar_AR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -48,82 +48,86 @@ msgstr "تم التعديل" msgid "when the object was last modified" msgstr "متى تم تحرير الكائن آخر مرة" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "الترجمات" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "جنرال لواء" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "العلاقات" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "معلومات إضافية" + +#: core/admin.py:94 msgid "metadata" msgstr "البيانات الوصفية" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "الطوابع الزمنية" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "تنشيط المحدد _PH_0__%(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "تم تفعيل العناصر المختارة!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "إلغاء التنشيط المحدد _PH_0_%(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "تم إلغاء تنشيط العناصر المحددة!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "قيمة السمة" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "قيم السمات" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "الصورة" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "الصور" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "المخزون" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "الأسهم" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "طلب المنتج" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "اطلب المنتجات" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "الأطفال" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "التكوين" @@ -707,7 +711,7 @@ msgstr "حذف علاقة الطلب-المنتج" msgid "add or remove feedback on an order–product relation" msgstr "إضافة أو إزالة الملاحظات على العلاقة بين الطلب والمنتج" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "لم يتم توفير مصطلح بحث." @@ -881,7 +885,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "يرجى تقديم إما Order_uuid أو order_uid_hr_hr_id - متنافيان!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "جاء نوع خاطئ من طريقة order.buy(): {type(instance)!s}" @@ -957,7 +961,7 @@ msgstr "سلسلة العنوان الأصلي المقدمة من المستخ #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} غير موجود: {uuid}!" @@ -2611,22 +2615,22 @@ msgstr "كل من البيانات والمهلة مطلوبة" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "قيمة المهلة غير صالحة، يجب أن تكون بين 0 و216000 ثانية" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | بادر بالاتصال بنا" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | تأكيد الطلب" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | طلبية تم تسليمها" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | الرمز الترويجي الممنوح" @@ -2862,7 +2866,7 @@ msgstr "" " \"مجموعة عرض الملاحظات\" الأساسية وتستفيد من نظام تصفية Django للاستعلام عن" " البيانات." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2879,7 +2883,7 @@ msgstr "" "عليه. يستخدم ViewSet العديد من المتسلسلات بناءً على الإجراء المحدد الذي يتم " "تنفيذه ويفرض الأذونات وفقًا لذلك أثناء التفاعل مع بيانات الطلبات." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2892,11 +2896,11 @@ msgstr "" "من الأذونات، وتبديل المتسلسل بناءً على الإجراء المطلوب. بالإضافة إلى ذلك، " "توفر إجراءً مفصلاً للتعامل مع الملاحظات على مثيلات OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "يدير العمليات المتعلقة بصور المنتج في التطبيق." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -2904,15 +2908,15 @@ msgstr "" "يدير استرداد مثيلات PromoCode ومعالجتها من خلال إجراءات واجهة برمجة " "التطبيقات المختلفة." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "يمثل مجموعة عرض لإدارة الترقيات." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "يتعامل مع العمليات المتعلقة ببيانات المخزون في النظام." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2929,7 +2933,7 @@ msgstr "" "الأذونات للتأكد من أن المستخدمين يمكنهم فقط إدارة قوائم الرغبات الخاصة بهم " "ما لم يتم منح أذونات صريحة." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2942,12 +2946,12 @@ msgstr "" "العناوين. وتتضمن سلوكيات متخصصة لطرق HTTP المختلفة، وتجاوزات المتسلسل، " "ومعالجة الأذونات بناءً على سياق الطلب." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "خطأ في الترميز الجغرافي: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/cs_CZ/LC_MESSAGES/django.mo b/core/locale/cs_CZ/LC_MESSAGES/django.mo index d4e477b0f6fe17391fb1b2deb43ef52d6efc57d2..3502a453e20f5b14ff01dbd9066d58177efb8d97 100644 GIT binary patch delta 12582 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -50,82 +50,86 @@ msgstr "Upraveno" msgid "when the object was last modified" msgstr "Kdy byl objekt naposledy upraven" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Překlady" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Obecné" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Vztahy" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "další informace" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Časová razítka" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktivace vybraného %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Vybrané položky byly aktivovány!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deaktivace vybraných %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Vybrané položky byly deaktivovány!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Hodnota atributu" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Hodnoty atributů" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Obrázek" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Obrázky" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Zásoby" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Objednat produkt" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Objednat produkty" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Děti" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfigurace" @@ -732,7 +736,7 @@ msgstr "odstranit vztah objednávka-produkt" msgid "add or remove feedback on an order–product relation" msgstr "přidat nebo odebrat zpětnou vazbu na vztah objednávka-produkt." -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Nebyl zadán žádný vyhledávací termín." @@ -906,7 +910,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Zadejte prosím order_uuid nebo order_hr_id - vzájemně se vylučují!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Z metody order.buy() pochází nesprávný typ: {type(instance)!s}" @@ -984,7 +988,7 @@ msgstr "Původní řetězec adresy zadaný uživatelem" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} neexistuje: {uuid}!" @@ -2672,22 +2676,22 @@ msgstr "Jsou vyžadována data i časový limit" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Nesprávná hodnota timeoutu, musí být v rozmezí 0 až 216000 sekund." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | kontaktujte nás inicioval" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Potvrzení objednávky" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Objednávka doručena" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode uděleno" @@ -2932,7 +2936,7 @@ msgstr "" "objekty Zpětné vazby na základě oprávnění. Rozšiřuje základní třídu " "`EvibesViewSet` a využívá systém filtrování Djanga pro dotazování na data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2950,7 +2954,7 @@ msgstr "" " Sada ViewSet používá několik serializátorů podle konkrétní prováděné akce a" " podle toho vynucuje oprávnění při interakci s daty objednávek." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2964,11 +2968,11 @@ msgstr "" " požadované akce. Kromě toho poskytuje podrobnou akci pro zpracování zpětné " "vazby na instance OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Spravuje operace související s obrázky produktů v aplikaci." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -2976,15 +2980,15 @@ msgstr "" "Spravuje načítání a zpracování instancí PromoCode prostřednictvím různých " "akcí API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Představuje sadu zobrazení pro správu povýšení." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Zpracovává operace související s údaji o zásobách v systému." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3002,7 +3006,7 @@ msgstr "" "uživatelé mohou spravovat pouze své vlastní seznamy přání, pokud jim nejsou " "udělena výslovná oprávnění." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3016,12 +3020,12 @@ msgstr "" "přepisování serializátoru a zpracování oprávnění na základě kontextu " "požadavku." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Chyba v zeměpisném kódování: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/da_DK/LC_MESSAGES/django.mo b/core/locale/da_DK/LC_MESSAGES/django.mo index 5a4ffb421b2463e6e6798317a2102c1d2d10c213..9e5ed830b769e30261df9f26b5e99bfa0aa93451 100644 GIT binary patch delta 12589 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 delta 12544 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 diff --git a/core/locale/da_DK/LC_MESSAGES/django.po b/core/locale/da_DK/LC_MESSAGES/django.po index 270fcf32..27701f98 100644 --- a/core/locale/da_DK/LC_MESSAGES/django.po +++ b/core/locale/da_DK/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -49,82 +49,86 @@ msgstr "Modificeret" msgid "when the object was last modified" msgstr "Hvornår objektet sidst blev redigeret" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Oversættelser" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Generelt" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relationer" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "Yderligere info" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Tidsstempler" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktivér valgt %(verbose_name_plural)s." -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Udvalgte varer er blevet aktiveret!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deaktiver valgte %(verbose_name_plural)s." -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Udvalgte varer er blevet deaktiveret!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attributværdi" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attributværdier" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Billede" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Billeder" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Lager" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Aktier" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Bestil produkt" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Bestil produkter" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Børn" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfig" @@ -734,7 +738,7 @@ msgstr "slette en ordre-produkt-relation" msgid "add or remove feedback on an order–product relation" msgstr "tilføje eller fjerne feedback på en ordre-produkt-relation" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Der er ikke angivet noget søgeord." @@ -908,7 +912,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Angiv enten order_uuid eller order_hr_id - det udelukker hinanden!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Forkert type kom fra metoden order.buy(): {type(instance)!s}" @@ -986,7 +990,7 @@ msgstr "Original adressestreng leveret af brugeren" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} findes ikke: {uuid}!" @@ -2694,22 +2698,22 @@ msgstr "Både data og timeout er påkrævet" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Ugyldig timeout-værdi, den skal være mellem 0 og 216000 sekunder" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | kontakt os påbegyndt" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Ordrebekræftelse" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Order Delivered" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promokode givet" @@ -2958,7 +2962,7 @@ msgstr "" " basen `EvibesViewSet` og gør brug af Djangos filtreringssystem til at " "forespørge på data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2977,7 +2981,7 @@ msgstr "" "baseret på den specifikke handling, der udføres, og håndhæver tilladelser i " "overensstemmelse hermed, mens der interageres med ordredata." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2992,11 +2996,11 @@ msgstr "" "Derudover indeholder det en detaljeret handling til håndtering af feedback " "på OrderProduct-instanser." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Håndterer operationer relateret til produktbilleder i applikationen." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3004,15 +3008,15 @@ msgstr "" "Administrerer hentning og håndtering af PromoCode-instanser gennem " "forskellige API-handlinger." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Repræsenterer et visningssæt til håndtering af kampagner." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Håndterer operationer relateret til lagerdata i systemet." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3030,7 +3034,7 @@ msgstr "" "integreret for at sikre, at brugere kun kan administrere deres egne " "ønskelister, medmindre der er givet eksplicitte tilladelser." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3044,12 +3048,12 @@ msgstr "" "omfatter specialiseret adfærd for forskellige HTTP-metoder, tilsidesættelse " "af serializer og håndtering af tilladelser baseret på anmodningskonteksten." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Fejl i geokodning: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/de_DE/LC_MESSAGES/django.mo b/core/locale/de_DE/LC_MESSAGES/django.mo index c0de90f1c214c5eaaf9df8f5095a395979424d26..6e3ac55450ea7aed09f2d0f7bf9108cdbd88586e 100644 GIT binary patch delta 12585 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 F^\n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Geändert" msgid "when the object was last modified" msgstr "Wann das Objekt zuletzt bearbeitet wurde" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Übersetzungen" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Allgemein" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Beziehungen" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "Zusatzinfo" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadaten" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Zeitstempel" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Ausgewählte %(verbose_name_plural)s aktivieren" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Ausgewählte Artikel wurden aktiviert!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Ausgewählte %(verbose_name_plural)s deaktivieren" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Ausgewählte Artikel wurden deaktiviert!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attribut Wert" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attribut Werte" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Bild" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Bilder" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Lagerbestand" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Bestände" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Produkt bestellen" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Produkte bestellen" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Kinder" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfigurieren Sie" @@ -760,7 +764,7 @@ msgid "add or remove feedback on an order–product relation" msgstr "" "Feedback zu einer Bestellung-Produkt-Beziehung hinzufügen oder entfernen" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Kein Suchbegriff angegeben." @@ -937,7 +941,7 @@ msgstr "" "sich gegenseitig aus!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Von der Methode order.buy() kam der falsche Typ: {type(instance)!s}" @@ -1016,7 +1020,7 @@ msgstr "Vom Benutzer angegebene Originaladresse" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} existiert nicht: {uuid}!" @@ -2757,22 +2761,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" "Ungültiger Timeout-Wert, er muss zwischen 0 und 216000 Sekunden liegen" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | Kontakt eingeleitet" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Auftragsbestätigung" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Bestellung ausgeliefert" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | Promocode gewährt" @@ -3029,7 +3033,7 @@ msgstr "" "implementieren. Es erweitert das Basis `EvibesViewSet` und nutzt das " "Filtersystem von Django zur Abfrage von Daten." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -3049,7 +3053,7 @@ msgstr "" "basieren, die durchgeführt wird, und erzwingt die entsprechenden " "Berechtigungen, während es mit den Bestelldaten interagiert." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3064,12 +3068,12 @@ msgstr "" "Außerdem bietet es eine detaillierte Aktion für die Bearbeitung von Feedback" " zu OrderProduct-Instanzen" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Verwaltet Vorgänge im Zusammenhang mit Produktbildern in der Anwendung." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3077,15 +3081,15 @@ msgstr "" "Verwaltet den Abruf und die Handhabung von PromoCode-Instanzen durch " "verschiedene API-Aktionen." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Stellt ein Ansichtsset für die Verwaltung von Werbeaktionen dar." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Erledigt Vorgänge im Zusammenhang mit Bestandsdaten im System." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3104,7 +3108,7 @@ msgstr "" "nur ihre eigenen Wunschlisten verwalten können, sofern keine expliziten " "Berechtigungen erteilt wurden." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3119,12 +3123,12 @@ msgstr "" "HTTP-Methoden, Serialisierungsüberschreibungen und die Behandlung von " "Berechtigungen auf der Grundlage des Anfragekontexts." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Geocodierungsfehler: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/en_GB/LC_MESSAGES/django.mo b/core/locale/en_GB/LC_MESSAGES/django.mo index debdfe8f6bb8b10640976988e8861b547fa04146..f2df83a72d427cf0357153bbe8141623684648b5 100644 GIT binary patch delta 12589 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -53,82 +53,86 @@ msgstr "Modified" msgid "when the object was last modified" msgstr "When the object was last edited" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Translations" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "General" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relations" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "additional info" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Timestamps" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activate selected %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Selected items have been activated!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deactivate selected %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Selected items have been deactivated!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attribute Value" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attribute Values" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Image" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Images" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stocks" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Order Product" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Order Products" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Children" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Config" @@ -712,7 +716,7 @@ msgstr "delete an order–product relation" msgid "add or remove feedback on an order–product relation" msgstr "add or remove feedback on an order–product relation" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "No search term provided." @@ -885,7 +889,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Please provide either order_uuid or order_hr_id - mutually exclusive!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Wrong type came from order.buy() method: {type(instance)!s}" @@ -963,7 +967,7 @@ msgstr "Original address string provided by the user" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} does not exist: {uuid}!" @@ -2644,22 +2648,22 @@ msgstr "Both data and timeout are required" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Invalid timeout value, it must be between 0 and 216000 seconds" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | contact us initiated" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Order Confirmation" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Order Delivered" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode granted" @@ -2904,7 +2908,7 @@ msgstr "" " accessible Feedback objects. It extends the base `EvibesViewSet` and makes " "use of Django's filtering system for querying data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2922,7 +2926,7 @@ msgstr "" " uses multiple serializers based on the specific action being performed and " "enforces permissions accordingly while interacting with order data." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2936,11 +2940,11 @@ msgstr "" " requested action. Additionally, it provides a detailed action for handling " "feedback on OrderProduct instances" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Manages operations related to Product images in the application." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -2948,15 +2952,15 @@ msgstr "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Represents a view set for managing promotions." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Handles operations related to Stock data in the system." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2974,7 +2978,7 @@ msgstr "" "that users can only manage their own wishlists unless explicit permissions " "are granted." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2988,12 +2992,12 @@ msgstr "" "different HTTP methods, serializer overrides, and permission handling based " "on the request context." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Geocoding error: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/en_US/LC_MESSAGES/django.mo b/core/locale/en_US/LC_MESSAGES/django.mo index 2c698a4817107f46a874ce90a6d59e7a5367ed52..92c7108f868c3ffa07686c3d49e5248772390a54 100644 GIT binary patch delta 12589 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -49,82 +49,86 @@ msgstr "Modified" msgid "when the object was last modified" msgstr "When the object was last edited" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Translations" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "General" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relations" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "additional info" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Timestamps" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activate selected %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Selected items have been activated!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deactivate selected %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Selected items have been deactivated!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attribute Value" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attribute Values" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Image" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Images" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stocks" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Order Product" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Order Products" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Children" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Config" @@ -708,7 +712,7 @@ msgstr "delete an order–product relation" msgid "add or remove feedback on an order–product relation" msgstr "add or remove feedback on an order–product relation" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "No search term provided." @@ -881,7 +885,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Please provide either order_uuid or order_hr_id - mutually exclusive!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Wrong type came from order.buy() method: {type(instance)!s}" @@ -959,7 +963,7 @@ msgstr "Original address string provided by the user" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} does not exist: {uuid}!" @@ -2640,22 +2644,22 @@ msgstr "Both data and timeout are required" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Invalid timeout value, it must be between 0 and 216000 seconds" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | contact us initiated" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Order Confirmation" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Order Delivered" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode granted" @@ -2900,7 +2904,7 @@ msgstr "" " accessible Feedback objects. It extends the base `EvibesViewSet` and makes " "use of Django's filtering system for querying data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2918,7 +2922,7 @@ msgstr "" " uses multiple serializers based on the specific action being performed and " "enforces permissions accordingly while interacting with order data." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2932,11 +2936,11 @@ msgstr "" " requested action. Additionally, it provides a detailed action for handling " "feedback on OrderProduct instances" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Manages operations related to Product images in the application." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -2944,15 +2948,15 @@ msgstr "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Represents a view set for managing promotions." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Handles operations related to Stock data in the system." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2970,7 +2974,7 @@ msgstr "" "that users can only manage their own wishlists unless explicit permissions " "are granted." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2984,12 +2988,12 @@ msgstr "" "different HTTP methods, serializer overrides, and permission handling based " "on the request context." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Geocoding error: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/es_ES/LC_MESSAGES/django.mo b/core/locale/es_ES/LC_MESSAGES/django.mo index 845933c4c43698a3607f311c6d55b9f7f08f890d..76f76c8a692d00a97c94e2a9f0ec5150ff20e09b 100644 GIT binary patch delta 12579 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 Kj=yJc=KlcHZYx9p delta 12545 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Modificado" msgid "when the object was last modified" msgstr "Cuándo se editó el objeto por última vez" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Traducciones" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "General" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relaciones" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "información adicional" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadatos" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Marcas de tiempo" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activar %(verbose_name_plural)s seleccionado" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Los artículos seleccionados se han activado." -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Desactivar %(verbose_name_plural)s seleccionado" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Los artículos seleccionados se han desactivado." -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Atributo Valor" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Valores de los atributos" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Imagen" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Imágenes" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Acciones" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Pedir un producto" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Pedir productos" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Niños" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Configurar" @@ -742,7 +746,7 @@ msgstr "suprimir una relación pedido-producto" msgid "add or remove feedback on an order–product relation" msgstr "añadir o eliminar comentarios en una relación pedido-producto" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "No se proporciona ningún término de búsqueda." @@ -916,7 +920,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Indique order_uuid o order_hr_id, ¡se excluyen mutuamente!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" "Tipo incorrecto proveniente del método order.buy(): {type(instance)!s}" @@ -995,7 +999,7 @@ msgstr "Cadena de dirección original proporcionada por el usuario" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} no existe: ¡{uuid}!" @@ -2711,22 +2715,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" "Valor de tiempo de espera no válido, debe estar entre 0 y 216000 segundos." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | contacto iniciado" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Confirmación de pedido" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Pedido entregado" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode granted" @@ -2980,7 +2984,7 @@ msgstr "" "objetos Feedback accesibles. Extiende la base `EvibesViewSet` y hace uso del" " sistema de filtrado de Django para la consulta de datos." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2999,7 +3003,7 @@ msgstr "" "acción específica que se esté realizando y aplica los permisos " "correspondientes al interactuar con los datos del pedido." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3014,13 +3018,13 @@ msgstr "" "Además, proporciona una acción detallada para gestionar los comentarios " "sobre las instancias de OrderProduct." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Gestiona las operaciones relacionadas con las imágenes de productos en la " "aplicación." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3028,16 +3032,16 @@ msgstr "" "Gestiona la recuperación y el manejo de instancias de PromoCode a través de " "varias acciones de la API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Representa un conjunto de vistas para gestionar promociones." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" "Gestiona las operaciones relacionadas con los datos de Stock en el sistema." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3056,7 +3060,7 @@ msgstr "" "integrados para garantizar que los usuarios sólo puedan gestionar sus " "propias listas de deseos a menos que se concedan permisos explícitos." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3070,12 +3074,12 @@ msgstr "" "comportamientos especializados para diferentes métodos HTTP, anulaciones del" " serializador y gestión de permisos basada en el contexto de la solicitud." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Error de geocodificación: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/fa_IR/LC_MESSAGES/django.po b/core/locale/fa_IR/LC_MESSAGES/django.po index f3ddddb0..5e5fbc61 100644 --- a/core/locale/fa_IR/LC_MESSAGES/django.po +++ b/core/locale/fa_IR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -49,82 +49,86 @@ msgstr "" msgid "when the object was last modified" msgstr "" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "" -#: core/admin.py:87 -msgid "metadata" +#: core/admin.py:76 +msgid "additional info" msgstr "" #: core/admin.py:94 +msgid "metadata" +msgstr "" + +#: core/admin.py:101 msgid "timestamps" msgstr "" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "" @@ -678,7 +682,7 @@ msgstr "" msgid "add or remove feedback on an order–product relation" msgstr "" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "" @@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" @@ -927,7 +931,7 @@ msgstr "" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "" @@ -2459,22 +2463,22 @@ msgstr "" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "" @@ -2656,7 +2660,7 @@ msgid "" "use of Django's filtering system for querying data." msgstr "" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2667,7 +2671,7 @@ msgid "" "enforces permissions accordingly while interacting with order data." msgstr "" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2676,25 +2680,25 @@ msgid "" "feedback on OrderProduct instances" msgstr "" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2705,7 +2709,7 @@ msgid "" "are granted." msgstr "" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2714,12 +2718,12 @@ msgid "" "on the request context." msgstr "" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/fr_FR/LC_MESSAGES/django.mo b/core/locale/fr_FR/LC_MESSAGES/django.mo index ec52ac0e3b837c388772806fe0e46970b3810a33..fdba5980da597df292c1ab8837abae17a4f68c6e 100644 GIT binary patch delta 12587 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

V8 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 M=FS;8Jr^4OABj#VLjV8( diff --git a/core/locale/fr_FR/LC_MESSAGES/django.po b/core/locale/fr_FR/LC_MESSAGES/django.po index 1bf7133e..5f2a898e 100644 --- a/core/locale/fr_FR/LC_MESSAGES/django.po +++ b/core/locale/fr_FR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Modifié" msgid "when the object was last modified" msgstr "Date de la dernière modification de l'objet" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Traductions" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Général" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relations" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "Informations complémentaires" + +#: core/admin.py:94 msgid "metadata" msgstr "Métadonnées" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Horodatage" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activer la %(verbose_name_plural)s sélectionnée" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Les articles sélectionnés ont été activés !" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Désactiver la %(verbose_name_plural)s sélectionnée" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Les articles sélectionnés ont été désactivés !" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Valeur de l'attribut" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Valeurs des attributs" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Image" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Images" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stocks" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Commander un produit" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Commander des produits" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Les enfants" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Config" @@ -754,7 +758,7 @@ msgstr "" "ajouter ou supprimer un retour d'information sur une relation commande-" "produit" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Aucun terme de recherche n'est fourni." @@ -931,7 +935,7 @@ msgstr "" "mutuellement !" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" "Le mauvais type provient de la méthode order.buy() : {type(instance)!s}" @@ -1013,7 +1017,7 @@ msgstr "Chaîne d'adresse originale fournie par l'utilisateur" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} n'existe pas : {uuid} !" @@ -2758,22 +2762,22 @@ msgstr "" "La valeur du délai d'attente n'est pas valide, elle doit être comprise entre" " 0 et 216000 secondes." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | nous contacter initié" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Confirmation de commande" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Commande livrée" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode accordé" @@ -3030,7 +3034,7 @@ msgstr "" "la classe de base `EvibesViewSet` et utilise le système de filtrage de " "Django pour l'interrogation des données." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -3050,7 +3054,7 @@ msgstr "" "autorisations en conséquence lors de l'interaction avec les données de la " "commande." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3065,11 +3069,11 @@ msgstr "" " En outre, il fournit une action détaillée pour gérer le retour " "d'informations sur les instances OrderProduct." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Gère les opérations liées aux images des produits dans l'application." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3077,15 +3081,15 @@ msgstr "" "Gère la récupération et le traitement des instances de PromoCode par le " "biais de diverses actions API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Représente un jeu de vues pour la gestion des promotions." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Gère les opérations liées aux données de stock dans le système." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3105,7 +3109,7 @@ msgstr "" "ne peuvent gérer que leur propre liste de souhaits, sauf si des permissions " "explicites sont accordées." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3120,12 +3124,12 @@ msgstr "" " HTTP, des dérogations au sérialiseur et une gestion des autorisations basée" " sur le contexte de la demande." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Erreur de géocodage : {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/he_IL/LC_MESSAGES/django.mo b/core/locale/he_IL/LC_MESSAGES/django.mo index d491655e00308746e513fd86b7a09e5640ad762c..9987a4a45d5175e0fc8cd24edfd2c8a5e4455922 100644 GIT binary patch delta 12574 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 delta 12545 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 gu~>tMBdudUF=$Ij\n" "Language-Team: BRITISH ENGLISH \n" @@ -47,82 +47,86 @@ msgstr "משונה" msgid "when the object was last modified" msgstr "מתי האובייקט נערך לאחרונה" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "תרגומים" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "כללי" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "יחסים" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "מידע נוסף" + +#: core/admin.py:94 msgid "metadata" msgstr "מטא-נתונים" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "חותמות זמן" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "הפעל את %(verbose_name_plural)s שנבחר" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "הפריטים שנבחרו הופעלו!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "השבת את %(verbose_name_plural)s שנבחר" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "פריטים נבחרים הושבתו!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "ערך התכונה" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "ערכי תכונות" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "תמונה" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "תמונות" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "מלאי" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "מניות" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "הזמן מוצר" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "הזמנת מוצרים" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "ילדים" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "תצורה" @@ -693,7 +697,7 @@ msgstr "מחיקת קשר בין הזמנה למוצר" msgid "add or remove feedback on an order–product relation" msgstr "הוספה או הסרה של משוב על קשר בין הזמנה למוצר" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "לא צויין מונח חיפוש." @@ -866,7 +870,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "אנא ספק את order_uuid או order_hr_id - אחד מהם בלבד!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "סוג שגוי הגיע משיטת order.buy(): {type(instance)!s}" @@ -942,7 +946,7 @@ msgstr "מחרוזת הכתובת המקורית שסופקה על ידי המש #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} אינו קיים: {uuid}!" @@ -2572,22 +2576,22 @@ msgstr "נדרשים הן הנתונים והן זמן ההמתנה" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "ערך זמן המתנה לא חוקי, הוא חייב להיות בין 0 ל-216000 שניות" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | צור קשר יוזם" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | אישור הזמנה" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | הזמנה נמסרה" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | קוד קידום מכירות מוענק" @@ -2817,7 +2821,7 @@ msgstr "" " היא מרחיבה את `EvibesViewSet` הבסיסי ומשתמשת במערכת הסינון של Django " "לשאילתת נתונים." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2834,7 +2838,7 @@ msgstr "" "בהתאם לפעולה הספציפית המתבצעת ומאכוף הרשאות בהתאם בעת אינטראקציה עם נתוני " "הזמנה." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2847,25 +2851,25 @@ msgstr "" "הרשאות והחלפת סריאלייזר בהתאם לפעולה המבוקשת. בנוסף, הוא מספק פעולה מפורטת " "לטיפול במשוב על מופעים של OrderProduct." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "מנהל פעולות הקשורות לתמונות מוצרים ביישום." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "מנהל את אחזור וטיפול במקרי PromoCode באמצעות פעולות API שונות." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "מייצג קבוצת תצוגות לניהול מבצעים." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "מטפל בפעולות הקשורות לנתוני המלאי במערכת." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2882,7 +2886,7 @@ msgstr "" "שמשתמשים יוכלו לנהל רק את רשימות המשאלות שלהם, אלא אם כן ניתנו הרשאות " "מפורשות." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2895,12 +2899,12 @@ msgstr "" "לישויות כתובת. היא כוללת התנהגויות מיוחדות עבור שיטות HTTP שונות, עקיפת " "סריאלייזר וטיפול בהרשאות בהתבסס על הקשר הבקשה." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "שגיאת קידוד גיאוגרפי: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/hi_IN/LC_MESSAGES/django.po b/core/locale/hi_IN/LC_MESSAGES/django.po index e2de56ff..ef29e6ec 100644 --- a/core/locale/hi_IN/LC_MESSAGES/django.po +++ b/core/locale/hi_IN/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -49,82 +49,86 @@ msgstr "" msgid "when the object was last modified" msgstr "" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "" -#: core/admin.py:87 -msgid "metadata" +#: core/admin.py:76 +msgid "additional info" msgstr "" #: core/admin.py:94 +msgid "metadata" +msgstr "" + +#: core/admin.py:101 msgid "timestamps" msgstr "" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "" @@ -678,7 +682,7 @@ msgstr "" msgid "add or remove feedback on an order–product relation" msgstr "" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "" @@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" @@ -927,7 +931,7 @@ msgstr "" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "" @@ -2459,22 +2463,22 @@ msgstr "" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "" @@ -2656,7 +2660,7 @@ msgid "" "use of Django's filtering system for querying data." msgstr "" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2667,7 +2671,7 @@ msgid "" "enforces permissions accordingly while interacting with order data." msgstr "" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2676,25 +2680,25 @@ msgid "" "feedback on OrderProduct instances" msgstr "" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2705,7 +2709,7 @@ msgid "" "are granted." msgstr "" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2714,12 +2718,12 @@ msgid "" "on the request context." msgstr "" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/hr_HR/LC_MESSAGES/django.po b/core/locale/hr_HR/LC_MESSAGES/django.po index f3ddddb0..5e5fbc61 100644 --- a/core/locale/hr_HR/LC_MESSAGES/django.po +++ b/core/locale/hr_HR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -49,82 +49,86 @@ msgstr "" msgid "when the object was last modified" msgstr "" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "" -#: core/admin.py:87 -msgid "metadata" +#: core/admin.py:76 +msgid "additional info" msgstr "" #: core/admin.py:94 +msgid "metadata" +msgstr "" + +#: core/admin.py:101 msgid "timestamps" msgstr "" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "" @@ -678,7 +682,7 @@ msgstr "" msgid "add or remove feedback on an order–product relation" msgstr "" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "" @@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" @@ -927,7 +931,7 @@ msgstr "" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "" @@ -2459,22 +2463,22 @@ msgstr "" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "" @@ -2656,7 +2660,7 @@ msgid "" "use of Django's filtering system for querying data." msgstr "" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2667,7 +2671,7 @@ msgid "" "enforces permissions accordingly while interacting with order data." msgstr "" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2676,25 +2680,25 @@ msgid "" "feedback on OrderProduct instances" msgstr "" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2705,7 +2709,7 @@ msgid "" "are granted." msgstr "" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2714,12 +2718,12 @@ msgid "" "on the request context." msgstr "" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/id_ID/LC_MESSAGES/django.mo b/core/locale/id_ID/LC_MESSAGES/django.mo index 6f55377b46871f4ab6c19f079c6caee1f12eba5a..1c324bd28ca3fd24cc48b72444e55bde6f288683 100644 GIT binary patch delta 12586 zcmZwO2Yk*~-^cNDAp@~OB6cE@5Q#{LJrdFoDn*ILj;(6eD9UA2jiSS*RIOG~Qmt9L zMveAv6}`FXjiNdzTB}vh=X;&wd3imr=l{BYd7s}o|9Qs$x{|uLP4v4u(a(D!INvBFA~nfEvaWrD7z8;8dK8OVJ;bYT66b#T0HJ4Rr%kl8uSL*%*VHurz*; zpYbqvurB%9I`+Jmkt*}RnLuMQ*EhW>l%Qb=M&l;T!82GM>((=792b58TjA;Y#?+?1 zQbS`}V`sdJ8!#7FH8Q3k`(-sYhX0u!DfWR@pn9Nosxif|0fupXlSv^I`(l0^kLuEC zSQ6);x^f+=i*u3xnWOyJ<1r?v2^S+j-qe^5~|7%BY&cI z35ACg{BeFW#vYeq5ayzKW;eFxgeOs5Un#?wA21%*QeUWrF>$!Hr7@l8`X8S)<}B?g z&lxj<`Z9D=48GmQm=?IbExn2P+R^{19MGk`F^i~puY)n4V%=dXqn1~-?b^H%%2nvm`vpy6f$s3`L>w$4N z)3tAR^%s%(YYL9Et0W!Ek$ZEV6i_Eviph8wOW-5aBn%#9dny)-kdMFsoPwb^3pHm} zp-!BOdg8CK1O6K`G4U0*8g4#!8G`d=IJpEH3`$OFus6l?~7w`3`XHy)T$^u zhTg!67=qPN`=_IZG8=Ux1JHNls2iSwMYaClrBITJ4Q_{nz6N7XIj^F|>>ifJJlutD zupEYCBF17{Ou})fA=~8YFQG16=vCWe<**`o6#8lXH>aQ-GEsNj6?MTOE+31UgtJgj zIu~_<6{s#hh?*1MqMq~|7Q`#48@uJ&%Z{_>jY3_oI(l_r3I&aI2CB=uqPlP(>Vgwc zPd*!U!L_b_3x<<_fjZ9>)atl_nj3de7y1h|GzG`o^F^S}lQ5qC*M%EUp#$5X4$MMd zPdJC5_M3zn`vq7OccF&jD=dYVoPVP(97^}tg5xdn2u#Jx~`O?(!+98(4t4fpyMiIHxfM24p9_ph!eaNnoy{RNjMJG zHJeb&a2M(VcTg7&m}I*;3^gKd{CfjqaJ_|Lr{aij2b;8M51!rMx+={F5CTjnAuh}tQhBe7QMJ?Css2;wF^|k&h zPqBB}3pGabu`(`0J<(y*ja^4wsOalbZ}i8(s1uDu4aqdDjJr`cd=1rp6Lo{0>2`9}#RT%+ zs3Dw(8Mqc3;T_D+^-amL_@F| zjzZ1yHJFWGqIxp&O*>gTqV{_Y{c!V}^nYOr+o{k6k6;lzhq}-&7>*Ax4okmf_iu(l zUkBBm=GxmJ=l7Z(6!hvG;2Nf2N%Hxq zN%k@7z_VBYuc1CnZlg{dIL~%%3Dg{^ip4MuwSN}o#~cj70jL|Bhy}F%-=a{RiX|A1 z$5G4cH`Ew~&bKFg4z&t$uoq6mSiFiFs$vUlk5xn6Ky9ps8CVNn!KSzob>2JJjO&}Y zg?7>m#}M+ds5^ceb-^X5G27|9fKlY0MYcW$)q^dtCiX(z&>~b1Y{5>r51+?!i|t$( zirx(EKp_sz659juSb{VYHP$_`6b?lV$s3r6Tb<&v zXJKO;kIA?jb>2U)5=MN;*E~!|P0GpWr}aOZg4Xd|)FfMuk+=iP;04tBe~9HUV6E-S zD9lgZ9_wH?)QJ~j7_P(&{2Z&G|3~%#s$(p97Dj9RPo$tO{SfovHdNQ_!eIObbtC_v zo}~0T+f$9P5qTfvNz7_2fa}m7x1erh7Z$|RsO5bLwcmY=;QA)-diO*aK;9n5VHecc zp2G+%u)(g|I1D5oikgIDup&-J&7Jj_ANOKB9z_l1eN4rgAKOVd61{O$Y^M;5S5aM6 zY@;3X`l#hH1f%g|)TBCvTBg~X>`=|bCght?^>?r(M(5f$-!Rm5)}pR+8e`D&3H`4N zR{6v>JdYaV@z~SDrxxl(WIkmgl80ar>CDgUkS#*>*jm)w$weK13^gRzF)!Y9-oY8< z_fS1JX$$>dn8F)d>{u;EhQ(~gg4k`Vz2E?B#|^xK8oLwQY}bB|waNXr+n#HLrMY51 z>`49O&utG~z*gjWcG;n5?VRbQps_oG8mnKh50=_(51fGOxbP|*h^_b9^}BnY{f6@x z1E|m5&rNe&&H>&FOUe{ZWLI`;Zs>`xaJ<{3L4?rC_ z5jDA{V^ds;UvZ&}*p7VD5tbgg-#zFIbM@gBwe7J@zf9erHd1cxyVV#GcPgboOtAAyG$oup|_~d z#gcgYs{P|tfuHOjnO0r5=Lz|hbJMW;U4Gte;EI&RQyFnZH#$rU#Z;<#zs3=Vny;3s0;s&I*-TCO{jMfFG<493o=9S5Us zXas6#Cb@h$YX1$W$+``7+&`r95Vj5<$An|n$U8PxmaI;toBL|w<9*Jc>=&xBIYfeEN(RTH&i zebgK8S!Z|D1&5<9umE+UHK-fhf+2X!)n9bpLY>zWXnQ2kSqme%zUf6F38$f!;ZCfJ zcTqi4J-_{8@Y&@M1P>h{BLIf|G7hB9gLbQDX3+gj@o}1#^M-kg{x6Ld#9ks>$~%S zAbUW0)CpRko}@Ku?E0a)c(}`_qb@KH({LZILH|N_l5Id;U<>NKauhX3@)Y)%<`{%+ zuzg|HzusgYP@y?+9>ehxR>HhRJib?NWo$wI0_sLqqTUPJP(yMO)zv>@Da=>YzKF_W zC-VB(9~WSE^c1smqKB7)CQ*OXosC9y?S8kz3DnqrhkBA|4Vhl!=@R%HIg*sp(>dWM3sG+%q zW$=;9ONH1x3U#BYsG%5!np3Z10`5TOoY(wJL6f5dUt2U3jZygsOvUA>SMnv)BrV8i zZVD!&hHNDIRsn{S&qBS5KSmA7R@Bg)LCyY(VYWR1i)sDWp`a7BK#k>ds2=H#8k)fv zhhEeRX+3H+>_GL%2~>}qL`}*fr95U7*2hHLj9ML6P|Lh{X?t8c26KJ$tP0o-b-`h% zJDr3&@J-Z#yIlS6s2hBQQ5aOlc6kzNxn-ixmxb!;{w`mHI&M8`hx`P*i?BRi!j|YM z&-&L`wJL9CX%?zW2cp*N%cxi9IMmR*h8lu-&XuSq%|%VdFHrma%Xty?K)0QbQO5^W zu;(pZf%UKT8bO6lR3EimGErmN8+GFMQBS@B)nnUSejIiD8PsvNoPpu?!WB?G6^H7n znyxhkHR&-Jya8#v+e{1J92;;|3)8K@W3Ce;3?P(Ahlb)mc!?WzgE z4Dv?U3a6na&>A%)eNmtDL!7fwH@M#A$DKbr11s4%5{=R9*B#aM zQ&C^R=3)oDgKe;7l3`<66b@09@a!q~IGvRM$N~O}6lAcFe1y z#&Mrebn6WRJWggVW>PFn_wEI;8gqokKhCxl4ytM7S<$>OtO>l1ysHwiS-{#;S3eJ zaGo0OPBEFhqw_5cCqIN5%WD{cMQYlfOT;wt_NZ@Ai!lyQp}w-^NwzPbDAf8NgzAA; zlfAafCQ(t6irE;BYfx{#!>FOSj9T|MP;a_Cwd|@%#dPuvRQp?~?**%{H|{}A#;Dr% zMxVpVWr^`3tBn4y|KnZ9M8-o{f64>DU~%pq}J0YV7^$+BaJ< z)GsDssQN_I`5K}gs2%FYyxl11!(cjUF6_s?_$6v+66@I>>5LiV<4}|Du=9J=iLRqA zP`tivk43$}>SI$Jg)ML=K8OAde9P5qvTVW3z-MUKjapv$8rt8{I-u5jE{?}bs3*^9 zWV`Ys%qBmHwJ^T1{ld}<)nkWHJ$4uMK#?hS4rOAT*8fNf8k3c%clmMjAj{XcRmj8A zBQ%k;t)zavEgB}aZ<~RdfOm-|l(*PwbHaIqx*?RW5p#*jZ;aFEN^E?{YoyE0kX#-lY5qv5+`PzK@7+ z#}92gu@G^I(BA|!)}Is1E7JwlH*HwvSQkr#tnZ6Ah`;n@C$K`2l@n{DJDK)>dz9@sn?c{KT@AX@M7|9^DO3F-dMgZ z4?FFpu`1afY~yy=fPa(sC+1LYMjRxHlGnp+#P`Gra&4oCpD7o1x$4@w@>nHoRk)Tu z%EnROMAu(WL9ZKaFHzT9v zGvdj%oC0h1e>d-9SJXeW8bZTc0+YEPYYsiZd70ADE zb!*AbQBLFhLn((7gNPK{KBs5pV%{X$N|4{CURw~6>nqtGYwW(}Uzoza+CCzpi2<%n zb!8~8#t33D<$J^!;!E;lL^H}=h!(^~a(!+;&>U>cNvo4++d$)!?KB0w=CX*=>{El7 zO}m!}ro0sSqGPrZ|KB!)%8s<1Cms{8xSc+t%!ip7Mn3Y%98}wXi3v3H!EU%2wN0h` z4sOJM2tzzeG$bw)!Bp)+ZK=dXU&;O`LVYh{JTZ$HL1>HP0j^T^{i{X2tNls7#rbMw z`?9gdpMx(E+VrQ`)LeEP zL$Z~aO&leDCI0Ug&d#^kH;&N9thQL{;^*YX7SCUdT5T8RoQN&sZRxU9+6xof-Xq!) z$7oweETa4|^0DsQ{^Vy3Vkr4U;ymR(u1!1Cap&nk-Mgw_^QZ1NOz>rVm!K^_-^5G` z6_<(5Po3ap$_uE|Ctob(pNRhw)!c~-Q2#9Pn7BcG5>6pLrTk>OPa&O{M7%*fbZx_M zE>WDA?wND7YP2_kq937c0iLl%GZW8}-ywPve-QnttE6^rr4>}8t_bFHx2C3^1b;mC zZR_|snth&ZA5eaoq&qRs)_ct~w}ZzSN#lPguO>PX<%sWzyF?+{w0%waxGkFJDL3E- zmXQBM{6X9x_7d7k()I&BxyR$||DCUe4`i*YOCif5^e(p?< zs5?zO+1{r7Z{i@qFAnA*4X+U^pX}fqL|Z<}4X~iz5~YZWob+4NR@Y)abUq=|wf~!n zSBdN7Wu811`DcW_s%ncO^3tA(^Dz*wVIup#kJ^@__b5O9LvoI2OnED@iE=060=(w#JWt)g8`OP5Xe&bfuav){{D`PP{NUOs`u<}dq?;vF)^#TdQ48BQ zL^5@qv65>mi=pHv32oho5kxKO>&-b)t)zDr*;GPXKF)d%3(-23@@~qJxQWpACDwE0 zX!hyn%4)0V%Bv{Xr>%i1*~(GQcxu10)Ll_f_m`a?ye+ACkqD-83lYOXRmgX^1K+0n z^!5z(3tgM)KXr}CxRf~K+NQgDe+=cEA%wQ(wEOu=%+G-&F(ku@58Z)*>^PHh3rxe! z#39LVkuM&%h6Sn2Lt;x11VIvH$si;)5wT0fEKx;k)u`KwQRG)tYu1QS)NGA(X=~3a zwOcMxG+L@ITH4#H8f}gHdjHPxe|Y@A_kQv`pL4$RjPLK4)YXZ8+a~&XFO({6Bt0XdbEuBAXdg5@Ru#>zgJN%3^mcjKfh~ItI(( zWK>r!MRoBip zn<8;yI`a&3IvMi}{@I!SZ^i-byE0Bx%d5ONpwBdY%`x&!|S;_64Zd^B<`GafZbFQJAse1zSYvB^CiC>|H-~mRWf2J{2F&=eXCyd4MsP-IJ ze-fF$<{zwp$)gxP^rpMQOQ;jf!X(^^LHH|b66PCid#VB!B=3)9aTsc@ypB5IT-1|p z!0xymJ7CE%b~W_DH1d^LO6&g$g&I`cLruPFV;M)RhwNZl;W+Gx)$t5!HQdMInD14) zz5`MFN1%qVKI%r=VE}eT-Ee;l#PL{8>wlKpVU26p>^z7XtFu@Ee?;Bj0}REI+*J%F zVj@0^8mc+2ejn<>zoL5V0fwXBc>4fR7@+kZPeFIw1a-lVF3&(szG0{*9f>-@BvhBL zLCuBFP*1uOi{b&)jh%Gu_fhBdn_zD!5OrKAdNsz;6x8KSP+iy_b-_NUCm)Ww;51ji z5JSn|L!IaVYE>LZJ!vlL$oE_bc{ZL~+ z8Z~yyP($%CmdAb0?@$-MgL)8ux>x5dk6IOBsJYewH5Xp>x{A42kBZ$`AMc=Uq~>eZ zRMdsLxV%5=21cW9V1{!I>IObX4b=(Mjr@TcBEN}tC;~8*yn>g4Z}OnJcn)g$Ekj)( z7j@xlsII<;zOI~P$2tJRsIQ1>Z;YCREm0R7gW)&{Q*aIH2Ct$X(0hl1UNnU!+sT%I zYDh+%u(iw6Q73#Jqj4D4#YMOVPoVbCeBF+D7STQ$M^Qce2YOWqnrXW*87q-@$C{XlRdB6qKZrHRuVDc!JfC{P-|U~|*8eFgv>wl*?)bl`uJgQQzwwm8;^gtD`bOxF9WfreV>rHnJunB= zllf=c$=U$5-wUX*&&CqCcsBj73$CXk0C%D;bPPlBTa3lOQ3piMvCA|WL&%$>p1cq0 zhQ?taPC^}*je4-X7=UL{tKb@H@`ifn+7l*WQ7TeVC+>h6+aajQ_a@tB62P(Ab)rejF9y`FbC1>MQ3sIHlf8p8#s3oggfxE9qjJ5W7w z*wvrKV&pe45bwG6!t?C~f>G_&Q0=u)=TAl6oL{E9asbpp*~Db zp?c~kRM-BA!B}*Gos88``zNE8Su-qy?NB$~7u7xjYij+EqYz5Php6TCHEN9RU`b3^ zXjefqe1W_##^6EJP~Aj5QHe!%|8f{l9*xQP3^vEvsPpEcRzv-AfF zp;&yWoeS}(v2Kp#F&#A|L$DSuavnkT#6Ql6ckGKM9UD+T7Nc9T$&Pu@UNh&<7K6 zAg1CXSD)v+Q!)bUFx8h`+^qw6G z|24M9;xUE#7g76vfEs%5w-h2M_^-9IKMvK!-B4XL53A!L)ENGXl`wdny+ATHCGU+% zxEyuj(^w5X>*)=QKt1U5=!e6RW$ZO0DQJ?thE;J1R>VE1^`D2j;5AfN`sLVFl7yNo zO;INvgTXi%+u%DGjaN|*5cs}*fMkpy?~4Ii|5GUxpyF***DS+QcnozT7f?^~H|oGD zAK1_FmZ&G0f<jV!~WxCOPm_o4PXhhcab6S%(d`_R5>lW+ogW7OF0MD2JT z)3De_c21WSY%O{&ePWm^9eJ5)n4m3$7WJ{Q}e|EKoN*9mo@X{hUL!AQJ>x?bVW=zlfT z{>+YXZ+zavrxpfL|HDQ;56Ew0G4i3C?J5|H1<9wO=FVKy9Qgn>Bu6kmo^a;kbn>%U z2>WfZJvd|w{jafll?sN#WMffmy47B=9d_Xcp1~s2f3(eZ?KZ4Seiij3mACUffGf7f zp5)K(vOTm1+mru@8j6~`twT{mx86%ZV|5G%;9sa!&}R=f#D!nSVOVpoUBAn}u-|Yl zVnOQb@8ho=?B8rZ?*;PPs0$T4zy}VtM)lM=48b2z7k+?c&>MQtc3Co(prR3~p&jbL zzNpDH7@Ok+JkEu_z%Jx-4zqH|ub^%;>!>}?FURa;{0B7${JyfQED?3Xb&<*HH8&_| ztZ$>bzR1`14ObS2aKbobN3-}iFCTmtuTnqv1Rq*B<|G%+NBb#ykM@G!u=J?+oMAHK zin9y>o<7IbFg(wgm)L*xdBVf^m%6|&3p8xL$PDHLJufj!$>V?IX4tXYW&7gkdxasO zelC{7Q&+htUcYAlxb*tZ_B^+5u-2(x!rhML_-B8!f9pAWlZj3J(pz>YgKzW3)cWs1 zp(M`6{J0AB#A`4CH=rM0M1Q=3dSU&7Bk(5b&vX6m*bkwNcWwI@Se*8QsG&WLf3e?X zOy$PDr@OrRoDRKjzwc*Y1o=#CiyJW+AEK5`(gXXBZ-TMpBQXwFVJ$r2>OBwbdXL8z z)c3$jxWc&`YmlFR$oSW#Q1Fp`r8Y(FnB{y2TaxcUJ-LVf1!5sAhUGB?BT((lu{XBG z?wEt==<#@bzZY~y-!jG&>bH5A5m6NWqC#C2p3md^K3@};khjBVyowrv!2BNH`=TtW zM-ot7ThG}FwQ9PdZnQUQXkT*qL@Y}_4|Tm9uPbatJ<$Qw2~J@d%)V`3ls9_o2>{i&gME>H+>i-H^x6p4VHNg1V$Cmcn?{j?GXv)Cx5uU0nV$ zYJV?kl1@h*HyO4QY{0?gWN63SDO(}o7V>qfyYM|Z+^-%|QaAu&M za1iRkGf=Bw0cr@Apq?xT^&Z)Y>WM?B9z2J^_!H_l53f&uu5bJ)XvgBHH(h0CBI<%I zQ5P7DI?))^4NgT3(K1)R(YYTr8FNuRlIJW`$PQsLCQ{!M8*qIyi$Z-ojOv`j%6SpnkpF_3JIO^n#;YCrP^gW=P#0K* zx{-~jNpui3=Et4iqMqzOsJT*#|JrY>%T+J$nFk<}ekWAauQk5e!iH=&Nd zfqLS6r9HksI(0$ybT;Zdi&2x;yPiTl3VSdT?_yu95@ZjUi26eDCTeK*V?{jS@*6I{ zi@MR$W$aL-q2|;xs2-h(nsmERbK@!|Y5kYvYl|vcVKaOgqi_@IfbTH{3-Xz(F>8&! zRe+)7&!OhPYp5Zah8nsY)a3rtwR?i?aYaz)3Bf?E|1b*bl0?+{Zica#j(Q!DwXXdjjHU{ ze^V;7UR$76!PBT^)(tfT1D%qg0hS?X?B-H-vP(5}Gb)j!itL7TE!N73)>g|cO$k$_2 z%tPHsg{t-eyx|lyCiPLD^Qq20s5{JZ`EutjXC7*f+`|Y=tY)9I2kI->0PKzjFdZvZ zw_m|t!g%r{$Q##d?orUJtrTHrYkSn2sTXQ;y^MOXEJr=b3DkSR6KN-14OIRd>Ww%J zBk>UG_}@@nUNOq%ZLkY@CU({OKT4q+6`|3#VKkP2%46Y($Xh_MN_egbM0Ohyg)bo4R?CYypTxXm>jMa}M9)W`63 zmp{T(^0GDUE4c@*BVU5AVQMY=g!{1$`EAr>j7hZlNQ@!RL0$KBBJ1CGr&J_S5nJ2Z z4@1e{Mvdim48u#PuFGG?4pAiP7nq?Ki|bHd*-m3?yo*}@DM_{mI-q*23zow^NnU%Q zF;uAQ7o&z^Giu%MMZM`xqn1tSWRLF`l8UJIeyHySqp&~DMNP)Ls2dHdYnNpUR6ZQl zqw`Qhu+B?CpYxxfy8I{9tbK%96*cPFC(A%R(NxqJpF};$S=5+bMt!@z?&|Z`x91B$ zJx~Pd#%iHH3o=m0dFN9YNMR{zZ1Oj-Jra)^yQfi;Z?W@z)QNVYZup9;zmE;ci#PQ6 z{!Y*a+mg@1r|}%>Ga{;ywHLO~`kzBV%j*pG!05(yy-&t0@=d5GuieCU<#^P7YcLrf zVP8ycYJ2Q$)Lb}>dZ62=ITV^=>swh=%scZes>}CfU#ect+ltn=sMW^1)Z8Vu5!=aQXuIy(^r}fFzpNeEDp8Il{!2NC zeeMxYyM5IjO4~=M_46F{JBdcr=}n}KVKMtOLmrU)MpBV@hNwbln?h(6Yhkk9Olb~I zBVKpyRQvuRmj2e!(bXNmLDYXsBv7xd1zx7UE5RGfx6QYhrTPnzHV->}PNNp*9!&Su z@?VYcAM!!OJj$(zFNpwhy_&WXXNj-KwT&izrd-_Rs!Mm}aZ22#kFxR9r|SA2P|)i} z+YripWSV)zOXRiPQ>g7v>a=~0k<`D7+sLa?4j>8<<*19tf*6kFaTD=)TS0-f{C}Hw zu`9M_=a*=hP5xi3gMO$g|o78J7MttHc*&l1{zUBlrb=S?IDS~*>wQ0`^l;6WJVlm}A z#8~1m`B9=JpxQ1HUK$2qZ~RP^Y;RDWiyz|y;t}O` z*ogR%C`G;twKXGtP{C~_sDGZAK+GgY6549;09Ppc{*@vxYvV_95*MhI?S#ctqCSwF zQ{938#-C{WjmUL%E8V`GokiK74=djm&(B@N4x%yjeQ_wEtuT4BPuTHQk}bq6;s|kr z`2SlKcK)4x`6}l7oK<@?b+OrB#FQ=^NUgT-v%in2=xyt=6xxdu+LjZYh@-TucdJi&|HgNcIxH6LEyLH!Z&JMJgWTAa*tDv4A_%eahbukGDCL z&kW?l=P=p|P;Q7tw2*^|Fiv_Bwbi%yzF51WkM^$p9NBo{C-Mr9 zAB%hw(S*=eoybRf2V8)K@G911|COk11$vM0<2*?o(S-6AVguz2;(KBbaflc~tR)_A zb=a?*F8;&~OsDQsLR$&yZ&3c4@_nKTaly4wH2rM3rCCCuo;yhywXpr0s6$;Ztm@h- zVp;N2gtq61Od^T;`q|&dm-EgfdxOxHpR?YYERPj2l< zO1UQp#@$b}x1juk%k$AToATd8e|LhLlp9h$?efOt{_Gd_3xz+ZjK>LBkBFeG?F(Y~ V#*(!Lw%j;%^x~\n" "Language-Team: BRITISH ENGLISH \n" @@ -50,82 +50,86 @@ msgstr "Dimodifikasi" msgid "when the object was last modified" msgstr "Kapan objek terakhir kali diedit" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Terjemahan" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Umum" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Hubungan" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "info tambahan" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Stempel waktu" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktifkan %(verbose_name_plural)s yang dipilih" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Item yang dipilih telah diaktifkan!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Menonaktifkan %(verbose_name_plural)s yang dipilih" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Item yang dipilih telah dinonaktifkan!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Nilai Atribut" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Nilai Atribut" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Gambar" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Gambar" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stok" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Saham" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Pesan Produk" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Pesan Produk" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Anak-anak" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfigurasi" @@ -753,7 +757,7 @@ msgstr "menghapus relasi pesanan-produk" msgid "add or remove feedback on an order–product relation" msgstr "menambah atau menghapus umpan balik pada relasi pesanan-produk" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Tidak ada istilah pencarian yang disediakan." @@ -927,7 +931,7 @@ msgstr "" "Harap berikan order_uuid atau order_hr_id - tidak boleh lebih dari satu!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Tipe yang salah berasal dari metode order.buy(): {type(instance)!s}" @@ -1004,7 +1008,7 @@ msgstr "String alamat asli yang diberikan oleh pengguna" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} tidak ada: {uuid}!" @@ -2715,22 +2719,22 @@ msgstr "Data dan batas waktu diperlukan" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Nilai batas waktu tidak valid, harus antara 0 dan 216000 detik" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | hubungi kami dimulai" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Konfirmasi Pesanan" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Pesanan Dikirim" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | kode promo diberikan" @@ -2977,7 +2981,7 @@ msgstr "" "yang dapat diakses. Kelas ini memperluas `EvibesViewSet` dasar dan " "menggunakan sistem penyaringan Django untuk meminta data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2996,7 +3000,7 @@ msgstr "" "beberapa serializer berdasarkan tindakan spesifik yang dilakukan dan " "memberlakukan izin yang sesuai saat berinteraksi dengan data pesanan." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3010,11 +3014,11 @@ msgstr "" "serializer berdasarkan tindakan yang diminta. Selain itu, ini menyediakan " "tindakan terperinci untuk menangani umpan balik pada instance OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Mengelola operasi yang terkait dengan gambar Produk dalam aplikasi." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3022,15 +3026,15 @@ msgstr "" "Mengelola pengambilan dan penanganan contoh PromoCode melalui berbagai " "tindakan API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Merupakan set tampilan untuk mengelola promosi." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Menangani operasi yang terkait dengan data Stok di dalam sistem." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3048,7 +3052,7 @@ msgstr "" "diintegrasikan untuk memastikan bahwa pengguna hanya dapat mengelola daftar " "keinginan mereka sendiri kecuali jika izin eksplisit diberikan." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3062,12 +3066,12 @@ msgstr "" "khusus untuk metode HTTP yang berbeda, penggantian serializer, dan " "penanganan izin berdasarkan konteks permintaan." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Kesalahan pengodean geografis: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/it_IT/LC_MESSAGES/django.mo b/core/locale/it_IT/LC_MESSAGES/django.mo index 0a4a71046b2bb17e7265acefc339f1eb91e73113..2d1397b141a59051461e8aab22419c5fe4c65e26 100644 GIT binary patch delta 12598 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 Gt^Wts;uhfm diff --git a/core/locale/it_IT/LC_MESSAGES/django.po b/core/locale/it_IT/LC_MESSAGES/django.po index 73a035d6..cc9295ad 100644 --- a/core/locale/it_IT/LC_MESSAGES/django.po +++ b/core/locale/it_IT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Modificato" msgid "when the object was last modified" msgstr "Quando l'oggetto è stato modificato per l'ultima volta" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Traduzioni" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Generale" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relazioni" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "informazioni aggiuntive" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadati" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Timestamp" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Attivare il %(verbose_name_plural)s selezionato" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Gli articoli selezionati sono stati attivati!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Disattivare il %(verbose_name_plural)s selezionato" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Gli articoli selezionati sono stati disattivati!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Valore dell'attributo" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Valori degli attributi" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Immagine" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Immagini" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Le scorte" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Ordina il prodotto" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Ordinare i prodotti" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "I bambini" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Configurazione" @@ -752,7 +756,7 @@ msgstr "eliminare una relazione ordine-prodotto" msgid "add or remove feedback on an order–product relation" msgstr "aggiungere o rimuovere un feedback su una relazione ordine-prodotto" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Non è stato fornito alcun termine di ricerca." @@ -927,7 +931,7 @@ msgstr "" "Si prega di fornire order_uuid o order_hr_id, che si escludono a vicenda!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" "Il metodo order.buy() ha fornito un tipo sbagliato: {type(instance)!s}" @@ -1006,7 +1010,7 @@ msgstr "Stringa di indirizzo originale fornita dall'utente" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} non esiste: {uuid}!" @@ -2725,22 +2729,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" "Valore di timeout non valido, deve essere compreso tra 0 e 216000 secondi." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | contattaci iniziato" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Conferma d'ordine" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Ordine consegnato" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode granted" @@ -2992,7 +2996,7 @@ msgstr "" "accessibili. Estende l'insieme di base `EvibesViewSet` e fa uso del sistema " "di filtraggio di Django per interrogare i dati." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -3011,7 +3015,7 @@ msgstr "" "serializzatori in base all'azione specifica da eseguire e applica le " "autorizzazioni di conseguenza durante l'interazione con i dati degli ordini." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3026,13 +3030,13 @@ msgstr "" "richiesta. Inoltre, fornisce un'azione dettagliata per gestire il feedback " "sulle istanze di OrderProduct." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Gestisce le operazioni relative alle immagini dei prodotti " "nell'applicazione." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3040,15 +3044,15 @@ msgstr "" "Gestisce il recupero e la gestione delle istanze di PromoCode attraverso " "varie azioni API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Rappresenta un insieme di viste per la gestione delle promozioni." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Gestisce le operazioni relative ai dati delle scorte nel sistema." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3068,7 +3072,7 @@ msgstr "" "solo la propria lista dei desideri, a meno che non vengano concessi permessi" " espliciti." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3082,12 +3086,12 @@ msgstr "" "specializzati per diversi metodi HTTP, override del serializzatore e " "gestione dei permessi in base al contesto della richiesta." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Errore di geocodifica: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/ja_JP/LC_MESSAGES/django.mo b/core/locale/ja_JP/LC_MESSAGES/django.mo index dd5bd0950d3bb2a6a4bf36ebf3f4c9e6721964cc..43b350d6f5cdc8cd3e62af358f21512fc39f8f41 100644 GIT binary patch delta 12574 zcmZwO2YilK|HtujTM;V}NyJV>B8ZU)LLw3(#7K==wKuIAHA}gvDoRvq)+kk4qpew^ ztzEQ6pX%U2QM6WTtD5cq^S#gUe|i01|LgVqywC5PYn_5!srl@6q%Ixwk*F%dWe%i}sM zj{n8axtTjyn|xKGJ?{mi$~O{1G+uQC*6v`;Ax?1p1r{aw z7af^TJl@Hes?;Cqg5;0zHhHCP#=JmYy1Ox%obS~h#>^q#+sk&aLmy)XQ=hXRouq!) zi>x1v9l-e0d9&eVJEu=jb5moWUA2u+BhwUPuoY_P#<=?NE}x8C%S=Zt(p#u0jUR0H z&qPga7HVqS<6idb>7|g9o|S)v;iRF`Fk>oU2aLvv7>BE|8vcTsf`Y^Cst?6T@)Xo@ zJunuhyY_9a{v5J?P5u$~DapW6{F7Q?}04pGRG|;A?ioN?}>@D9o+rzcB^vkcH}T7t{p@yL=34 z5oV+AbT;Y)%TPnU549$KK;7vn%#XjLI(EyommF))8-==FHT3GhR0^8wOw^EfK@H){ zs0)rq-T4gE1y{NH%@|JpHR?RSqn?iIsI_qib)iS7smVXio-YD*o~q**e_c443LV%I zbzoccjf8VBYQNV}b3YFQaXV@%zQba8-uW1H;ZTNGHxi9HZ*7dlG}Kxf=%t{=u)tNU z$3*heSQ|sf+m5tw_CQ^Dn9C=jIxr8_fi=#3s1BS(P1OxlM}j8UDT+c(aaAvc`V{J5 zJdQ;T%{tU$xE*zYJE#l$y>5p(3^g?osJX6+5t!uKJEIn1AJm$dk7aQgrs6(S2fcYF z+B*zIy>Mbsi|sjA-xf8u{aii-b;5~Q0kg3dZow6J1GWF0H|(6hj|t?PP><^s)Ck|e zBt8EzlWb3Wq2_2V#^C#?J34^s*cH@;0^hWcYh%=qc0;X=p%{)+P>XdHY7Kpj&G8uW zE;HpOv#@a?=GOD?KgF*40L-AFH0lm}V;&rYI?)K!luW@G+=1%wB~<$jR0lm%?c%D9 zRmpp!rf?2s;wntRJLu2#P5fJSE|XDr)C6l{XRM5~u{!R-oOln_frqFy5IK#HSd2sE z&9O9gL=F9D)OpupdEDc?ie3$I&~!W02^db^7E9qstcG*24DNUB7qJq#U$%X0tD{CB z5jFHpFfaCY`9N$$KGoG9b)L*-{Pn`QKt(RRjd~paM)kPR3_ElY7)D+L3u2b5?}VD7 z!B_=HqE`7w*a5#qjb!B8cCo&I+V2g_jT_%){0mXoMujf;4F=#T)P?@QaD0HVSbV14 zzY!K7Z;K_dC+g0}qdK$@192JZxQ(bA`xSNmzfn(tpZ6WRdQ(v+Y=il+2kOKFQFA*D zwfH_pExOar-%*R}8u}LByLQdgM$LU+RQ)1M$DdFmRBRS+Tl6MV&;@6p9-{@Qp;?QX z!_QF{+<`@KKWb!7qDJnrtN$By1Nmp$I}by(S3sRV5!IgV+FK&$_nICQ^y+-cHB7>y z@(DXCovyhLVcLrMx8kC96PkZs5Mdv3u8KJ|F-Cl-7y4TLUn8c=F{^(lR`Br z7GgLaMm=8FP;(SI*Pie>)KkzMd*KAEh!;^)Rd}8qu_~wz)WRy5i8XN)Ho�^WMQm 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 delta 12545 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 awvQOLIi%KrmYd%i)nw5&{=KML=KldFCoKU0 diff --git a/core/locale/ja_JP/LC_MESSAGES/django.po b/core/locale/ja_JP/LC_MESSAGES/django.po index c1493302..249ca5e9 100644 --- a/core/locale/ja_JP/LC_MESSAGES/django.po +++ b/core/locale/ja_JP/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -47,82 +47,86 @@ msgstr "変形" msgid "when the object was last modified" msgstr "オブジェクトの最終編集日時" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "翻訳" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "一般" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "関係" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "追加情報" + +#: core/admin.py:94 msgid "metadata" msgstr "メタデータ" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "タイムスタンプ" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "選択した%(verbose_name_plural)sをアクティブにする" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "選択した項目がアクティブになりました!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "選択された%(verbose_name_plural)sを非アクティブにする" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "選択されたアイテムは無効化されました!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "属性値" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "属性値" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "画像" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "画像" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "在庫" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "株式" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "商品のご注文" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "商品のご注文" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "子供たち" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "コンフィグ" @@ -692,7 +696,7 @@ msgstr "注文と商品の関係を削除する" msgid "add or remove feedback on an order–product relation" msgstr "注文と商品の関係に関するフィードバックを追加または削除する。" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "検索語はありません。" @@ -865,7 +869,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "order_uuidまたはorder_hr_idを入力してください!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "order.buy()メソッドから間違った型が来た:{type(instance)!s}。" @@ -941,7 +945,7 @@ msgstr "ユーザーが提供したオリジナルのアドレス文字列" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name}は存在しません:{uuid}が存在しません!" @@ -2513,22 +2517,22 @@ msgstr "データとタイムアウトの両方が必要" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "無効なタイムアウト値です。" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME}|コンタクト開始| お問い合わせはこちらから" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME}|注文確認| ご注文の確認" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME}|ご注文は配送されますか?" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME}|プロモコード付与" @@ -2745,7 +2749,7 @@ msgstr "" "オブジェクトのパーミッションベースの処理を実装することです。ベースとなる `EvibesViewSet` を拡張し、Django " "のフィルタリングシステムを利用してデータを取得します。" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2758,7 +2762,7 @@ msgstr "" "注文と関連する操作を管理するための " "ViewSet。このクラスは、注文オブジェクトを取得、変更、管理する機能を提供します。商品の追加や削除、登録ユーザや未登録ユーザの購入の実行、現在の認証ユーザの保留中の注文の取得など、注文操作を処理するためのさまざまなエンドポイントを含みます。ViewSetは、実行される特定のアクションに基づいて複数のシリアライザを使用し、注文データを操作している間、それに応じてパーミッションを強制します。" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2770,25 +2774,25 @@ msgstr "" "操作とカスタムアクションを可能にします。これは、要求されたアクションに基づくフィルタリング、パーミッションチェック、シリアライザーの切り替えを含みます。さらに、OrderProduct" " インスタンスに関するフィードバックを処理するための詳細なアクションを提供します。" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "アプリケーション内の商品画像に関する操作を管理します。" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "様々なAPIアクションによるプロモコードインスタンスの取得と処理を管理します。" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "プロモーションを管理するためのビューセットを表します。" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "システム内のストックデータに関する操作を行う。" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2800,7 +2804,7 @@ msgid "" msgstr "" "ウィッシュリスト操作を管理するためのViewSet。WishlistViewSetは、ユーザーのウィッシュリストと対話するためのエンドポイントを提供し、ウィッシュリスト内の商品の検索、変更、カスタマイズを可能にします。このViewSetは、ウィッシュリスト商品の追加、削除、一括アクションなどの機能を容易にします。明示的なパーミッションが付与されていない限り、ユーザーが自分のウィッシュリストのみを管理できるよう、パーミッションチェックが統合されています。" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2812,12 +2816,12 @@ msgstr "" "クラスは、住所エンティティに関連する CRUD 操作、フィルタリング、カスタムアクションを可能にします。異なる HTTP " "メソッドに特化した振る舞いや、シリアライザのオーバーライド、 リクエストコンテキストに基づいたパーミッション処理などを含みます。" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "ジオコーディングエラー:{e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/kk_KZ/LC_MESSAGES/django.po b/core/locale/kk_KZ/LC_MESSAGES/django.po index e2de56ff..ef29e6ec 100644 --- a/core/locale/kk_KZ/LC_MESSAGES/django.po +++ b/core/locale/kk_KZ/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -49,82 +49,86 @@ msgstr "" msgid "when the object was last modified" msgstr "" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "" -#: core/admin.py:87 -msgid "metadata" +#: core/admin.py:76 +msgid "additional info" msgstr "" #: core/admin.py:94 +msgid "metadata" +msgstr "" + +#: core/admin.py:101 msgid "timestamps" msgstr "" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "" @@ -678,7 +682,7 @@ msgstr "" msgid "add or remove feedback on an order–product relation" msgstr "" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "" @@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" @@ -927,7 +931,7 @@ msgstr "" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "" @@ -2459,22 +2463,22 @@ msgstr "" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "" @@ -2656,7 +2660,7 @@ msgid "" "use of Django's filtering system for querying data." msgstr "" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2667,7 +2671,7 @@ msgid "" "enforces permissions accordingly while interacting with order data." msgstr "" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2676,25 +2680,25 @@ msgid "" "feedback on OrderProduct instances" msgstr "" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2705,7 +2709,7 @@ msgid "" "are granted." msgstr "" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2714,12 +2718,12 @@ msgid "" "on the request context." msgstr "" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/ko_KR/LC_MESSAGES/django.mo b/core/locale/ko_KR/LC_MESSAGES/django.mo index 6164697a9613202be042c23f7a12416f8920f990..6f33fb3972ac223ac315677cb6cbfd85c0757a90 100644 GIT binary patch delta 12580 zcmZwO2Xqz1+sE;_gb-RNA%xHgAq5B|gc@oBA&?-wNtIp%X(C9yK|qQSKx#mWASk^l z#Xm*q0v41Gf}&Cs(Sm_WX^hCS|2NR@fyjHR(E=Qq761kYJZea% zVj-N18p`#kA>NAoV~+F3evdJ^>vJ;llMRe%Pad9ZOamO#&>nApiuDT&W54fE9l4L* zB@`Z0$c76VG55F>bK_Rj$n3)w9Pm5T(3eRy<|`JE#Ak=BDZ(yJ{PuMy3fyV=L6qjdAtqE}w#&%gjJ6(mzpC8b8GDpNg8= zW~ixs84t2wPcH>OdKNW|;iRGbaAV412aLptSP9o*99~9ELEsy9)rVj>d0o`!dSDFB zaP7NY{g24{HMvIEyCemRlY6^AFQ5*v6szJ<490&@i!f-U9jS7dm;4P3z{wbbGf`{i z1Jr@HqOSOBY>yYP8CH7J-WBPXto#2n3PCjZkK*bv6txJGF%Q0sYVV6CCr7tpgQ)aYcDp=9ybDYzBu&igNYP0*Qux>?}{42*H9-+ zM_qXa>V#`u{SGWeeh77(Ur=|)AE>o)4|Sp^sHw>{-X1Rub)4AojK5A?n+kofCF+Ci z&^Hp!A*lV{Le2d`%!hkXQ}GoR#%s=}s1t`Uyt0ZIG9O7QykfBuDsPG< zuoG(NN289r8Kdxk^H=n0h=XR>p{|0Z$lGCY9Eou_A4}p9*M1$#lLySSw{2zA2-H9g zeHv!R-Yy@6jmW3D`cuw}GZ}w9aDJj9E8a!jj(?+ioF~H$T^NRvSH(bV=IT46rf3LO z#F3~~z6Lws7pRd8pJf+oN7R0k&>y$YV*K+^*iD5_cntI6CDe(2!&3MNW3b3-8ll2-dD^14HU*t919clMMh(qo)Es_- zI^jMnfJaaxa}hOiH(mYTs0+w7&t7>bs=X}g_%%@N$*#R6a(u7pK|zns0j^;(79wAO zT4bA0AH0Y;@doN;au;>r?DOr=2BX$UdCZT=sQuev4(yHvaR91g6ELUl|JfAcs91uf z@FeQ?`W-b#Aq(sQo1^Z6?$`?_U^%>wnyUN@?TA%Gb)Y&{#8j+?Z(;-7j5_W;Y{dCZ z%p$vJhGRkUF{mETL7i|3YR>-Syn+$ro=jUGg&M&$tb)Bz9m+(Fzz*z$pJQt*zSypX zq3BK34isY0EU_a{0fR}Kq2{_L7RI5dDR~Dg;ZEl*)JPP4&zgdI&1Vl6!4>a#4j511;LMEzKo@54m$Y%8pd zunzfDmmgW-wL=#0zWo|q8#T1uP*?soYUt--KHQ0&@fd0mMXa=UMHSRt(-`%+W*Cm0 zQO|>PjKwKfA9uR?$6i^J9Sg8S0n`bjP`6vmWV$75C8hdSXR2t#odrs5tfi`mxM3y8yV>+ML@!@A^skSj5(F(rx{<@8p@32F-15c7)Kpl9^PP^kqe47q@imFfAZRfr*YE@4`O~D~7#2Ig3 zd-8wx*so&k_u5DA2-JukcV_qQvvZq*aWwS9VVH^KG53C++nl%tPQb^X@sOc@>;YCV z9>!?uiyh?W8S;jQ*q6NUVLJt_j@TcimZ3(X#ZlX#HmF7IeVsxP3bRl{yACyUyD%Rf zKwa^7F29H^$$!J_S-6^GbecTnINt?0@n+1xMGT{k7xk63Dpn-Bon@ z+V0o`bFsq^EQVuIKQd*aKG@(CYlJ)vbJBr+-*Q)wzkZq@8_0K^vF%gO^TMHi%>`p# z#W9zx*Du=+w!Ff(sVvO@4_En@3wD@#joXg{4EveqGbb8-o#CWD{swbN{hK$*ssH9z z`(sncZ@hG9A9|Zn!ri~~>j(Rdy~E>|JnSx`hL7&C(5V0NzCC`ohkUuAzTab>n4I7I z`@}vv>piuvT`y{`=Ao{55$d*Cj+&a|uKu+15>BN48fuO7`N!TJH=o%D+C9ue`$N?8 zA>d!03v{R`dh1h2^>}=b&>4On-+g)*6WH-CreRE0kMG}%Mxr{f59{JFtc(Hv9^YcE zh4JKlUA`Ej$&cVmcn1q%?QGUI**sp~gJ2*P)o7T9x;;*~9dZQN9m6n*`UKRX8iN{{ zX{bl?Y*+sY29qCj?dP#K`Bm(S4YPZEcg+W={7H7N$G6Hm=J5F5&jU~gSb~Ld3+nDT zj@$4TtcQzo+76sY4e3?PjrUL;)DOU_&x7h{X;gh#)Cg2}d2=s?{8V(ooH*Dy+U+nI zb%433jxBcen^E`gUeu6Zz)F}qx4n?MsG%Q(I^japaW=8^ zQCA*^+OY}h3fj8*o-QBnoPoN4#i%P^jq2EL)aP%bM(BZS_siqUy`~TaeV`16U=7<~ zn!EbWs4E}h^2yFj45NM{>I7e-uJD5M2ULe|xcolq0-w72z`Qyy_g_&8`e3ZH8mc38 zd^;G^2GxOnSQ5vf4z$#{2{pv~QB!%&)!%YHMs+Y(K9BEpUJy%@Cu4EWZ~9WGf|D^7 zKgH&lHNPF1HmDQ!LtW7*=M?9BR0mg~I7Qx*A z>fxYZdw}Vv6MTUY_zkMZ4^SO51#O-mwTg>k4Qz=!aXRYr^+W84q+$c|uIP^|Q6u~j zw!*t1-2c@nG%RF4I1crworGFkn=uhjVP^~qwFe%I8j(q;5n6=$+#1va=@gd02iP48 z7WSB)I1)SJCDesg^A@qUSt9BLolpndh1%f=>dL=Ct%)B|Q&p*`?QkE|{;#1%WDM%Q z-->B?5w#{F_-hnB@v37YEc~N4M|0mO_k$FK%@CUTi`BEowx=!|dlOpzrtpDz2g->Hse}yQ4;A1ghtAP$%4j zy3&I#KZSbIoky*iT%|p}FPRlk7w|dO#CxbIsu*sM(+h)j{|}&`1ExDOobO>R>er!e zuj{TpqKw_YGR9J$gn9rCMRjl*>Oy9trfRjzPoqZa7V3-4Kj_tt4I=CTUv~CE-Il{q zBQP8Ff%T{p{E0d7A!_aTMcUVQFlzBN!Fo6xb>$ypN4$d?fwU-(X^ZJm-2b}rvs9=f zKci0Y2=yS*S6k(QsQrRbCoJu(jQU)%YwzIf>wLpG(K!e8`Q@nNZi)8VE8Izi4)m?_ z25Rn}qK2$uS!;dNldGM}hhrT1RIGrzQSXi$uKgM6LW0WK&zE#oM%6d+QqUZ>LCw`9 z)DvyH^ET>15>eisI2i|#_dvZwPNCZWLS0dT7&}r$Q0>v!2Ag0PT!FehpJ57m%U7@; z9EKW!Q7+Fw&Ha4m7S!rK;qu>|*(=)p!m%;!by2tL6x5Wh$9}jQ^&~7E>+$_GI|<3X z<_ZP%G%?QJW<60OkbyeDQB=pypbq>i>UPXi$v#LDuq=6ZjKp_bz6~{nmrj z`sD4fw%-4l6f{I0XY#*JYur>K1OvKPCHt&G#$v2|*_pj zKKB}GM8~-LWvDf_8ugAjmIG}Mp}L>+Jfmcm)6HL=Bc0-KXx z$5gCV%VSnxI;LY-ZTlKuiQ4ZNreSCu`yA+5hx+T4$Nfc%V_)4;lRwN^)c zq3DI0%VntB@&M|tIg2l&e?5=yFB-a{9z1JM?LT5S%$I224MR~EJR#9*pJY?12&G~! z>UP?IdIFwsJKjKz$RDUDn_rTBnKZyx$eW@%v=KEzpJOk)jCwaD)wdlPj#bE4p)T~i zmx3M`o(A@Sp{QqlY1EUdJ8HELLw#T=>WYqFHN20yl9*(BA(c@Nmb$11RTEUl`lC8F z&gF|xuVL>73VO+$Mtv|}LyzwVh~lVkMzc{JIEH#=-^09^n&R>O>v;#%=SQF}WE-me z3rxZb*ba*}vajJ`*ogcfChGpr)!5!%FQMjmCTfu!#g-V9>gFD&kuO8tcF}2ejf_Cu zzAI33ejj^aTod~onTr~^lc=?J-{nPL(({4)FPVZKI3rMx#?9!#^7@0VWEP&&L}{Cv zRn%{AWu7g*Z8|1XdO$FvW{0gdUpkLbH-z#HVjeM(Tz5n+F9+t!s2NGTMU)|QH92uP zafW!C;I{_f)|B!gN?*G?9kn0}QLoL97)7*oxu)(-$}bbMC~qSc5#N!2PE=^aAKLzd zfy6b!_nQE9dkCI2z86Ph$_MA3iYVl5OqXX-t1TKI61#~{$;;FBn`>)9UY-1B?Z{Sw zvVL~BL%AUPJR(}SebpXD+a}a9?MD3`q7HTW)yT%JWDaV@JR|upNim`WQHs#^Hlgo9 z0R)d!6U>Jj5|dp!)h0LP2Gq55bw{ut^%sda>b0fd&(yagcqjO_`4;mYPb}Y-g`Ga5 zu{_y+)Kb;9k$6hppO{NoYyB{hk6g=h7jd5Wl3d$J;#bOfT&}uSt~^EwTUpLk2ggxg zU+3RIL3g#bfs`YOxx`@dD())OcAq+JUtu)$AK-5C2+H}097HH}v6vmhu?T)bJl|GO z;CcSPn|HA*>OZs^Lc?tGJE)iK0X&L&tHizVp#aJgsnf>m)C_lRYsmGOD@lIH)vYDJ zL^+w`52aj+7(^u6_PITy^LyiI3nsryy*53$w)#r;k2Q8*^9?4lueNnWBr(9XsjevH z)fh%Bru;WCn)rhJ1i?efbRl@An9byR0zT3jtj9s)NVILF@%eU^f}UP_>~cZZ90`5Y5Sh|mw40dw2m_0H++xg5zp74+I}F?Y3PHm;C9qDh4Q<& z8J`h`;K63<5I+$?RP9A=NyLx7lKmqu^}UGk#7yE1LR$;@k9w+e`e1s7rl!97t%>Z@x)e z*>N<p^j$WN`dD|5drSJcaU!M7#Ro`=x3 zoM=Uyplv;oNqH0URnE8F=g-Q-Q1S`H_mum%HtkTu9j85Y@2P?<8+E^9tS{r|7}|31 zP0S=x@e|Scg#)}!c_DSg%si~;vM3# zYa531hyuhk&)nmnp9%IuXT*^TY!pkTz{!Q$A^nrZwf- zbYKbjP2w-&58^XITOr!6;`2V9WdGB?7GB7@udb1NPW(w!a1B$PeVs@75WD*RTEgEQ z=^yIO63@3elrIp6iL%6F8YU5|p6}osL|azMwK12T5`~G<9Q0e%mS8a-IiJ(awO^oO zEOCpx=<~}W|Af#tNo^5?AMMR>0cOV=Sc(1LM{O(6dz?QmlUyR|QQk>xq1=hMLhL7w z5d(-1iRW8Y_6y};o)VJpWwn)d@sazW{>p9!V*fV%Q0Ta44!v$6y3b zMRnyeR2Q#C{xkdd;{%^D53nQo_nL4I@7vn4}h^tXOvklvE!$YX94{Kq}MJ$DzDSwESabqiEy3+Muwl?N0^;O$4Oq3U( zo8oYCCi4t8w>RcVyxoERZ_EX4o?x6PnA6Fax3OYpV~%ly3tgC$q?b`cT6VZSzYc0>8={6b z0}pXt2aiN^CSk78wx>#9Uh;jh7!ER270LJieiSAG!n;G3u(dx&K*V1j*tcnsG1Pa>ffH$*+Koy&JcO}-(hHyw$(!4y=N zuSd;=ov1h6j|K2Bs$pNa`Uj}{228XK3PD{Ljh@E1A_;YQLsS>GK|Qbs>dl9u9yr~V zFT`l_>rgj3j9L{ZP;Yt~_2%DUIR1>fpKp@APcZ7aQIqI@U096*U6_LYo^ZBvC-y>( z{bKmXYVLIx8W3Vhv!Bkw2YTz~03wn1*XrswD)lRl5 zsEQQS4KrLm6LrJhSP_R{EnI}_@g(Z}Q7_stpM*8Z&qpoSPf$I466;~Um;4R&Oj8mX zqvtUmC!yYGBdTGapdR!)MqvCj+oh?fNz?(Ou|I0EPDj1KI&6cx@p;ViGL6RZ7=S-v zVXgn)NTgHnFX|1Oy<&T!E$T)cQA5%n<8dYC#cWjlNmK(bqb67J>Gnga8EObeVGEp& z4e>MvVdxBolINQ!5}G6ln1T&35l3PTT!XpsYmCRUs5y{(CgYApQ29hGjrCAn-vxEw zIT(j)oS&k4_)qkd2z%9bVG5Qa-wCVYC@g~;T>TNOME*MF!J@Nl4@9E6J^}M#Gnao1 zo0A{l%6B;Tq4t|Yv)uYWMS<4i8B~jZMRlETw*AHvj)ll4p~~xHAhyFK?1W`;8g|Cb zsGiI{$4=I|sPp=u#y$%R)YuL}O}>{=lkR=zVN_2X zNB`u*MDoR7vt!>JRXzcm;@hYm`Uf*HD$7348%jbg8HehcIjAvQfO_CcEQ%XYJ+lwh z6GvV787xTtXAHr+u0CkKeLy6tzC5bF8tVRO$j<4RR<5EiYJESCnq;$47w*ISn2q`{ zIfd$}A5mR<8zZs60y`PYqs~u3EwjcLj;&A)?}@4(j#ah($CHSr;0@IBI*uBnJ6Hs( zEVQejG4>(f6BF(Ft&4tXRc0*c-o@VJK z646*_nVkzssIhK>#W52#B!jRTE^>Z?>WTZ#*yVPk$;7&pkHw1kHtM_!SRI2_*!$F9 zLI2mLU?>Hu*oexXbte>EX-{m1>eA6z4>!2-E2ypvd)@wxs2eK35>xS-Gj0{TD*67H ziW^Wpc72s+zdlE;wq2Wwdh=&cT|W{vYZqZR+=QA$0c-542t%!!c+_=CSPtu>_JbZ+ z1^ZzdE^_5(otHfl8mk|%DBeOnFz;GBsUlI6Fb1`O)WBlc1l1#5FcGKYr?>~F;*@oE zC<52p9!tVh$_Jv(--;S~?^_bFBmy_s*`J8&;*O{;dJQXJHfjuSVkwN=XdjS*jmUS$ zWL$~5@t0U0eVgbFj77a@Zw$bp$TIfKND`W4FJL)biY4&?YW<%@J@7iJD+4y$Rg#RF zD~(V$9)poM6B3=p~RiLPA~j2Wreq zzGat7JJcJ`Mop@BP|LK=b~{vqF^&9ORQYLag@HTl&etCGpy{aR?8Z2}jCx+sPWoRJ zHFnxD?vA~Ed}?6?<(GCDGlTqHEJS|lJGKkwp}KlGhT>Wb$K9wN_zZL7*Uqz;Mg9U7 z#1XsgD)M&I|LVep6nutzQ8%8p$DTL~r_q3=sPdS-cI@L(v$`MZ`gIt=6SJ`s`HSz_ zuVS^{w_9&VY(V)I=Z_deKGr*6ziMUR2nxnxCHw_H;=z$0@Usb?{gAKXly^I5f9qL~ z@svNn)09{EnAJf3AJh<3KVpB3nuO|!s@b+dHBpng1C~H<7zuUl3{=-G#t>YCdgEO# zzYjCXAH#gP7_Osir{rTlW%J^}b8t3}p&NC-yeF*Tm`uJL>VBQ^EcUQ@&(u3C-e|V9<1Na#K{#R%%1?|6Q`{Y4guJH|)3q!9nmXtsFBYDcV-=L22JJ=jE ze_>7IlADY_=XLvy?|0;Ve=;Qa?Jags%HRCU-aqv&^NjM0dv?dXcprJbDf7U7>^_Ye ztC6TT9)k(!p@wFQD}UR$AE#1&5H&~AAKKM%^k2K7oyNk{e}hHwIwsPf`Q72RbR$@ckgf;LwYO9z0#7GLXJhr+MescQq`usaraa50V#q!t-HOXGaFkIm3w_soLJFq)O zouH1nI@i3|( zr(F3ZR6}pO^82Va58?-5ofm^eunOkK#-2;Gb|-W~-Jmb(%?7*j$*6TZ2dm>&tcDk` z3WgN4U7m`1-~iNpCZm?$E2tqn;OdW}dcwQp5`UoHJXaxmVkuOM<51dAQzk|hizR6$Mo*09=Q4;FS(_Frja}dT*?x7yA8uf-- zojXwt-s|$&s5d;}$}ghsf78|bf^|LXFCPh7VuDd8#G)Ed7t3H<)QyHYUqE&7Jk(fj zcIEq>pP?Ff9+U7omc?QrKK~b)I#`o@Cv2hh|0;>L_%-?)P{cm4F6xb1IXgT1p&B>} z)qokUd^u{4Y;pM`sD^xr>ZuEui9etkP%D)6uQwY^qCQSUJ#ZhYAxBXcp2J|g>b!;8 z2XYs+LzjlyH`==VbSy`HA@;+4SPILA*#@SfuJ0Dc`qu-NQK0W=YfvpdifY&?m%oad z#WztKR=IGWf2;0>x<0I!?U9n$gnU)hSF@4W0>@!{{1|ItM1;MrZ3OFITWm)PG`S{Y zDz3$D_&utt8%Nq6>4@r~fvD@opf;qnSQ?LFPrQ!3u|;v8>4I;fUMyb;yP85#_fPal z=!P>;CoD$2`5M%m*o7La+$C*`YopF@gzAwtsI7J?w!}A3bK-B*ju*uLK1s#?sOvVP z?!O1Mti7Wos*$*gdZTbYV+Ua>=EgTrvv@n|1{YCpeADGaOWV(mXiTNN4XVdxqwcpB zwb!3O&51i$5lfWu>ANMr|B+C^AXGyZpiazo{*2m!gQMM;p(bZX)Pn}1Ca34}bFdxx zb*LWw3pGdnL%n%mjLk=2nAU%3e}XTes4mGswY)d#!r7=dU*Pg&pLj29&pZeNof~)CASQ zuBaRLLJieum*0Tusr{%gFehDkcm>;l1oYIB+9b4bq@#ME7wUqEs0SRv{P-!V3%^2r zY+pl7zEZJvh|;kx`Dxe%KSK3DRGiN|f$dSx+k|TH?l`ypk5Qlxi&LlvUUVm3Lp|`e zGa%kxSPXTeO3pgY=FTUay;0Xci@NU=)C*2WHDF!5XA^rV(Ab?obs67{{Dz@+u6UPE z$ExJJU?R>$eRk}1^`E0&SIwu)zKrN9qlFO0n|qFH|oK~D*4P% ztcm&%S&OPaf_kGLP(AUBtG|bjlP^`-XP&|lSQ$UZbbN@qu4$ruajz8#74$%LO+V)p z)a+j2@*gO+$3a_x+2$VBXqGf_L?ZS0I4tJwT@)Qf~x^{+C|B$H4N^g!KU z32JOMqV|FJP|NWWY9lF7&F&X9FqZsNF8?BG2)CiGyX4GM-RJ*HYCP&gZV;-6HenmB z|A!=6QqZb~&;K*oLQExp!{sa0^!fiz=V2Sl&){IJknHpSpUu~B0Qt+<2V14s9@vh` z7q4Z{n}izkwA4|DmsIE?&CmoHq$F4HK~kkv-@SR+)IwsGad zQIl*m>O*FuE6-Ec?uZ3Y*N3C0F^(dkE^mmsVF!%Ho~Su7#km68l7AOlV7_`jvkKee z3wR4F;K=&+yrrm~y@A>Xk{j6iL8#A=c@0?q+CX+wpwEDdsM#9S(0-vvL5<~b)Uuq9 z>cUOnWwP~szDyAhq6#(y$$u*P&CapBpqv#ABB3+EvWtCH0pjgJQCXLZ=-gq z8cpnMZ;HBL80w7{qqf{^)Y$!tdXs>rc4G-a?H8p`4XcN0SX-ALh*~|9P@gdyP#cwZ zg~SLFzoEVw^=f7tuoSgtA4YXy$#kFpujQ3cH^@M}$&0A^W!M&Y&#}bgE}uYpH0e&nY|=Z3MZ_uc9}*o19s95#QR*^(G^SN8DBMr5 zDfvG*GDsiHx?CZ`YfkNKN_E8H-^9DbUh)al-Eegp?G*A?bs|S8(v^u{Nr!RHU81c! zSM|}Ue{= zPrg6#8fk4u9}~gkH9hwbXNb?p>ljV^M7og6t1Q!{$1CHG1~`H8G(CSS39V`!gGg5( zUL%H)ui@T8b+;+gaUA0)UyJXOFHbs{&<}SJlqF$aEQ`hQZ6fD*odo;){~q2Fm(1Yg zVN}c^|0`-SeS}9)ds&r7E(#&6Os9$dzp(f0lF;&VQD4G%=KD zWb3n@i!b6;qpm3VKPcCst!ukKW&c=j&ow8pk$diDs$z+Ou1;r`AiWM_h$W=&5Mzm> zk`xz9OOBOIu!X&Z$n!qJ9!lg!FPOPwXN7 zzhgRuovAxV{7Z~+Cv7Ip_YeQpJSt}ns_r7;QSl6R$DJzVm_~XYZo`Mff27&*Onu@C z5la3&)X|u@q=Y*PQ{J1HNW4mnBy?2b1%4py|5u95CsGl*he&=yeAGObOe!ayqy!rk=aemB0eF0CjReH zhLeBi+)9K#zjaikta8>z2}OfKDAjR3>wH2AtQ`C)9HH=}6f!6>tPl_6t_==lFe?x_o@|GN}|?A-X*Ku*M9)IVR$IeL@0?=o9(4Cmw=8%RG# zrUxhh4ThxxUTBZ(Mp`UUE!V=)_@Ika*0-%v1t_>p{xoYx}%HqnsK zq3=DpsDBI>U_QKtRXKkZ>UbT!Px#|IGG~c~q<0fPVViHl1#klBn%&60RDK&xx9pb;EM5t|S&Ce~QrY zG%<=uro2wp`J@Q%RdUk^9l5#d9V|%gIMVNvE{kswI*wu;m#)A${ajjgF)qE9bY1G| ztB@m#bjBm+MN#&>g0g#dez03oFpwxh;X6bu7gZ#`*IhW5^rJ^p$``phmG5$u$+(>O z+SR?{$^$W+dxjA@no}R(Pcc6SlZhiUlGx}j)c@F;Nm~CZx(V(i4pZNqm`b`2K84Q^ zD~OhyHxGZJd^PGAV)6f^qhwFYD`O8FPb?-@YklY_Osw#y>>u$kfD;})T9FBLZxD&^ zKT_X}^d*bZ$Lhf^J0D>@h62zI1y_Tv7~i;L=4?kq*}l9 RU9XJ3J!j91yuS9${s+Jp5D)+W diff --git a/core/locale/ko_KR/LC_MESSAGES/django.po b/core/locale/ko_KR/LC_MESSAGES/django.po index db00e566..64a4d231 100644 --- a/core/locale/ko_KR/LC_MESSAGES/django.po +++ b/core/locale/ko_KR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -47,82 +47,86 @@ msgstr "수정됨" msgid "when the object was last modified" msgstr "개체가 마지막으로 편집된 시기" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "번역" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "일반" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "관계" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "추가 정보" + +#: core/admin.py:94 msgid "metadata" msgstr "메타데이터" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "타임스탬프" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "선택한 %(verbose_name_plural)s 활성화" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "선택한 아이템이 활성화되었습니다!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "선택한 %(verbose_name_plural)s 비활성화하기" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "선택한 아이템이 비활성화되었습니다!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "속성 값" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "속성 값" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "이미지" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "이미지" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "재고" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "주식" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "제품 주문" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "제품 주문" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "어린이" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "구성" @@ -689,7 +693,7 @@ msgstr "주문-제품 관계 삭제" msgid "add or remove feedback on an order–product relation" msgstr "주문-제품 관계에 대한 피드백 추가 또는 제거" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "검색어가 입력되지 않았습니다." @@ -862,7 +866,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "주문_uuid 또는 주문_hr_id 중 하나를 입력하세요 - 상호 배타적입니다!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "order.buy() 메서드에서 잘못된 유형이 발생했습니다: {type(instance)!s}" @@ -938,7 +942,7 @@ msgstr "사용자가 제공한 원본 주소 문자열" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name}가 존재하지 않습니다: {uuid}!" @@ -2538,22 +2542,22 @@ msgstr "데이터와 시간 초과가 모두 필요합니다." msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "잘못된 시간 초과 값, 0~216000초 사이여야 합니다." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | 문의 시작됨" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | 주문 확인" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | 주문 배송됨" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | 프로모코드 부여됨" @@ -2769,7 +2773,7 @@ msgstr "" "구현하는 것입니다. 이 클래스는 기본 `EvibesViewSet`을 확장하고 데이터 쿼리를 위해 Django의 필터링 시스템을 " "사용합니다." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2784,7 +2788,7 @@ msgstr "" "엔드포인트가 포함되어 있습니다. 뷰셋은 수행되는 특정 작업에 따라 여러 직렬화기를 사용하며 주문 데이터와 상호 작용하는 동안 그에 따라 " "권한을 적용합니다." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2796,25 +2800,25 @@ msgstr "" "수행할 수 있습니다. 여기에는 요청된 작업을 기반으로 필터링, 권한 확인 및 직렬화기 전환이 포함됩니다. 또한 주문 제품 인스턴스에 대한" " 피드백 처리를 위한 세부 작업도 제공합니다." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "애플리케이션에서 제품 이미지와 관련된 작업을 관리합니다." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "다양한 API 작업을 통해 프로모션 코드 인스턴스의 검색 및 처리를 관리합니다." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "프로모션을 관리하기 위한 보기 세트를 나타냅니다." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "시스템에서 주식 데이터와 관련된 작업을 처리합니다." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2828,7 +2832,7 @@ msgstr "" "내의 제품을 검색, 수정 및 사용자 지정할 수 있도록 합니다. 이 뷰셋은 위시리스트 제품에 대한 추가, 제거 및 대량 작업과 같은 기능을" " 용이하게 합니다. 명시적인 권한이 부여되지 않는 한 사용자가 자신의 위시리스트만 관리할 수 있도록 권한 검사가 통합되어 있습니다." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2840,12 +2844,12 @@ msgstr "" "사용자 정의 작업을 가능하게 합니다. 여기에는 다양한 HTTP 메서드, 직렬화기 재정의, 요청 컨텍스트에 따른 권한 처리를 위한 특수 " "동작이 포함되어 있습니다." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "지오코딩 오류입니다: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/nl_NL/LC_MESSAGES/django.mo b/core/locale/nl_NL/LC_MESSAGES/django.mo index 08a4160f981644548643586942f1f9bd8db6fa2d..7e9107b98f6997d7f5b759ef6c37a1015b5cdb73 100644 GIT binary patch delta 12580 zcmZwO37n2q|Htuj8?#sjGZ^bIgV`9&Fk%=C#xR2s%94Eq*;ZH^$YEcli|LUS=k0k^YXF(rSb3`5CCG z%|cCWdpy8-J-rnC=vmAVhLeU$Lyd{U4j7FSFcCLm0{(!Sg5Y6x)rVnu@_MMx^}u+X z>Du?W`k#>XYw``ZyCfaM$-Uhl7f=^ifi>_57QsiTMHo85j#Nb~NInb$aT12%EYzA= zi@NYO)DwS!?eKfd!o-nwSB%Fr?f;J`gwo(Yil@ios708D1+YD;y$_DT(HMnyP`je^ zXhs9eVNpy#ou7`H$_}WG^haOEQ5~Lyg|z=)r%;TFciahwd=18Y>%4-Rv%6RlbI}WR zFdQQ=5i4SAtcGJzQ?}LB|BSkE@XL0@!m%8A6#8rbH>IExvQRzlg1X@#myba$!da*% zU4Xj4YSfS)Lam9fQBQgn^WkMw$9{M1rN`RqMxpMPfL?ttm4fCv12yDbP(%14>W1S{ zPd*!U!yH$?3nR!6qONlpwL5-8t&Q8L8$Co#O}=sVdXcE>R2|3o>&7Wm=!30LA8d=h zk#G(|o%bqg?iXVr+>4ru&#?sl?ED*b<1mI-4-$>KZZgJW1Jqg@;H99&u*_9#!&>C$ zFd4(f+m1Z#?18%RP?t|abzm{71Dl+OP#rjrnyOoV*@FT5K&{eOuJr_I3GS)CDJC9L~a;xEt5uE!6o7C)zn*iAm(|qPFXG)Ck|gI@^ka3g(lnW+7vaU-B4@eC5*tSsKuItT0;l11)f6QWv0Ru z7B((Nf9?M~Q|+oRi0L$xK|NtM2H-%{g@&W1WGcquK2(RVqS|kvI_Q~Z7gsV?CC^4p z;X=&79IS`8F%S1Q)u!9IOhG+SCO(Cou`({e>i7xz;T=>59-!7h`5Ao0Vj?PUfn~5G zYUoF!uDbT!YDcIYCpIC%{W#w=Ig2{lE7unLYq zt@5|91Ac}Y$?|jTVto#E-bD1r9dj7}0u=U8p&NdR1@SEEMmI15?_)fce9fNU1oM-( z#nRXl_2lDG9a@fsa5d_4J5UdH0d@Vms9g}~ooiQbD(ZsIVm|DFy6^zh+|EEPzV)a@ zcg}ekwYYvo-{PBR*Gw{M?)#wXU&l231~oz@=JU2iZwdw7a5iciEkg~>7StT>MBQ*7 z7RJMGWi2_;h=?fXp5lMNF@xxG}QTRF%NdfqSznRu~#s!_Wx@X5~x^?5qKQ6 zy?#Z_QP?7T!Ir39&>ef>D_9Y)pr$Hhu^q80s1DS`Dwu&!;Ye(RTTs`%jZL_}iC&L1&~+_Tiy$Dl?q6O*tPszXarBd`lQ;>Xwq!(+GCi)Jv^#-$jC-?;XFuo`*X z3dUa->a@ZR$!t`^5tlzewO3zh%|;FBVyuIQU45=M>jgnA#0 z$Er958{%$P|G?`Co;7x^g0L_r6h_@J2DJ@qp%zsG)C;5yhG9?Ch>XU{n1e_0G)}

)`eFJE9h9uG?aL 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 cM85&O2kz)K;?gYt?2$uW@?zig5u2><{9 delta 12545 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 diff --git a/core/locale/nl_NL/LC_MESSAGES/django.po b/core/locale/nl_NL/LC_MESSAGES/django.po index 9b029b15..f074b693 100644 --- a/core/locale/nl_NL/LC_MESSAGES/django.po +++ b/core/locale/nl_NL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -49,82 +49,86 @@ msgstr "Gewijzigd" msgid "when the object was last modified" msgstr "Wanneer het object voor het laatst bewerkt is" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Vertalingen" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Algemeen" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relaties" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "extra informatie" + +#: core/admin.py:94 msgid "metadata" msgstr "Metagegevens" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Tijdstempels" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activeer geselecteerde %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Geselecteerde items zijn geactiveerd!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deactiveer geselecteerd %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Geselecteerde items zijn gedeactiveerd!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attribuut Waarde" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attribuutwaarden" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Afbeelding" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Afbeeldingen" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Voorraad" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Aandelen" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Product bestellen" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Producten bestellen" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Kinderen" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Config" @@ -753,7 +757,7 @@ msgstr "een order-productrelatie verwijderen" msgid "add or remove feedback on an order–product relation" msgstr "feedback toevoegen of verwijderen op een order-productrelatie" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Geen zoekterm opgegeven." @@ -927,7 +931,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Geef order_uuid of order_hr_id - wederzijds exclusief!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Verkeerd type kwam uit order.buy() methode: {type(instance)!s}" @@ -1004,7 +1008,7 @@ msgstr "Originele adresstring geleverd door de gebruiker" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} bestaat niet: {uuid}!" @@ -2734,22 +2738,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "" "Ongeldige time-outwaarde, deze moet tussen 0 en 216000 seconden liggen" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | neem contact met ons op" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Orderbevestiging" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Bestelling afgeleverd" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode toegekend" @@ -3003,7 +3007,7 @@ msgstr "" "implementeren. Het breidt de basis `EvibesViewSet` uit en maakt gebruik van " "Django's filtersysteem voor het opvragen van gegevens." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -3023,7 +3027,7 @@ msgstr "" "gebaseerd op de specifieke actie die wordt uitgevoerd en dwingt " "dienovereenkomstig permissies af tijdens de interactie met ordergegevens." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3038,12 +3042,12 @@ msgstr "" " een gedetailleerde actie voor het afhandelen van feedback op OrderProduct " "instanties" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Beheert bewerkingen met betrekking tot productafbeeldingen in de applicatie." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3051,16 +3055,16 @@ msgstr "" "Beheert het ophalen en afhandelen van PromoCode-instanties via verschillende" " API-acties." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Vertegenwoordigt een view set voor het beheren van promoties." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" "Verwerkt bewerkingen met betrekking tot voorraadgegevens in het systeem." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3079,7 +3083,7 @@ msgstr "" "verlanglijstjes kunnen beheren, tenzij er expliciete toestemmingen zijn " "verleend." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3093,12 +3097,12 @@ msgstr "" "gespecialiseerde gedragingen voor verschillende HTTP methoden, serializer " "omzeilingen en toestemmingsafhandeling gebaseerd op de verzoekcontext." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Fout bij geocodering: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/no_NO/LC_MESSAGES/django.mo b/core/locale/no_NO/LC_MESSAGES/django.mo index 91d207d0814428aa85287d29d9375b3660f604fd..ec8af0723dba096942a667791bb48927a24e2626 100644 GIT binary patch delta 12585 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±TPpsULUScDV3eUQ*OQy2n>G_ct@{ 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�j+`hoouQCC!c5jMih&ZxyaRms1E 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 F{vYgx9^L=| diff --git a/core/locale/no_NO/LC_MESSAGES/django.po b/core/locale/no_NO/LC_MESSAGES/django.po index 48b81b19..0118e5c7 100644 --- a/core/locale/no_NO/LC_MESSAGES/django.po +++ b/core/locale/no_NO/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -50,82 +50,86 @@ msgstr "Modifisert" msgid "when the object was last modified" msgstr "Når objektet sist ble redigert" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Oversettelser" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Generelt" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relasjoner" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "ytterligere informasjon" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Tidsstempler" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktiver valgt %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Utvalgte elementer har blitt aktivert!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Deaktiver valgt %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Utvalgte elementer har blitt deaktivert!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attributtverdi" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attributtverdier" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Bilde" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Bilder" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Lager" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Aksjer" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Bestill produkt" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Bestill produkter" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Barn" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfigurer" @@ -739,7 +743,7 @@ msgstr "slette en ordre-produkt-relasjon" msgid "add or remove feedback on an order–product relation" msgstr "legge til eller fjerne tilbakemeldinger på en ordre-produkt-relasjon" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Ingen søkeord oppgitt." @@ -914,7 +918,7 @@ msgstr "" "Vennligst oppgi enten order_uuid eller order_hr_id - gjensidig utelukkende!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Feil type kom fra order.buy()-metoden: {type(instance)!s}" @@ -991,7 +995,7 @@ msgstr "Opprinnelig adressestreng oppgitt av brukeren" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} eksisterer ikke: {uuid}!" @@ -2700,22 +2704,22 @@ msgstr "Både data og tidsavbrudd er påkrevd" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Ugyldig tidsavbruddsverdi, den må være mellom 0 og 216000 sekunder" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | kontakt oss initiert" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Ordrebekreftelse" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Bestilling levert" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promokode gitt" @@ -2963,7 +2967,7 @@ msgstr "" "tilbakemeldingsobjekter. Den utvider basisklassen `EvibesViewSet` og bruker " "Djangos filtreringssystem for å spørre etter data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2982,7 +2986,7 @@ msgstr "" "serialisatorer basert på den spesifikke handlingen som utføres, og håndhever" " tillatelser i samsvar med dette under samhandling med ordredata." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2997,11 +3001,11 @@ msgstr "" " tillegg inneholder det en detaljert handling for håndtering av " "tilbakemeldinger på OrderProduct-instanser" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Administrerer operasjoner knyttet til produktbilder i applikasjonen." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3009,15 +3013,15 @@ msgstr "" "Administrerer henting og håndtering av PromoCode-instanser gjennom ulike " "API-handlinger." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Representerer et visningssett for håndtering av kampanjer." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Håndterer operasjoner knyttet til lagerdata i systemet." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3035,7 +3039,7 @@ msgstr "" "integrert for å sikre at brukere bare kan administrere sine egne ønskelister" " med mindre eksplisitte tillatelser er gitt." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3049,12 +3053,12 @@ msgstr "" "inkluderer spesialisert atferd for ulike HTTP-metoder, overstyring av " "serializer og håndtering av tillatelser basert på forespørselskonteksten." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Feil i geokoding: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/pl_PL/LC_MESSAGES/django.mo b/core/locale/pl_PL/LC_MESSAGES/django.mo index 3eb776cf2e7631779d89ccb3207e1ad135363eb7..987739e0fcaa9d0b73b74a3222201d2cfbf130ae 100644 GIT binary patch delta 12584 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 hzk$66ZR|O+`Sie^gL-xw)_>5*URyrT7vt(D4 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 diff --git a/core/locale/pl_PL/LC_MESSAGES/django.po b/core/locale/pl_PL/LC_MESSAGES/django.po index 990fe0fa..fb77b80a 100644 --- a/core/locale/pl_PL/LC_MESSAGES/django.po +++ b/core/locale/pl_PL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Zmodyfikowany" msgid "when the object was last modified" msgstr "Kiedy obiekt był ostatnio edytowany" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Tłumaczenia" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Ogólne" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relacje" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "dodatkowe informacje" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadane" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Znaczniki czasu" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktywuj wybrane %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Wybrane elementy zostały aktywowane!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Dezaktywacja wybranego %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Wybrane elementy zostały dezaktywowane!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Wartość atrybutu" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Wartości atrybutów" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Obraz" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Obrazy" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stan magazynowy" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Akcje" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Zamów produkt" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Zamawianie produktów" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Dzieci" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfiguracja" @@ -746,7 +750,7 @@ msgstr "usunąć relację zamówienie-produkt" msgid "add or remove feedback on an order–product relation" msgstr "dodawanie lub usuwanie opinii na temat relacji zamówienie-produkt" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Nie podano wyszukiwanego hasła." @@ -919,7 +923,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Podaj albo order_uuid albo order_hr_id - wzajemnie się wykluczają!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Nieprawidłowy typ pochodzi z metody order.buy(): {type(instance)!s}" @@ -997,7 +1001,7 @@ msgstr "Oryginalny ciąg adresu podany przez użytkownika" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} nie istnieje: {uuid}!" @@ -2713,22 +2717,22 @@ msgstr "" "Nieprawidłowa wartość limitu czasu, musi zawierać się w przedziale od 0 do " "216000 sekund." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | zainicjowany kontakt" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Potwierdzenie zamówienia" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Zamówienie dostarczone" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | przyznany kod promocyjny" @@ -2974,7 +2978,7 @@ msgstr "" "bazowy `EvibesViewSet` i wykorzystuje system filtrowania Django do " "odpytywania danych." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2993,7 +2997,7 @@ msgstr "" "wykorzystuje wiele serializatorów w oparciu o konkretną wykonywaną akcję i " "odpowiednio egzekwuje uprawnienia podczas interakcji z danymi zamówienia." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3008,26 +3012,26 @@ msgstr "" "szczegółową akcję do obsługi informacji zwrotnych na temat instancji " "OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Zarządza operacjami związanymi z obrazami produktów w aplikacji." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" "Zarządza pobieraniem i obsługą instancji PromoCode poprzez różne akcje API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Reprezentuje zestaw widoków do zarządzania promocjami." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Obsługuje operacje związane z danymi Stock w systemie." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3045,7 +3049,7 @@ msgstr "" "że użytkownicy mogą zarządzać tylko własnymi listami życzeń, chyba że " "zostaną przyznane wyraźne uprawnienia." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3059,12 +3063,12 @@ msgstr "" "wyspecjalizowane zachowania dla różnych metod HTTP, zastępowanie serializera" " i obsługę uprawnień w oparciu o kontekst żądania." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Błąd geokodowania: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/pt_BR/LC_MESSAGES/django.mo b/core/locale/pt_BR/LC_MESSAGES/django.mo index 32c4743128c4e0892a8bfb6a4dcedc1e51afe42c..6227f93ce396fb717194f863a3d270e69551bab4 100644 GIT binary patch delta 12574 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 RZ0S9E)a)IfXY<`@_&;0vA>#l5 delta 12545 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 Hb2{U{gvJoZ diff --git a/core/locale/pt_BR/LC_MESSAGES/django.po b/core/locale/pt_BR/LC_MESSAGES/django.po index 087f9930..42b189bf 100644 --- a/core/locale/pt_BR/LC_MESSAGES/django.po +++ b/core/locale/pt_BR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Modificado" msgid "when the object was last modified" msgstr "Quando o objeto foi editado pela última vez" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Traduções" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Geral" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relações" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "informações adicionais" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadados" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Carimbos de data/hora" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Ativar o %(verbose_name_plural)s selecionado" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Os itens selecionados foram ativados!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Desativar o %(verbose_name_plural)s selecionado" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Os itens selecionados foram desativados!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Valor do atributo" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Valores de atributos" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Imagem" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Imagens" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Estoque" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Ações" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Pedido de produto" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Solicitar produtos" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Crianças" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Configuração" @@ -736,7 +740,7 @@ msgstr "excluir uma relação pedido-produto" msgid "add or remove feedback on an order–product relation" msgstr "adicionar ou remover feedback em uma relação pedido-produto" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Nenhum termo de pesquisa foi fornecido." @@ -910,7 +914,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "Forneça order_uuid ou order_hr_id - mutuamente exclusivos!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "O tipo errado veio do método order.buy(): {type(instance)!s}" @@ -987,7 +991,7 @@ msgstr "Cadeia de endereços original fornecida pelo usuário" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} não existe: {uuid}!" @@ -2696,22 +2700,22 @@ msgstr "São necessários dados e tempo limite" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Valor de tempo limite inválido, deve estar entre 0 e 216000 segundos" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | entre em contato conosco iniciado" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Confirmação do pedido" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Pedido entregue" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode granted" @@ -2962,7 +2966,7 @@ msgstr "" "feedback acessíveis. Ela estende a base `EvibesViewSet` e faz uso do sistema" " de filtragem do Django para consultar dados." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2981,7 +2985,7 @@ msgstr "" "específica que está sendo executada e impõe as permissões de acordo com a " "interação com os dados do pedido." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2996,11 +3000,11 @@ msgstr "" "fornece uma ação detalhada para lidar com feedback sobre instâncias de " "OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Gerencia operações relacionadas a imagens de produtos no aplicativo." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3008,15 +3012,15 @@ msgstr "" "Gerencia a recuperação e o manuseio de instâncias de PromoCode por meio de " "várias ações de API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Representa um conjunto de visualizações para gerenciar promoções." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Trata de operações relacionadas a dados de estoque no sistema." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3035,7 +3039,7 @@ msgstr "" "possam gerenciar suas próprias listas de desejos, a menos que sejam " "concedidas permissões explícitas." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3050,12 +3054,12 @@ msgstr "" "substituições de serializadores e tratamento de permissões com base no " "contexto da solicitação." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Erro de geocodificação: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/ro_RO/LC_MESSAGES/django.mo b/core/locale/ro_RO/LC_MESSAGES/django.mo index b448d4230f22e92c5e59784bf88c8b09a2b0e869..33316bb610c6ab5ff1e1f33e12e391e3e10814a2 100644 GIT binary patch delta 12574 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¬>Uw*zIC{@e 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Modificat" msgid "when the object was last modified" msgstr "Când a fost editat obiectul ultima dată" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Traduceri" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Generalități" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relații" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "informații suplimentare" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadate" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Timestamps" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Activați %(verbose_name_plural)s selectat" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Articolele selectate au fost activate!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Dezactivați %(verbose_name_plural)s selectat" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Articolele selectate au fost dezactivate!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Atribut Valoare" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Valori ale atributului" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Imagine" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Imagini" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stoc" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stocuri" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Comanda Produs" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Comandați produse" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Copii" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Configurare" @@ -747,7 +751,7 @@ msgstr "ștergeți o relație comandă-produs" msgid "add or remove feedback on an order–product relation" msgstr "adăugarea sau eliminarea feedback-ului într-o relație comandă-produs" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Nu a fost furnizat niciun termen de căutare." @@ -923,7 +927,7 @@ msgstr "" "Vă rugăm să furnizați fie order_uuid sau order_hr_id - se exclud reciproc!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Metoda order.buy() a generat un tip greșit: {type(instance)!s}" @@ -1001,7 +1005,7 @@ msgstr "Șirul de adrese original furnizat de utilizator" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} nu există: {uuid}!" @@ -2722,22 +2726,22 @@ msgstr "Sunt necesare atât datele, cât și timpul de așteptare" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Valoare timeout invalidă, trebuie să fie între 0 și 216000 secunde" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | contactați-ne inițiat" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Confirmarea comenzii" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Livrarea comenzii" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode acordat" @@ -2989,7 +2993,7 @@ msgstr "" "Feedback accesibile. Aceasta extinde clasa de bază `EvibesViewSet` și " "utilizează sistemul de filtrare Django pentru interogarea datelor." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -3009,7 +3013,7 @@ msgstr "" "de acțiunea specifică efectuată și aplică permisiunile corespunzătoare în " "timpul interacțiunii cu datele comenzii." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3024,12 +3028,12 @@ msgstr "" "solicitată. În plus, oferă o acțiune detaliată pentru gestionarea feedback-" "ului privind instanțele OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Gestionează operațiunile legate de imaginile produselor din aplicație." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3037,16 +3041,16 @@ msgstr "" "Gestionează recuperarea și gestionarea instanțelor PromoCode prin diverse " "acțiuni API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Reprezintă un set de vizualizări pentru gestionarea promoțiilor." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "" "Gestionează operațiunile legate de datele privind stocurile din sistem." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3065,7 +3069,7 @@ msgstr "" "utilizatorii își pot gestiona doar propriile liste de dorințe, cu excepția " "cazului în care sunt acordate permisiuni explicite." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3080,12 +3084,12 @@ msgstr "" "serializatorului și gestionarea permisiunilor în funcție de contextul " "cererii." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Eroare de geocodare: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/ru_RU/LC_MESSAGES/django.mo b/core/locale/ru_RU/LC_MESSAGES/django.mo index 49f14783c6def556f8f7e13396e72c9e01de270a..37d97b9154cabdde5a29f2eb629f43a2ba785cfd 100644 GIT binary patch delta 12587 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 F{|5mf+UWoQ delta 12545 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 Vb5`hGZ}*Im4NvS3Nc2jM{4Y;S#u5Mk diff --git a/core/locale/ru_RU/LC_MESSAGES/django.po b/core/locale/ru_RU/LC_MESSAGES/django.po index 495e6e68..cf04f70d 100644 --- a/core/locale/ru_RU/LC_MESSAGES/django.po +++ b/core/locale/ru_RU/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Модифицированный" msgid "when the object was last modified" msgstr "Когда объект был отредактирован в последний раз" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Переводы" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Общие сведения" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Отношения" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "дополнительная информация" + +#: core/admin.py:94 msgid "metadata" msgstr "Метаданные" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Временные метки" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Активировать выбранный %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Выбранные сущности активированы!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Деактивировать выбранный %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Выбранные сущности были деактивированы!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Значение атрибута" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Значения атрибутов" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Изображение" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Изображения" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Наличие" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Наличия" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Заказанный товар" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Заказанные товары" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Дети" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Конфигурация" @@ -746,7 +750,7 @@ msgstr "удалить отношение \"заказ-продукт" msgid "add or remove feedback on an order–product relation" msgstr "добавлять или удалять отзывы о связи заказ-продукт" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Поисковый запрос не предоставлен." @@ -923,7 +927,7 @@ msgstr "" "варианты!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Неправильный тип получен из метода order.buy(): {type(instance)!s}" @@ -1001,7 +1005,7 @@ msgstr "Оригинальная строка адреса, предоставл #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} не существует: {uuid}!" @@ -2711,22 +2715,22 @@ msgstr "" "Неверное значение тайм-аута, оно должно находиться в диапазоне от 0 до " "216000 секунд" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | свяжитесь с нами по инициативе" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Подтверждение заказа" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Заказ доставлен" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | Промокод предоставлен" @@ -2977,7 +2981,7 @@ msgstr "" "доступа. Он расширяет базовый `EvibesViewSet` и использует систему " "фильтрации Django для запроса данных." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2998,7 +3002,7 @@ msgstr "" "соответствующим образом устанавливает разрешения при взаимодействии с " "данными заказа." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3013,12 +3017,12 @@ msgstr "" " от запрашиваемого действия. Кроме того, он предоставляет подробное действие" " для обработки отзывов об экземплярах OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "" "Управляет операциями, связанными с изображениями продуктов в приложении." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3026,16 +3030,16 @@ msgstr "" "Управляет получением и обработкой экземпляров PromoCode с помощью различных " "действий API." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "" "Представляет собой набор представлений для управления рекламными акциями." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Выполняет операции, связанные с данными о запасах в системе." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3053,7 +3057,7 @@ msgstr "" "проверка прав доступа гарантирует, что пользователи смогут управлять только " "своими списками желаний, если не предоставлены явные права." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3068,12 +3072,12 @@ msgstr "" "методов HTTP, переопределение сериализатора и обработку разрешений в " "зависимости от контекста запроса." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Ошибка геокодирования: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/sv_SE/LC_MESSAGES/django.mo b/core/locale/sv_SE/LC_MESSAGES/django.mo index 9d3813700f76bbb70f2cd0305bb35d3efc55d399..4fe54ffd432d923e53b4ecc4b5783828a9df0ff6 100644 GIT binary patch delta 12586 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 td|mPZw2S_Y#4QSw@C{5OVo2-wiWsmdIQgZ\n" "Language-Team: BRITISH ENGLISH \n" @@ -49,82 +49,86 @@ msgstr "Modifierad" msgid "when the object was last modified" msgstr "När objektet senast redigerades" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Översättningar" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Allmänt" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Relationer" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "Ytterligare information" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Tidsstämplar" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Aktivera vald %(verbose_name_plural)s." -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Valda artiklar har aktiverats!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Avaktivera vald %(verbose_name_plural)s." -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Valda objekt har avaktiverats!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Attributvärde" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Attributets värden" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Bild" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Bilder" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stock" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stocks" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Beställ produkt" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Beställ produkter" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Barn och ungdomar" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfig" @@ -728,7 +732,7 @@ msgstr "ta bort en order-produktrelation" msgid "add or remove feedback on an order–product relation" msgstr "lägga till eller ta bort feedback om en order-produktrelation" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Ingen sökterm angavs." @@ -905,7 +909,7 @@ msgstr "" "uteslutande!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "Fel typ kom från order.buy()-metoden: {type(instance)!s}" @@ -982,7 +986,7 @@ msgstr "Originaladresssträng som tillhandahålls av användaren" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} existerar inte: {uuid}!" @@ -2684,22 +2688,22 @@ msgstr "Både data och timeout krävs" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Ogiltigt timeout-värde, det måste vara mellan 0 och 216000 sekunder" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | kontakta oss initierad" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Orderbekräftelse" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Beställning levererad" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | promocode beviljad" @@ -2944,7 +2948,7 @@ msgstr "" "basen `EvibesViewSet` och använder Djangos filtreringssystem för att fråga " "data." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2963,7 +2967,7 @@ msgstr "" "åtgärd som utförs och verkställer behörigheter i enlighet med detta vid " "interaktion med orderdata." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2978,11 +2982,11 @@ msgstr "" "åtgärden. Dessutom innehåller den en detaljerad åtgärd för att hantera " "feedback på OrderProduct-instanser" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Hanterar åtgärder relaterade till produktbilder i applikationen." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -2990,15 +2994,15 @@ msgstr "" "Hanterar hämtning och hantering av PromoCode-instanser genom olika API-" "åtgärder." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Representerar en vyuppsättning för hantering av kampanjer." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Hanterar åtgärder relaterade till lagerdata i systemet." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3016,7 +3020,7 @@ msgstr "" "integrerade för att säkerställa att användare endast kan hantera sina egna " "önskelistor om inte uttryckliga behörigheter beviljas." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3030,12 +3034,12 @@ msgstr "" "innehåller specialiserade beteenden för olika HTTP-metoder, serializer-" "överskrivningar och behörighetshantering baserat på förfrågningskontexten." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Fel i geokodningen: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/th_TH/LC_MESSAGES/django.mo b/core/locale/th_TH/LC_MESSAGES/django.mo index dafa0df854d2750705f9ab2f814b4f1639c50fb6..b32192f8940eeaa5cd1f1e34726d0220b76abc36 100644 GIT binary patch delta 12579 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 JPTqsX{{?sFXHNhC delta 12545 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 E2X\n" "Language-Team: BRITISH ENGLISH \n" @@ -49,82 +49,86 @@ msgstr "แก้ไขแล้ว" msgid "when the object was last modified" msgstr "เมื่อครั้งล่าสุดที่มีการแก้ไขวัตถุ" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "การแปล" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "ทั่วไป" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "ความสัมพันธ์" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "ข้อมูลเพิ่มเติม" + +#: core/admin.py:94 msgid "metadata" msgstr "เมตาดาตา" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "เวลาที่บันทึก" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "เปิดใช้งานที่เลือกไว้ %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "รายการที่เลือกไว้ได้รับการเปิดใช้งานแล้ว!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "ยกเลิกการใช้งานที่เลือกไว้ %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "รายการที่เลือกถูกยกเลิกการใช้งานแล้ว!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "ค่าคุณสมบัติ" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "ค่าของแอตทริบิวต์" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "ภาพ" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "รูปภาพ" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "สต็อก" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "หุ้น" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "สั่งซื้อสินค้า" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "สั่งซื้อสินค้า" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "เด็ก" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "การกำหนดค่า" @@ -723,7 +727,7 @@ msgid "add or remove feedback on an order–product relation" msgstr "" "เพิ่มหรือลบความคิดเห็นเกี่ยวกับความสัมพันธ์ระหว่างคำสั่งซื้อและผลิตภัณฑ์" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "ไม่พบคำค้นหา" @@ -897,7 +901,7 @@ msgstr "" "กรุณาให้ order_uuid หรือ order_hr_id - ต้องเลือกอย่างใดอย่างหนึ่งเท่านั้น!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "ประเภทไม่ถูกต้องมาจากเมธอด order.buy(): {type(instance)!s}" @@ -974,7 +978,7 @@ msgstr "สตริงที่อยู่ต้นฉบับที่ผู #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} ไม่พบ: {uuid}!" @@ -2647,22 +2651,22 @@ msgstr "จำเป็นต้องมีทั้งข้อมูลแล msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "ค่าหมดเวลาไม่ถูกต้อง ต้องอยู่ระหว่าง 0 ถึง 216000 วินาที" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | ติดต่อเรา เริ่มต้น" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | ยืนยันการสั่งซื้อ" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | จัดส่งเรียบร้อย" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | รหัสโปรโมชั่นได้รับแล้ว" @@ -2907,7 +2911,7 @@ msgstr "" " และจัดการวัตถุข้อเสนอแนะที่เข้าถึงได้บนพื้นฐานของสิทธิ์ มันขยายคลาสพื้นฐาน " "`EvibesViewSet` และใช้ระบบกรองของ Django สำหรับการสืบค้นข้อมูล" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2925,7 +2929,7 @@ msgstr "" "และการดึงคำสั่งซื้อที่รอดำเนินการของผู้ใช้ที่เข้าสู่ระบบปัจจุบัน ViewSet " "ใช้ตัวแปลงข้อมูลหลายแบบตามการกระทำที่เฉพาะเจาะจงและบังคับใช้สิทธิ์การเข้าถึงอย่างเหมาะสมขณะโต้ตอบกับข้อมูลคำสั่งซื้อ" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2940,26 +2944,26 @@ msgstr "" "นอกจากนี้ยังมีรายละเอียดการดำเนินการสำหรับการจัดการข้อเสนอแนะเกี่ยวกับอินสแตนซ์ของ" " OrderProduct" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "จัดการการดำเนินงานที่เกี่ยวข้องกับภาพผลิตภัณฑ์ในแอปพลิเคชัน" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "" "จัดการการดึงและการจัดการของตัวอย่าง PromoCode ผ่านการกระทำของ API ต่าง ๆ" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "แสดงมุมมองที่ตั้งค่าไว้สำหรับการจัดการโปรโมชั่น" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "จัดการการดำเนินงานที่เกี่ยวข้องกับข้อมูลสต็อกในระบบ" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2977,7 +2981,7 @@ msgstr "" "มีการตรวจสอบสิทธิ์เพื่อรับรองว่าผู้ใช้สามารถจัดการรายการที่ต้องการของตนเองเท่านั้น" " เว้นแต่จะได้รับสิทธิ์อนุญาตอย่างชัดเจน" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2991,12 +2995,12 @@ msgstr "" "รวมถึงพฤติกรรมเฉพาะสำหรับวิธีการ HTTP ที่แตกต่างกัน การแทนที่ตัวแปลงข้อมูล " "และการจัดการสิทธิ์ตามบริบทของคำขอ" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "ข้อผิดพลาดในการแปลงพิกัดภูมิศาสตร์: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/tr_TR/LC_MESSAGES/django.mo b/core/locale/tr_TR/LC_MESSAGES/django.mo index d501bbbb260358893ce7b550b95973472d1985fe..4cff1ece36c43c3befc0654331871ea8140028a3 100644 GIT binary patch delta 12577 zcmZwO2YilK|HtujBZ-I^5)msA8Hj`s5;Im}RBDgbCTNYKXlvbCvt~UurK(0%?U6@| zwl-C&ilWt4)hOygYqj+GeD8BSFR%aWf4%z4`;6eGg>xEnw5&>v39D>O5iEvXJ;o$pZt^pdj0wQ`mE^ACSwL zUoaP5!7+FP`JC7Et71$+3Wj3{PQp331pP6os=YxfrqO_gs0K_(HYO5hU@UILaQqIp z@i2EWmHe6%d);4RC20gh~BulHHH^)N zjPFnX(|EIafF0AvsIf^NXlHE(s%M&E9JWGr-AGqH*5xN5_cGH^lk_%fNRtNH^P8ZC zHWM|p9dIw__4Ja+Ny}n~(4ACN7-~#8?1(Wq4lCnFSP8#J4MDzPcGibt6!|)+&-K7~ zoaX9xxbmNo`D=oP+f|Z|CCPicKTV)6umqFwAQr*Ls7V<7n(e9bSb+R648RE(iqlbZ zW(DfPn@~@D9NXhr%*4vC+f^|Z8*2T3P9m5Jzc+Y#3`0%AhL|5apz8bJNF0IDcn`HI zN{pa4undM^CDi%psG;nLYDhoyH5}F830P3;|6LMADOl%D*zc<_=9Kd?YRv9qIOd=g zYG6r>z{*%2TVWE8Mh)3USAG$7<9wrRkCntS%TDxosfxYaTnAL2f6%6)Fhma zdeS+l3oJ)<`F_-#_y+Z)=P?L>MK$cUt1mIyUN;(bze?!U2h&Jstec>^ybG!e2cT{^ z7WL#aP&ZuT%C}<#`F*JC{EAu~zoX{HUDS>KLJdvO7<;`))O8Za(Eqw|EeiC(mZ%T5 zLtjrg2cgb;3pMuhu^{e34aG4mh8LZGqi!5Z_v%4nP}fbxc&vw-YXiL`G#M7Tf=!r0 z{s&CO(6P25Eu1}2Hy-Np6HpD9k7~eL=YCWJenbt`EmT8--?T#%jT+)aFNyjjYG4wM zMs>|b)H2+Ky1`x4jRW4YT^)uRnn=`GCt@VlboHH4ldv~xPAtGOxE#}PKdOOV|8e#S zLs1(}9BQ&X@56;X)n|m&BHicih81hsD@ob-KgM1yIdQiy0jZ=ZoG;SI2kor*P!OmK5UMsk-f~6 zoy5e(#ptK?A2`|0`U03vMJd!1W}!d6g1XRf)R0WZINXhD@D)`3EmQ+NZ`;Y0iiza2 zP(wHuo8TI(gLg5I`%$~VVS z_#&$7N1(2|0b_BG^EdRWi-V`xuC9s^WLNKt5o)UA9$FJ&=Ox z`lgs0vs`{4W{`i|m7j2)n@<00!}*1RTzChy9PguAoPUPxx=0KopN#o1)0KBZ4bdP> zz}HZ-d=+-Y!>FE&nrSEN3#jwPqaSXWN&n|3v4aBL@DLWj^QaqL#|V6g@fiM&JwF5U zl5dA4uqW!t$D$gv7z^TZ)aSOK9_%O7_3xurL4bFboxN$O3%11|?18%QK-AbyMNPid zs7d#O^HQz%bEuxX>dNn<9w2Creey6=eL2+iQ&9B{U42XB`d-t6gtpFpu3`cfB|i@} z$=0JjcnV*}iPy6#=f;Ql6l zft@r%F@*d`REuY!ZnzjVW}iAQU^IEpLR%h->cOU16?>r?v=G$;+wn#G0$XFrMRqO> zMsE|HKq4N^V%q~1u?X2r)L8e#VmKHzBvY|6W;?H;dZPHd)^yZHGZ<^&LM(^hy80)W zM84b-`d=67w8VDF3{=HImw$w+ud>vdh3eAzSQ8Jp@*MBk4W=sAqkNRh@5VIp{>!Wx zSeyK0mp`z~Yr8Dqefu@K7OHEzp`Lsqs_W-qLCnTZcnCF#qL;e5HOZD?6n=um@d9f7Kf;n2u*P;} zGzOAyiz(O@b>RgVh96)P+==DT|0DYVm9RYdb{M1e|0W4_>4%sL|BdRJT^NklQ4M*5 zdXn(9wx{Z19rC@ACowBA53WUj+>UC0Jv&LM_vd8|_d{!}{bmqRQ`LGmP0}cfKL0`>a9T=QPHmXEXh; z8u7%aSVQnnrt;bv%eAPiod{oENs2-4F}!qv4!)4l~GK+s}%?%2d)Wa|CtWuP_05vaU!i2;-U)mlV@Rgm6qp%9+O+*dNC&)D5 z&;KL>C>V0g?sy|GKl!Ps<+BKN!7ZqUBz(=Lg2{M=^71E`-57k5p5hTRzoil6bDrT# z4VL=O{%&a9S*}Sw_j#5i&iS4>mBY)Q+b=M)DY)?yGZzC9PZqm)<mcS zH1{|6NL0tr0v^*CGf}gBKI#e1qI%#e>O!7^wukbgdM+GQUm3%(sVmPy_0TAnUyAC{ zZKxsLi{4BUM@dx0;)U!9El@4&f||_}QC+_P)x~R2L$ncfp`Dn7`(6D5)Y$)nIpkU@BH4 ze*m?tAEO#rw+wSd>%TDxjbRq*!oyH4orc;MmY|;e6l(J2in8a2p|;{U)TC>MYG7Z~ zx*v-A{5(_-9Yf8nOV|K!qgPLyT-H`JM%}nAMqqE$ET4p$Osi1K=x5Z9c@^{H9n_@r zMB9C%8a5)|1v793_QD$&hb?35Yk5Qr>t8RM3lwPVuA#crFV=QZ5bB0SP(x81)l-#F z4Nr6Btj9Ipf0okwa(X~hTu4A2yeLhoaO9|LQxHhKwT#VH53_M5>-gFL3Q{{;waQAsfkUnJ*tP^$CY>u zr{K(*_Prlo%YLm-$7YmIMBV3`TC9J)EdHWElP#jQ-RT;j=E4xHgsU+EzjO5uQ4NTz zV>g_J*n)h2Ov7EM&p$!+XqCFQzB_7z+l+efy>(gtnx#i5(E2@t8j3$qHwa6!>%S`M z9Z(mwY`UWFLfDP`UepFtww_(a)ljp%EhgbQ)N=d@)u5pIwr5hkB=mmHLJh$fjK?Xi zJR7x~zD8}qk6b>vfqkN`s3+No`7j%E<9^fw9CPKrp&sx7>Kzi&(Btb-Z#fdWa8pzR zCSVrM!UVjJnoKc`>;}>pH5uolw&Yb<0Y61e#w)1F>6dQbiXo`ibtX2)Y1k6aA#Y2s ziO;ZasUE0xy9o8VJc^uPayE8dg|oqma#5T zlyV(8i8qM0F0V=VI_VC?OwyZ)1;k16Ul0}B@I%L^n2)$f)TdEe*Ex*~ClbO`4>BwDz0RUb*+dJHGJ zQNEL?O_|n}4wjDDs~Piz%zwy~AUYBegpP@XUa|oMTPVN2;EOmh!PQf2@{(>qSxZ-T z0Q*vYj;KVrj&!_4c{_r4g727XG4HZt`Hmc%^f{H9IiI2Cw2pPe-{fB+W|Ph!_7erk zYn}a@_>TCBypGq1-$?Uk!2cbsTzaG{DaXCEhDK9fU-$o*gjTVR{-k4w*~Ba4tGcI9 z-Jg`{IEHbQufQGTqe&Me0*Nrn5-~SMVK{Cho*v6cu#f-m@Gf#m{X?rkRJ=p}7HaYC z!Gjn`RC?w^0i?%Kri0h08S3g*k=H(2n*2Ujwubz9(ha%(VA2u9KqAf7&+Zvl$eTo6 z5%PB^*P%UplP_g|tg`2tuQ82tb$mp`5dB=8%8HZL8!M7nMEX84f;de6OM*SfbSBs$ z%m(spiHDklb-8FIGCI~#`SdtVqAAgi2+YnFNb~)|3?V=K=^RwuPsCU%dSh4If;uLV{uge*CxjuMBWe@B5Wy7fLLK#ppM5F& zqX6Z-h%v-;Vi=(#o(H&0+V`&(8&Tj-<{O-+T8^(RrWECcIGLA??>K?iNd1TS)|I_) zt9*YWsbpTx=X-|l(EhxO_>`zad3Wqj=*UC9-X=~QK_;7+K^!4&5dZgx;N;t!8&BwM zr9;2VtvGvA`NDyPDAjRc_E+VLd)fAVM?LEE6FS}_S`lATx0YB)dOh+L&UgID&nm=V z@^2D9knZj3bV7=|PJ7DURRM=TWj8U=m*W>!)CKZQ%%oB93(@JB3%p8tK4oKw@}#d4 zKM@J;!g(lvj`)Z8o$@4{Kx`%b^msrbop_6wN<4CPLvRjJn0VVW`*MXCZzM@SLdSeO zW0PhYo+E#k$RhqAUZSk5>S>DJ>Dw%G?TwCrn zlidj(XB3s+lU_-@NR%YLBkmFTsMB$r^ii8Mtx4CS0gK6BCH^3OCq5^16s7J*eA>pN zod2z_h8MEd)kQL25Vwhnu41yYkMkfO;#A+ief4u!dQ91A;^{Gq^jTs*QI2>-#dzX_ zrzbcEQkRQ#Eez5wQH&_VMZZBEsTT90^C_9G{wxKfh->7FKYc9n+lV@Zj%Xq$^_e&i zbK@1P%=z!5j%DaQ!jJFCoG0p%&L%dJev!C9d`281`Vp&%r$;j9g>f;@GYyzZ*=9nA z{<`4?>0_iH6QzkCT^&i^U-m(|SxjN7yGV#?I8G4Bly$MDs!?8J z_E!l-z0=7}B6Q^9s`oJ;wIfOICLM(v2_1*AhD*nAPG6T+T^W~NLAoY&wN%Jal5~@2 z&MQILuL{ckvh#!8l7g3sU<$Vrv3#f;`A^&jXOVvPXhit}SEur=t}+>y5NBN7+pgRn zL%C)Mp`$VNe!dj*a{!rGGDC?E-3N1X;xy7tu_10D4p85P7*D#F(%6SsO6Y$J_!s_0 z`Et}Tz~cKutdcz_kH_vfidaZ2=l;GUKR=hcw1^{K=7eXDW@HMxCn$!ypQ%qL{j!%uoELeM#9ay#aWtk7v7~kEAzsuq19pf6PWsXL8UF zPvcnp5&4|gbWSm*Fa^D_7!Jd?aRvrp`ReupahOgAs-rqEq=qr&a4g2)3M_?R;WlpO zBGx9qxRyO{4pLz>=e%du{U=076cIozp=AuR*rlB#Rn1JD2-_$2j96Mq#4nPg*a4dln zP(!&CHN-2C|I99aeCjdgA$B0Yr!nUsU$luajj?ZrJ>Qn5)}2_6b_Y-$`3=2GNn9Zj zfRi%$FwVdNxDquoo3Sk?Jb)Vdu;#}6jFGs3@<*6}>slJqnV~<~%9yj%SAB|UqC7vt z6oYSMvCeQqJ7b>3+wB?uhJ2v)Gt3hOvpO2{3C2BV%n?p-t`m!r{Kn44+`>a$jHyET z?iY~!RlG^QbT?xG^-)vX z3=hz*y_ZB@dRF2!V-l$-J(#=4<`|8yV=^wms`w3R3Laq$1`IK#0w$q8*A5eKG^&1s zD?g5`U-JMIIQEy6s*>`0ZuK=Qq?IQB=al{Zl*oP)a4 zE!YuvVjBz{Zg)dBY(jno7SaCyjYMS%?xGf7#SzRS)^qA zHK?`lG3ritV}AS+)v@EQ{vqnT{$p&13Zp(3gdptCE;!Yd zFTg1Bt5GNV616LiqV6;Yb>}}|F}#X8pJ%K+Pa)KGBgQiR`d~5z`d}*hM#9> ztc_3?e%j@Gp*k=O)q!cwHK-1JikhlpsE*u3O_Bc_b}9;CBl4xZBz%hpHN>+~+iw}_ z0y(G)Uq%h}UGxp*cstjHupH&3QT6pui?Au`g2S;qj>mLdgX-WV)D3#?kkErBXo6jA zRZtbFs1r7G`7G24dte;)$C|hh*WfW!`yp@IIUkGF$-j--u7^=0d<^Si&_rKHy`~8X z&CyVd#j&V6T8HY`Vbq2G!V(xe$qs2cY7w=^DC~n;tW!}puo_$Ab{vX+lj$^$LVx@N zL$v>|lW0o8W7HjHOtB;J6zW7BP*c(eV{thK;vrQ1F;oXHpcYrjsrDt6fttc0*c_)~ zeayjNEb7ARIOH@fd^|F5d<- z$-nH%KXUFuJ#P-oaQpuR1=^3NQ9b?>HFTbt_8U(zEJ!{HRi1_c*cOwpBbLWW_#AFP zjbz?gcCpq$wd;wR`*|3Gi)S(Zy5M>W3gK?lg^pkpp1}mXkNQB&Y`aZUF@k(!)SY)j zb!Ze8#__1n%|qSTXIKbNqjte%)Z&fu&ao$~f%z$DggS8>)ZF$(ExyU9MYq@aC2AzH z(YN?8k$lOycJ4D#<)g6)eu5gIdzgh0^X&D!14yVRBT+*$3pI!HQ5Rf}MR6@^WOkuO z;wx8v8ViuWiiPp6s}FwLULYJ*UlCQGj5>cKd-o%^s7`3o)|xY)jY;;}mAO;8;gfx5#5*cn%1dwhgi3t3C-18D(zwMx&E zh{A$P?OI4e&2?ieiCL&A>5Iv@(0Ld&5)Yiw@7M=T7S^GB1jgYfsCMVD8U`=3=Sf?} z_}8Lf00pX8hsvLI4T>(e4Kq+fIt=ULT37xHYAD0rwZ9Q{LFJcYI$mdv;fZp>|Cy>T^k00n<>=gKk&_ zU&2PX(3PKcUhtC8T>Xwk@fPZWfvfDI3P&x%a;OJL3Kqx4s1fOei8vL%#vM2T$FH_i z5wOONSQ4gF{tBx7`>3h+o*@xUB4Dju{fVd{?tmJixmXDgq2}-!Mq>Cndx2DJK>h`+ zfy+@RK8Y34v!2nwXw;4NKz|&7Y-6t(OhSun99F<3SQ_`C_WxPb1uvt9(tm^9B{fiM zr2*>1!!aBuU~_y2$BBzYF}01<23ZW{310)KIQRt&OdykvNW;lG~UU?_(f7MxMGR zV7vYNax6=J<95cs6p61X*onVk2)?_+?&rHwWDQdBm`qcgx3HmzNqap5_Q6PsE&ku%P3$myi9q%4aZ!v+i(5v z_ODsjurl>MuJBo$b(Oz%(5}lh))DyvfAOlt(>M6aP5F1X?B9BZ-(h+vPrGaXT=&mC zb`RG#ZJ0={;yI{Qy9G5=TQL!LVqv`O%I{(@`Nud2gB}?3A}1b!+BH8uv=6i!Sd{!7 z)D-4>#1oGWmBWsh{4e9L#W&UC@%?794Yj&&V{?qj__ysrON-=d)Au0v04c4cT61F~;Fa)Ce9yUHCYv!`@#>=z@1q zca}H59md!_!7fz$vokKl8t~(#2I$E%xT`N(j8%jidJ`?@* z{?8(z9(KeC9EfT-9ku<|qDJPV^9pKe^t{!!jX>4cakfP*&fZuBUq`L>Rj8>uf;I6f zHskuHLLs}#`=Rb&Gin6(qE2)QH9{9rLwDWP2Nd@BUS4HU<#kXal;!fTqek>C)b3b> zZEz)O?fivaHK-J7dzgY+&7Dz0+8;HXl)33f5r_ z@_SJozlE*vK0bq)#ccgD)aP=FvH!Kd&rlGHrntRO9JVCe8`ZIoQLFqQYJ`46?TUX; zYo=5QkMGNCP3%R!GY-Yiu|L)dw-;QCdH`+0Cb-8-LL=ZQY41D)^`MBrbWFy0d<`}9 z%TOm+i%oGmYAzpP9jwMH(6@U~cRmSqBRQzgmo05SAB(yXZ!HoU+7_6IlW`1gLp?xJ z`2R2Uu`cQaBT=hvi_){oq}3B*{=Q^>W(j?=KdZQ(fkq)SZk%ZKLg|N9JA(!9%D;cMA1n%U{Xv^AyY^ zKLUH==NOC8(e}0c6zW~G6*YDHqS^l%(z6t3h|Z%f_y=ki{Dr!6{}|izVyN<1)YQ~N z)i*~y!k5)g*s7x ztbpTCQ?MGfHa>Ut-=i*c71g1?Q5`B6XNNojQ^?1mM*4X#i8vCYQFF8w^+39U+6AHU z9y1ctP(!%`Rev5eQh}B22!x>8m%(P(9NXYrSAGH8kuQ*7Ki3sC65iehRjBGI;Mfa%n~h`NDQsKu6z{qQVm4P++SuU?z58+pGfb_9AMYshOBlhDu~ zMa^YURXfz-sG+Kis_%+*aWV4XFyEmTVPLY&r(rtz0ayjMpg#XI>UmJKn#cFc>a*B_ z{8DVF{eOu>D+*#$>=X<^t>T?7@2PGdwHc`WJRQ5?QS5|OYIsa{d<&n&|2i{LZGJhb z-9MO$?P}UJG!+xI|34t1JO2SS1y@mvCZv|#Hj$|MH&Bal4*KC1SN;iV|9^pcWM4v! z%%9i+E7Z0Ru92uUGY&Q7lhLb1HIIb0!yZ?00<}2Kp;qx-)P5~o$NpZBfEuBpxCZy( zTiCO%eeYk#2INbp*_Tge)OFTjMf?_ZqkpHd|C30B*Rws&#H!>+V-$XXsy~YAz$1*o zlJ)KP`i7WJelF^cb5Jj_pa!-+74?9djJoqhs73lNYWr?#;I(scm;znk8s@{`bo&kn zLv5St=sOX1BfkjsfVqd-$N3xDRUVJk$d5;D$8D$%oyW=;(#XD^>!7Bfy_ZA+iLS0< zI%+$uK|O+xxqQCH_KvEf?qnhs#OWA>OHenk%9VeLy2EVLJLC#R;bYW!%Qmqc@OC26 zi-O*$q5cN7m>ysojLfi$u^)z!ABDP;*{H?12emlQqTY&EP_OF>P3>2;?wCb>3+ip@ z$+R!2n#eZxnt>#=Emoo$e2>1NYUVL>$k#!=)xJT^y<>Kk2-I6ljA-LAs#Jt1Qc`~E`oJ_+q&9eqhxBIXhU z$)~uxP~C0HbYx=;<*V>NM>Bwl&AFfxGSos-lTkT%B5$BE1^R5sOLRAx02ik^h?D zA!WJ{JWI@G^3M==wFc{R(yC;1Y@#yv_>M#iLhspwgPZXY@h@o}Y$lEPg(yOP z59(-0oL9mfA(ZzZ#t_qq!Gw;=+`w<7eg8@^g93jt$8o-DIgVLOB;|!^+{k_KTl}56 z>qL$#TjAQacjl)(Ur>BU5!WheT6iJne~- z3-FXpnrV23{7s@Kaf^7FvWmpNq+4Sm7DD~=#oVI@i3cvT5r@+z_gG8%bu!(Ew{5xC zOwMiKtU%=tq*oK2hzQ~|@i(FGJ35Y%K4O!m9qGDsUf$cd(0;NJ@Ew*OWdPk0`XpM z180Bg{7BcueA>w2L^)1+9Cg&Tn03xvTD$u1DHu)sPQFy`ZISqCV;E#1_(>iJypl#372(> zpzK!#W%up+;Au(0D?})T+lXjB6i0ri``~QSPaaJuU+C&ozSULMz;}pKu5OAe55Qua zGmOxYNxi=>#ro_=CWg#lVx9Y7APuLH*1w8wj2{zUQvU)mfpkxN9(xnZh!(V)gMU!I z5_R;q_-d})ur)OKrKVe_3@bQu#|nSX H@r?fg*7qIZ diff --git a/core/locale/tr_TR/LC_MESSAGES/django.po b/core/locale/tr_TR/LC_MESSAGES/django.po index 6a01fca4..8dd75886 100644 --- a/core/locale/tr_TR/LC_MESSAGES/django.po +++ b/core/locale/tr_TR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Değiştirilmiş" msgid "when the object was last modified" msgstr "Nesne en son ne zaman düzenlendi" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Çeviriler" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Genel" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "İlişkiler" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "EK BİLGİ" + +#: core/admin.py:94 msgid "metadata" msgstr "Metadata" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Zaman Damgaları" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Seçili %(verbose_name_plural)s'ı etkinleştirin" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Seçilen öğeler etkinleştirildi!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Seçili %(verbose_name_plural)s'ı devre dışı bırak" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Seçilen öğeler devre dışı bırakıldı!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Öznitelik Değeri" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Öznitelik Değerleri" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Resim" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Görüntüler" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Stok" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Stoklar" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Ürün Siparişi" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Sipariş Ürünleri" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Çocuklar" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Konfigürasyon" @@ -743,7 +747,7 @@ msgstr "sipariş-ürün ilişkisini silme" msgid "add or remove feedback on an order–product relation" msgstr "sipariş-ürün ilişkisine geri bildirim ekleme veya kaldırma" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Arama terimi belirtilmemiştir." @@ -919,7 +923,7 @@ msgstr "" " dışlayan bilgiler!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "order.buy() metodundan yanlış tip geldi: {type(instance)!s}" @@ -997,7 +1001,7 @@ msgstr "Kullanıcı tarafından sağlanan orijinal adres dizesi" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} mevcut değil: {uuid}!" @@ -2695,22 +2699,22 @@ msgstr "Hem veri hem de zaman aşımı gereklidir" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "Geçersiz zaman aşımı değeri, 0 ile 216000 saniye arasında olmalıdır" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | bi̇zi̇mle i̇leti̇şi̇me geçi̇n" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Sipariş Onayı" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Sipariş Teslim Edildi" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | verilen promosyon kodu" @@ -2960,7 +2964,7 @@ msgstr "" "genişletir ve verileri sorgulamak için Django'nun filtreleme sistemini " "kullanır." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2979,7 +2983,7 @@ msgstr "" "birden fazla serileştirici kullanır ve sipariş verileriyle etkileşime " "girerken izinleri buna göre zorlar." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2993,11 +2997,11 @@ msgstr "" " serileştirici değiştirme içerir. Ayrıca, OrderProduct örnekleriyle ilgili " "geri bildirimleri işlemek için ayrıntılı bir eylem sağlar" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Uygulamadaki Ürün görselleri ile ilgili işlemleri yönetir." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3005,15 +3009,15 @@ msgstr "" "Çeşitli API eylemleri aracılığıyla PromoCode örneklerinin alınmasını ve " "işlenmesini yönetir." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Promosyonları yönetmek için bir görünüm kümesini temsil eder." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Sistemdeki Stok verileri ile ilgili işlemleri yürütür." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3031,7 +3035,7 @@ msgstr "" "verilmediği sürece kullanıcıların yalnızca kendi istek listelerini " "yönetebilmelerini sağlamak için entegre edilmiştir." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3045,12 +3049,12 @@ msgstr "" "serileştirici geçersiz kılmaları ve istek bağlamına dayalı izin işleme için " "özel davranışlar içerir." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Coğrafi kodlama hatası: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/vi_VN/LC_MESSAGES/django.mo b/core/locale/vi_VN/LC_MESSAGES/django.mo index 2cab3f7c1ce2372bccfd1940e185336531283a12..07aed3febd39b1b8efdb6199044315bed5a5d02c 100644 GIT binary patch delta 12574 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 delta 12545 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -51,82 +51,86 @@ msgstr "Đã sửa đổi" msgid "when the object was last modified" msgstr "Khi đối tượng được chỉnh sửa lần cuối" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "Dịch thuật" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "Tổng quát" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "Quan hệ" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "Thông tin bổ sung" + +#: core/admin.py:94 msgid "metadata" msgstr "Siêu dữ liệu" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "Dấu thời gian" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "Kích hoạt %(verbose_name_plural)s đã chọn" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "Các mục đã được chọn đã được kích hoạt!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "Vô hiệu hóa các mục đã chọn %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "Các mục đã chọn đã bị vô hiệu hóa!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "Giá trị thuộc tính" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "Giá trị thuộc tính" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "Hình ảnh" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "Hình ảnh" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "Cổ phiếu" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "Cổ phiếu" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "Đặt hàng sản phẩm" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "Đặt hàng sản phẩm" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "Trẻ em" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "Cấu hình" @@ -749,7 +753,7 @@ msgstr "Xóa mối quan hệ giữa đơn hàng và sản phẩm" msgid "add or remove feedback on an order–product relation" msgstr "Thêm hoặc xóa phản hồi về mối quan hệ giữa đơn hàng và sản phẩm" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "Không có từ khóa tìm kiếm được cung cấp." @@ -925,7 +929,7 @@ msgstr "" "trường này là tương hỗ!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "" "Loại sai đã được trả về từ phương thức order.buy(): {type(instance)!s}" @@ -1005,7 +1009,7 @@ msgstr "Dòng địa chỉ gốc do người dùng cung cấp" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} không tồn tại: {uuid}!" @@ -2708,22 +2712,22 @@ msgstr "" "Giá trị thời gian chờ không hợp lệ, nó phải nằm trong khoảng từ 0 đến " "216.000 giây." -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME} | Liên hệ với chúng tôi đã được khởi tạo" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME} | Xác nhận đơn hàng" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | Đơn hàng đã được giao" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | mã khuyến mãi được cấp" @@ -2975,7 +2979,7 @@ msgstr "" "với các đối tượng Feedback có thể truy cập. Nó kế thừa từ lớp cơ sở " "`EvibesViewSet` và sử dụng hệ thống lọc của Django để truy vấn dữ liệu." -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2994,7 +2998,7 @@ msgstr "" "serializer khác nhau tùy thuộc vào hành động cụ thể đang được thực hiện và " "áp dụng quyền truy cập tương ứng khi tương tác với dữ liệu đơn hàng." -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -3009,11 +3013,11 @@ msgstr "" "hành động được yêu cầu. Ngoài ra, nó cung cấp một hành động chi tiết để xử " "lý phản hồi cho các thực thể OrderProduct." -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "Quản lý các hoạt động liên quan đến hình ảnh sản phẩm trong ứng dụng." -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." @@ -3021,15 +3025,15 @@ msgstr "" "Quản lý việc truy xuất và xử lý các thực thể PromoCode thông qua các hành " "động API khác nhau." -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "Đại diện cho một bộ xem để quản lý các chương trình khuyến mãi." -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "Quản lý các hoạt động liên quan đến dữ liệu kho trong hệ thống." -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -3048,7 +3052,7 @@ msgstr "" " bảo rằng người dùng chỉ có thể quản lý danh sách mong muốn của chính mình " "trừ khi được cấp quyền rõ ràng." -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -3062,12 +3066,12 @@ msgstr "" "chuyên biệt cho các phương thức HTTP khác nhau, các tùy chỉnh serializer và " "xử lý quyền truy cập dựa trên bối cảnh yêu cầu." -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "Lỗi địa chỉ địa lý: {e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/locale/zh_Hans/LC_MESSAGES/django.mo b/core/locale/zh_Hans/LC_MESSAGES/django.mo index d041a5c3d8e9c2a7b6d2b351b35de36f542ebac1..9dd63ea9ab6e2514e3bbfb940c8feaa6def88428 100644 GIT binary patch delta 12579 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 R5#u(V`F!sBepk;{{vVQKlj#5e delta 12544 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 diff --git a/core/locale/zh_Hans/LC_MESSAGES/django.po b/core/locale/zh_Hans/LC_MESSAGES/django.po index 1883685d..34a11a6c 100644 --- a/core/locale/zh_Hans/LC_MESSAGES/django.po +++ b/core/locale/zh_Hans/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -47,82 +47,86 @@ msgstr "改装" msgid "when the object was last modified" msgstr "对象最后一次编辑的时间" -#: core/admin.py:63 +#: core/admin.py:68 msgid "translations" msgstr "翻译" -#: core/admin.py:67 +#: core/admin.py:72 msgid "general" msgstr "一般情况" -#: core/admin.py:69 +#: core/admin.py:74 msgid "relations" msgstr "关系" -#: core/admin.py:87 +#: core/admin.py:76 +msgid "additional info" +msgstr "其他信息" + +#: core/admin.py:94 msgid "metadata" msgstr "元数据" -#: core/admin.py:94 +#: core/admin.py:101 msgid "timestamps" msgstr "时间戳" -#: core/admin.py:109 +#: core/admin.py:116 #, python-format msgid "activate selected %(verbose_name_plural)s" msgstr "激活选定的 %(verbose_name_plural)s" -#: core/admin.py:114 +#: core/admin.py:121 msgid "selected items have been activated." msgstr "所选项目已激活!" -#: core/admin.py:120 +#: core/admin.py:127 #, python-format msgid "deactivate selected %(verbose_name_plural)s" msgstr "停用选定的 %(verbose_name_plural)s" -#: core/admin.py:125 +#: core/admin.py:132 msgid "selected items have been deactivated." msgstr "选定项目已停用!" -#: core/admin.py:137 core/graphene/object_types.py:609 +#: core/admin.py:144 core/graphene/object_types.py:609 #: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717 msgid "attribute value" msgstr "属性值" -#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718 +#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718 msgid "attribute values" msgstr "属性值" -#: core/admin.py:146 +#: core/admin.py:153 msgid "image" msgstr "图片" -#: core/admin.py:147 core/graphene/object_types.py:501 +#: core/admin.py:154 core/graphene/object_types.py:501 msgid "images" msgstr "图片" -#: core/admin.py:155 core/models.py:467 +#: core/admin.py:162 core/models.py:467 msgid "stock" msgstr "库存" -#: core/admin.py:156 core/graphene/object_types.py:663 +#: core/admin.py:163 core/graphene/object_types.py:663 msgid "stocks" msgstr "股票" -#: core/admin.py:166 core/models.py:1675 +#: core/admin.py:173 core/models.py:1675 msgid "order product" msgstr "订购产品" -#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676 +#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676 msgid "order products" msgstr "订购产品" -#: core/admin.py:180 core/admin.py:181 +#: core/admin.py:187 core/admin.py:188 msgid "children" msgstr "儿童" -#: core/admin.py:566 +#: core/admin.py:940 msgid "Config" msgstr "配置" @@ -687,7 +691,7 @@ msgstr "删除订单-产品关系" msgid "add or remove feedback on an order–product relation" msgstr "添加或删除订单与产品关系中的反馈信息" -#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498 +#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499 msgid "no search term provided." msgstr "未提供搜索条件。" @@ -860,7 +864,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive" msgstr "请提供 order_uuid 或 order_hr_id(互斥)!" #: core/graphene/mutations.py:229 core/graphene/mutations.py:486 -#: core/graphene/mutations.py:527 core/viewsets.py:679 +#: core/graphene/mutations.py:527 core/viewsets.py:680 msgid "wrong type came from order.buy() method: {type(instance)!s}" msgstr "order.buy() 方法中的类型有误:{type(instance)!s}" @@ -936,7 +940,7 @@ msgstr "用户提供的原始地址字符串" #: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870 #: core/models.py:1289 core/models.py:1318 core/models.py:1343 -#: core/viewsets.py:682 +#: core/viewsets.py:683 #, python-brace-format msgid "{name} does not exist: {uuid}" msgstr "{name} 不存在:{uuid}!" @@ -2502,22 +2506,22 @@ msgstr "需要数据和超时" msgid "invalid timeout value, it must be between 0 and 216000 seconds" msgstr "超时值无效,必须介于 0 和 216000 秒之间" -#: core/utils/emailing.py:25 +#: core/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | contact us initiated" msgstr "{config.PROJECT_NAME}| 联系我们" -#: core/utils/emailing.py:74 +#: core/utils/emailing.py:73 #, python-brace-format msgid "{config.PROJECT_NAME} | order confirmation" msgstr "{config.PROJECT_NAME}| 订单确认" -#: core/utils/emailing.py:109 +#: core/utils/emailing.py:105 #, python-brace-format msgid "{config.PROJECT_NAME} | order delivered" msgstr "{config.PROJECT_NAME} | 订单已送达" -#: core/utils/emailing.py:197 +#: core/utils/emailing.py:188 #, python-brace-format msgid "{config.PROJECT_NAME} | promocode granted" msgstr "{config.PROJECT_NAME} | 授予的促销代码" @@ -2721,7 +2725,7 @@ msgstr "" "处理反馈对象的视图集的表示。该类管理与反馈对象相关的操作,包括列出、筛选和检索详细信息。该视图集的目的是为不同的操作提供不同的序列化器,并对可访问的反馈对象实施基于权限的处理。它扩展了基本的" " `EvibesViewSet` 并使用 Django 的过滤系统来查询数据。" -#: core/viewsets.py:593 +#: core/viewsets.py:594 msgid "" "ViewSet for managing orders and related operations. This class provides " "functionality to retrieve, modify, and manage order objects. It includes " @@ -2735,7 +2739,7 @@ msgstr "" "ViewSet。该类提供了检索、修改和管理订单对象的功能。它包括用于处理订单操作的各种端点,如添加或删除产品、为注册用户和未注册用户执行购买操作,以及检索当前已验证用户的待处理订单。ViewSet" " 根据正在执行的特定操作使用多个序列化器,并在与订单数据交互时执行相应的权限。" -#: core/viewsets.py:782 +#: core/viewsets.py:784 msgid "" "Provides a viewset for managing OrderProduct entities. This viewset enables " "CRUD operations and custom actions specific to the OrderProduct model. It " @@ -2747,25 +2751,25 @@ msgstr "" "模型的自定义操作。它包括过滤、权限检查和根据请求的操作切换序列化器。此外,它还提供了一个详细的操作,用于处理有关 OrderProduct " "实例的反馈信息" -#: core/viewsets.py:833 +#: core/viewsets.py:835 msgid "Manages operations related to Product images in the application. " msgstr "管理应用程序中与产品图像相关的操作。" -#: core/viewsets.py:845 +#: core/viewsets.py:847 msgid "" "Manages the retrieval and handling of PromoCode instances through various " "API actions." msgstr "通过各种 API 操作管理 PromoCode 实例的检索和处理。" -#: core/viewsets.py:866 +#: core/viewsets.py:868 msgid "Represents a view set for managing promotions. " msgstr "代表用于管理促销活动的视图集。" -#: core/viewsets.py:878 +#: core/viewsets.py:880 msgid "Handles operations related to Stock data in the system." msgstr "处理系统中与库存数据有关的操作。" -#: core/viewsets.py:892 +#: core/viewsets.py:894 msgid "" "ViewSet for managing Wishlist operations. The WishlistViewSet provides " "endpoints for interacting with a user's wish list, allowing for the " @@ -2778,7 +2782,7 @@ msgstr "" "用于管理愿望清单操作的 ViewSet。WishlistViewSet 提供了与用户愿望清单交互的端点,允许检索、修改和定制愿望清单中的产品。该 " "ViewSet 支持添加、删除和批量操作愿望清单产品等功能。此外,还集成了权限检查功能,以确保用户只能管理自己的愿望清单,除非获得明确的权限。" -#: core/viewsets.py:1007 +#: core/viewsets.py:1009 msgid "" "This class provides viewset functionality for managing `Address` objects. " "The AddressViewSet class enables CRUD operations, filtering, and custom " @@ -2789,12 +2793,12 @@ msgstr "" "该类为管理 \"地址 \"对象提供了视图集功能。AddressViewSet 类支持与地址实体相关的 CRUD 操作、过滤和自定义操作。它包括针对不同 " "HTTP 方法的专门行为、序列化器重载以及基于请求上下文的权限处理。" -#: core/viewsets.py:1074 +#: core/viewsets.py:1076 #, python-brace-format msgid "Geocoding error: {e}" msgstr "地理编码错误:{e}" -#: core/viewsets.py:1081 +#: core/viewsets.py:1083 msgid "" "Handles operations related to Product Tags within the application. This " "class provides functionality for retrieving, filtering, and serializing " diff --git a/core/management/commands/await_services.py b/core/management/commands/await_services.py index 1eff88df..de564423 100644 --- a/core/management/commands/await_services.py +++ b/core/management/commands/await_services.py @@ -1,6 +1,7 @@ import os import threading import time +from typing import Any import redis from django.core.management.base import BaseCommand @@ -11,10 +12,10 @@ from redis.exceptions import ConnectionError # noqa: A004 class Command(BaseCommand): - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: self.stdout.write("Waiting for services...") - def wait_for_db(): + def wait_for_db() -> None: db_up = False while not db_up: try: @@ -31,7 +32,7 @@ class Command(BaseCommand): time.sleep(1) self.stdout.write(self.style.SUCCESS("Database available!")) - def wait_for_redis(): + def wait_for_redis() -> None: redis_up = False while not redis_up: try: diff --git a/core/management/commands/check_translated.py b/core/management/commands/check_translated.py index 3137fe36..bfefc7b5 100644 --- a/core/management/commands/check_translated.py +++ b/core/management/commands/check_translated.py @@ -1,7 +1,9 @@ import contextlib import os import re +from argparse import ArgumentParser from tempfile import NamedTemporaryFile +from typing import Any import polib from django.apps import apps @@ -64,7 +66,7 @@ def load_po_sanitized(path: str) -> polib.POFile: class Command(BaseCommand): help = "Scan target-language .po files and report any placeholder mismatches, grouped by app." - def add_arguments(self, parser): + def add_arguments(self, parser: ArgumentParser) -> None: parser.add_argument( "-l", "--language", @@ -92,14 +94,14 @@ class Command(BaseCommand): help="Root path prefix to adjust file links", ) - def handle(self, *args, **options) -> None: - langs: list[str] = options["target_languages"] + def handle(self, *args: list[Any], **options: dict[str, str | list[str]]) -> None: + langs: list[str] = options.get("target_languages", []) # type: ignore [assignment] if "ALL" in langs: langs = list(dict(settings.LANGUAGES).keys()) apps_to_scan: set[str] = set(options["target_apps"]) if "ALL" in apps_to_scan: apps_to_scan = set(TRANSLATABLE_APPS) - root_path: str = options.get("root_path") or "/app/" + root_path: str = options.get("root_path") or "/app/" # type: ignore [assignment] configs = list(apps.get_app_configs()) # noinspection PyTypeChecker diff --git a/core/management/commands/clear_unwanted.py b/core/management/commands/clear_unwanted.py index 65d0d074..fbdad57e 100644 --- a/core/management/commands/clear_unwanted.py +++ b/core/management/commands/clear_unwanted.py @@ -1,4 +1,5 @@ from collections import defaultdict +from typing import Any from django.core.management.base import BaseCommand @@ -6,17 +7,16 @@ from core.models import Category, Product, Stock class Command(BaseCommand): - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: self.stdout.write(self.style.SUCCESS("Starting clearing unwanted data...")) # 1. Clean up duplicate Stock entries per product and vendor: # Group stocks by (product, vendor) stocks_by_group = defaultdict(list) for stock in Stock.objects.all().order_by("modified"): - key = (stock.product_id, stock.vendor) - stocks_by_group[key].append(stock) + stocks_by_group[stock.product_pk].append(stock) - stock_deletions = [] + stock_deletions: list[str] = [] for group in stocks_by_group.values(): if len(group) <= 1: continue @@ -32,20 +32,20 @@ class Command(BaseCommand): # Mark all stocks (except the designated one) for deletion. for s in group: - if s.id != record_to_keep.id: - stock_deletions.append(s.id) + if s.uuid != record_to_keep.uuid: + stock_deletions.append(str(s.uuid)) if stock_deletions: - Stock.objects.filter(id__in=stock_deletions).delete() + Stock.objects.filter(uuid__in=stock_deletions).delete() self.stdout.write(self.style.SUCCESS(f"Deleted {len(stock_deletions)} duplicate stock entries.")) # 2. Clean up duplicate Category entries based on name (case-insensitive) category_groups = defaultdict(list) for cat in Category.objects.all().order_by("modified"): - key = cat.name.lower() + key: str = cat.name.lower() category_groups[key].append(cat) - categories_to_delete = [] + categories_to_delete: list[str] = [] total_product_updates = 0 for cat_list in category_groups.values(): if len(cat_list) <= 1: @@ -59,13 +59,13 @@ class Command(BaseCommand): keep_category = max(cat_list, key=lambda c: c.modified) for duplicate in cat_list: - if duplicate.id == keep_category.id: + if duplicate.uuid == keep_category.uuid: continue total_product_updates += Product.objects.filter(category=duplicate).update(category=keep_category) - categories_to_delete.append(duplicate.id) + categories_to_delete.append(str(duplicate.uuid)) if categories_to_delete: - Category.objects.filter(id__in=categories_to_delete).delete() + Category.objects.filter(uuid__in=categories_to_delete).delete() self.stdout.write( self.style.SUCCESS( f"Replaced category for {total_product_updates} product(s) " @@ -74,7 +74,7 @@ class Command(BaseCommand): ) # 3. For Products without stocks: set is_active = False. - inactive_products = Product.objects.filter(stock__isnull=True) + inactive_products = Product.objects.filter(stocks__isnull=True) count_inactive = inactive_products.count() if count_inactive: inactive_products.update(is_active=False) diff --git a/core/management/commands/deepl_translate.py b/core/management/commands/deepl_translate.py index b7075ae2..16dde6e6 100644 --- a/core/management/commands/deepl_translate.py +++ b/core/management/commands/deepl_translate.py @@ -1,13 +1,15 @@ import os import re +from argparse import ArgumentParser from tempfile import NamedTemporaryFile +from typing import Any import polib import requests from django.apps import apps from django.core.management.base import BaseCommand, CommandError -from core.management.commands import RootDirectory, DEEPL_TARGET_LANGUAGES_MAPPING, TRANSLATABLE_APPS +from core.management.commands import DEEPL_TARGET_LANGUAGES_MAPPING, TRANSLATABLE_APPS, RootDirectory # Patterns to identify placeholders PLACEHOLDER_REGEXES = [ @@ -23,7 +25,7 @@ def placeholderize(text: str) -> tuple[str, list[str]]: """ placeholders: list[str] = [] - def _repl(match: re.Match) -> str: + def _repl(match: re.Match) -> str: # type: ignore [type-arg] idx = len(placeholders) placeholders.append(match.group(0)) return f"__PH_{idx}__" @@ -77,7 +79,7 @@ def load_po_sanitized(path: str) -> polib.POFile | None: class Command(BaseCommand): help = "Merge msgid/msgstr from en_GB PO into target-language POs via DeepL, preserving placeholders." - def add_arguments(self, parser): + def add_arguments(self, parser: ArgumentParser) -> None: parser.add_argument( "-l", "--language", @@ -97,10 +99,10 @@ class Command(BaseCommand): help="App label for translation, e.g. core, payments. Use ALL to translate all apps.", ) - def handle(self, *args, **options) -> None: - target_langs = options["target_languages"] + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: + target_langs: list[str] = options["target_languages"] # type: ignore [assignment] if "ALL" in target_langs: - target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys() + target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys() # type: ignore [assignment] target_apps = set(options["target_apps"]) if "ALL" in target_apps: target_apps = { @@ -152,9 +154,9 @@ class Command(BaseCommand): default = e.msgid if readline: - def hook(): - readline.insert_text(default) # noqa: B023 - readline.redisplay() + def hook() -> None: + readline.insert_text(default) # type: ignore [attr-defined] # noqa: B023 + readline.redisplay() # type: ignore [attr-defined] readline.set_pre_input_hook(hook) # type: ignore [attr-defined] diff --git a/core/management/commands/delete_never_ordered_products.py b/core/management/commands/delete_never_ordered_products.py index ce15bf30..e3d63c6b 100644 --- a/core/management/commands/delete_never_ordered_products.py +++ b/core/management/commands/delete_never_ordered_products.py @@ -1,3 +1,6 @@ +from argparse import ArgumentParser +from typing import Any + from django.core.management.base import BaseCommand from core.models import AttributeValue, Product, ProductImage @@ -6,7 +9,7 @@ from core.models import AttributeValue, Product, ProductImage class Command(BaseCommand): help = "Delete Product rows with no OrderProduct, in batches" - def add_arguments(self, parser): + def add_arguments(self, parser: ArgumentParser): parser.add_argument( "-s", "--size", @@ -15,8 +18,8 @@ class Command(BaseCommand): help="Chunk size to delete", ) - def handle(self, *args, **options): - size = options["size"] + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: + size: int = options["size"] # type: ignore [assignment] while True: batch_ids = list(Product.objects.filter(orderproduct__isnull=True).values_list("pk", flat=True)[:size]) if not batch_ids: diff --git a/core/management/commands/delete_products_by_description.py b/core/management/commands/delete_products_by_description.py index ffa66f54..51ad1f5b 100644 --- a/core/management/commands/delete_products_by_description.py +++ b/core/management/commands/delete_products_by_description.py @@ -1,3 +1,6 @@ +from argparse import ArgumentParser +from typing import Any + from django.core.management.base import BaseCommand from core.models import AttributeValue, Product, ProductImage @@ -6,7 +9,7 @@ from core.models import AttributeValue, Product, ProductImage class Command(BaseCommand): help = "Delete Product rows with special description, in batches" - def add_arguments(self, parser): + def add_arguments(self, parser: ArgumentParser) -> None: parser.add_argument( "-s", "--size", @@ -15,8 +18,8 @@ class Command(BaseCommand): help="Chunk size to delete", ) - def handle(self, *args, **options): - size = options["size"] + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: + size: int = options["size"] # type: ignore [assignment] while True: batch_ids = list( Product.objects.filter(description__iexact="EVIBES_DELETED_PRODUCT").values_list("pk", flat=True)[:size] diff --git a/core/management/commands/fetch_products.py b/core/management/commands/fetch_products.py index 3fff1b63..4df69765 100644 --- a/core/management/commands/fetch_products.py +++ b/core/management/commands/fetch_products.py @@ -1,12 +1,14 @@ +from typing import Any + from django.core.management.base import BaseCommand from core.tasks import update_products_task class Command(BaseCommand): - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: self.stdout.write(self.style.SUCCESS("Starting fetching products task in worker container...")) - update_products_task.delay() + update_products_task.delay() # type: ignore [attr-defined] self.stdout.write(self.style.SUCCESS("Started fetching products task in worker container without errors!")) diff --git a/core/management/commands/fix_prices.py b/core/management/commands/fix_prices.py index 6a077690..420c6148 100644 --- a/core/management/commands/fix_prices.py +++ b/core/management/commands/fix_prices.py @@ -1,4 +1,5 @@ import logging +from typing import Any from django.core.management.base import BaseCommand @@ -9,7 +10,7 @@ logger = logging.getLogger("django") class Command(BaseCommand): - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: self.stdout.write(self.style.SUCCESS("Starting fixing stocks' prices...")) for product in Product.objects.filter(stocks__isnull=False): diff --git a/core/management/commands/rebuild_slugs.py b/core/management/commands/rebuild_slugs.py index ba653c9f..5db3283c 100644 --- a/core/management/commands/rebuild_slugs.py +++ b/core/management/commands/rebuild_slugs.py @@ -1,5 +1,8 @@ +from typing import Any + from django.core.management.base import BaseCommand from django.db import transaction +from django.db.models import QuerySet from django.utils.crypto import get_random_string from core.models import Brand, Category, Product @@ -9,7 +12,7 @@ from core.models import Brand, Category, Product class Command(BaseCommand): help = "Rebuild slug field for all slugified instances" - def reset_em(self, queryset): + def reset_em(self, queryset: QuerySet[Any]) -> None: total = queryset.count() self.stdout.write(f"Starting slug rebuilding for {total} {queryset.model._meta.verbose_name_plural}") for idx, instance in enumerate(queryset.iterator(), start=1): @@ -35,7 +38,7 @@ class Command(BaseCommand): ) ) - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: for queryset in [ Brand.objects.all(), Category.objects.all(), diff --git a/core/management/commands/set_default_caches.py b/core/management/commands/set_default_caches.py index 40722e6e..f1ea6850 100644 --- a/core/management/commands/set_default_caches.py +++ b/core/management/commands/set_default_caches.py @@ -1,10 +1,12 @@ +from typing import Any + from django.core.management.base import BaseCommand from core.utils.caching import set_default_cache class Command(BaseCommand): - def handle(self, *args, **options): + def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: self.stdout.write(self.style.SUCCESS("Started setting default cache values...")) set_default_cache() diff --git a/core/models.py b/core/models.py index 53a4b5b5..1ab647c6 100644 --- a/core/models.py +++ b/core/models.py @@ -66,7 +66,7 @@ from payments.models import Transaction logger = logging.getLogger("django") -class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing] +class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a group of attributes, which can be hierarchical." " This class is used to manage and organize attribute groups." @@ -94,7 +94,7 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): unique=True, ) - def __str__(self): + def __str__(self) -> str: return self.name class Meta: @@ -102,7 +102,7 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): verbose_name_plural = _("attribute groups") -class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc, django-manager-missing] +class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a vendor entity capable of storing information about external vendors and their interaction requirements." " The Vendor class is used to define and manage information related to an external vendor." @@ -147,13 +147,13 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [ def __str__(self) -> str: return self.name - def save( + def save( # type: ignore [override] self, *, - force_insert=False, - force_update=False, - using=None, - update_fields=None, + force_insert: bool = False, + force_update: bool = False, + using: str | None = None, + update_fields: list[str] | tuple[str, ...] | None = None, update_modified: bool = True, ) -> None: users = self.users.filter(is_active=True) @@ -180,7 +180,7 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [ ] -class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc, django-manager-missing] +class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a product tag used for classifying or identifying products." " The ProductTag class is designed to uniquely identify and classify products through a combination" @@ -212,7 +212,7 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: verbose_name_plural = _("product tags") -class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc, django-manager-missing] +class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a category tag used for products." " This class models a category tag that can be used to associate and classify products." @@ -335,7 +335,7 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): # ordering = ["tree_id", "lft"] -class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc, django-manager-missing] +class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a Brand object in the system. " "This class handles information and attributes related to a brand, including its name, logos, " @@ -405,7 +405,7 @@ class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [mi verbose_name_plural = _("brands") -class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc, django-manager-missing] +class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents the stock of a product managed in the system." " This class provides details about the relationship between vendors, products, and their stock information, " @@ -468,7 +468,7 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi verbose_name_plural = _("stock entries") -class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc, django-manager-missing] +class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a product with attributes such as category, brand, tags, digital status, name, description, part number, and slug." " Provides related utility properties to retrieve ratings, feedback counts, price, quantity, and total orders." @@ -561,21 +561,21 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore return self.name @property - def rating(self): + def rating(self) -> float: cache_key = f"product_rating_{self.pk}" rating = cache.get(cache_key) if rating is None: feedbacks = Feedback.objects.filter(order_product__product_id=self.pk) rating = feedbacks.aggregate(Avg("rating"))["rating__avg"] or 0 cache.set(cache_key, rating, 86400) - return round(rating, 2) + return float(round(rating, 2)) @rating.setter - def rating(self, value): + def rating(self, value: float): self.__dict__["rating"] = value @property - def feedbacks_count(self): + def feedbacks_count(self) -> int: cache_key = f"product_feedbacks_count_{self.pk}" feedbacks_count = cache.get(cache_key) if feedbacks_count is None: @@ -616,7 +616,7 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore self.__dict__["personal_orders_only"] = value -class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc, django-manager-missing] +class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents an attribute in the system." " This class is used to define and manage attributes," @@ -680,7 +680,7 @@ class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ig verbose_name_plural = _("attributes") -class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc, django-manager-missing] +class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a specific value for an attribute that is linked to a product. " "It links the 'attribute' to a unique 'value', allowing " @@ -718,7 +718,7 @@ class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): verbose_name_plural = _("attribute values") -class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc, django-manager-missing] +class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a product image associated with a product in the system. " "This class is designed to manage images for products, including functionality " @@ -765,7 +765,7 @@ class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # t verbose_name_plural = _("product images") -class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc, django-manager-missing] +class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a promotional campaign for products with a discount. " "This class is used to define and manage promotional campaigns that offer a " @@ -811,7 +811,7 @@ class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ig return str(self.id) -class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc, django-manager-missing] +class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a user's wishlist for storing and managing desired products. " "The class provides functionality to manage a collection of products, " @@ -882,7 +882,7 @@ class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: igno return self -class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing] +class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a documentary record tied to a product. " "This class is used to store information about documentaries related to specific " @@ -911,7 +911,7 @@ class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # return self.document.name.split(".")[-1] or _("unresolved") -class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc, django-manager-missing] +class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents an address entity that includes location details and associations with a user. " "Provides functionality for geographic and address data storage, as well " @@ -970,7 +970,7 @@ class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore return f"{base} for {self.user.email}" if self.user else base -class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ignore [misc, django-manager-missing] +class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents a promotional code that can be used for discounts, managing its validity, " "type of discount, and application. " @@ -1093,7 +1093,7 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig return promo_amount -class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc, django-manager-missing] +class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents an order placed by a user." " This class models an order within the application," @@ -1594,7 +1594,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi return None -class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc, django-manager-missing] +class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents products associated with orders and their attributes. " "The OrderProduct model maintains information about a product that is part of an order, " @@ -1745,7 +1745,7 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t return None -class CustomerRelationshipManagementProvider(ExportModelOperationsMixin("crm_provider"), NiceModel): # type: ignore [misc, django-manager-missing] +class CustomerRelationshipManagementProvider(ExportModelOperationsMixin("crm_provider"), NiceModel): # type: ignore [misc] name = CharField(max_length=128, unique=True, verbose_name=_("name")) integration_url = URLField(blank=True, null=True, help_text=_("URL of the integration")) authentication = JSONField(blank=True, null=True, help_text=_("authentication credentials")) @@ -1797,7 +1797,7 @@ class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel): # verbose_name_plural = _("orders CRM links") -class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing] +class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Represents the downloading functionality for digital assets associated with orders. " "The DigitalAssetDownload class provides the ability to manage and access " @@ -1826,7 +1826,7 @@ class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceMo ) -class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc, django-manager-missing] +class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc] __doc__ = _( # type: ignore "Manages user feedback for products. " "This class is designed to capture and store user feedback for specific products " diff --git a/core/serializers/simple.py b/core/serializers/simple.py index 2358fb5c..d9b4f157 100644 --- a/core/serializers/simple.py +++ b/core/serializers/simple.py @@ -26,7 +26,7 @@ from core.models import ( from core.serializers.utility import AddressSerializer -class AttributeGroupSimpleSerializer(ModelSerializer): +class AttributeGroupSimpleSerializer(ModelSerializer): # type: ignore [type-arg] parent = PrimaryKeyRelatedField(read_only=True) # type: ignore [assignment, var-annotated] children = PrimaryKeyRelatedField(many=True, read_only=True) # type: ignore [assignment, var-annotated] @@ -40,7 +40,7 @@ class AttributeGroupSimpleSerializer(ModelSerializer): ] -class CategorySimpleSerializer(ModelSerializer): +class CategorySimpleSerializer(ModelSerializer): # type: ignore [type-arg] children = SerializerMethodField() image = SerializerMethodField() @@ -56,10 +56,10 @@ class CategorySimpleSerializer(ModelSerializer): def get_image(self, obj: Category) -> str | None: with suppress(ValueError): - return obj.image.url + return str(obj.image.url) return None - def get_children(self, obj) -> Collection[Any]: + def get_children(self, obj: Category) -> Collection[Any]: request = self.context.get("request") if request is not None and request.user.has_perm("view_category"): children = obj.children.all() @@ -69,7 +69,7 @@ class CategorySimpleSerializer(ModelSerializer): return CategorySimpleSerializer(children, many=True, context=self.context).data if obj.children.exists() else [] -class BrandSimpleSerializer(ModelSerializer): +class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg] small_logo = SerializerMethodField() big_logo = SerializerMethodField() @@ -84,16 +84,16 @@ class BrandSimpleSerializer(ModelSerializer): def get_small_logo(self, obj: Brand) -> str | None: with suppress(ValueError): - return obj.small_logo.url + return str(obj.small_logo.url) return None def get_big_logo(self, obj: Brand) -> str | None: with suppress(ValueError): - return obj.big_logo.url + return str(obj.big_logo.url) return None -class ProductTagSimpleSerializer(ModelSerializer): +class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class Meta: model = ProductTag fields = [ @@ -103,8 +103,8 @@ class ProductTagSimpleSerializer(ModelSerializer): ] -class ProductImageSimpleSerializer(ModelSerializer): - product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) +class ProductImageSimpleSerializer(ModelSerializer): # type: ignore [type-arg] + product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] class Meta: model = ProductImage @@ -117,7 +117,7 @@ class ProductImageSimpleSerializer(ModelSerializer): ] -class AttributeSimpleSerializer(ModelSerializer): +class AttributeSimpleSerializer(ModelSerializer): # type: ignore [type-arg] group = AttributeGroupSimpleSerializer(read_only=True) class Meta: @@ -130,9 +130,9 @@ class AttributeSimpleSerializer(ModelSerializer): ] -class AttributeValueSimpleSerializer(ModelSerializer): +class AttributeValueSimpleSerializer(ModelSerializer): # type: ignore [type-arg] attribute = AttributeSimpleSerializer(read_only=True) - product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) + product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] class Meta: model = AttributeValue @@ -144,7 +144,7 @@ class AttributeValueSimpleSerializer(ModelSerializer): ] -class ProductSimpleSerializer(ModelSerializer): +class ProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg] brand = BrandSimpleSerializer(read_only=True) category = CategorySimpleSerializer(read_only=True) tags = ProductTagSimpleSerializer(many=True, read_only=True) @@ -196,7 +196,7 @@ class ProductSimpleSerializer(ModelSerializer): return obj.personal_orders_only -class VendorSimpleSerializer(ModelSerializer): +class VendorSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class Meta: model = Vendor fields = [ @@ -205,7 +205,7 @@ class VendorSimpleSerializer(ModelSerializer): ] -class StockSimpleSerializer(ModelSerializer): +class StockSimpleSerializer(ModelSerializer): # type: ignore [type-arg] vendor = VendorSimpleSerializer(read_only=True) product = ProductSimpleSerializer(read_only=True) @@ -222,7 +222,7 @@ class StockSimpleSerializer(ModelSerializer): ] -class PromoCodeSimpleSerializer(ModelSerializer): +class PromoCodeSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class Meta: model = PromoCode fields = [ @@ -231,7 +231,7 @@ class PromoCodeSimpleSerializer(ModelSerializer): ] -class PromotionSimpleSerializer(ModelSerializer): +class PromotionSimpleSerializer(ModelSerializer): # type: ignore [type-arg] products = ProductSimpleSerializer(many=True, read_only=True) class Meta: @@ -244,8 +244,8 @@ class PromotionSimpleSerializer(ModelSerializer): ] -class WishlistSimpleSerializer(ModelSerializer): - user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) +class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg] + user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] products = ProductSimpleSerializer(many=True, read_only=True) class Meta: @@ -257,8 +257,8 @@ class WishlistSimpleSerializer(ModelSerializer): ] -class FeedbackSimpleSerializer(ModelSerializer): - order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) +class FeedbackSimpleSerializer(ModelSerializer): # type: ignore [type-arg] + order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] class Meta: model = Feedback @@ -269,7 +269,7 @@ class FeedbackSimpleSerializer(ModelSerializer): ] -class OrderProductSimpleSerializer(ModelSerializer): +class OrderProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg] product = ProductSimpleSerializer(read_only=True) class Meta: @@ -283,8 +283,8 @@ class OrderProductSimpleSerializer(ModelSerializer): ] -class OrderSimpleSerializer(ModelSerializer): - user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) +class OrderSimpleSerializer(ModelSerializer): # type: ignore [type-arg] + user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] promo_code = PromoCodeSimpleSerializer(read_only=True) order_products = OrderProductSimpleSerializer(many=True, read_only=True) billing_address = AddressSerializer(read_only=True, required=False) diff --git a/core/serializers/utility.py b/core/serializers/utility.py index ec855c61..09f4ac20 100644 --- a/core/serializers/utility.py +++ b/core/serializers/utility.py @@ -1,3 +1,5 @@ +from typing import Any + from django.utils.translation import gettext_lazy as _ from rest_framework.exceptions import ValidationError from rest_framework.fields import ( @@ -16,19 +18,19 @@ from rest_framework.serializers import ListSerializer, ModelSerializer, Serializ from core.models import Address -class AddressAutocompleteInputSerializer(Serializer): +class AddressAutocompleteInputSerializer(Serializer): # type: ignore [type-arg] q = CharField(required=True) limit = IntegerField(required=False, min_value=1, max_value=10, default=5) -class AddressSuggestionSerializer(Serializer): +class AddressSuggestionSerializer(Serializer): # type: ignore [type-arg] display_name = CharField() lat = FloatField() lon = FloatField() address = DictField(child=CharField()) -class AddressSerializer(ModelSerializer): +class AddressSerializer(ModelSerializer): # type: ignore [type-arg] latitude = FloatField(source="location.y", read_only=True) longitude = FloatField(source="location.x", read_only=True) @@ -57,7 +59,7 @@ class AddressSerializer(ModelSerializer): ] -class AddressCreateSerializer(ModelSerializer): +class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg] raw_data = CharField( write_only=True, max_length=512, @@ -69,31 +71,32 @@ class AddressCreateSerializer(ModelSerializer): model = Address fields = ["raw_data", "address_line_1", "address_line_2"] - def create(self, validated_data): + def create(self, validated_data: dict[str, Any]) -> Address: raw = validated_data.pop("raw_data") user = None if self.context["request"].user.is_authenticated: user = self.context["request"].user - return Address.objects.create(raw_data=raw, user=user, **validated_data) + return Address.objects.create(raw_data=raw, user=user, **validated_data) # type: ignore [no-untyped-call] -class DoFeedbackSerializer(Serializer): +class DoFeedbackSerializer(Serializer): # type: ignore [type-arg] comment = CharField(required=True) rating = IntegerField(min_value=1, max_value=10, default=10) action = CharField(default="add") - def validate(self, data): + def validate(self, data: dict[str, Any]) -> dict[str, Any]: if data["action"] == "add" and not all([data["comment"], data["rating"]]): raise ValidationError(_("you must provide a comment, rating, and order product uuid to add feedback.")) + return data -class CacheOperatorSerializer(Serializer): +class CacheOperatorSerializer(Serializer): # type: ignore [type-arg] key = CharField(required=True) data = JSONField(required=False) # type: ignore [assignment] timeout = IntegerField(required=False) -class ContactUsSerializer(Serializer): +class ContactUsSerializer(Serializer): # type: ignore [type-arg] email = CharField(required=True) name = CharField(required=True) subject = CharField(required=True) @@ -101,14 +104,14 @@ class ContactUsSerializer(Serializer): message = CharField(required=True) -class LanguageSerializer(Serializer): +class LanguageSerializer(Serializer): # type: ignore [type-arg] code = CharField(required=True) name = CharField(required=True) flag = CharField() -class RecursiveField(Field): - def to_representation(self, value): +class RecursiveField(Field): # type: ignore [type-arg] + def to_representation(self, value: Any) -> Any: parent = self.parent if isinstance(parent, ListSerializer): parent = parent.parent @@ -116,45 +119,45 @@ class RecursiveField(Field): serializer_class = parent.__class__ return serializer_class(value, context=self.context).data - def to_internal_value(self, data): + def to_internal_value(self, data: Any) -> Any: return data -class AddOrderProductSerializer(Serializer): +class AddOrderProductSerializer(Serializer): # type: ignore [type-arg] product_uuid = CharField(required=True) attributes = ListField(required=False, child=DictField(), default=list) -class BulkAddOrderProductsSerializer(Serializer): +class BulkAddOrderProductsSerializer(Serializer): # type: ignore [type-arg] products = ListField(child=AddOrderProductSerializer(), required=True) -class RemoveOrderProductSerializer(Serializer): +class RemoveOrderProductSerializer(Serializer): # type: ignore [type-arg] product_uuid = CharField(required=True) attributes = JSONField(required=False, default=dict) -class BulkRemoveOrderProductsSerializer(Serializer): +class BulkRemoveOrderProductsSerializer(Serializer): # type: ignore [type-arg] products = ListField(child=RemoveOrderProductSerializer(), required=True) -class AddWishlistProductSerializer(Serializer): +class AddWishlistProductSerializer(Serializer): # type: ignore [type-arg] product_uuid = CharField(required=True) -class RemoveWishlistProductSerializer(Serializer): +class RemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg] product_uuid = CharField(required=True) -class BulkAddWishlistProductSerializer(Serializer): +class BulkAddWishlistProductSerializer(Serializer): # type: ignore [type-arg] product_uuids = ListField(child=CharField(required=True), allow_empty=False, max_length=64) -class BulkRemoveWishlistProductSerializer(Serializer): +class BulkRemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg] product_uuids = ListField(child=CharField(required=True), allow_empty=False, max_length=64) -class BuyOrderSerializer(Serializer): +class BuyOrderSerializer(Serializer): # type: ignore [type-arg] force_balance = BooleanField(required=False, default=False) force_payment = BooleanField(required=False, default=False) promocode_uuid = CharField(required=False) @@ -163,7 +166,7 @@ class BuyOrderSerializer(Serializer): chosen_products = AddOrderProductSerializer(many=True, required=False) -class BuyUnregisteredOrderSerializer(Serializer): +class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg] products = AddOrderProductSerializer(many=True, required=True) promocode_uuid = UUIDField(required=False) customer_name = CharField(required=True) @@ -174,7 +177,7 @@ class BuyUnregisteredOrderSerializer(Serializer): payment_method = CharField(required=True) -class BuyAsBusinessOrderSerializer(Serializer): +class BuyAsBusinessOrderSerializer(Serializer): # type: ignore [type-arg] products = AddOrderProductSerializer(many=True, required=True) business_identificator = CharField(required=True) promocode_uuid = UUIDField(required=False) diff --git a/core/signals.py b/core/signals.py index e9f5b9e5..a6486047 100644 --- a/core/signals.py +++ b/core/signals.py @@ -1,6 +1,7 @@ import logging from contextlib import suppress from datetime import timedelta +from typing import Any from django.db import IntegrityError from django.db.models.signals import post_save @@ -13,7 +14,7 @@ from sentry_sdk import capture_exception from core.crm import any_crm_integrations from core.crm.exceptions import CRMException -from core.models import Category, Order, Product, PromoCode, Wishlist, DigitalAssetDownload +from core.models import Category, DigitalAssetDownload, Order, Product, PromoCode, Wishlist from core.utils import ( generate_human_readable_id, resolve_translations_for_elasticsearch, @@ -25,8 +26,9 @@ from vibes_auth.models import User logger = logging.getLogger("django") +# noinspection PyUnusedLocal @receiver(post_save, sender=User) -def create_order_on_user_creation_signal(instance, created, **_kwargs): +def create_order_on_user_creation_signal(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None: if created: try: Order.objects.create(user=instance, status="PENDING") @@ -40,17 +42,23 @@ def create_order_on_user_creation_signal(instance, created, **_kwargs): break +# noinspection PyUnusedLocal @receiver(post_save, sender=User) -def create_wishlist_on_user_creation_signal(instance, created, **_kwargs): +def create_wishlist_on_user_creation_signal(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None: if created: Wishlist.objects.create(user=instance) +# noinspection PyUnusedLocal @receiver(post_save, sender=User) -def create_promocode_on_user_referring(instance, created, **_kwargs): +def create_promocode_on_user_referring(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None: try: + if not instance.attributes: + instance.attributes = {} + instance.save() + if created and instance.attributes.get("referrer", ""): - referrer_uuid = urlsafe_base64_decode(instance.attributes.get("referrer", "")) + referrer_uuid = urlsafe_base64_decode(instance.attributes.get("referrer", "")).decode() referrer = User.objects.get(uuid=referrer_uuid) code = f"WELCOME-{get_random_string(6)}" PromoCode.objects.create( @@ -65,8 +73,9 @@ def create_promocode_on_user_referring(instance, created, **_kwargs): logger.error(_(f"error during promocode creation: {e!s}")) +# noinspection PyUnusedLocal @receiver(post_save, sender=Order) -def process_order_changes(instance, created, **_kwargs): +def process_order_changes(instance: Order, created: bool, **kwargs: dict[Any, Any]): if type(instance.attributes) is not dict: instance.attributes = {} @@ -99,9 +108,12 @@ def process_order_changes(instance, created, **_kwargs): if instance.status in ["CREATED", "PAYMENT"]: if not instance.is_whole_digital: - send_order_created_email.delay(instance.uuid) + send_order_created_email.delay(instance.uuid) # type: ignore [attr-defined] for order_product in instance.order_products.filter(status="DELIVERING", product__is_digital=True): + if not order_product.product: + continue + stocks_qs = order_product.product.stocks.filter(digital_asset__isnull=False).exclude(digital_asset="") stock = stocks_qs.first() @@ -115,8 +127,8 @@ def process_order_changes(instance, created, **_kwargs): order_product.status = "FINISHED" if not order_product.download: DigitalAssetDownload.objects.create(order_product=order_product) - order_product.order.user.payments_balance.amount -= order_product.buy_price - order_product.order.user.payments_balance.save() + order_product.order.user.payments_balance.amount -= order_product.buy_price # type: ignore [union-attr, operator] + order_product.order.user.payments_balance.save() # type: ignore [union-attr] order_product.save() continue @@ -124,12 +136,12 @@ def process_order_changes(instance, created, **_kwargs): try: vendor_name = ( - order_product.product.stocks.filter(price=order_product.buy_price).first().vendor.name.lower() + order_product.product.stocks.filter(price=order_product.buy_price).first().vendor.name.lower() # type: ignore [union-attr, attr-defined, misc] ) vendor = create_object(f"core.vendors.{vendor_name}", f"{vendor_name.title()}Vendor") - vendor.buy_order_product(order_product) + vendor.buy_order_product(order_product) # type: ignore [attr-defined] except Exception as e: order_product.add_error(f"Failed to buy {order_product.uuid}. Reason: {e}...") @@ -144,26 +156,29 @@ def process_order_changes(instance, created, **_kwargs): if instance.status == "FINISHED" and not instance.attributes.get("system_email_sent", False): instance.attributes["system_email_sent"] = True instance.save() - send_order_finished_email.delay(instance.uuid) + send_order_finished_email.delay(instance.uuid) # type: ignore [attr-defined] +# noinspection PyUnusedLocal @receiver(post_save, sender=Product) -def update_product_name_lang(instance, created, **_kwargs): +def update_product_name_lang(instance: Product, created: bool, **kwargs: dict[Any, Any]) -> None: if created: pass resolve_translations_for_elasticsearch(instance, "name") resolve_translations_for_elasticsearch(instance, "description") +# noinspection PyUnusedLocal @receiver(post_save, sender=Category) -def update_category_name_lang(instance, created, **_kwargs): +def update_category_name_lang(instance: Category, created: bool, **kwargs: dict[Any, Any]) -> None: if created: pass resolve_translations_for_elasticsearch(instance, "name") resolve_translations_for_elasticsearch(instance, "description") +# noinspection PyUnusedLocal @receiver(post_save, sender=PromoCode) -def send_promocode_creation_email(instance, created, **_kwargs): +def send_promocode_creation_email(instance: PromoCode, created: bool, **kwargs: dict[Any, Any]) -> None: if created: - send_promocode_created_email.delay(instance.uuid) + send_promocode_created_email.delay(instance.uuid) # type: ignore [attr-defined] diff --git a/core/sitemaps.py b/core/sitemaps.py index a7d631fa..93ecd6ad 100644 --- a/core/sitemaps.py +++ b/core/sitemaps.py @@ -1,12 +1,13 @@ from django.conf import settings from django.contrib.sitemaps import Sitemap from django.utils.translation import gettext_lazy as _ + from core.models import Brand, Category, Product from core.utils.seo_builders import any_non_digital from evibes.settings import LANGUAGE_CODE -class StaticPagesSitemap(Sitemap): +class StaticPagesSitemap(Sitemap): # type: ignore [type-arg] protocol = "https" changefreq = "monthly" priority = 0.8 @@ -54,7 +55,7 @@ class StaticPagesSitemap(Sitemap): return obj.get("lastmod") -# class FeaturedProductsSitemap(Sitemap): +# class FeaturedProductsSitemap(Sitemap): # type: ignore [type-arg] # protocol = "https" # changefreq = "daily" # priority = 0.9 @@ -80,7 +81,7 @@ class StaticPagesSitemap(Sitemap): # return f"/{LANGUAGE_CODE}/product/{obj.slug}" -class ProductSitemap(Sitemap): +class ProductSitemap(Sitemap): # type: ignore [type-arg] protocol = "https" changefreq = "daily" priority = 0.9 @@ -106,7 +107,7 @@ class ProductSitemap(Sitemap): return f"/{LANGUAGE_CODE}/product/{obj.slug}" -class CategorySitemap(Sitemap): +class CategorySitemap(Sitemap): # type: ignore [type-arg] protocol = "https" changefreq = "weekly" priority = 0.7 @@ -122,7 +123,7 @@ class CategorySitemap(Sitemap): return f"/{LANGUAGE_CODE}/catalog/{obj.slug}" -class BrandSitemap(Sitemap): +class BrandSitemap(Sitemap): # type: ignore [type-arg] protocol = "https" changefreq = "weekly" priority = 0.6 diff --git a/core/tasks.py b/core/tasks.py index c71f5bdb..3792ad66 100644 --- a/core/tasks.py +++ b/core/tasks.py @@ -4,6 +4,7 @@ import shutil import uuid from datetime import date, timedelta from time import sleep +from typing import Any import requests from celery.app import shared_task @@ -38,7 +39,7 @@ def update_products_task() -> tuple[bool, str]: if not update_products_task_running: cache.set("update_products_task_running", True, 86400) - vendors_classes: list = [] + vendors_classes: list[Any] = [] for vendor_class in vendors_classes: vendor = vendor_class() @@ -69,7 +70,7 @@ def update_orderproducts_task() -> tuple[bool, str]: message confirming the successful execution of the task. :rtype: Tuple[bool, str] """ - vendors_classes: list = [] + vendors_classes: list[Any] = [] for vendor_class in vendors_classes: vendor = vendor_class() @@ -202,7 +203,7 @@ def process_promotions() -> tuple[bool, str]: if eligible_products.count() < 48: return False, "Not enough products to choose from [< 48]." - selected_products: list = [] + selected_products: list[Any] = [] while len(selected_products) < 48: product = eligible_products.order_by("?").first() diff --git a/core/templatetags/conditions.py b/core/templatetags/conditions.py index ca086a58..f2874ded 100644 --- a/core/templatetags/conditions.py +++ b/core/templatetags/conditions.py @@ -1,10 +1,12 @@ +from typing import Any + from django import template register = template.Library() @register.filter -def attributes_length(value, arg): +def attributes_length(value: Any, arg: int) -> bool: """Returns True if the value length is more than the argument.""" if isinstance(value, dict): count = 0 diff --git a/core/tests.py b/core/tests.py index e55d6890..e69de29b 100644 --- a/core/tests.py +++ b/core/tests.py @@ -1,3 +0,0 @@ -from django.test import TestCase # noqa: F401 - -# Create your tests here. diff --git a/core/urls.py b/core/urls.py index e8ac27db..a1b30b22 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1 +1,3 @@ -urlpatterns: list = [] +from typing import Any + +urlpatterns: list[Any] = [] diff --git a/core/utils/__init__.py b/core/utils/__init__.py index aadce51d..8357c26d 100644 --- a/core/utils/__init__.py +++ b/core/utils/__init__.py @@ -2,13 +2,18 @@ import logging import re import secrets from contextlib import contextmanager +from typing import Any, Generator from constance import config from django.conf import settings +from django.core import mail from django.core.cache import cache +from django.core.mail.backends.smtp import EmailBackend from django.db import transaction from django.utils.crypto import get_random_string from django.utils.translation import get_language +from graphene import Context +from rest_framework.request import Request from evibes.settings import DEBUG, EXPOSABLE_KEYS, LANGUAGE_CODE @@ -29,7 +34,7 @@ def graphene_current_lang() -> str: return (get_language() or settings.LANGUAGE_CODE).lower() -def graphene_abs(request, path_or_url: str) -> str: +def graphene_abs(request: Request | Context, path_or_url: str) -> str: """ Builds and returns an absolute URI for a given path or URL. @@ -63,20 +68,20 @@ def get_random_code() -> str: return get_random_string(20) -def get_product_uuid_as_path(instance, filename: str = "") -> str: +def get_product_uuid_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] return "products" + "/" + str(instance.product.uuid) + "/" + filename -def get_vendor_name_as_path(instance, filename: str = "") -> str: +def get_vendor_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] return "vendors_responses/" + str(instance.name) + "/" + filename -def get_brand_name_as_path(instance, filename: str = "") -> str: +def get_brand_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] return "brands/" + str(instance.name) + "/" + filename @contextmanager -def atomic_if_not_debug(): +def atomic_if_not_debug() -> Generator[None, None, None]: """ Context manager to wrap a block of code in an atomic transaction if the DEBUG setting is not enabled. @@ -97,7 +102,7 @@ def is_url_safe(url: str) -> bool: return bool(re.match(r"^https://", url, re.IGNORECASE)) -def format_attributes(attributes: str | None = None) -> dict: +def format_attributes(attributes: str | None = None) -> dict[str, Any]: """ Parses a string of attributes into a dictionary. @@ -125,7 +130,7 @@ def format_attributes(attributes: str | None = None) -> dict: return result -def get_project_parameters() -> dict: +def get_project_parameters() -> Any: """ Fetches project parameters from cache or configuration. @@ -134,7 +139,7 @@ def get_project_parameters() -> dict: configuration source, formats their keys to lowercase, and then stores them in the cache for a limited period. """ - parameters = cache.get("parameters", {}) + parameters = cache.get("parameters") if not parameters: for key in EXPOSABLE_KEYS: @@ -145,7 +150,7 @@ def get_project_parameters() -> dict: return parameters -def resolve_translations_for_elasticsearch(instance, field_name: str) -> None: +def resolve_translations_for_elasticsearch(instance, field_name: str) -> None: # type: ignore [no-untyped-def] """ Resolves translations for a given field in an Elasticsearch-compatible format. It checks if the localized version of the field contains data, @@ -199,3 +204,17 @@ def generate_human_readable_token() -> str: def is_status_code_success(status_code: int) -> bool: return 200 <= status_code < 300 + + +def get_dynamic_email_connection() -> EmailBackend: + return mail.get_connection( # type: ignore [no-any-return] + host=config.EMAIL_HOST, + port=config.EMAIL_PORT, + username=config.EMAIL_HOST_USER, + password=config.EMAIL_HOST_PASSWORD, + use_tls=config.EMAIL_USE_TLS, + use_ssl=config.EMAIL_USE_SSL, + timeout=30, + fail_silently=False, + backend=config.EMAIL_BACKEND, + ) diff --git a/core/utils/caching.py b/core/utils/caching.py index 737e1070..5827c6a7 100644 --- a/core/utils/caching.py +++ b/core/utils/caching.py @@ -1,10 +1,8 @@ import json import logging from pathlib import Path -from typing import Any +from typing import Any, Type -from django.contrib.auth.base_user import AbstractBaseUser -from django.contrib.auth.models import AnonymousUser from django.core.cache import cache from django.core.exceptions import BadRequest from django.utils.translation import gettext_lazy as _ @@ -17,11 +15,11 @@ from vibes_auth.models import User logger = logging.getLogger("django") -def is_safe_cache_key(key: str): +def is_safe_cache_key(key: str) -> bool: return key not in UNSAFE_CACHE_KEYS -def get_cached_value(user: User, key: str, default=None) -> None | object: +def get_cached_value(user: Type[User], key: str, default: Any = None) -> Any: if user.is_staff or user.is_superuser: return cache.get(key, default) @@ -31,9 +29,7 @@ def get_cached_value(user: User, key: str, default=None) -> None | object: return None -def set_cached_value( - user: User | AbstractBaseUser | AnonymousUser, key: str, value: object, timeout: int = 3600 -) -> None | object: +def set_cached_value(user: Type[User], key: str, value: object, timeout: int = 3600) -> None | object: if user.is_staff or user.is_superuser: cache.set(key, value, timeout) return value @@ -41,14 +37,14 @@ def set_cached_value( return None -def web_cache(request: Request | Context, key: str, data: dict[str, Any], timeout: int): +def web_cache(request: Request | Context, key: str, data: dict[str, Any], timeout: int) -> dict[str, Any]: if not data and not timeout: - return {"data": get_cached_value(request.user, key)} + return {"data": get_cached_value(request.user, key)} # type: ignore [assignment, arg-type] if (data and not timeout) or (timeout and not data): raise BadRequest(_("both data and timeout are required")) if not 0 < int(timeout) < 216000: raise BadRequest(_("invalid timeout value, it must be between 0 and 216000 seconds")) - return {"data": set_cached_value(request.user, key, data, timeout)} + return {"data": set_cached_value(request.user, key, data, timeout)} # type: ignore [assignment, arg-type] def set_default_cache() -> None: diff --git a/core/utils/constance.py b/core/utils/constance.py deleted file mode 100644 index c1b6771e..00000000 --- a/core/utils/constance.py +++ /dev/null @@ -1,12 +0,0 @@ -from constance import config - -from evibes import settings - - -def set_email_settings(): - settings.EMAIL_HOST = config.EMAIL_HOST - settings.EMAIL_PORT = config.EMAIL_PORT - settings.EMAIL_HOST_USER = config.EMAIL_HOST_USER - settings.EMAIL_HOST_PASSWORD = config.EMAIL_HOST_PASSWORD - settings.EMAIL_USE_TLS = config.EMAIL_USE_TLS - settings.EMAIL_USE_SSL = config.EMAIL_USE_SSL diff --git a/core/utils/db.py b/core/utils/db.py index 601ee56d..476f1c08 100644 --- a/core/utils/db.py +++ b/core/utils/db.py @@ -1,5 +1,7 @@ import logging +from typing import Any, Callable +from django.db.models import Model from django.db.models.constants import LOOKUP_SEP from django_extensions.db.fields import AutoSlugField from slugify import slugify @@ -7,7 +9,7 @@ from slugify import slugify logger = logging.getLogger("django") -def unicode_slugify_function(content): +def unicode_slugify_function(content: Any) -> str: return slugify( text=str(content), allow_unicode=True, @@ -20,7 +22,7 @@ def unicode_slugify_function(content): class TweakedAutoSlugField(AutoSlugField): - def get_slug_fields(self, model_instance, lookup_value): + def get_slug_fields(self, model_instance: Model, lookup_value: str | Callable[[Any], Any]) -> str | Model: if callable(lookup_value): return f"{lookup_value(model_instance)}" @@ -29,9 +31,9 @@ class TweakedAutoSlugField(AutoSlugField): for elem in lookup_value_path: try: - attr = getattr(attr, elem) + attr: Any = getattr(attr, elem) except AttributeError: - attr = "" + attr: Any = "" if callable(attr): # noinspection PyCallingNonCallable return f"{attr()}" diff --git a/core/utils/emailing.py b/core/utils/emailing.py index 6eb1a50a..38109f87 100644 --- a/core/utils/emailing.py +++ b/core/utils/emailing.py @@ -4,22 +4,24 @@ from celery.app import shared_task from celery.utils.log import get_task_logger from constance import config from django.conf import settings -from django.core import mail from django.core.mail import EmailMessage from django.template.loader import render_to_string from django.utils.translation import activate from django.utils.translation import gettext_lazy as _ from core.models import Order, OrderProduct, PromoCode -from core.utils.constance import set_email_settings +from core.utils import get_dynamic_email_connection logger = get_task_logger(__name__) @shared_task(queue="default") -def contact_us_email(contact_info): - set_email_settings() - connection = mail.get_connection() +def contact_us_email(contact_info) -> tuple[bool, str]: + logger.debug( + "Contact us email sent to %s with subject %s", + contact_info.get("email"), + contact_info.get("subject", "Without subject"), + ) email = EmailMessage( _(f"{config.PROJECT_NAME} | contact us initiated"), @@ -36,7 +38,7 @@ def contact_us_email(contact_info): ), to=[config.EMAIL_FROM], from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" email.send() @@ -66,9 +68,6 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]: activate(language) - set_email_settings() - connection = mail.get_connection() - if not order.is_whole_digital: email = EmailMessage( _(f"{config.PROJECT_NAME} | order confirmation"), @@ -83,7 +82,7 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]: ), to=[recipient], from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" email.send() @@ -93,7 +92,7 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]: @shared_task(queue="default") def send_order_finished_email(order_pk: str) -> tuple[bool, str]: - def send_digital_assets_email(ops: list[OrderProduct]): + def send_digital_assets_email(ops: list[OrderProduct]) -> None: if len(ops) <= 0: return @@ -102,9 +101,6 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]: activate(order.user.language) - set_email_settings() - connection = mail.get_connection() - email = EmailMessage( _(f"{config.PROJECT_NAME} | order delivered"), render_to_string( @@ -122,21 +118,19 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]: ), to=[order.user.email], from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" result = email.send() logger.debug("Order %s: Tried to send email to %s, resulted with %s", order.pk, order.user.email, result) - def send_thank_you_email(ops: list[OrderProduct]): + def send_thank_you_email(ops: list[OrderProduct]) -> None: if ops: pass if not order.user: return activate(order.user.language) - set_email_settings() - pass try: @@ -190,9 +184,6 @@ def send_promocode_created_email(promocode_pk: str) -> tuple[bool, str]: activate(promocode.user.language) - set_email_settings() - connection = mail.get_connection() - email = EmailMessage( _(f"{config.PROJECT_NAME} | promocode granted"), render_to_string( @@ -208,7 +199,7 @@ def send_promocode_created_email(promocode_pk: str) -> tuple[bool, str]: ), to=[promocode.user.email], from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" result = email.send() diff --git a/core/utils/languages.py b/core/utils/languages.py index 8ab2d840..797b67c1 100644 --- a/core/utils/languages.py +++ b/core/utils/languages.py @@ -1,5 +1,5 @@ from constance import config -def get_flag_by_language(language): +def get_flag_by_language(language: str) -> str: return f"https://api.{config.BASE_DOMAIN}/static/flags/{language}.png" diff --git a/core/validators.py b/core/validators.py index 409c6496..b32d660d 100644 --- a/core/validators.py +++ b/core/validators.py @@ -3,12 +3,14 @@ from django.core.files.images import ImageFile, get_image_dimensions from django.utils.translation import gettext_lazy as _ -def validate_category_image_dimensions(image: ImageFile) -> None: - max_width = 99999 - max_height = 99999 +def validate_category_image_dimensions( + image: ImageFile, max_width: int | None = None, max_height: int | None = None +) -> None: + max_width = max_width or 7680 + max_height = max_height or 4320 if image: - width, height = get_image_dimensions(image.file) + width, height = get_image_dimensions(image.file) # type: ignore [arg-type] - if width > max_width or height > max_height: + if int(width) > max_width or int(height) > max_height: # type: ignore [arg-type] raise ValidationError(_(f"image dimensions should not exceed w{max_width} x h{max_height} pixels")) diff --git a/core/vendors/__init__.py b/core/vendors/__init__.py index f2c7cde2..da68d537 100644 --- a/core/vendors/__init__.py +++ b/core/vendors/__init__.py @@ -231,12 +231,12 @@ class AbstractVendor: def resolve_price_with_currency(self, price: float | int | Decimal, provider: str, currency: str = "") -> float: rates = get_rates(provider) - rate = rates.get(currency or self.currency) + rate = rates.get(currency or self.currency) if rates else 1 if not rate: raise RatesError(f"No rate found for {currency or self.currency} in {rates} with probider {provider}...") - return float(round(price / rate, 2)) if rate else float(round(price, 2)) # type: ignore [arg-type] + return float(round(price / rate, 2)) if rate else float(round(price, 2)) # type: ignore [arg-type, operator] @staticmethod def round_price_marketologically(price: float) -> float: @@ -339,9 +339,9 @@ class AbstractVendor: Product.objects.filter(pk__in=batch_ids).delete() def delete_belongings(self) -> None: - self.get_products_queryset().delete() # type: ignore [union-attr] - self.get_stocks_queryset().delete() # type: ignore [union-attr] - self.get_attribute_values_queryset().delete() # type: ignore [union-attr] + self.get_products_queryset().delete() + self.get_stocks_queryset().delete() + self.get_attribute_values_queryset().delete() def get_or_create_attribute_safe(self, *, name: str, attr_group: AttributeGroup) -> Attribute: key = name[:255] @@ -393,11 +393,11 @@ class AbstractVendor: attribute = Attribute.objects.filter(name=key, group=attr_group).order_by("uuid").first() # type: ignore [assignment] attribute.is_active = True attribute.value_type = attr_value_type - attribute.save() # type: ignore [no-untyped-call] + attribute.save() except IntegrityError: return - attribute.save() # type: ignore [no-untyped-call] + attribute.save() if not is_created: return diff --git a/core/views.py b/core/views.py index 6cce9afb..68396451 100644 --- a/core/views.py +++ b/core/views.py @@ -8,7 +8,7 @@ from django.contrib.sitemaps.views import index as _sitemap_index_view from django.contrib.sitemaps.views import sitemap as _sitemap_detail_view from django.core.cache import cache from django.core.exceptions import BadRequest -from django.http import FileResponse, Http404, JsonResponse, HttpRequest, HttpResponseRedirect +from django.http import FileResponse, Http404, HttpRequest, HttpResponse, HttpResponseRedirect, JsonResponse from django.shortcuts import redirect from django.utils.decorators import method_decorator from django.utils.http import urlsafe_base64_decode @@ -181,9 +181,9 @@ class CacheOperatorView(APIView): return Response( data=web_cache( request, - request.data.get("key"), - request.data.get("data"), - request.data.get("timeout"), + request.data.get("key"), # type: ignore [arg-type] + request.data.get("data", {}), + request.data.get("timeout"), # type: ignore [arg-type] ), status=status.HTTP_200_OK, ) @@ -205,7 +205,7 @@ class ContactUsView(APIView): def post(self, request: Request, *args, **kwargs) -> Response: serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) - contact_us_email.delay(serializer.validated_data) + contact_us_email.delay(serializer.validated_data) # type: ignore [attr-defined] return Response(data=serializer.data, status=status.HTTP_200_OK) @@ -227,7 +227,7 @@ class RequestCursedURLView(APIView): @method_decorator(ratelimit(key="ip", rate="10/h")) def post(self, request: Request, *args, **kwargs) -> Response: url = request.data.get("url") - if not is_url_safe(url): + if not is_url_safe(str(url)): return Response( data={"error": _("only URLs starting with http(s):// are allowed")}, status=status.HTTP_400_BAD_REQUEST, @@ -235,7 +235,7 @@ class RequestCursedURLView(APIView): try: data = cache.get(url, None) if not data: - response = requests.get(url, headers={"content-type": "application/json"}) + response = requests.get(str(url), headers={"content-type": "application/json"}) response.raise_for_status() data = camelize(response.json()) cache.set(url, data, 86400) @@ -317,7 +317,10 @@ def download_digital_asset_view(request: HttpRequest, *args, **kwargs) -> FileRe download.num_downloads += 1 download.save() - file_path = download.order_product.product.stocks.first().digital_asset.path + if not download.order_product.product: + raise BadRequest(_("the order product does not have a product")) + + file_path = download.order_product.product.stocks.first().digital_asset.path # type: ignore [union-attr] content_type, encoding = mimetypes.guess_type(file_path) if not content_type: @@ -357,7 +360,7 @@ download_digital_asset_view.__doc__ = _( # type: ignore [assignment] ) -def favicon_view(request: HttpRequest, *args, **kwargs) -> FileResponse | Http404: +def favicon_view(request: HttpRequest, *args, **kwargs) -> HttpResponse | FileResponse: try: favicon_path = os.path.join(settings.BASE_DIR, "static/favicon.png") return FileResponse(open(favicon_path, "rb"), content_type="image/x-icon") @@ -373,7 +376,7 @@ favicon_view.__doc__ = _( # type: ignore [assignment] ) -def index(request: HttpRequest, *args, **kwargs) -> HttpResponseRedirect: +def index(request: HttpRequest, *args, **kwargs) -> HttpResponse | HttpResponseRedirect: return redirect("admin:index") diff --git a/core/viewsets.py b/core/viewsets.py index 01f88f9c..1fb12e6b 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -1,5 +1,6 @@ import logging import uuid +from typing import Type from uuid import UUID from constance import config @@ -20,6 +21,7 @@ from rest_framework.permissions import AllowAny from rest_framework.renderers import MultiPartRenderer from rest_framework.request import Request from rest_framework.response import Response +from rest_framework.serializers import Serializer from rest_framework.viewsets import ModelViewSet from rest_framework_xml.renderers import XMLRenderer from rest_framework_yaml.renderers import YAMLRenderer @@ -132,13 +134,14 @@ class EvibesViewSet(ModelViewSet): "permissions, and rendering formats." ) - action_serializer_classes: dict = {} - additional: dict = {} + action_serializer_classes: dict[str, Type[Serializer]] = {} + additional: dict[str, str] = {} permission_classes = [EvibesPermission] renderer_classes = [CamelCaseJSONRenderer, MultiPartRenderer, XMLRenderer, YAMLRenderer] - def get_serializer_class(self): - return self.action_serializer_classes.get(self.action, super().get_serializer_class()) + def get_serializer_class(self) -> Type[Serializer]: + # noinspection PyTypeChecker + return self.action_serializer_classes.get(self.action, super().get_serializer_class()) # type: ignore [arg-type] @extend_schema_view(**ATTRIBUTE_GROUP_SCHEMA) @@ -587,6 +590,7 @@ class FeedbackViewSet(EvibesViewSet): return qs.filter(is_active=True) +# noinspection PyUnusedLocal @extend_schema_view(**ORDER_SCHEMA) class OrderViewSet(EvibesViewSet): __doc__ = _( @@ -659,9 +663,12 @@ class OrderViewSet(EvibesViewSet): def buy(self, request: Request, *args, **kwargs) -> Response: serializer = BuyOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) - lookup_val = kwargs.get(self.lookup_field) + order = self.get_object() + if not request.user or request.user.is_anonymous: + return Response( + status=status.HTTP_401_UNAUTHORIZED, + ) try: - order = Order.objects.get(user=request.user, uuid=lookup_val) instance = order.buy( force_balance=serializer.validated_data.get("force_balance"), force_payment=serializer.validated_data.get("force_payment"), @@ -709,9 +716,8 @@ class OrderViewSet(EvibesViewSet): def add_order_product(self, request: Request, *args, **kwargs) -> Response: serializer = AddOrderProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) - lookup_val = kwargs.get(self.lookup_field) + order = self.get_object() try: - order = Order.objects.get(uuid=lookup_val) if not (request.user.has_perm("core.add_orderproduct") or request.user == order.user): raise PermissionDenied(permission_denied_message) @@ -727,9 +733,8 @@ class OrderViewSet(EvibesViewSet): def remove_order_product(self, request: Request, *args, **kwargs) -> Response: serializer = RemoveOrderProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) - lookup_val = kwargs.get(self.lookup_field) + order = self.get_object() try: - order = Order.objects.get(uuid=lookup_val) if not (request.user.has_perm("core.delete_orderproduct") or request.user == order.user): raise PermissionDenied(permission_denied_message) @@ -762,9 +767,8 @@ class OrderViewSet(EvibesViewSet): def bulk_remove_order_products(self, request: Request, *args, **kwargs) -> Response: serializer = BulkRemoveOrderProductsSerializer(data=request.data) serializer.is_valid(raise_exception=True) - lookup_val = kwargs.get(self.lookup_field) + order = self.get_object() try: - order = Order.objects.get(uuid=lookup_val) if not (request.user.has_perm("core.delete_orderproduct") or request.user == order.user): raise PermissionDenied(permission_denied_message) @@ -776,6 +780,7 @@ class OrderViewSet(EvibesViewSet): return Response(status=status.HTTP_404_NOT_FOUND) +# noinspection PyUnusedLocal @extend_schema_view(**ORDER_PRODUCT_SCHEMA) class OrderProductViewSet(EvibesViewSet): __doc__ = _( @@ -810,7 +815,9 @@ class OrderProductViewSet(EvibesViewSet): serializer = self.get_serializer(request.data) serializer.is_valid(raise_exception=True) try: - order_product = OrderProduct.objects.get(uuid=kwargs.get("pk")) + order_product = OrderProduct.objects.get(uuid=str(kwargs.get("pk"))) + if not order_product.order: + return Response(status=status.HTTP_404_NOT_FOUND) if not (request.user.has_perm("core.change_orderproduct") or request.user == order_product.order.user): raise PermissionDenied(permission_denied_message) feedback = order_product.do_feedback( @@ -934,7 +941,7 @@ class WishlistViewSet(EvibesViewSet): serializer = AddWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: - wishlist = Wishlist.objects.get(uuid=kwargs.get("pk")) + wishlist = self.get_object() if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user): raise PermissionDenied(permission_denied_message) @@ -952,7 +959,7 @@ class WishlistViewSet(EvibesViewSet): serializer = RemoveWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: - wishlist = Wishlist.objects.get(uuid=kwargs.get("pk")) + wishlist = self.get_object() if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user): raise PermissionDenied(permission_denied_message) @@ -970,7 +977,7 @@ class WishlistViewSet(EvibesViewSet): serializer = BulkAddWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: - wishlist = Wishlist.objects.get(uuid=kwargs.get("pk")) + wishlist = self.get_object() if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user): raise PermissionDenied(permission_denied_message) @@ -988,7 +995,7 @@ class WishlistViewSet(EvibesViewSet): serializer = BulkRemoveWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: - wishlist = Wishlist.objects.get(uuid=kwargs.get("pk")) + wishlist = self.get_object() if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user): raise PermissionDenied(permission_denied_message) @@ -1035,7 +1042,7 @@ class AddressViewSet(EvibesViewSet): def retrieve(self, request: Request, *args, **kwargs) -> Response: try: - address = Address.objects.get(uuid=kwargs.get("pk")) + address = Address.objects.get(uuid=str(kwargs.get("pk"))) return Response(status=status.HTTP_200_OK, data=self.get_serializer(address).data) except Address.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) @@ -1064,9 +1071,9 @@ class AddressViewSet(EvibesViewSet): try: suggestions = fetch_address_suggestions(query=q, limit=limit) - serializer = AddressSuggestionSerializer(suggestions, many=True) + suggestion_serializer = AddressSuggestionSerializer(suggestions, many=True) return Response( - serializer.data, + suggestion_serializer.data, status=status.HTTP_200_OK, ) except Exception as e: diff --git a/core/widgets.py b/core/widgets.py index 6d673d8e..f2359f48 100644 --- a/core/widgets.py +++ b/core/widgets.py @@ -1,14 +1,17 @@ import json -from typing import Any +from typing import Any, Mapping from django import forms -from django.forms.renderers import DjangoTemplates +from django.core.files.uploadedfile import UploadedFile +from django.forms.renderers import BaseRenderer +from django.utils.datastructures import MultiValueDict +from django.utils.safestring import SafeString class JSONTableWidget(forms.Widget): template_name = "json_table_widget.html" - def format_value(self, value: str | dict[str, Any]): + def format_value(self, value: str | dict[str, Any]) -> str | dict[str, Any]: # type: ignore [override] if isinstance(value, dict): return value try: @@ -19,18 +22,23 @@ class JSONTableWidget(forms.Widget): return value def render( - self, name: str, value: str | dict[str, Any], attrs: dict | None = None, renderer: DjangoTemplates | None = None - ): + self, + name: str, + value: str | dict[str, Any], + attrs: dict[str, Any] | None = None, + renderer: BaseRenderer | None = None, + ) -> SafeString: value = self.format_value(value) return super().render(name, value, attrs, renderer) - # noinspection PyUnresolvedReferences - def value_from_datadict(self, data: dict[str, Any], files: list, name: str): + def value_from_datadict( + self, data: Mapping[str, Any], files: MultiValueDict[str, UploadedFile], name: str + ) -> str | None: json_data = {} try: - keys = data.getlist(f"{name}_key") - values = data.getlist(f"{name}_value") + keys = data.getlist(f"{name}_key") # type: ignore [attr-defined] + values = data.getlist(f"{name}_value") # type: ignore [attr-defined] for key, value in zip(keys, values, strict=True): if key.strip(): try: diff --git a/evibes/ftpstorage.py b/evibes/ftpstorage.py index 4e3ebc39..a0e736ff 100644 --- a/evibes/ftpstorage.py +++ b/evibes/ftpstorage.py @@ -1,3 +1,4 @@ +from typing import Any from urllib.parse import urlparse from storages.backends.ftp import FTPStorage @@ -7,7 +8,7 @@ class AbsoluteFTPStorage(FTPStorage): # type: ignore # noinspection PyProtectedMember # noinspection PyUnresolvedReferences - def _get_config(self): + def _get_config(self) -> Any: cfg = super()._get_config() url = urlparse(self.location) cfg["path"] = url.path or cfg["path"] diff --git a/evibes/locale/ar_AR/LC_MESSAGES/django.mo b/evibes/locale/ar_AR/LC_MESSAGES/django.mo index d6790b56cd582dfed01ba140491df0ab68204e84..ffaeaeec588a7fb71d080f8ffd8b85bd13b46403 100644 GIT binary patch delta 936 zcmXxiu}_mh7{~FmEp1h*1x2NW^1ii2T&#;m*=#j9(6=$^00{$|U5v08SZHFHjGc^= zx)=>folNagga3eWFeappvA8+7VN4iI<2>&E}lXFd@fBv`;0<9SqNiq2(JHP=vyf8nJf_E8D?aVpLF z=B7IM5cS|KW^otO_|uL5;T6U+WT)o=>iIeruz}OKi%R4>Y6AyuUggv}8B}GeSXU`( zbgttTma&amAWS)CaTfKw?A%5z_z`tye!Fp;bJP3{)WS7XB9Gj-ffpFRz$N@JO8vFt z1aGsZ$)k?qsio3> zonM}&-3~*Us=PTj5yDF}T{c}*#T+eVdxJ}=^6R#9QudO0sL&=A+N3ICeBZxa@q$Xc j>Xq)^3Ks6PR>O;tB-6d^?vB@Oc00W%-S@3`vCWYq&o)iO delta 885 zcmYk*J1oOd6vy#fS}p2T&$gcRTs#(yMI<7oibNzN3@j31VlhY>Oihgp2AhS5h)xm_ zlffV%!XRm4uvHAiD89ejJGk-h=brn&?LGhVKb|8;kz_XH-8YPGu12nDk1>O|Tfhfn zq0pF0T*NwD!yZgw2VP(qzM%HKV-@~j7z5t?{TS8~51{sqV~sIMGsC2Ug;fmVCYE3d z`7?Wb=nDr}jVI1)EGK@%7JS2c^!W1o!q`mQ>r9{$SivZ6VTkk1A(K)T&aoJ;P)~I0 z;wKkpv5oZ{D#7w1WBeFKRi@23g!5E!5=U7-Ws?&7L{-)w$UBVnoNv~d#4wG@?99b? z*hl=~;zqL5{SoZPIc&l-DuH8E;x}&n9(7<2Rk;{hs{(P1V*-;COm>(kfd}luZ?_>z zS+sEqbzlnBBbP3Ib{6s8bZ{J%$e4@guz`3PXK@=\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "رقم هاتف الشركة" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!لا تغير" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "مضيف SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "منفذ SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "استخدام TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "استخدام SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "اسم مستخدم SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "كلمة مرور SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "عنوان مرسل البريد الإلكتروني" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "عنوان URL لبوابة الدفع" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "الرمز المميز لبوابة الدفع" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "الحد الأدنى لمبلغ بوابة الدفع" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "الحد الأقصى لمبلغ بوابة الدفع" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "مفتاح API لسعر الصرف" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "عنوان URL لواجهة برمجة تطبيقات OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "مفتاح واجهة برمجة تطبيقات OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "مفتاح واجهة برمجة التطبيقات المجردة" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "وكيل HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "تعطيل وظيفة الشراء" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "كيان لتخزين بيانات الإعلانات" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "كيان لتخزين بيانات التحليلات" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "حفظ الاستجابات من واجهات برمجة تطبيقات البائعين" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "الخيارات العامة" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "خيارات البريد الإلكتروني" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "خيارات بوابة الدفع" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "خيارات الميزات" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "خيارات تحسين محركات البحث" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "خيارات التصحيح" diff --git a/evibes/locale/cs_CZ/LC_MESSAGES/django.mo b/evibes/locale/cs_CZ/LC_MESSAGES/django.mo index 2ca0a26d20126f0c6e9023c4fc8f9f8012b67583..90fc4e795c9fb313396f60454561378bef49847c 100644 GIT binary patch delta 932 zcmXxjJuJgP7{~FW)z(YB6!ltK>MfB-B$f^ms$rlaX(Ys86N7}LgIJm%u`mgP5Md;- zGzew^8q$U>G0Ji$AFOE~haSSc7%gh59{;)i{C7OPM(ysu)ziX9d<lCV*i>QR|n55qyQ5*ZfcGfoq9?FB=sEtgbN;Yr% zYp9HNQ6)V?9aYBmpRtzyyX||}z2?g}Ydf8En8O zY{PGBfOAnMQB=vNQ5#r6RcsrXYL1YPIko)@RAL$I#m6G*uhMy`yR1fK8nE^u6*Mih zR+@tQmAwZ#0);k^3#Ml?)8eY6?v*yA&=Dv}PA?m}6E2;ejts!??`9(rOP{)vjz6=AN2LG& delta 885 zcmYk)J4nJ&6vy#XT9&=c(z5qEg@O=*puI_G>9I7_PzW{ET3A~`lhn`J z&=P^*P&7n~;MOR8e}C`L!RzOqzgNBI-1{0mk7ho?{u3j{89j`JDzj-ks^*PY^_him z4Wqb?am?Zf-eMExQR}|36@M{?b^gldLl_~SLam#_cC(BvGil+$7B=E81~H4g?3g!w z;S}5O!uf#B?5CarcfK$#BMymF#m67Od5D_gY|fis_5C}?=Jtq zL7o>;8*HvM3t$Y@nL+0auF%DKmtV3-8-Kzv%wqz}80P;iURP<=EQZM!QI(`ot=vZ) zP0r=l*h&8A@`AJIEF;aZ5Y^~=5!42fs7}wJes>8o2_|VKU6@0)<_bsg#aTjC7@=&n zdIGh96sl9}$P(K@Ubg4*L)0C}VG=KqqV3c96QuvDw8R4$;2h|j*XAKq=pJg<0}O@E z^na*h6zo-`Ds_hxI#S&mbwbh0;N-jlIT`Qrj@kw@7utZjFzj;n\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Telefonní číslo společnosti" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NEMĚŇTE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP host" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Port SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Použití protokolu TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Použití protokolu SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Uživatelské jméno SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Heslo SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adresa odesílatele e-mailů" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Adresa URL platební brány" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token platební brány" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minimální částka platební brány" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Maximální částka platební brány" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Klíč API pro směnný kurz" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL rozhraní API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Klíč API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstraktní klíč API" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy server HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Zakázat funkci nákupu" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Subjekt pro ukládání dat inzerátů" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Subjekt pro ukládání analytických dat" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Ukládání odpovědí z rozhraní API dodavatelů" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Obecné možnosti" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Možnosti e-mailu" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Možnosti platební brány" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Možnosti funkcí" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Možnosti SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Možnosti ladění" diff --git a/evibes/locale/da_DK/LC_MESSAGES/django.mo b/evibes/locale/da_DK/LC_MESSAGES/django.mo index 2ff855215572000ae8e21650a87010dc896e2057..2d7404649db01f3f78c7cb1302b9ebd15c2ff8c2 100644 GIT binary patch delta 939 zcmXxjKWI}?6vy#n@{-i1QIpzg692r!sL!b&?UGHCpd~e_|3JaPElUe=5L_gnC=NOm zL9ksqCSy?0!6k#BI7H`GG6~`)m2U0#_q;jezEAGU?YsA!^ZIY5H{03Hc(08J7$+F_ z4wxH(e~@4@}`MYJJ=@OXD%j;sw<26`aBA$hwZT_;QpR zkMJhWDb&zi?k|Wdsb}(RnOHP=b z!FkkzJE%-o@FYHVzQyCrKcGtb-Oc}?Dj4I`$~=ck=pw3uHKaJUjH=LW_xnTasN^sB zqF%jm3%brPs11K(38Oqs2MsWXOPI$NYTZ**E7p;Z^|&aJ_sApcGitvf7I8F5{ncxa zx~qg~BpJ&(i%12-#oAcG`xQP^El?<4ifzb=pY)g zh?tCs2#Yk4urWz&!uQwS!AbA^+~@YWeV%j9?MdjnEnNz@b4H{%x;W;m%tmmpniH|) zGV|jyhHw)HFpEh%!$y2Y&3nfd{Kg1+-Ied-*v5DWHE#l2&C<5OMKd=xumN|_hgsxf z2b}c4AqMf-@d}$5KVUDuVi>DxD)S=P!+6kf8nuCS?8FQPSl{wo)N|t$>+lkl(Ty{H zbjBr&asLCg!KPX>4@OXxi8+qpB2}D4ZMeWBEqslt+!H477lW*C32!CCQS4?s>9~sR zjCWC`%sb-?q;z(V%J>}v_=DP*pDZYbb)qU0MSVYxs`MPHMJt%rge@*)4z=JpCh-=v z(=Y76Fu$(S4Ws7Gpjxnod~BPOT9rW_v3=BnM;ONfs>OFm^7i7R{%qRbxFJ80%9YEk z2NZe_^&?RZg?jowl$oAYMk==!P^hKaj4Gi}W$9cw0XkDou+LVxazdq4mdaScUaX%( p?}D;aq&U\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Virksomhedens telefonnummer" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!MÅ IKKE ÆNDRES" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP-vært" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP-port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Brug TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Brug SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP-brugernavn" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP-adgangskode" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adressen på e-mailens afsender" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL til betalingsgateway" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token til betalingsgateway" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minimumsbeløb for betalingsgateway" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Betalingsgatewayens maksimale beløb" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "API-nøgle til valutakurs" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API-nøgle" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstrakt API-nøgle" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Deaktiver købsfunktionalitet" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "En enhed til lagring af annonceringsdata" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "En enhed til lagring af analysedata" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Gem svar fra leverandørers API'er" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Generelle indstillinger" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Indstillinger for e-mail" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Muligheder for betalingsgateway" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Funktioner Indstillinger" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO-muligheder" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Indstillinger for fejlfinding" diff --git a/evibes/locale/de_DE/LC_MESSAGES/django.mo b/evibes/locale/de_DE/LC_MESSAGES/django.mo index 21ad68132ed95c5756e845ea0c1517acd151a7ef..afe01b4b1f5341394db65f0c82c68e9592448f83 100644 GIT binary patch delta 936 zcmXxjODIH99LMovW{fxE{pOD6NK#74Mhu~J<*`weos}BdSg4U~6h*SaMoNv1l8prm z*^q@~iH)*VQZ^pn-*xHI_n!a#ojc!!$3^j{yuh}hB8&>gWRfxMxa;GCiusKR z;hc3DiFWZ07G+jlN_S#TwLkomhpgbr#jY8kV!Z+2>0h2hK4A?=TG?Q60b9 z`G=kVV3^}s!M_GuF@R))bgd^YMkUycO0dHk#X9CLDuH>7>jtZQQG`3F2otDIudxJQ zum-=d0UhqD8}y^1okA_Vh+239Io0f;5Be Whuy*Gz_@d{;`a89x+g~|WBy-BOGqsM delta 885 zcmYk*JxD@P7{>8qnwFJirDdOL_5mV95Clyv4Iu>)xI`aI5H<-xLm<*5)KozY(a;tR zqH8#|w1fn0hJ#x)1})M5Io+Xy_x|oV9`AY2bFZcFPbgpS^;{a-G{*?XhRc|FJZ<4b z+i@GygS!~U9L``76IjMBd_&D^Vi3PDf^D9^@8cMvKZ}~TjQz&sO@@nZ1`ezhR`w8K>m;5J4v zhf3xgb%Q%pv{fWJ^MXpGiAwGpRhXAu$RH+g1hw-e)bBH>chI4p}nqNZ|@a`vnMfk~p{6dnmF{=PI zy@yI6%AuwL{x>DY#_d8XN(-pzkt$VQ3)@CH^W^Na=gHV)Ce5Dx&Ytx0DCP-gh+6FK pwIfxlHqD`=)Of+|KSqhEcs&xOsiyZqO{plkO2M7>RO-HU_b*TuK9T?c diff --git a/evibes/locale/de_DE/LC_MESSAGES/django.po b/evibes/locale/de_DE/LC_MESSAGES/django.po index c18834a0..a6e3ccb7 100644 --- a/evibes/locale/de_DE/LC_MESSAGES/django.po +++ b/evibes/locale/de_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Telefonnummer des Unternehmens" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NICHT ÄNDERN" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP-Host" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP-Port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Use TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Use SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP-Benutzername" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP-Kennwort" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Die Adresse des Absenders der E-Mail" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL des Zahlungsgateways" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Zahlungsgateway-Token" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Mindestbetrag für das Zahlungsgateway" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Höchstbetrag des Zahlungsgateways" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Wechselkurs-API-Schlüssel" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API Key" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstrakter API-Schlüssel" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-Proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Kauffunktionalität deaktivieren" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Eine Einheit zur Speicherung von Werbedaten" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Eine Einheit zur Speicherung von Analysedaten" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Speichern von Antworten aus den APIs von Anbietern" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Allgemeine Optionen" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "E-Mail-Optionen" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Zahlungs-Gateway-Optionen" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Merkmale Optionen" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO-Optionen" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Debugging-Optionen" diff --git a/evibes/locale/en_GB/LC_MESSAGES/django.mo b/evibes/locale/en_GB/LC_MESSAGES/django.mo index 6ec7de005ce418e4a1085051d45ab160d32e64bb..f3bbb6fa8e550e24bfe3aac7d8271ef8f5664ba1 100644 GIT binary patch delta 941 zcmYk*ODIH99LMo<8DqSkMVfc6@(#&Xj-7{hV{}G3T7$o!JOp1>-NpzFk8_Xf?Dc$CxfWNaI2+r5jU- z%hq))W4wdd^Ae~8?@$T8p%VN;CFpP(!ZEoR!Xi{MofubVh>jwhL`67{if|M4{0J4{ zrS%cDflsW)ELKs1&8P&skw<0#bs*P{r|ftZmEcM?`O`OhTomDv_0)QfBxo9FjWiYC zFYna)0F^eJDlM)JYjJHzsb~W#C89KWdtT{4e!YKv>$P|@t%a7V3OYJnlf9uIL@P~6 zDP~oKR^|1Q5!ce!t0H+Xp%AK+ri$};@7{#N;elAljRnR+{Ug2Z@ZiNv`mnDsb^G7l L9_QjUaN_&{zn@2p delta 890 zcmYk*JuE{}7{>9pTGThCC`Ek>kr;>$CIgGGNV<}UNJyF(SR^+Xq)A5xLl+A%i7q4} zVX#U>(!@|P*lZFp`aid4@TTYf?zuhmJ) zaTQx}8%HpM19**fSU|1uZ~7=}Zo_xmu)d;+y@4qMDTOL5b{gDtGZJ*>tI^0H$t z`h!z!#!Kft)-!*>9{j*I43wAF#ju\n" "Language-Team: LANGUAGE \n" @@ -42,106 +42,110 @@ msgid "Phone number of the company" msgstr "Phone number of the company" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!DO NOT CHANGE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP host" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Use TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Use SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP username" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP password" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "The address of the emails sender" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Payment gateway URL" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Payment gateway token" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Payment gateway minimum amount" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Payment gateway maximum amount" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Exchange rate API key" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API Key" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstract API Key" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP Proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Disable buy functionality" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "An entity for storing advertisiment data" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "An entity for storing analytics data" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Save responses from vendors' APIs" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "General Options" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Email Options" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Payment Gateway Options" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Features Options" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO Options" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Debugging Options" diff --git a/evibes/locale/en_US/LC_MESSAGES/django.mo b/evibes/locale/en_US/LC_MESSAGES/django.mo index 0fce29ce49df1353f52541bc3469d51ea61bbaae..5a50373803184e52997dde57aae90d72d0cd6642 100644 GIT binary patch delta 941 zcmYk*J1j#{9LMof>Z-SvdOupvvY13j3|>JO=+z&lLCC)AGL z?D)%$e=*GcEGNFfCQN1AhDxT>I)+Mf0k!d4Cdp^iybp}9zHxl<2%As~j-n<`qas{F zMYv|4@1ss|f|_@YO7H=d;5#b8A5?-4ry(5U#}F2vl4-%1IsKCU4Iz9mvu9*SB7a*V5`}i7KL_)797;`a#sw zl$2stMQ9~%FCK9@eZ4A@cM}SsN@=P%kNfUTI2`UC3Pp!}qoJ<8j%aVs*<|vdH#c$n N-`!Tv*{ko!^9L}}NN4~6 delta 890 zcmYk*J1m1y7{>9p+PYO;N>yFkx-P;ZA+cCknixnd1{R56k#3qa6@w-g34_66Az~06 zEEw6PiA5?BHnUhH{?FGlc+>O!zVr3a_dKV4h#o|9!nUAB^&0?Eb&X%}o;=v|1U>57KfV}L8 zi~isQTk+EQfQ`(bu@B!dhQ45BT^xIvk2=$+1~#w@^BCdt?Ub7k53aEe?@&8>bn}v% zmodrnFI0n#)n+vqMv7Eq0B zp*r6|{lh~fIy*xpcZ*8y3DsB$3B%qnfgh;kg6vMlQOS*BPSH(sqv)31f($CUedjr< zfk#wyuNc7}RB|Ccm0OFU8cw?Tn43?blAA+bw$6pkTc)1;b(3`u_K@Vf#VJ(jd#GI| z7%DaPztjjD^pex=l!Qu+DJ>S1tl-Uc`s?+6BMjXPILpp((>=IV5ap&cnM)i6Ux mqv8wh{bD*$o6wOcO_k1DrBsw$G4D?Yio5\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Phone number of the company" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!DO NOT CHANGE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP host" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Use TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Use SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP username" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP password" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "The address of the emails sender" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Payment gateway URL" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Payment gateway token" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Payment gateway minimum amount" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Payment gateway maximum amount" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Exchange rate API key" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API Key" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstract API Key" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP Proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Disable buy functionality" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "An entity for storing advertisiment data" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "An entity for storing analytics data" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Save responses from vendors' APIs" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "General Options" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Email Options" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Payment Gateway Options" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Features Options" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO Options" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Debugging Options" diff --git a/evibes/locale/es_ES/LC_MESSAGES/django.mo b/evibes/locale/es_ES/LC_MESSAGES/django.mo index 80ceb8efcc7e2be35762a7a4929dfcb3eaf6872a..57d145b69a733b20535395b398cf8c39b582032f 100644 GIT binary patch delta 933 zcmXxjJxo(k7{>8eTFX_ed6>N>&cLqFY9cQ2Hrz z7tHSAb_)+;C1TcrW#>ywP~SxTriO#~4dZx<>K}`mbz%~4;3(?*JoeyIq+i7rdFiHM z729zguiy?|#v1am_dGQ4N4$o0X9KTN|BJV<o|f9)LroSwFVx-+xXDAh?;l<)3}Eku#P&qBV-8sjXJUuRAxOM+E_Q<#j!T>&v#a$ zfvnmxYJjqH4as10k^xk3znX*U2o%c5dC(eo$CCC zDB9(D=!}%+LD!%^#4tsdO&3+6Y$-zu?w{SHC^MW)^OE_f&@n2sS!KY2Ab3>t!=m@h f&(CDT>8brvq!5kM92Wh2_DSyX)a?G-)_0NrO+H4* delta 885 zcmYk)y)Q#i7{~FaT2#HZXchHZF9T8uiG--#3I3BVPYYXG&aJ>AmJYnLorFD zF^O4-G^B~aCb4xg`2KFs;7RZO+;i^jInQ~{If{KmbEQb&)QAzTZmvb2*)$$kaU)j! zW-YjeQQX2&Jj5j4U?aYvzWc&3mNAaOK;``aw$o0bzMIE3vz#sQ&`ifBHsBtH@DTag z2{--W3|sNiS->XR&)AEf7(-um<-0ic&>nYYPzh{c7w%((`R#&-dOGr0hxe!zJ-YUb zYnQN}{%=%*O*Lk<7)Mp6-#LTJR56Q6_==A@@Bt^Vh+`NG@}Bu^ngJ)9gZ93N8n}$Z7-lp% zgPM2+2XGfP;5ll`u93f30ku_6sEQU*3;V(;{6&5?$xDi8bM@3;1ElGYS)_7anKh9@ z=TPUPk4vFF{U2I6h42oYR;O_kN\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Número de teléfono de la empresa" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NO CAMBIES" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Host SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Puerto SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Utilizar TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Utilizar SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nombre de usuario SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Contraseña SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Dirección del remitente del correo electrónico" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL de la pasarela de pago" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token de pasarela de pago" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Importe mínimo de la pasarela de pago" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Importe máximo de la pasarela de pago" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Clave API de tipo de cambio" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL de la API Nominatim de OpenStreetMap" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Clave API de OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Clave API abstracta" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Desactivar la función de compra" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Una entidad para almacenar datos publicitarios" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Una entidad para almacenar datos analíticos" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Guardar las respuestas de las API de los proveedores" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opciones generales" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opciones de correo electrónico" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opciones de pasarela de pago" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Características Opciones" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opciones SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opciones de depuración" diff --git a/evibes/locale/fa_IR/LC_MESSAGES/django.po b/evibes/locale/fa_IR/LC_MESSAGES/django.po index 29989c32..4feadbd3 100644 --- a/evibes/locale/fa_IR/LC_MESSAGES/django.po +++ b/evibes/locale/fa_IR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,106 +41,110 @@ msgid "Phone number of the company" msgstr "" #: evibes/settings/constance.py:28 -msgid "SMTP host" +msgid "!!!DO NOT CHANGE" msgstr "" #: evibes/settings/constance.py:29 -msgid "SMTP port" +msgid "SMTP host" msgstr "" #: evibes/settings/constance.py:30 -msgid "Use TLS (0=No, 1=Yes)" +msgid "SMTP port" msgstr "" #: evibes/settings/constance.py:31 -msgid "Use SSL (0=No, 1=Yes)" +msgid "Use TLS (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:32 -msgid "SMTP username" +msgid "Use SSL (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:33 -msgid "SMTP password" +msgid "SMTP username" msgstr "" #: evibes/settings/constance.py:34 -msgid "Mail from option" +msgid "SMTP password" msgstr "" #: evibes/settings/constance.py:35 -msgid "Payment gateway URL" +msgid "Mail from option" msgstr "" #: evibes/settings/constance.py:36 -msgid "Payment gateway token" +msgid "Payment gateway URL" msgstr "" #: evibes/settings/constance.py:37 -msgid "Payment gateway minimum amount" +msgid "Payment gateway token" msgstr "" #: evibes/settings/constance.py:38 -msgid "Payment gateway maximum amount" +msgid "Payment gateway minimum amount" msgstr "" #: evibes/settings/constance.py:39 -msgid "Exchange rate API key" +msgid "Payment gateway maximum amount" msgstr "" #: evibes/settings/constance.py:40 -msgid "OpenStreetMap Nominatim API URL" +msgid "Exchange rate API key" msgstr "" #: evibes/settings/constance.py:41 -msgid "OpenAI API Key" +msgid "OpenStreetMap Nominatim API URL" msgstr "" #: evibes/settings/constance.py:42 -msgid "Abstract API Key" +msgid "OpenAI API Key" msgstr "" #: evibes/settings/constance.py:43 -msgid "HTTP Proxy" +msgid "Abstract API Key" msgstr "" #: evibes/settings/constance.py:44 -msgid "Disable buy functionality" +msgid "HTTP Proxy" msgstr "" #: evibes/settings/constance.py:45 -msgid "An entity for storing advertisiment data" +msgid "Disable buy functionality" msgstr "" #: evibes/settings/constance.py:46 -msgid "An entity for storing analytics data" +msgid "An entity for storing advertisiment data" msgstr "" #: evibes/settings/constance.py:47 +msgid "An entity for storing analytics data" +msgstr "" + +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "" diff --git a/evibes/locale/fr_FR/LC_MESSAGES/django.mo b/evibes/locale/fr_FR/LC_MESSAGES/django.mo index ba9710eecf8c237a7c54476c564497498b188726..1aca40096aa5adac3a7bd6507b958c05fbd5b9ca 100644 GIT binary patch delta 937 zcmXxjJ4jswG3UyX&}3xh~}HbOuPlD0^voPl*L!d=YA zpO}j&Ce(2IXz8D2Xdu#o3xti#MK7R7qhygsbOm~$DGzz$Ziz8%piW#BjF;SJ{C zUsT3V?)k+%zoE}~LFgmF?-=H}4^^2#=Nzh<2~;KiFiGn?pc4F#-K=l9*=C*Ck6JK+ zdeJ7TG6&d?I<<0z_vaa0ADPzkPL4{o65onlf8UeQqrZ?O>{ zQ459nwuf!lj$_U>R07AS#4b?@{BwpVBVF@RJ8wr`Y5k~;MX?L#^QgZv+haf;I*(90 zNFf!pdRhZb!Tn0#10|?XBA>zZ^v<-HO0DW?g9^P*$#8n<(47eB{B`TKcoR*#`HV_B zRWwyZp&vvGO_kC`RkYHya|QR$YG^tVP9}ZHJXGks6{?CVV7~7UPk6D3>{)LpIuIKj ZIa>&f2TK@^jd+s-Gj4SH>?C{_cn5p5ND}}6 delta 885 zcmYk*%PT}-7{~F483yAzj4|%UWhlx$8w({R%0}5Jmjw$-Y;0swHd8jl!h)=&hy@E_ zIglSYSXEEF+zB z$;42heW?9W&7shm{tva7M!1PprQW09Rc_y~EnHM^X64-4vodb;*4vEx&YiSIs;br- tQbnp(EmOM`aSknkf(`EeF(s%Xv~=o{LRBl&1#P;sHQ%uR>?QEz`vs!7J@)_r diff --git a/evibes/locale/fr_FR/LC_MESSAGES/django.po b/evibes/locale/fr_FR/LC_MESSAGES/django.po index 00815861..1a4e65c5 100644 --- a/evibes/locale/fr_FR/LC_MESSAGES/django.po +++ b/evibes/locale/fr_FR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Numéro de téléphone de l'entreprise" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NE PAS CHANGER" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Hôte SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Utiliser TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Use SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nom d'utilisateur SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Mot de passe SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "L'adresse de l'expéditeur du courrier électronique" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL de la passerelle de paiement" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Jeton de passerelle de paiement" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Montant minimum de la passerelle de paiement" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Montant maximum de la passerelle de paiement" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Clé API pour le taux de change" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL de l'API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API Key" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Clé API abstraite" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP Proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Désactiver la fonctionnalité d'achat" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Une entité pour stocker des données publicitaires" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Une entité pour stocker des données analytiques" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Sauvegarder les réponses des API des fournisseurs" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Options générales" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Options de courrier électronique" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Options de passerelle de paiement" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Caractéristiques Options" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Options de référencement" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Options de débogage" diff --git a/evibes/locale/he_IL/LC_MESSAGES/django.mo b/evibes/locale/he_IL/LC_MESSAGES/django.mo index 0833f9a23aabf7f96331ab5e9537460a0c3a002e..7b018d3906ae07f93d8ad972490f7264cb504a48 100644 GIT binary patch delta 940 zcmXxjy=zlZ7{~ErnkK0+eT_*qZB1&_NJ>RYmykgli&aX3(528JgP=iZm?#|OxB z74wLjFcVL30N3ywzQeQFK>o~EKJ?;mID#$f5A0`rh?mgQ%c3}mdM<+#n75Wt3B1A> z>zhy93^VZ^gSdlzxQEL4ryc*Xerur^PU3x3VkNwZH9KyhTKX5SV1%|^!z`-Ohp5gyMJ@Ewx^BP!j8n{S z1?fMmeKA)JvWSDv!qROQAEcQ=Hoi%;ui9= z9Zq^-4@>dLd4Ywr@39WwFoM3UzvrS@OS{uKib`M+t8fEDjBoo~AwZ=>I|`SQs!1ViZ-G2Il}yQ^heO~pPhkh5@mer;i3YEu^DGDfty%~ zXV`>yScBiF0ZYkN?KTYI2&(i`$k?`wy|{*|@FA*#=cw^+F{yz*xQJnxX(_{g?8bT5 z-bI!2665%aEf}C|tf3`P6&pegH13>p_gAok{!JuzOCg`IbRP9r#y51xC!}&-nU#=2 z`%oXP=TIn-|Dl=dqk3Pn(;iarDR1AfExb^rSUGR)RUK6{ZVQ}UXsuN4M%Pw`S`N)j p8%?2EYga4S;NCw*rDRFHN@yc0v^)w5>#coiBXiWBdJhize*rFiK3V_( diff --git a/evibes/locale/he_IL/LC_MESSAGES/django.po b/evibes/locale/he_IL/LC_MESSAGES/django.po index a61d7c0b..260c02ce 100644 --- a/evibes/locale/he_IL/LC_MESSAGES/django.po +++ b/evibes/locale/he_IL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "מספר הטלפון של החברה" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!אין לשנות" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "מארח SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "יציאת SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "השתמש ב-TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "השתמש ב-SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "שם משתמש SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "סיסמת SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "כתובת השולח של הודעות הדוא\"ל" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "כתובת URL של שער התשלומים" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "אסימון שער תשלום" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "סכום מינימום לשער תשלום" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "סכום מקסימלי בשער התשלומים" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "מפתח API לשער החליפין" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "כתובת ה-API של OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "מפתח API של OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "מפתח API מופשט" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "פרוקסי HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "השבת פונקציונליות הרכישה" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "ישות לאחסון נתוני פרסום" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "ישות לאחסון נתוני ניתוח" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "שמור תגובות מ-API של ספקים" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "אפשרויות כלליות" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "אפשרויות דוא\"ל" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "אפשרויות שער תשלום" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "אפשרויות תכונות" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "אפשרויות SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "אפשרויות ניפוי באגים" diff --git a/evibes/locale/hi_IN/LC_MESSAGES/django.po b/evibes/locale/hi_IN/LC_MESSAGES/django.po index 7cd20519..1ebb926e 100644 --- a/evibes/locale/hi_IN/LC_MESSAGES/django.po +++ b/evibes/locale/hi_IN/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -41,106 +41,110 @@ msgid "Phone number of the company" msgstr "" #: evibes/settings/constance.py:28 -msgid "SMTP host" +msgid "!!!DO NOT CHANGE" msgstr "" #: evibes/settings/constance.py:29 -msgid "SMTP port" +msgid "SMTP host" msgstr "" #: evibes/settings/constance.py:30 -msgid "Use TLS (0=No, 1=Yes)" +msgid "SMTP port" msgstr "" #: evibes/settings/constance.py:31 -msgid "Use SSL (0=No, 1=Yes)" +msgid "Use TLS (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:32 -msgid "SMTP username" +msgid "Use SSL (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:33 -msgid "SMTP password" +msgid "SMTP username" msgstr "" #: evibes/settings/constance.py:34 -msgid "Mail from option" +msgid "SMTP password" msgstr "" #: evibes/settings/constance.py:35 -msgid "Payment gateway URL" +msgid "Mail from option" msgstr "" #: evibes/settings/constance.py:36 -msgid "Payment gateway token" +msgid "Payment gateway URL" msgstr "" #: evibes/settings/constance.py:37 -msgid "Payment gateway minimum amount" +msgid "Payment gateway token" msgstr "" #: evibes/settings/constance.py:38 -msgid "Payment gateway maximum amount" +msgid "Payment gateway minimum amount" msgstr "" #: evibes/settings/constance.py:39 -msgid "Exchange rate API key" +msgid "Payment gateway maximum amount" msgstr "" #: evibes/settings/constance.py:40 -msgid "OpenStreetMap Nominatim API URL" +msgid "Exchange rate API key" msgstr "" #: evibes/settings/constance.py:41 -msgid "OpenAI API Key" +msgid "OpenStreetMap Nominatim API URL" msgstr "" #: evibes/settings/constance.py:42 -msgid "Abstract API Key" +msgid "OpenAI API Key" msgstr "" #: evibes/settings/constance.py:43 -msgid "HTTP Proxy" +msgid "Abstract API Key" msgstr "" #: evibes/settings/constance.py:44 -msgid "Disable buy functionality" +msgid "HTTP Proxy" msgstr "" #: evibes/settings/constance.py:45 -msgid "An entity for storing advertisiment data" +msgid "Disable buy functionality" msgstr "" #: evibes/settings/constance.py:46 -msgid "An entity for storing analytics data" +msgid "An entity for storing advertisiment data" msgstr "" #: evibes/settings/constance.py:47 +msgid "An entity for storing analytics data" +msgstr "" + +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "" diff --git a/evibes/locale/hr_HR/LC_MESSAGES/django.po b/evibes/locale/hr_HR/LC_MESSAGES/django.po index 29989c32..4feadbd3 100644 --- a/evibes/locale/hr_HR/LC_MESSAGES/django.po +++ b/evibes/locale/hr_HR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,106 +41,110 @@ msgid "Phone number of the company" msgstr "" #: evibes/settings/constance.py:28 -msgid "SMTP host" +msgid "!!!DO NOT CHANGE" msgstr "" #: evibes/settings/constance.py:29 -msgid "SMTP port" +msgid "SMTP host" msgstr "" #: evibes/settings/constance.py:30 -msgid "Use TLS (0=No, 1=Yes)" +msgid "SMTP port" msgstr "" #: evibes/settings/constance.py:31 -msgid "Use SSL (0=No, 1=Yes)" +msgid "Use TLS (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:32 -msgid "SMTP username" +msgid "Use SSL (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:33 -msgid "SMTP password" +msgid "SMTP username" msgstr "" #: evibes/settings/constance.py:34 -msgid "Mail from option" +msgid "SMTP password" msgstr "" #: evibes/settings/constance.py:35 -msgid "Payment gateway URL" +msgid "Mail from option" msgstr "" #: evibes/settings/constance.py:36 -msgid "Payment gateway token" +msgid "Payment gateway URL" msgstr "" #: evibes/settings/constance.py:37 -msgid "Payment gateway minimum amount" +msgid "Payment gateway token" msgstr "" #: evibes/settings/constance.py:38 -msgid "Payment gateway maximum amount" +msgid "Payment gateway minimum amount" msgstr "" #: evibes/settings/constance.py:39 -msgid "Exchange rate API key" +msgid "Payment gateway maximum amount" msgstr "" #: evibes/settings/constance.py:40 -msgid "OpenStreetMap Nominatim API URL" +msgid "Exchange rate API key" msgstr "" #: evibes/settings/constance.py:41 -msgid "OpenAI API Key" +msgid "OpenStreetMap Nominatim API URL" msgstr "" #: evibes/settings/constance.py:42 -msgid "Abstract API Key" +msgid "OpenAI API Key" msgstr "" #: evibes/settings/constance.py:43 -msgid "HTTP Proxy" +msgid "Abstract API Key" msgstr "" #: evibes/settings/constance.py:44 -msgid "Disable buy functionality" +msgid "HTTP Proxy" msgstr "" #: evibes/settings/constance.py:45 -msgid "An entity for storing advertisiment data" +msgid "Disable buy functionality" msgstr "" #: evibes/settings/constance.py:46 -msgid "An entity for storing analytics data" +msgid "An entity for storing advertisiment data" msgstr "" #: evibes/settings/constance.py:47 +msgid "An entity for storing analytics data" +msgstr "" + +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "" diff --git a/evibes/locale/id_ID/LC_MESSAGES/django.mo b/evibes/locale/id_ID/LC_MESSAGES/django.mo index 64868dcc845be6a09ae8aa32afd444734a179051..93b5cec12b267d825709155b25ce46ee10236d2c 100644 GIT binary patch delta 937 zcmXxjO-PhM7{KvqcU{eo%8#x5D0eq2JqbYv?X;_l60%Zg5Ey#%B$)^4)Iw+L5_PJG zAOt-wT{;xqg6bfiOFT%>B_e`u_W!>-4$k{~=i}XZ=9zIL_aRsN-j#V8D8tkN>cX)Q zuHy3)56Wsfgj0Ag`Vddkeu93pg+sWD9rzEOpUs5OiD$4EN6_&J%;61WUM(#1(nH66 zJc*C69baH8ZXti+Ef0VA9d_gA=pLS+{Ramz)x@G$MCXm;d8|fP&;T~DpY_9QUb^Ub zk8QYv$MG8)@sHU48{3CipuZ#A2yhgeX^*3sDMxRk*<3|4@s&xs7yXSz)(`2H5H8{+ zbcZwO#5?HD?xG7mKr`|R-NANjf5fx2zo3C1pqc!IZs-sVu#G{#>qf^%u;zp@UR=0> zrtlV;!gX{3l7Az6Mu#81 zL<8E4){zV*i~E6v`;`Q1AQl5YDt_ykySNK^uRKDFcgn1CdP(t4WIcaxy+I^LkPI~* z?y#Ra6#M*#xJ>m(+?8dR+LydFF6lYmz3pzsjO3{nvuR;JNk&7VP?(&}S7%%1@)Ogg e>Qtq^l%C0S(tVv)shTfWZqAoW)AjA<{nUS#21fz_ delta 885 zcmYk*zb}J99LMo5E$Ua*Ls7rAenm(u5`)Abv5;6K1_mOrl%+8kBxRI{Ne6>}Kn&6j z7GX0PL?leqV361(U3q`5H@Nhk*K^Nv&)xUFcfE@r$FpxiIA@d*YBzPc!fXnUE4fhC zLuN7Dz&6a_C?4S;=CKi9Q2jo!8B3VJNVxnyiE-MKsDAUMXZkl+ojSaYub$EpQ z?39Z>IKvja@ZMsS_7nEu2exBHRk>dRdudO27f}JEu?r6|V17I2rk)2^Sc^BP72W&x zvv0rQ0MEZs0Yia?AYbs(UU-Iv(`A8WJFssz1xKZlnP%BwQMVdhc zl0!{+?R`WI{Dq8ZzsS!bM5{moR6B_Qj$;aEQGsouzDw7Ue?`2@19^aC&P}QSRCEqC zXg^g&d-}g<0u81V>wM@8sc1Z{l4IdY4_9{1?L9l=4)2g{xp(fO40KWzsS2^!FjZ$k o+oCc;)u~qDfV+Q;GNV;-n%zMJmqn>8C{u;Q&|V!Z diff --git a/evibes/locale/id_ID/LC_MESSAGES/django.po b/evibes/locale/id_ID/LC_MESSAGES/django.po index a5205098..110e475d 100644 --- a/evibes/locale/id_ID/LC_MESSAGES/django.po +++ b/evibes/locale/id_ID/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Nomor telepon perusahaan" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!JANGAN BERUBAH" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Host SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Port SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Gunakan TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Gunakan SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nama pengguna SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Kata sandi SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Alamat pengirim email" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL gateway pembayaran" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token gateway pembayaran" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Jumlah minimum gateway pembayaran" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Jumlah maksimum gateway pembayaran" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Kunci API nilai tukar" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Kunci API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Kunci API Abstrak" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proksi HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Menonaktifkan fungsionalitas beli" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Entitas untuk menyimpan data iklan" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Entitas untuk menyimpan data analitik" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Menyimpan tanggapan dari API vendor" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opsi Umum" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opsi Email" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opsi Gerbang Pembayaran" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Opsi Fitur" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opsi SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opsi Debugging" diff --git a/evibes/locale/it_IT/LC_MESSAGES/django.mo b/evibes/locale/it_IT/LC_MESSAGES/django.mo index 48890fca35926cdc172f7d347ad91b9e77e4e021..82dc635a94bb60d11785919de3d6a4375428d3ce 100644 GIT binary patch delta 932 zcmXxjJ!n%=6u|Lglcu$8TCEyCqU}qqT6J&`MT$!rOD*UNtuCbwP6{nT+ysY!t_p&< z_yHnL)vf5z!C5E{A})%$2%Qw96m+WpfBJgKeZTu&PTo7`+?VCjzf$vifBsQ0Mwt7V zSGGi)!l!K<7>!)SHoTd62TPnkM1Qk@!}tk{_!o^YiJ732N*NcUX1W#ZG=c8z6#xiHnZZ^<@J`iL=U(mSUc$()& zduPN+Jc}mMKr6V5R{R7<@HJZLXSAZ9Xk3nL-MTUwe+F&+B-+7Qq&aa7hjAWF#8MTH$Qw9MZuUVjg5Vc)waVaSI$KusH~CRp!I(r0v_|huh?^Soc0EmCCt# llGZyfC$;m{bYgt*YVJb5C#|PRt$J~6vN}D!_^RW1?mt0QN7MiS delta 885 zcmYk)PbfrD6vy#1W-$H@2E!Qt4Kt-FC9+^+VMR7%V}XT@v9Yj{$&RvQLCI2yk}0Kx zQZ`mZN+Jt8vsKE%_xId|+uZkg_r5dloqO*6j@(8vui?O!(Gv6q`nb=m7dP^_(5C%n z6*z+tT*M@6Fz!ah4P&)g#wNKbXCjTIxQxZPj{Izs zi~g{URe0dMz!2kmY{qx2MPL43Tojuar<^0G1m-b@s~G0{w#!Wk6USJD=cpCkxbcG< zzhW!%pQr>w1!jd9MOCKN*^g6HaSWC4Awhb6g?;#hJs1j-0N=MEZj|{1YNZR9#1+&E z_fac3Ma4a$wkn5;FD7f1Jcddvg%rd3F^+?%L}pQOOU^aSC}4*hmGBbv;x|m<4<@jK zw<>{AR9qTca06AjBP7($P?ftzes;%23BF(#=G=UgKasn|OQ^qAm|{W>AeHmV+=gm8 zhdLiEbTuXNzl9m-Wm=h5sWYU;tGth^5^9ZfcFx;-cE+nrhs|;4no3(wZ+By@pp&i@ oDLFM&L#JAe1MXF;4%t$jX0JNn?YC4_bm+3H{*gfTxp2?_3szS?PXGV_ diff --git a/evibes/locale/it_IT/LC_MESSAGES/django.po b/evibes/locale/it_IT/LC_MESSAGES/django.po index 6869e631..2d2c3c9f 100644 --- a/evibes/locale/it_IT/LC_MESSAGES/django.po +++ b/evibes/locale/it_IT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Numero di telefono dell'azienda" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "NON CAMBIARE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Host SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Porta SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Utilizzare TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Utilizzare SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nome utente SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Password SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "L'indirizzo del mittente dell'e-mail" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL del gateway di pagamento" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token del gateway di pagamento" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Importo minimo del gateway di pagamento" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Importo massimo del gateway di pagamento" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Chiave API del tasso di cambio" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL dell'API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Chiave API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Chiave API astratta" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Disattivare la funzionalità di acquisto" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Un'entità per la memorizzazione dei dati pubblicitari" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Un'entità per la memorizzazione dei dati analitici" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Salvare le risposte dalle API dei fornitori" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opzioni generali" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opzioni e-mail" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opzioni di gateway di pagamento" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Caratteristiche Opzioni" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opzioni SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opzioni di debug" diff --git a/evibes/locale/ja_JP/LC_MESSAGES/django.mo b/evibes/locale/ja_JP/LC_MESSAGES/django.mo index b85b1854fa02297a7e19c4fc8536964f80d35444..e11945d65a67a96ca42092f3048f232cca3b66b6 100644 GIT binary patch delta 941 zcmXxjF-%iI9LMpqeU@qkq>7b-rL72cP+{m&CMlu=Y14#-q$Y;N$)v=@Fxfmpf+iSa zjB$~LkdV~GrI8R4-IxdiG>qc#Bn%7;4T+n6f3Md|?|ts>-MjaH|GR#R9mlFiQRkDP zWT*qw@&#kE_$9!FQVAM!73Zysc!T~&)H5|4!UlHYU)21NV@wamun+H|?&q-=OUS&c zc~0Xx0}I%V@9+w);$^HMKl7c77T(5dxNH55UG$qch=Gf|6w|1AIZR-|`T`Ze3ik7U zvqmGzz)y_eK3>9KsEAK&|J?TfVT$q2P%FR(*g-#s%FKjy7M0Bk>V8n)1IDl)=kO-JMn(SFx`|5Vp}l{GS~yI!BbY$-r%?0CsEoZrerB1A0{>w9b*$=v zA2c+vflA>YR6q{-S3p_RgC*4XOY1u7`9r*qr>IQENux4%548p3wqLaUr>J%2BjjHT ztTCXJY*}|u3mqUCG->K>stV`J4^{!GDByNsy8lAr_n+6fQXnc?Uk8%i^NTVY(*Enz zvlZqJb(q>N+5&z3kR8w;LTT1v(>|(XsByp5I;6K~EA{M*|6xf~(ScMULH-#rsZ?sR tm@E{-Gs*muhlR(F>d%7HPVe#hThD#txi!yS^4ty2eeW%<)W3EFo&V4-Qkeh% delta 885 zcmYk*%_~Gv7{~F)%w@dJFkZ$O@9!nDQIfJ_qgW^BU^nz`nR%tmlKLPg0& z&8l$;8*m-_aSOZg607hPHSQg2@C(ye8vH%)#CqDpsBx26XBOH#Hwijcu@X119Ji34 z?NaH5eXPY3?;XZzKVuudVG4_i|Hh@UmG+=_8nu8G%wP_aeBX|^si5Nm%kUNz(YJ45FkWI7!!#;09o|t~B#Sesz)l&Yz;1CEAH3g~;rljFYSxHTs1;|uAu5H( z{`n0mf+y_558qC(YK`kbWoiNy$Sjo>yx`j#sP{Kf;|?)Y>dv^)${tav`9ZzdM40Ly z_pYHPIL0Bo#v~R{8T&$QQ9wG?ZbY?vQS*$U+X7TZauwuXH#>A_q5~vz?&F=PqI0M; zwsWZ{L;s83BN6V<>0_Etg{fSW91B-ksM$FeAUop@Z;vgzXRgxWY2xbgT?AvjT#7^o nO+{%}s#Q4P?jNJAV=Hx<-9ZF*9wdo$5ntt^)4^3C772a<@~A!# diff --git a/evibes/locale/ja_JP/LC_MESSAGES/django.po b/evibes/locale/ja_JP/LC_MESSAGES/django.po index eae9eda7..0871c02c 100644 --- a/evibes/locale/ja_JP/LC_MESSAGES/django.po +++ b/evibes/locale/ja_JP/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "会社の電話番号" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "変えないでくれ" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTPホスト" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTPポート" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "TLSを使用する" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "SSLの使用" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTPユーザー名" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTPパスワード" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "メール送信者のアドレス" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "決済ゲートウェイURL" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "ペイメントゲートウェイ・トークン" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "ペイメントゲートウェイの最低金額" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "支払ゲートウェイ上限額" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "為替レートAPIキー" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI APIキー" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "抽象APIキー" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTPプロキシ" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "購入機能を無効にする" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "広告データを保存するエンティティ" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "分析データを保存するエンティティ" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "ベンダーのAPIからの応答を保存する" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "一般オプション" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Eメールオプション" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "ペイメントゲートウェイオプション" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "機能オプション" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEOオプション" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "デバッグ・オプション" diff --git a/evibes/locale/kk_KZ/LC_MESSAGES/django.po b/evibes/locale/kk_KZ/LC_MESSAGES/django.po index 7cd20519..1ebb926e 100644 --- a/evibes/locale/kk_KZ/LC_MESSAGES/django.po +++ b/evibes/locale/kk_KZ/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -41,106 +41,110 @@ msgid "Phone number of the company" msgstr "" #: evibes/settings/constance.py:28 -msgid "SMTP host" +msgid "!!!DO NOT CHANGE" msgstr "" #: evibes/settings/constance.py:29 -msgid "SMTP port" +msgid "SMTP host" msgstr "" #: evibes/settings/constance.py:30 -msgid "Use TLS (0=No, 1=Yes)" +msgid "SMTP port" msgstr "" #: evibes/settings/constance.py:31 -msgid "Use SSL (0=No, 1=Yes)" +msgid "Use TLS (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:32 -msgid "SMTP username" +msgid "Use SSL (0=No, 1=Yes)" msgstr "" #: evibes/settings/constance.py:33 -msgid "SMTP password" +msgid "SMTP username" msgstr "" #: evibes/settings/constance.py:34 -msgid "Mail from option" +msgid "SMTP password" msgstr "" #: evibes/settings/constance.py:35 -msgid "Payment gateway URL" +msgid "Mail from option" msgstr "" #: evibes/settings/constance.py:36 -msgid "Payment gateway token" +msgid "Payment gateway URL" msgstr "" #: evibes/settings/constance.py:37 -msgid "Payment gateway minimum amount" +msgid "Payment gateway token" msgstr "" #: evibes/settings/constance.py:38 -msgid "Payment gateway maximum amount" +msgid "Payment gateway minimum amount" msgstr "" #: evibes/settings/constance.py:39 -msgid "Exchange rate API key" +msgid "Payment gateway maximum amount" msgstr "" #: evibes/settings/constance.py:40 -msgid "OpenStreetMap Nominatim API URL" +msgid "Exchange rate API key" msgstr "" #: evibes/settings/constance.py:41 -msgid "OpenAI API Key" +msgid "OpenStreetMap Nominatim API URL" msgstr "" #: evibes/settings/constance.py:42 -msgid "Abstract API Key" +msgid "OpenAI API Key" msgstr "" #: evibes/settings/constance.py:43 -msgid "HTTP Proxy" +msgid "Abstract API Key" msgstr "" #: evibes/settings/constance.py:44 -msgid "Disable buy functionality" +msgid "HTTP Proxy" msgstr "" #: evibes/settings/constance.py:45 -msgid "An entity for storing advertisiment data" +msgid "Disable buy functionality" msgstr "" #: evibes/settings/constance.py:46 -msgid "An entity for storing analytics data" +msgid "An entity for storing advertisiment data" msgstr "" #: evibes/settings/constance.py:47 +msgid "An entity for storing analytics data" +msgstr "" + +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "" diff --git a/evibes/locale/ko_KR/LC_MESSAGES/django.mo b/evibes/locale/ko_KR/LC_MESSAGES/django.mo index 317ed6a82c6d6acec93888a332fd53eb67b91a70..c16cdecf53b5eb454334d16bce6538561eb81c50 100644 GIT binary patch delta 948 zcmXxjK}Zx)7{KwDyX|h8R+eU|HEWs{MGjaH@|r^Z{EE3eY2|_3!Rnq_UwEhhG;#s zsXZZF#-%0>L^%_}LA)1zh@JGGq0iK?AHQKM{zb>;~)e~V7^37u#K6WoY>SMU9{XfINga1ML%BKlkjE2e0Q z6CWs}3#p(3Yv_wVV?TaJQ(2%c-XBDtA4gLD!j6G>^J ya5EXbHd4AeUca5Wp6%iCR()pk-SV&b#YS}|*{aSq=H4{smKuw%>aX+XGyegIZByI; delta 885 zcmYk*ODIH99LMqhm|++U#&bLdQmjT679RKGVY!C#DGZXokKj^(s_Q2mCn%q(G(ToiF*2@7x)L%5Fo zY@13i>|rS$J1;Rz`vL3m6)Vw~o#_|F80{|S7-|8FSc6H7Fu(0{kw% z(Y4dq$o)^$0>e3GL5!j@)94()X|gzuTHpztG~PLO;EnSKiEBE}~`GREMzOW9zQSTMAJ7qA28m|u%TG0>}>bQiOcmtd95S7AP z_xv3-K#=V#l{LuEdZ{$vAnMzXqB1&z>bHPxm_WUMge1q#L*$=pyP}eJRAkOea~u^q zhdLh(6onS_KO!{Ppf|Aw*BMf10m>%F!V7JXFXw%GO|A{L*gUlh9Ukqz$+fkhR*F)m o-6^ySooa>Wh#&VwXjUItQ0|5zaP5$yE;0Y6baf&c&j diff --git a/evibes/locale/ko_KR/LC_MESSAGES/django.po b/evibes/locale/ko_KR/LC_MESSAGES/django.po index 8d3c7992..c76898a5 100644 --- a/evibes/locale/ko_KR/LC_MESSAGES/django.po +++ b/evibes/locale/ko_KR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "회사 전화번호" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!변경하지 마십시오" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP 호스트" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP 포트" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "TLS 사용" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "SSL 사용" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP 사용자 이름" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP 비밀번호" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "이메일 발신자의 주소" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "결제 게이트웨이 URL" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "결제 게이트웨이 토큰" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "결제 대행사 최소 금액" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "전자결제 대행사 최대 금액" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "환율 API 키" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "오픈스트리트맵 노미나팀 API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API 키" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "추상 API 키" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP 프록시" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "구매 기능 비활성화" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "광고 데이터를 저장하는 엔티티" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "분석 데이터를 저장하는 엔티티" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "공급업체 API의 응답 저장하기" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "일반 옵션" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "이메일 옵션" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "결제 게이트웨이 옵션" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "기능 옵션" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO 옵션" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "디버깅 옵션" diff --git a/evibes/locale/nl_NL/LC_MESSAGES/django.mo b/evibes/locale/nl_NL/LC_MESSAGES/django.mo index e85dfe8edb05b8ceab164a6b72f390130b13b750..8ba012f9b02b6f0b8673d901b3382c9e89de2185 100644 GIT binary patch delta 935 zcmXxjKS*0q6vy#X6QhY*|0Y&r+eEEZ3U;v;9fYV44ak#<2ttQW>LTbSbO?5iAc&pJ zVrjv2D&o??LFptS;;iE2T&!B?V86fT^^p5M@7~p#YSwxF4Xr!7{_KlCUH{tk?=a1HRpdUw*H}isA61z_=QOIC3#f%1GD$B!bzb3H-fz)zvtG=g zGG0QhG>=NCfKPA>Rhd213Xf0^zC``**7YmMUJFX1D%gz_$NKOk4xlPNgE`%NC7=HoM6bofB3JW%@l(JC6QrQp-3wAcLkSQxk z$}B9UNSRVt$WnI7_qoo(uetYg&T(e$InOb@eGd^oUYR1a4Z*QC!Zfm;RKs9C>R z70zKDE@LllVke$qIXwI!TmsQELPQFO~RnsLWXI7LNw<9v1F zetuo!QPcvHs0U7PV~V9w3!Hc3E2xF8V;}CK=3Su@zAYhtH6Go-JCd9ib33YZ4)vpL zTq-T#e`zOd*gJH3m=aSdNu{bJRN5eK&U^Q~8Sn6R*#a$BinxKR!}VE\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Telefoonnummer van het bedrijf" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "NIET VERANDEREN" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP host" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP poort" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "TLS gebruiken" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "SSL gebruiken" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP gebruikersnaam" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP wachtwoord" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Het adres van de afzender van de e-mail" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL betalingsgateway" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Betaal gateway token" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minimumbedrag betalingsgateway" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Maximumbedrag betalingsgateway" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Wisselkoers API sleutel" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API sleutel" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstracte API-sleutel" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Koopfunctie uitschakelen" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Een entiteit voor het opslaan van adverteerdersgegevens" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Een entiteit voor het opslaan van analytische gegevens" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Reacties opslaan van API's van leveranciers" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Algemene opties" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "E-mailopties" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opties voor betalingsgateways" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Functies Opties" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO Opties" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Debugopties" diff --git a/evibes/locale/no_NO/LC_MESSAGES/django.mo b/evibes/locale/no_NO/LC_MESSAGES/django.mo index 53d15cdfdac2f20c5f277ed537d062b7e98e3185..33066ed1d84cd74333d3ab5fe085b7db3dc238b2 100644 GIT binary patch delta 934 zcmXxjJ!lj`6u|LkZoR~4VvJt=h|#?>A7>#}HrHvgenl=s(g+q>gj7mw#Ks(0D;B}d zG$|t}Bm~65LP#YdVynhNuoe;0Nc{iL$>ZjJJ9{%b^WN-jS6&UYzV&C%f~eDu({ApH zIET+W_#);@5q)?s`3MK-FQRi+a2P*h4{o93%UQ$$Jd8*2H2V8ER&W{_*NQnV4sqiF z?#Cy%50|hTSCCJv^W}rz;6Z$!+{9k`zwsn?>}FA{q2n5O0-MP@=ms9+AnV667yaCL zi+k}C?!m9z{ zr|=BA<7qV0S@cNmqZurs6IbyVZlIZdPi~|x+1S7Yi4&oNgK;M$ z5OFjnE`-I!G;tvW1~yn2a5C_H?Hf4Z_V@1NzI*RE_wMI!bLG=)x)Q_~?HO&MAz~6g zHS$9&r6L~VJIrGV$8ifs@EbnDzv#FN?8F-^U`x9G{~^rLpFqb=V|PS37J2C4#VWSp z2h89W@)tY&_`zrF!rjE5*iQcs4&XWVV8es@xB~Xme~~zYZeRtU;yPwoKfdtL%8LVh zh(FMbj*@;g>7Qbe_m}7f+nXYqv4B>lnD`3cP{lbU!`Nd`7Js3YtKu;J$1c{7VoN>4 zN%RP&(Vf3XKit4xte_blBp#y+pP}Rap&QGP1;vOQx==4#;VHC|uhH>uv25u|Jeb)w zKEdxeg1^xTuF(zTncdR8M8BIwCtO2@#7Fc9Ht4n3XX4Xq;Rv0Zyj2q35y8QxcZeEX~+p rFEL8RZGwH*V=K0heQz1V- diff --git a/evibes/locale/no_NO/LC_MESSAGES/django.po b/evibes/locale/no_NO/LC_MESSAGES/django.po index 7b9775ef..737be3bb 100644 --- a/evibes/locale/no_NO/LC_MESSAGES/django.po +++ b/evibes/locale/no_NO/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Telefonnummer til selskapet" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!! IKKE ENDRE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP-vert" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP-port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Bruk TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Bruk SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP-brukernavn" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP-passord" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adressen til avsenderen av e-posten" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL til betalingsgateway" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token for betalingsgateway" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minimumsbeløp for betalingsgateway" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Maksimumsbeløp for betalingsgateway" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "API-nøkkel for valutakurs" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API-nøkkel" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstrakt API-nøkkel" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Deaktiver kjøpsfunksjonalitet" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "En enhet for lagring av annonseringsdata" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "En enhet for lagring av analysedata" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Lagre svar fra leverandørers API-er" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Generelle alternativer" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "E-postalternativer" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Alternativer for betalingsgateway" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Funksjoner Alternativer" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO-alternativer" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Alternativer for feilsøking" diff --git a/evibes/locale/pl_PL/LC_MESSAGES/django.mo b/evibes/locale/pl_PL/LC_MESSAGES/django.mo index b1c0024d15f22404eedd29b03d342024374e084a..7b096549c3f4adc425205a393f069998b85ae604 100644 GIT binary patch delta 936 zcmXxj%_~Gv7{~F$jPd@?c;}9HDHIlzg_nsDSIUMgD5Vs!K{iu%iYQqS8+I%#WWhpN zS%{J~HsTLJ+422d$CERkd(J)gp65L0+6mqSqt99X9YfU8ifQ99#Ow7XqtV7-J##|gm=0(jk7dZ?pV>)hN3Lan*9wUF| zoFBdT60`Bv`hscnKd=mA<5(2SQS;id6kY2qDuHz@VtsSSMHT~Bn2ZmYh)<}D-);ZP z_J1(McxvD;!A6Xy-;SzGmvt0X&3RPfcTCd#XH>#p*ueV6pI}TAHlq@m!hBppm2eBS zgF{qhu2DO@Mefi3uuME$jJfLSDO@=z~!P&;cwD(Ee$ z1QdK<-ZMG^h0gpxnC_jql29d;oZh2QCXGoX5(|Tb*u@~NQ4A!E zlBS7Rni#|)7Ky~>`+M%-r1yQ^eeb^BbI-kxk>f}z9}XNF(M@ZnP5aD-@SuPTvEVnW z!bObW7WUvic3>LI@fkJl4Xg1RqgWjHd!N8M`bpHdajZ2<*$g+8JXpsv+{O^@BR@Oh zq7P261}~hqSV2FFZTO1y=qvmi7sXckz0OHg0&CcWyBKDEJL9I52Ul2vH>edoxPH#{ z^BCv(2P(meBC{YyQI&~1hjErFPPzUigOun!_F)#2=qn}x=C=WE8gL9%x_MOQ8>osL zqE>c_O6(dn;hpQhpuT%|{-7#a%4%ZRgj(PTDv=3PMQ1RjOjfv20w<_5kj8d=!UTS~ z_Ys!Oo>@O?{3!Cu=A6r@i8ft-2bK694&pg#;vABry@ja1{^*kjT3L{RYnI\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Numer telefonu firmy" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!! NIE ZMIENIAJ" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Host SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Port SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Używanie TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Używanie protokołu SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nazwa użytkownika SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Hasło SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adres nadawcy wiadomości e-mail" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Adres URL bramki płatności" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token bramki płatności" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minimalna kwota bramki płatności" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Maksymalna kwota bramki płatności" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Klucz API kursu wymiany" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "Adres URL interfejsu API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Klucz API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstrakcyjny klucz API" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Serwer proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Wyłączenie funkcji kupowania" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Jednostka do przechowywania danych reklamowych" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Jednostka do przechowywania danych analitycznych" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Zapisywanie odpowiedzi z interfejsów API dostawców" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opcje ogólne" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opcje e-mail" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opcje bramki płatności" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Opcje funkcji" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opcje SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opcje debugowania" diff --git a/evibes/locale/pt_BR/LC_MESSAGES/django.mo b/evibes/locale/pt_BR/LC_MESSAGES/django.mo index f4ae5d2753b04fccd5b136c398f4f77a4f8ee66c..866b9426358c40660465d717b594d3827adb1137 100644 GIT binary patch delta 934 zcmXxjKTMNB7{~F)x3#SxEmSQi|K4In)R;~UNjIzwCXlzOun;@A022f!WNM*u}W`rdQT9j(ldO#L7o-85o?HbkqP zGArOKk1t{^V%CcfoR2U=|0U`-4b0&e?7@Gi`LU>3ANJ!#yoUOF2`^w3nOC=E9?moH z5L5UJ&*Bz#VFUSCi!Z%+AJ5@?=XXrf|AV9Gon}!SL(MDV2nNm-R0297{PPY z4oj#PRj?O7P?-x5wHE3?1vZWfYz7B$4mB_5+(89gzVUl zfJ*6x>mQ(Ae1S~067sQI=OZex3Xb6?DzGT&mWdGgXA?HWfSf=w=cQSZtLPqTkpZfT z0{CB)A^ldDPWMB1NJU4gd&9NxiZ;N>c^l+pybPyp)BDbQDD~acAvZ*@HcZuB&_z=j lq3TwvaKXKQjE+vb(b4FbRFqy7Wkne%7kpWN`8inh{Q`uMJthDE diff --git a/evibes/locale/pt_BR/LC_MESSAGES/django.po b/evibes/locale/pt_BR/LC_MESSAGES/django.po index f29f1654..9fc7dca1 100644 --- a/evibes/locale/pt_BR/LC_MESSAGES/django.po +++ b/evibes/locale/pt_BR/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Número de telefone da empresa" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NÃO ALTERE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Host SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Porta SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Usar TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Usar SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nome de usuário SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Senha SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "O endereço do remetente do e-mail" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL do gateway de pagamento" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token de gateway de pagamento" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Valor mínimo do gateway de pagamento" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Valor máximo do gateway de pagamento" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Chave da API de taxa de câmbio" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL da API do OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Chave da API da OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Chave abstrata da API" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Desativar a funcionalidade de compra" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Uma entidade para armazenar dados de propaganda" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Uma entidade para armazenar dados analíticos" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Salvar respostas das APIs dos fornecedores" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opções gerais" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opções de e-mail" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opções de gateway de pagamento" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Opções de recursos" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opções de SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opções de depuração" diff --git a/evibes/locale/ro_RO/LC_MESSAGES/django.mo b/evibes/locale/ro_RO/LC_MESSAGES/django.mo index e34a8b64a3e2e4d44b7a6e98b7535e66e946826e..424dbf6feb45cf2d50eb5c292cf65b7f8d1a51dc 100644 GIT binary patch delta 937 zcmXxjKWI}?6vy$?BqlL2YEs*%spd};TS0IrrI104iGKn%si;FBpo35-1QNQqltAV> zi6Ekb(kbE;TpYwjC=`+4q@dY!aDI zBhr9pl?sqXue=PVv!Sfj6zKE*KC1(Rw%{HnM9~h*Cj!=pH!3E~G zaM#6BHPHoBMV3$%yo2OmE2zXf=xrf( zRf;|rD(ySei-$Okzwi`J@RkD3IUA@Kby4G6d zi?Ew?sDw>a=J%YdNChoN(?kl+mzS&(P$=R3V7QkEd3%-8WZFW75>s{9Juh@7g4%zb zdQGkso}ulBN}8hOU5EYfu|N^0iX!>gB;*|Mfte?%M6lV!cwmQZ1J@pHv4gLmU1*H8@H9 delta 885 zcmYk*KP*F06vy#XEiLu8XchIRv?Zy8h!BIA4AR6Ru^1Rwh`}NeNyFBJMHmb$5)v_p zZXy+n#UK$PF%S})$zb;Vy}rRo@B6&>di&lv=iY8b9>UqTkZ<3J6r+_f?J*m|?Gg^e zoY$-t=P`_{*n>Ij#!IZi7u38jtixZ7V!&7YK8}rC_oL=bV1rrKW;m(g#xhpo23BAW z`Pd!@{onxW@yxY=)m%SfJAPmUJ*CBYQEcP7&ozTeUj=)$#VMphJ73ORDyG;4y>U%x`SCg_=uA(EMN>j zF@buTOrjo?LCsr1RkVv*vJ+GX^R73p_o#wia1g(doUMb&>RfM-{wwnVZpd+@bI!}+ zsL(#t{^(#Rw5I<<9nwS92_>b36iP@{vMroYVXU09_UcYIBVmgi-B4?_460B;vX*3M pFDN-hilJStV1qmV7%hdWQKjmpLhV-2NT=obO>f4RfA=4I{{U(DJm&xa diff --git a/evibes/locale/ro_RO/LC_MESSAGES/django.po b/evibes/locale/ro_RO/LC_MESSAGES/django.po index 59bd366f..cb9d1969 100644 --- a/evibes/locale/ro_RO/LC_MESSAGES/django.po +++ b/evibes/locale/ro_RO/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Numărul de telefon al societății" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!NU MODIFICAȚI" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Gazdă SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Portul SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Utilizați TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Utilizați SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Nume utilizator SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Parola SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adresa expeditorului e-mailurilor" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL-ul gateway-ului de plată" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token pentru gateway-ul de plată" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Suma minimă a gateway-ului de plată" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Suma maximă a gateway-ului de plată" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Cheie API pentru rata de schimb" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Cheie API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Cheie API abstractă" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Dezactivați funcționalitatea de cumpărare" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "O entitate pentru stocarea datelor privind publicitatea" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "O entitate pentru stocarea datelor analitice" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Salvați răspunsurile de la API-urile furnizorilor" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Opțiuni generale" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Opțiuni de e-mail" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Opțiuni pentru portalul de plăți" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Caracteristici Opțiuni" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Opțiuni SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Opțiuni de depanare" diff --git a/evibes/locale/ru_RU/LC_MESSAGES/django.mo b/evibes/locale/ru_RU/LC_MESSAGES/django.mo index e44e8a20bcc4a43f0ddceb95b52f478973927545..5bef89485f484fb605bdf2908abb95c4915e884b 100644 GIT binary patch delta 942 zcmXxjKS-NF7{~EbV~l@NtF2m%wn-YT6{!l^K`5wE6qFdjMQEYz&@L6y%`LP`m)1o> zQFL*PgGz955bPv~_^RNhE`qMoDlTHbzw>;^o6p_*Uhbavxyw!6S}1*7>B|_RnX8`b zZJse*IG@iKkt#6eA%1m!$7=dBsNZBUh6fnLYt(qZ&zK6V!CHKYdLG9r97D#X&1V{q zxiN+1_zTN$0ZTB8e9RhOns^-_;kNSxAJG4c&oIA`MKOvR*Nsmx;haPz@DoFtDM5Ek?K>^xq}ehDG$dQI+X)PN1rpa{V0!J?Hr;hAn81+JaB03Qgf4{y_b17t<=) z1r3#|g4b`sM%02ye1+dIjw{%U|4`#zvrnz~0i!sLs=z9$a$Beb4qg8oWAv|3^Mr!b zUzxpQw6@?2)?wN?hk5ihxk{(teA#oLH&EyW?t{GSi%{UKg(DPbK{MKhNYR&f4o`E}aaIeW;$sL+8_P-t5r6NyCn sN5hHHz<4-5)SDO_$h|KZ@l|u%TktYrZ{Ew$SoUVUMK6;m{h^vKb)@95P?iFw& zmI{rj!ey+-4eY}d_TV{I;5};ID^}wt2GHyNd)|e0^rNVG6Ig3Z(#+GSWMCc3aT`l9 zg?!8bH+|t4Yw*l5k3Rah*p5%wfG*G9ya2Y*A9S2XC9sCgxPyMyHzzd87|37==1^~R z<@E2I{v&oW{*Fq}S7b~v22hphbR5P7s+hoT#?wsFg4Z~O?>K|QUSoP$-=x&Q3~GUU zjN%u@FiciqTtq$J#Su(nE52b6y=0}*M^Kd+#W*HV-#bE8>JnAS2TX=(e9+K>jg%pR zlQ@o>IEFdYydNCEe)g#g=TL9Hg{s&-DuGj{pTQpbdDQPbqY?`;*^jXb>fb~o&VXD& z7b;sVpwKzg`RL$MXixu#euzTZh4ogfVS`-lx#3vYP^H*8yA|w=O)O|u?K6AR;ZYLW vGX+Jl+oCs9)`}39PPKvqZvQcj$d>9f+wy{~iezW(q08\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Номер телефона компании" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!НЕ МЕНЯЙТЕ" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP-хост" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Порт SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Используйте TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Используйте SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Имя пользователя SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Пароль SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Адрес отправителя электронного письма" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL-адрес платежного шлюза" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Токен платежного шлюза" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Минимальная сумма платежного шлюза" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Максимальная сумма платежного шлюза" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Ключ API обменного курса" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL-адрес API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Ключ API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Абстрактный ключ API" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-прокси" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Отключить функцию покупки" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Устройство для хранения данных о рекламе" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Сущность для хранения аналитических данных" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Сохраняйте ответы от API поставщиков" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Общие параметры" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Параметры электронной почты" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Варианты платежных шлюзов" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Особенности Опции" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Параметры SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Параметры отладки" diff --git a/evibes/locale/sv_SE/LC_MESSAGES/django.mo b/evibes/locale/sv_SE/LC_MESSAGES/django.mo index 8394b66927fd1f7c96dbd1f90ae4b72e37532802..8dd6eaf6f8fed8cd9264f8b2a1b283160db94c62 100644 GIT binary patch delta 934 zcmXxjO-NKx7>Ds!XBtiOvzjt1XG~3zXq5|hlMWTd6~j&7B5+ZgKo>!~0TJEkqQqUb zh*n0l5Gh);DQXcdq-`GrQQIJ*cJ(~d@nz2a-E-&8J?H$-ot5I#V(n9Rej})1+ELnU zL&O=p+sJ{M&qZ|NLUIv{^w-hfY~ldE$2RoLL z+`|rmD)usdJm938 z3oo!0cW^I$L}&ax^?#-QUo3OIt?++>r?H9tIGW7a`GK{6szg`1*{qQ zA}0=f2aWI{y24lJK;Lix8+e)yq3_B?bYj=h$d}QT-bX(1IQ5?)kBB$u%6D)GzqXLS z5x0^%sYVaF1%1g;B*EyXnULj5T%8lNobYb>TO)Qb2Qm$xZ~0ESNXM~!CkpPrD{=n@ zY0hf5jMVsDvE?7)B+V6?nl(%_A&d8~o`!EbJ5k@75?ZEXvGDp9M!8&`oGN8g%`>Hm g^Ofveb?a*GQofzbFPE~(%aziFY^J*PsA)F$4@~|>#Q*>R delta 885 zcmYk)JuCxp7{~F4me#wLmU?fM5|KzmVl^;HBq9t97%apfMsn$d#ONgkgH;Tuu!xwL zy(9)A3w9ng zjB&1ipb{+2Hw$14)tR_wFHX?KAymQ#+!V%3Y{xrn#$OEaev1dQE$c>Q){pf#g?g}q zHMoVU;0UYn8fl@upgQ!0N-Uo$=)Q%p10$&4`%s-8MvZ719kp(e6IHf>deJE+@y7ET zwKr;cx)SR}wR#jaf_da)%iekw`HO9%D&NCaJVAB#5ow~m7t(*V{*w#x2kD%fOac|! zhswH%L!p`e550iG-HOz1?IDGpr>fZ&ZYXiRR2^nAZhrDQ lk>b#\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Telefonnummer till företaget" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!ÄNDRA INTE" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP-värd" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP-port" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Använd TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Använd SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP-användarnamn" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP-lösenord" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Adressen till e-postmeddelandets avsändare" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL för betalningsgateway" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token för betalningsgateway" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Minsta belopp för betalningsgateway" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Betalningsgatewayens maximala belopp" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "API-nyckel för växelkurs" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API-nyckel" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Abstrakt API-nyckel" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP-proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Inaktivera köpfunktionalitet" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "En enhet för lagring av annonseringsdata" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "En enhet för lagring av analysdata" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Spara svar från leverantörers API:er" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Allmänna alternativ" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Alternativ för e-post" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Alternativ för betalningsgateway" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Funktioner Alternativ" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO-alternativ" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Alternativ för felsökning" diff --git a/evibes/locale/th_TH/LC_MESSAGES/django.mo b/evibes/locale/th_TH/LC_MESSAGES/django.mo index 082008ca601ef08ef6bfcb7bf657d0243db7f806..9320688c08212ee549947fa26da44c7d6eabfc81 100644 GIT binary patch delta 952 zcmXxjPe@cz6vy$Kjx(l?f2Qo8|7O&5Y|#|vW)Mrq(1nZ)1Ti4!P7pQS>87DJ5!p&w zR7NTU;(&`Je7X>68!bX`XFYVGdl6ez-{0+e@XqJm>wWXiJLk?`{YpdbXC&~(5OGE= zW9Wi09k@`y2QgJ>OeIb`pW_wg^Qe1Pu^D$UjK5L)g8^fz@G4%%Hq`%9SdAHEU(Sqj zahZh~tiab;h99s5SCK#Sg%5r47GA<{&RoM(|KqWATH9X%e za}i--8%yyAUc`M=#z$^`>gInj#(FsTKfwfsm?u${>2YRJ)ttgRtbb=y0{@`qw~LK= z%=67K7vs2rHQ3D4wc!D#aT+tYgRK~$EM1tydpL{jxQ4gz0B>NJw~=ww8>jF-W>FP+ zi#grkaiKRl#5OFV{(5i%Q}`5>;8%R2b;{C@ADze8$^0&T&>5OUwe%I%;i8*wV-xdT z%;H%&^}ohNhQ=#_F;vOtobQkdnns3hRB*oRInaKEdVU_{Z+lLmY)h4dzE45!_CV4- z8>&E1{a427-%Umf<2;m@ZHHUX4?^W9d3#W`9A~J+3eKN>Tb*_~X-ghOg$|^G&e$_z zVzF57U^G2g{3x30?@sqUTpuYM2vo4_dwGBJrSE)4Zmz4c-}rdp6k`Lo*~VcQkhjoW(Et-a84Gl@`U-97LD^WXW7x_u)M`y-%qO^ zV!=;Nvt}39c!yDz_q@RGJjD@TKgl_c@*#Wprf`jM(qEil+36w^mpRIL#z7vje#}GD zLwxuPFLF#BVu$y5H|9CXE7B4!^E|&YdZteu)H0prK~5Lr1s*bP@H(Hfn|~P_=X>$gm5hJ1>B2+AwqS\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "หมายเลขโทรศัพท์ของบริษัท" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!ห้ามเปลี่ยนแปลง" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "โฮสต์ SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "พอร์ต SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "ใช้ TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "ใช้ SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "ชื่อผู้ใช้ SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "รหัสผ่าน SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "ที่อยู่ของผู้ส่งอีเมล" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "URL ของเกตเวย์การชำระเงิน" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "โทเค็นเกตเวย์การชำระเงิน" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "จำนวนเงินขั้นต่ำของเกตเวย์การชำระเงิน" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "จำนวนเงินสูงสุดของเกตเวย์การชำระเงิน" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "คีย์ API อัตราแลกเปลี่ยน" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "URL ของ API OpenStreetMap Nominatim" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "คีย์ API ของ OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "คีย์ API แบบนามธรรม" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP พร็อกซี" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "ปิดการใช้งานฟังก์ชันการซื้อ" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "หน่วยงานสำหรับเก็บข้อมูลโฆษณา" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "หน่วยงานสำหรับเก็บข้อมูลการวิเคราะห์" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "บันทึกการตอบกลับจาก API ของผู้ขาย" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "ตัวเลือกทั่วไป" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "ตัวเลือกอีเมล" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "ตัวเลือกเกตเวย์การชำระเงิน" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "คุณสมบัติ ตัวเลือก" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "ตัวเลือก SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "ตัวเลือกการแก้ไขข้อผิดพลาด" diff --git a/evibes/locale/tr_TR/LC_MESSAGES/django.mo b/evibes/locale/tr_TR/LC_MESSAGES/django.mo index 22a573273077eafee7b41cc49cc746d0599b35f7..ec0f7d03281dfbe6a3167528d2113b99f4684dce 100644 GIT binary patch delta 938 zcmXxiIV?m$9LMot*E-g@SU0<@D4iAM#F9_nDbDJI8Dbd34NU7OrACZebekBR_M@ zLld83E?!!nF_ZQOR$yWhi((~eTpN~S)H;pYzzUYIzS*JTqvH&{c!R0JNj~2_%EgqS}Ch z@5@<4SD?_H{|CdJ6tiC^dF{5<76O!3SE9pT3TO4>7~9uN=4GdLL^o(HL*wx3@j315LVGNu}C^HkdW9!45Etx zVX+yAq+7$#&CFon|JRIB;Rm*3pt>?HfxYz8&J1b+>)3@kj4{8Ra8u8NE3Cy^)Q+B9|IPJF zIKcBy)B>Y5W?@XAk{NJL;Swp%p%#3}AZ_3Q)A-{2MUVL{9jPQRgId`~f=t&rlQH;Sd&4-~XV_ zMlb)aansHP)Xuh13)n+VaEu*z?w&v5B>f^1ibaWA#_P#nKj`Lx97B@xW7fnf?L_CJ zpQh4|{#T3+0r-h1Zk-{OUa1zxvGA*hD{s!\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Şirketin telefon numarası" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!DEĞIŞTIRMEYIN" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP ana bilgisayarı" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP bağlantı noktası" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "TLS kullanın" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "SSL kullanın" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP kullanıcı adı" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP şifresi" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "E-posta göndericisinin adresi" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Ödeme ağ geçidi URL'si" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Ödeme ağ geçidi belirteci" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Ödeme ağ geçidi minimum tutarı" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Ödeme ağ geçidi maksimum tutarı" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Döviz kuru API anahtarı" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL'si" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API Anahtarı" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Soyut API Anahtarı" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP Proxy" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Satın alma işlevini devre dışı bırakın" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Reklam verilerini depolamak için bir varlık" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Analitik verileri depolamak için bir varlık" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Satıcıların API'lerinden gelen yanıtları kaydedin" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Genel Seçenekler" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "E-posta Seçenekleri" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Ödeme Geçidi Seçenekleri" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Özellikler Seçenekler" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "SEO Seçenekleri" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Hata Ayıklama Seçenekleri" diff --git a/evibes/locale/vi_VN/LC_MESSAGES/django.mo b/evibes/locale/vi_VN/LC_MESSAGES/django.mo index 1199488988b0d628afaca31b7d2a61b8482c1199..2c49f2a404f76cbb13fa5a5cd01f01925222c9bd 100644 GIT binary patch delta 941 zcmXxjJ!lhQ9LMp;^h|4FwAM6DjM2MVHNn9b=+JaZQc1*cK`2N;(52`iR3~u>=oTy# zOa`ScPTG!bmlle_Y~oM?ZYtuSv(l2K)bH$ ziPP`|kK-a9#Wxti7360&xah;1coIKZzvD6LfAK7a4l^i@qx$9X4EolGs0qBlG~=7M z+>Fq$jZxgeBls0H<6pMEYwHK-(H;x`pWtO2q@G9ZOwl@r+RX*jfS>84h5p1e_OQtK zCO*Us-o_lhMr~aO)$t2nz(2M<#q3<_mr&2EcnTk&-g}N(c?-3J?@U&Az>LmxHpW1PZQcm=zdM2D}cU&dNMt#BTd%BQFaHIScK=A!rB;WW0R z?7tfJY2ceCLE`nIXT6H-pc$uVAO+_un5c;cD unVRd@hGyMTrQnyZuiYD{I-@k-tbAa4aI{yG)$4u@3 delta 885 zcmYk*IV?m$9LMoL)_t#Q*ST&AfD#xy{eboK zf1(yxkYSdIVN_=7y?r=A7DtdB+CGCc;RO!jy*H9&*3SGk%Z*aDjvBa&EqLPlpD{xF z%Ret;m6f!+QSU`jnVCc_Y#FtoRcyrsYD0&pap$Ov-e9bUn^$fcv4XcX@c{PY40ho* zhVTkC?%kWiEZSiw>Jtv37Bq?+HpfNpE#Uwreftvm346>X|9bI*4*7#*&ZW5l6{(41wZ9>Nm;n4;mVhD8RpBl;%&Bh_sm^XJW8u}sL%?P4W&+n nrcgRn)d~vS{bRI4KB>!u3Q?hYP>@(xbjR_uXyEuIb29J?J2gNd diff --git a/evibes/locale/vi_VN/LC_MESSAGES/django.po b/evibes/locale/vi_VN/LC_MESSAGES/django.po index f6d3dab9..da49ae76 100644 --- a/evibes/locale/vi_VN/LC_MESSAGES/django.po +++ b/evibes/locale/vi_VN/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "Số điện thoại của công ty" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "!!!KHÔNG THAY ĐỔI" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "Máy chủ SMTP" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "Cổng SMTP" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "Sử dụng TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "Sử dụng SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "Tên người dùng SMTP" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "Mật khẩu SMTP" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "Địa chỉ email của người gửi" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "Đường dẫn URL cổng thanh toán" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "Token cổng thanh toán" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "Số tiền tối thiểu cho cổng thanh toán" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "Giới hạn số tiền tối đa qua cổng thanh toán" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "Khóa API tỷ giá hối đoái" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "Địa chỉ URL API Nominatim của OpenStreetMap" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "Khóa API OpenAI" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "Tóm tắt Khóa API" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "Proxy HTTP" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "Vô hiệu hóa chức năng mua hàng" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "Một thực thể dùng để lưu trữ dữ liệu quảng cáo" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "Một thực thể dùng để lưu trữ dữ liệu phân tích." -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "Lưu trữ phản hồi từ các API của nhà cung cấp" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "Tùy chọn chung" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "Tùy chọn email" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "Các tùy chọn cổng thanh toán" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "Tính năng và tùy chọn" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "Các tùy chọn SEO" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "Các tùy chọn gỡ lỗi" diff --git a/evibes/locale/zh_Hans/LC_MESSAGES/django.mo b/evibes/locale/zh_Hans/LC_MESSAGES/django.mo index 843117ea883efc44dbeb693eca5fddf863ea027a..8ba95180c9d49f160dda4096ad467c8abbd10a5a 100644 GIT binary patch delta 932 zcmXxjKTK0m6vy#vTiWsjlv=2YU|S2;2^@6jB!ZFYfeA4&L1SD@O-$-WAf&;8i6$nM z30xQ)P~(6kU(=}B)t_rCY~?z!jQZY8H$%Daikj3e^2 z3$&3F&RxT~5MM+o?A&R5W{dx1fxr(aDCsbv(kR04k)XIOO-tV!>vN|a` zdSMP#!t1CB@1jax#IrbNR_*>-9NofldO1Ku9M0?J>!2+~;ZJ|O7)gsxwAhZ=x?Y~aF_OFxHMXQBY z9BhkS&>!M5O)JngDe|=QLGSpGw$s;Xr@}$0)2PsaRA_NJBQBH4^be-}!T4~xZ=lz| deQWVy*pD>qFIRrNo;;ZSaPV?v@m=gq=s)0iOJ)E7 delta 885 zcmYk*JuJgP7{~F`7WLNh_ge3&UKU{>kuVudrHjNSNLZM}D4H&kCL)nAh}cXWL>Mf> zW|N3Wh%`+M5)z|y_Wk|)44(Av)BFFgxqF_w?lr$Pr3+r@*bzgtPTE45a}&59pd*%p z&eh`zw%`^HV-^#5g?0Ffn)itfSi~5HL#6j|Y-T)$nm3D0&ZXTVU!pwN#9G|JYRn=Z zcSNTjoM0p7%sY%Qe#RdBz*a0PFU^Z#H{%gAiQ2#hc3=iQ)^}%oso}vTR^crwqX!$m z*tmdwJpVy$FjC=MCB{&d=`$yBi7KX08@OPS5_?1~{B9O8%KFX=mnOu`QS^8|ZKhBq zUA6byX2v`~RpJyWsmmd2yL(i|52y{~&2RLN2-7NEn6$OvFsjs3*oH}S&ED^thvvDx zzd=>-$;_KysEz&N7zQbuHa2cfRa1YJa)wUM(NQ_S%yCrc9_oJd(iAG`|Io%s#Lr0g zLzybHAtl4L@S}^Klk<;2n@G?G+&aC5E>AnH-^SX|AWe5cSty2Ry44CUxc`q)r8r8z Y^s1&p_d!A8{t;Yfg7cy4d}S{12WCq>eE\n" "Language-Team: LANGUAGE \n" @@ -38,106 +38,110 @@ msgid "Phone number of the company" msgstr "公司电话号码" #: evibes/settings/constance.py:28 +msgid "!!!DO NOT CHANGE" +msgstr "不要更改" + +#: evibes/settings/constance.py:29 msgid "SMTP host" msgstr "SMTP 主机" -#: evibes/settings/constance.py:29 +#: evibes/settings/constance.py:30 msgid "SMTP port" msgstr "SMTP 端口" -#: evibes/settings/constance.py:30 +#: evibes/settings/constance.py:31 msgid "Use TLS (0=No, 1=Yes)" msgstr "使用 TLS" -#: evibes/settings/constance.py:31 +#: evibes/settings/constance.py:32 msgid "Use SSL (0=No, 1=Yes)" msgstr "使用 SSL" -#: evibes/settings/constance.py:32 +#: evibes/settings/constance.py:33 msgid "SMTP username" msgstr "SMTP 用户名" -#: evibes/settings/constance.py:33 +#: evibes/settings/constance.py:34 msgid "SMTP password" msgstr "SMTP 密码" -#: evibes/settings/constance.py:34 +#: evibes/settings/constance.py:35 msgid "Mail from option" msgstr "邮件发件人地址" -#: evibes/settings/constance.py:35 +#: evibes/settings/constance.py:36 msgid "Payment gateway URL" msgstr "付款网关 URL" -#: evibes/settings/constance.py:36 +#: evibes/settings/constance.py:37 msgid "Payment gateway token" msgstr "支付网关令牌" -#: evibes/settings/constance.py:37 +#: evibes/settings/constance.py:38 msgid "Payment gateway minimum amount" msgstr "支付网关最低金额" -#: evibes/settings/constance.py:38 +#: evibes/settings/constance.py:39 msgid "Payment gateway maximum amount" msgstr "支付网关最高限额" -#: evibes/settings/constance.py:39 +#: evibes/settings/constance.py:40 msgid "Exchange rate API key" msgstr "汇率 API 密钥" -#: evibes/settings/constance.py:40 +#: evibes/settings/constance.py:41 msgid "OpenStreetMap Nominatim API URL" msgstr "OpenStreetMap Nominatim API URL" -#: evibes/settings/constance.py:41 +#: evibes/settings/constance.py:42 msgid "OpenAI API Key" msgstr "OpenAI API 密钥" -#: evibes/settings/constance.py:42 +#: evibes/settings/constance.py:43 msgid "Abstract API Key" msgstr "抽象应用程序接口密钥" -#: evibes/settings/constance.py:43 +#: evibes/settings/constance.py:44 msgid "HTTP Proxy" msgstr "HTTP 代理服务器" -#: evibes/settings/constance.py:44 +#: evibes/settings/constance.py:45 msgid "Disable buy functionality" msgstr "禁用购买功能" -#: evibes/settings/constance.py:45 +#: evibes/settings/constance.py:46 msgid "An entity for storing advertisiment data" msgstr "存储广告数据的实体" -#: evibes/settings/constance.py:46 +#: evibes/settings/constance.py:47 msgid "An entity for storing analytics data" msgstr "存储分析数据的实体" -#: evibes/settings/constance.py:47 +#: evibes/settings/constance.py:48 msgid "Save responses from vendors' APIs" msgstr "保存来自供应商应用程序接口的响应" -#: evibes/settings/constance.py:53 +#: evibes/settings/constance.py:54 msgid "General Options" msgstr "一般选项" -#: evibes/settings/constance.py:61 +#: evibes/settings/constance.py:62 msgid "Email Options" msgstr "电子邮件选项" -#: evibes/settings/constance.py:70 +#: evibes/settings/constance.py:72 msgid "Payment Gateway Options" msgstr "支付网关选项" -#: evibes/settings/constance.py:77 +#: evibes/settings/constance.py:79 msgid "Features Options" msgstr "功能选项" -#: evibes/settings/constance.py:84 +#: evibes/settings/constance.py:86 msgid "SEO Options" msgstr "搜索引擎优化选项" -#: evibes/settings/constance.py:88 +#: evibes/settings/constance.py:90 msgid "Debugging Options" msgstr "调试选项" diff --git a/evibes/pagination.py b/evibes/pagination.py index 99a9bd17..5cd24bd5 100644 --- a/evibes/pagination.py +++ b/evibes/pagination.py @@ -1,3 +1,5 @@ +from typing import Any + from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response @@ -5,7 +7,7 @@ from rest_framework.response import Response class CustomPagination(PageNumberPagination): page_size_query_param: str = "page_size" # name of the query parameter, you can use any - def get_paginated_response(self, data: dict) -> Response: + def get_paginated_response(self, data: dict[str, Any]) -> Response: return Response( { "links": {"forward": self.get_next_link(), "backward": self.get_previous_link()}, @@ -18,7 +20,7 @@ class CustomPagination(PageNumberPagination): } ) - def get_paginated_response_schema(self, data_schema: dict) -> dict: + def get_paginated_response_schema(self, data_schema: dict[str, Any]) -> dict[str, Any]: return { "type": "object", "properties": { diff --git a/evibes/settings/base.py b/evibes/settings/base.py index 1660156e..25c66bdf 100644 --- a/evibes/settings/base.py +++ b/evibes/settings/base.py @@ -2,8 +2,9 @@ import logging from datetime import datetime from os import getenv, name from pathlib import Path +from typing import Any -EVIBES_VERSION = "3.0.0" +EVIBES_VERSION = "3.1.0" RELEASE_DATE = datetime(2025, 9, 13) BASE_DIR = Path(__file__).resolve().parent.parent.parent @@ -29,9 +30,9 @@ else: for entry in getenv("ALLOWED_HOSTS", "").split(" "): ALLOWED_HOSTS.add(entry) -ALLOWED_HOSTS: tuple = tuple(ALLOWED_HOSTS) +ALLOWED_HOSTS: tuple[str, ...] = tuple(ALLOWED_HOSTS) -CSRF_TRUSTED_ORIGINS: set = { +CSRF_TRUSTED_ORIGINS: set[str] = { "http://127.0.0.1", "http://api.localhost", "http://b2b.localhost", @@ -40,12 +41,12 @@ CSRF_TRUSTED_ORIGINS: set = { for entry in getenv("CSRF_TRUSTED_ORIGINS", "").split(" "): CSRF_TRUSTED_ORIGINS.add(entry) -CSRF_TRUSTED_ORIGINS: tuple = tuple(CSRF_TRUSTED_ORIGINS) +CSRF_TRUSTED_ORIGINS: tuple[str, ...] = tuple(CSRF_TRUSTED_ORIGINS) if DEBUG: CORS_ALLOW_ALL_ORIGINS = True else: - CORS_ALLOWED_ORIGINS: set = { + CORS_ALLOWED_ORIGINS: set[str] = { "http://127.0.0.1", "http://api.localhost", "http://b2b.localhost", @@ -53,7 +54,7 @@ else: for entry in getenv("CORS_ALLOWED_ORIGINS", "").split(" "): CORS_ALLOWED_ORIGINS.add(entry) - CORS_ALLOWED_ORIGINS: tuple = tuple(CORS_ALLOWED_ORIGINS) + CORS_ALLOWED_ORIGINS: tuple[str, ...] = tuple(CORS_ALLOWED_ORIGINS) CORS_ALLOW_METHODS = ( "DELETE", @@ -166,7 +167,7 @@ MIDDLEWARE: list[str] = [ "django_prometheus.middleware.PrometheusAfterMiddleware", ] -TEMPLATES: list[dict] = [ +TEMPLATES: list[dict[str, str | list[str | Path] | dict[str, str | list[str]] | Path | bool]] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ @@ -244,7 +245,7 @@ CURRENCIES: tuple[tuple[str, str], ...] = ( CURRENCY_CODE: str = dict(CURRENCIES).get(LANGUAGE_CODE) # type: ignore [assignment] -MODELTRANSLATION_FALLBACK_LANGUAGES: tuple = (LANGUAGE_CODE, "en-us", "de-de") +MODELTRANSLATION_FALLBACK_LANGUAGES: tuple[str, ...] = (LANGUAGE_CODE, "en-us", "de-de") ROOT_URLCONF: str = "evibes.urls" @@ -296,10 +297,11 @@ if getenv("SENTRY_DSN"): from sentry_sdk.integrations.django import DjangoIntegration from sentry_sdk.integrations.logging import LoggingIntegration from sentry_sdk.integrations.redis import RedisIntegration + from sentry_sdk.types import Event, Hint - def scrub_sensitive(data): + def scrub_sensitive(data: dict[str, Any] | list[Any] | str) -> dict[str, Any] | list[Any] | str | None: if isinstance(data, dict): - cleaned = {} + cleaned: dict[str, Any] = {} for key, value in data.items(): if key.lower() in ("password", "confirm_password"): cleaned[key] = "[FILTERED]" @@ -310,12 +312,13 @@ if getenv("SENTRY_DSN"): return [scrub_sensitive(item) for item in data] return data - def before_send(event, hint): + def before_send(event: Event, hint: Hint) -> Event: if hint: pass request = event.get("request", {}) - if "data" in request: - request["data"] = scrub_sensitive(request["data"]) + data = request.get("data", {}) + if data: + request["data"] = scrub_sensitive(data) # type: ignore [arg-type] event["request"] = request return event diff --git a/evibes/settings/caches.py b/evibes/settings/caches.py index 722ca800..0216984b 100644 --- a/evibes/settings/caches.py +++ b/evibes/settings/caches.py @@ -1,6 +1,7 @@ import sys +from os import getenv -from evibes.settings.base import REDIS_PASSWORD, getenv +from evibes.settings.base import REDIS_PASSWORD CACHES = { "default": { diff --git a/evibes/settings/constance.py b/evibes/settings/constance.py index a919c669..c286d8be 100644 --- a/evibes/settings/constance.py +++ b/evibes/settings/constance.py @@ -1,8 +1,8 @@ from collections import OrderedDict +from os import getenv -from django.utils.translation import gettext_lazy as _, gettext_noop - -from evibes.settings.base import getenv +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext_noop CONSTANCE_BACKEND = "constance.backends.database.DatabaseBackend" CONSTANCE_SUPERUSER_ONLY = False @@ -25,6 +25,7 @@ CONSTANCE_CONFIG = OrderedDict( ("COMPANY_NAME", (getenv("COMPANY_NAME"), _("Name of the company"))), ("COMPANY_ADDRESS", (getenv("COMPANY_ADDRESS"), _("Address of the company"))), ("COMPANY_PHONE_NUMBER", (getenv("COMPANY_PHONE_NUMBER"), _("Phone number of the company"))), + ("EMAIL_BACKEND", ("django.core.mail.backends.smtp.EmailBackend", _("!!!DO NOT CHANGE"))), ("EMAIL_HOST", (getenv("EMAIL_HOST", "smtp.404.org"), _("SMTP host"))), ("EMAIL_PORT", (int(getenv("EMAIL_PORT", "465")), _("SMTP port"))), ("EMAIL_USE_TLS", (bool(int(getenv("EMAIL_USE_TLS", 0))), _("Use TLS (0=No, 1=Yes)"))), @@ -59,6 +60,7 @@ CONSTANCE_CONFIG_FIELDSETS = OrderedDict( "COMPANY_PHONE_NUMBER", ), gettext_noop("Email Options"): ( + "EMAIL_BACKEND", "EMAIL_HOST", "EMAIL_PORT", "EMAIL_USE_TLS", diff --git a/evibes/settings/drf.py b/evibes/settings/drf.py index afd4ab65..1f3f636e 100644 --- a/evibes/settings/drf.py +++ b/evibes/settings/drf.py @@ -4,7 +4,7 @@ from os import getenv from evibes.settings.base import DEBUG, EVIBES_VERSION, SECRET_KEY from evibes.settings.constance import CONSTANCE_CONFIG -REST_FRAMEWORK: dict = { +REST_FRAMEWORK: dict[str, str | int | list[str] | tuple[str, ...] | dict[str, bool]] = { "DEFAULT_PAGINATION_CLASS": "evibes.pagination.CustomPagination", "PAGE_SIZE": 30, "DEFAULT_AUTHENTICATION_CLASSES": [ @@ -45,15 +45,14 @@ SIMPLE_JWT: dict[str, timedelta | str | bool] = { "AUTH_HEADER_NAME": "HTTP_X_EVIBES_AUTH", } -SPECTACULAR_B2B_DESCRIPTION = ( # type: ignore [index] - f""" +SPECTACULAR_B2B_DESCRIPTION = f""" Welcome to the { - CONSTANCE_CONFIG.get("PROJECT_NAME")[0] # type: ignore [index] - } B2B API documentation. + CONSTANCE_CONFIG.get("PROJECT_NAME")[0] # type: ignore [index] +} B2B API documentation. The { - CONSTANCE_CONFIG.get("PROJECT_NAME")[0] # type: ignore [index] - } B2B API is designed to provide seamless integration for merchants selling a wide range of electronics. Through this API, partnered merchants can manage products, orders, and inventory with ease, while accessing real-time stock levels. + CONSTANCE_CONFIG.get("PROJECT_NAME")[0] # type: ignore [index] +} B2B API is designed to provide seamless integration for merchants selling a wide range of electronics. Through this API, partnered merchants can manage products, orders, and inventory with ease, while accessing real-time stock levels. ## Key Features - **Product Management:** Easily create, update, and manage your product listings with detailed specifications. @@ -71,8 +70,7 @@ The { ## Version Current API version: {EVIBES_VERSION} -""" -) # noqa: E501, F405 +""" # noqa: E501, F405 SPECTACULAR_PLATFORM_DESCRIPTION = f""" Welcome to the { diff --git a/evibes/utils/misc.py b/evibes/utils/misc.py index 19d2c1b3..63c60fe3 100644 --- a/evibes/utils/misc.py +++ b/evibes/utils/misc.py @@ -1,7 +1,8 @@ from importlib import import_module +from typing import Any -def create_object(module_name, class_name, *args, **kwargs): +def create_object(module_name: str, class_name: str, *args: list[Any], **kwargs: dict[Any, Any]) -> object: module = import_module(module_name) cls = getattr(module, class_name) diff --git a/payments/admin.py b/payments/admin.py index d53f51b8..bc22b6dc 100644 --- a/payments/admin.py +++ b/payments/admin.py @@ -1,5 +1,7 @@ from django.contrib import admin from django.contrib.admin import ModelAdmin, register +from django.db.models import QuerySet +from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ from core.admin import ActivationActionsMixin @@ -7,7 +9,7 @@ from payments.forms import TransactionForm from payments.models import Balance, Transaction -class TransactionInline(admin.TabularInline): +class TransactionInline(admin.TabularInline): # type: ignore [type-arg] model = Transaction form = TransactionForm extra = 1 @@ -15,25 +17,25 @@ class TransactionInline(admin.TabularInline): verbose_name = _("transaction") verbose_name_plural = _("transactions") - def get_queryset(self, request): + def get_queryset(self, request: HttpRequest) -> QuerySet[Transaction]: qs = super().get_queryset(request) return qs.select_related("order") @register(Balance) -class BalanceAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class BalanceAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] inlines = (TransactionInline,) list_display = ("user", "amount") search_fields = ("user__email",) ordering = ("user",) - def get_queryset(self, request): + def get_queryset(self, request: HttpRequest) -> QuerySet[Balance]: qs = super().get_queryset(request) return qs.prefetch_related("transactions", "user") @register(Transaction) -class TransactionAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc] +class TransactionAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] list_display = ("balance", "amount", "order", "modified", "created") search_fields = ("balance__user__email", "currency", "payment_method") list_filter = ("currency", "payment_method") diff --git a/payments/apps.py b/payments/apps.py index c4912bea..459bcbc8 100644 --- a/payments/apps.py +++ b/payments/apps.py @@ -10,5 +10,5 @@ class PaymentsConfig(AppConfig): priority = 87 hide = False - def ready(self): + def ready(self) -> None: import payments.signals # noqa: F401 diff --git a/payments/forms.py b/payments/forms.py index 100093a1..00952e67 100644 --- a/payments/forms.py +++ b/payments/forms.py @@ -4,7 +4,7 @@ from core.widgets import JSONTableWidget from payments.models import Transaction -class TransactionForm(forms.ModelForm): +class TransactionForm(forms.ModelForm): # type: ignore [type-arg] class Meta: model = Transaction fields = "__all__" diff --git a/payments/gateways/__init__.py b/payments/gateways/__init__.py index 4c935ff4..f4926b44 100644 --- a/payments/gateways/__init__.py +++ b/payments/gateways/__init__.py @@ -1,12 +1,15 @@ +from payments.models import Transaction + + class UnknownGatewayError(Exception): pass class AbstractGateway: @staticmethod - def process_transaction(transaction) -> None: + def process_transaction(transaction: Transaction) -> None: raise NotImplementedError @staticmethod - def process_callback(transaction) -> None: + def process_callback(transaction: Transaction) -> None: raise NotImplementedError diff --git a/payments/graphene/mutations.py b/payments/graphene/mutations.py index 2800c63a..aa162a04 100644 --- a/payments/graphene/mutations.py +++ b/payments/graphene/mutations.py @@ -18,6 +18,7 @@ class Deposit(BaseMutation): transaction = Transaction.objects.create( balance=info.context.user.payments_balance, amount=amount, currency="EUR" ) + # noinspection PyTypeChecker return Deposit(transaction=transaction) else: raise PermissionDenied(permission_denied_message) diff --git a/payments/locale/ar_AR/LC_MESSAGES/django.po b/payments/locale/ar_AR/LC_MESSAGES/django.po index 4a09c67c..fe776b91 100644 --- a/payments/locale/ar_AR/LC_MESSAGES/django.po +++ b/payments/locale/ar_AR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "مطلوب مزود للحصول على الأسعار من" msgid "couldn't find provider {provider}" msgstr "تعذر العثور على مزود {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | إيداع الرصيد" diff --git a/payments/locale/cs_CZ/LC_MESSAGES/django.po b/payments/locale/cs_CZ/LC_MESSAGES/django.po index 627bf8e0..0aba8fa9 100644 --- a/payments/locale/cs_CZ/LC_MESSAGES/django.po +++ b/payments/locale/cs_CZ/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Je třeba mít poskytovatele, od kterého lze získat sazby" msgid "couldn't find provider {provider}" msgstr "Nepodařilo se najít poskytovatele {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Zůstatek vkladu" diff --git a/payments/locale/da_DK/LC_MESSAGES/django.po b/payments/locale/da_DK/LC_MESSAGES/django.po index f143c160..9548cd21 100644 --- a/payments/locale/da_DK/LC_MESSAGES/django.po +++ b/payments/locale/da_DK/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Der er brug for en udbyder at få priser fra" msgid "couldn't find provider {provider}" msgstr "Kunne ikke finde udbyder {provider}." -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Saldoindbetaling" diff --git a/payments/locale/de_DE/LC_MESSAGES/django.po b/payments/locale/de_DE/LC_MESSAGES/django.po index 0e4d6aa3..0c622690 100644 --- a/payments/locale/de_DE/LC_MESSAGES/django.po +++ b/payments/locale/de_DE/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Sie benötigen einen Anbieter, bei dem Sie die Preise erfragen können." msgid "couldn't find provider {provider}" msgstr "Anbieter {provider} konnte nicht gefunden werden" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Saldo Einzahlung" diff --git a/payments/locale/en_GB/LC_MESSAGES/django.po b/payments/locale/en_GB/LC_MESSAGES/django.po index c37a3f4e..8625fd57 100644 --- a/payments/locale/en_GB/LC_MESSAGES/django.po +++ b/payments/locale/en_GB/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 Egor "fureunoir" Gorbunov # This file is distributed under the same license as the eVibes package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -120,7 +120,7 @@ msgstr "A provider to get rates from is required" msgid "couldn't find provider {provider}" msgstr "Couldn't find provider {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Balance Deposit" diff --git a/payments/locale/en_US/LC_MESSAGES/django.po b/payments/locale/en_US/LC_MESSAGES/django.po index 5b3d96bf..6e717825 100644 --- a/payments/locale/en_US/LC_MESSAGES/django.po +++ b/payments/locale/en_US/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "A provider to get rates from is required" msgid "couldn't find provider {provider}" msgstr "Couldn't find provider {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Balance Deposit" diff --git a/payments/locale/es_ES/LC_MESSAGES/django.po b/payments/locale/es_ES/LC_MESSAGES/django.po index 41dd39f9..ee25342d 100644 --- a/payments/locale/es_ES/LC_MESSAGES/django.po +++ b/payments/locale/es_ES/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -117,7 +117,7 @@ msgstr "Se necesita un proveedor del que obtener tarifas" msgid "couldn't find provider {provider}" msgstr "No se pudo encontrar el proveedor {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Depósito de saldo" diff --git a/payments/locale/fa_IR/LC_MESSAGES/django.po b/payments/locale/fa_IR/LC_MESSAGES/django.po index 9a843d76..a27c2656 100644 --- a/payments/locale/fa_IR/LC_MESSAGES/django.po +++ b/payments/locale/fa_IR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -113,7 +113,7 @@ msgstr "" msgid "couldn't find provider {provider}" msgstr "" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "" diff --git a/payments/locale/fr_FR/LC_MESSAGES/django.po b/payments/locale/fr_FR/LC_MESSAGES/django.po index 0435702a..f3b39475 100644 --- a/payments/locale/fr_FR/LC_MESSAGES/django.po +++ b/payments/locale/fr_FR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -117,7 +117,7 @@ msgstr "Il est nécessaire de disposer d'un fournisseur pour obtenir des tarifs" msgid "couldn't find provider {provider}" msgstr "Impossible de trouver le fournisseur {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Dépôt de solde" diff --git a/payments/locale/he_IL/LC_MESSAGES/django.po b/payments/locale/he_IL/LC_MESSAGES/django.po index afbc9763..80f88319 100644 --- a/payments/locale/he_IL/LC_MESSAGES/django.po +++ b/payments/locale/he_IL/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -113,7 +113,7 @@ msgstr "נדרש ספק ממנו ניתן לקבל תעריפים" msgid "couldn't find provider {provider}" msgstr "לא ניתן למצוא את הספק {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | הפקדת יתרה" diff --git a/payments/locale/hi_IN/LC_MESSAGES/django.po b/payments/locale/hi_IN/LC_MESSAGES/django.po index 18e95b2a..6c60edb2 100644 --- a/payments/locale/hi_IN/LC_MESSAGES/django.po +++ b/payments/locale/hi_IN/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -113,7 +113,7 @@ msgstr "" msgid "couldn't find provider {provider}" msgstr "" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "" diff --git a/payments/locale/hr_HR/LC_MESSAGES/django.po b/payments/locale/hr_HR/LC_MESSAGES/django.po index 9a843d76..a27c2656 100644 --- a/payments/locale/hr_HR/LC_MESSAGES/django.po +++ b/payments/locale/hr_HR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -113,7 +113,7 @@ msgstr "" msgid "couldn't find provider {provider}" msgstr "" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "" diff --git a/payments/locale/id_ID/LC_MESSAGES/django.po b/payments/locale/id_ID/LC_MESSAGES/django.po index 914ea390..665d1d34 100644 --- a/payments/locale/id_ID/LC_MESSAGES/django.po +++ b/payments/locale/id_ID/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -118,7 +118,7 @@ msgstr "Diperlukan penyedia layanan untuk mendapatkan tarif" msgid "couldn't find provider {provider}" msgstr "Tidak dapat menemukan penyedia {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Setoran Saldo" diff --git a/payments/locale/it_IT/LC_MESSAGES/django.po b/payments/locale/it_IT/LC_MESSAGES/django.po index 2aae43dd..cbd317db 100644 --- a/payments/locale/it_IT/LC_MESSAGES/django.po +++ b/payments/locale/it_IT/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -117,7 +117,7 @@ msgstr "È necessario un fornitore da cui ottenere le tariffe" msgid "couldn't find provider {provider}" msgstr "Impossibile trovare il fornitore {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Deposito a saldo" diff --git a/payments/locale/ja_JP/LC_MESSAGES/django.po b/payments/locale/ja_JP/LC_MESSAGES/django.po index fc409987..7b633e71 100644 --- a/payments/locale/ja_JP/LC_MESSAGES/django.po +++ b/payments/locale/ja_JP/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "レートを取得するプロバイダーが必要" msgid "couldn't find provider {provider}" msgstr "プロバイダーが見つかりませんでした {provider} 。" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME}| 預金残高" diff --git a/payments/locale/kk_KZ/LC_MESSAGES/django.po b/payments/locale/kk_KZ/LC_MESSAGES/django.po index 18e95b2a..6c60edb2 100644 --- a/payments/locale/kk_KZ/LC_MESSAGES/django.po +++ b/payments/locale/kk_KZ/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -113,7 +113,7 @@ msgstr "" msgid "couldn't find provider {provider}" msgstr "" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "" diff --git a/payments/locale/ko_KR/LC_MESSAGES/django.po b/payments/locale/ko_KR/LC_MESSAGES/django.po index 0efeec33..b23a48cb 100644 --- a/payments/locale/ko_KR/LC_MESSAGES/django.po +++ b/payments/locale/ko_KR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "요금을 받을 공급업체가 필요합니다." msgid "couldn't find provider {provider}" msgstr "공급자를 찾을 수 없습니다 {provider}." -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | 잔액 입금" diff --git a/payments/locale/nl_NL/LC_MESSAGES/django.po b/payments/locale/nl_NL/LC_MESSAGES/django.po index d30f2d5e..139f7067 100644 --- a/payments/locale/nl_NL/LC_MESSAGES/django.po +++ b/payments/locale/nl_NL/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Een provider om tarieven van te krijgen is vereist" msgid "couldn't find provider {provider}" msgstr "Kon provider {provider} niet vinden." -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Saldo storting" diff --git a/payments/locale/no_NO/LC_MESSAGES/django.po b/payments/locale/no_NO/LC_MESSAGES/django.po index e390a3fa..2efd029b 100644 --- a/payments/locale/no_NO/LC_MESSAGES/django.po +++ b/payments/locale/no_NO/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Det kreves en leverandør å få priser fra" msgid "couldn't find provider {provider}" msgstr "Fant ikke leverandøren {provider}." -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Saldo innskudd" diff --git a/payments/locale/pl_PL/LC_MESSAGES/django.po b/payments/locale/pl_PL/LC_MESSAGES/django.po index 7e97df87..2024519a 100644 --- a/payments/locale/pl_PL/LC_MESSAGES/django.po +++ b/payments/locale/pl_PL/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -117,7 +117,7 @@ msgstr "Wymagany jest dostawca, od którego można uzyskać stawki" msgid "couldn't find provider {provider}" msgstr "Nie można znaleźć dostawcy {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Wpłata salda" diff --git a/payments/locale/pt_BR/LC_MESSAGES/django.po b/payments/locale/pt_BR/LC_MESSAGES/django.po index d9de6ed9..9fdc5f4f 100644 --- a/payments/locale/pt_BR/LC_MESSAGES/django.po +++ b/payments/locale/pt_BR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "É necessário um provedor para obter as tarifas" msgid "couldn't find provider {provider}" msgstr "Não foi possível encontrar o provedor {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Depósito de saldo" diff --git a/payments/locale/ro_RO/LC_MESSAGES/django.po b/payments/locale/ro_RO/LC_MESSAGES/django.po index ab203915..0447ddf6 100644 --- a/payments/locale/ro_RO/LC_MESSAGES/django.po +++ b/payments/locale/ro_RO/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Este necesar un furnizor de la care să se obțină tarife" msgid "couldn't find provider {provider}" msgstr "Nu am putut găsi furnizorul {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Depozit sold" diff --git a/payments/locale/ru_RU/LC_MESSAGES/django.po b/payments/locale/ru_RU/LC_MESSAGES/django.po index 3f69d633..e1c52505 100644 --- a/payments/locale/ru_RU/LC_MESSAGES/django.po +++ b/payments/locale/ru_RU/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Требуется поставщик, у которого можно п msgid "couldn't find provider {provider}" msgstr "Не удалось найти провайдера {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Депозит баланса" diff --git a/payments/locale/sv_SE/LC_MESSAGES/django.po b/payments/locale/sv_SE/LC_MESSAGES/django.po index 22efd0ff..3da424e9 100644 --- a/payments/locale/sv_SE/LC_MESSAGES/django.po +++ b/payments/locale/sv_SE/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "En leverantör att få priser från krävs" msgid "couldn't find provider {provider}" msgstr "Kunde inte hitta leverantören {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Saldo insättning" diff --git a/payments/locale/th_TH/LC_MESSAGES/django.po b/payments/locale/th_TH/LC_MESSAGES/django.po index e00bbdfc..79d7533f 100644 --- a/payments/locale/th_TH/LC_MESSAGES/django.po +++ b/payments/locale/th_TH/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -114,7 +114,7 @@ msgstr "จำเป็นต้องมีผู้ให้บริการ msgid "couldn't find provider {provider}" msgstr "ไม่พบผู้ให้บริการ {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | ยอดเงินฝากคงเหลือ" diff --git a/payments/locale/tr_TR/LC_MESSAGES/django.po b/payments/locale/tr_TR/LC_MESSAGES/django.po index d28f86f4..492a9e41 100644 --- a/payments/locale/tr_TR/LC_MESSAGES/django.po +++ b/payments/locale/tr_TR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -117,7 +117,7 @@ msgstr "Fiyat almak için bir sağlayıcı gereklidir" msgid "couldn't find provider {provider}" msgstr "Sağlayıcı bulunamadı {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Bakiye Yatırma" diff --git a/payments/locale/vi_VN/LC_MESSAGES/django.po b/payments/locale/vi_VN/LC_MESSAGES/django.po index 4b5f3dcb..9b487eaf 100644 --- a/payments/locale/vi_VN/LC_MESSAGES/django.po +++ b/payments/locale/vi_VN/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "Cần có nhà cung cấp để lấy báo giá." msgid "couldn't find provider {provider}" msgstr "Không thể tìm thấy nhà cung cấp {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME} | Số dư tiền gửi" diff --git a/payments/locale/zh_Hans/LC_MESSAGES/django.po b/payments/locale/zh_Hans/LC_MESSAGES/django.po index bf63dffc..dd12d1fc 100644 --- a/payments/locale/zh_Hans/LC_MESSAGES/django.po +++ b/payments/locale/zh_Hans/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -116,7 +116,7 @@ msgstr "需要提供商提供费率" msgid "couldn't find provider {provider}" msgstr "找不到提供商 {provider}" -#: payments/utils/emailing.py:31 +#: payments/utils/emailing.py:27 #, python-brace-format msgid "{config.PROJECT_NAME} | balance deposit" msgstr "{config.PROJECT_NAME}| 余额存款" diff --git a/payments/serializers.py b/payments/serializers.py index faa92d4c..6062c3a0 100644 --- a/payments/serializers.py +++ b/payments/serializers.py @@ -4,17 +4,17 @@ from rest_framework.serializers import ModelSerializer, Serializer from payments.models import Transaction -class DepositSerializer(Serializer): +class DepositSerializer(Serializer): # type: ignore [type-arg] amount = FloatField(required=True) -class TransactionSerializer(ModelSerializer): +class TransactionSerializer(ModelSerializer): # type: ignore [type-arg] class Meta: model = Transaction fields = "__all__" -class TransactionProcessSerializer(ModelSerializer): +class TransactionProcessSerializer(ModelSerializer): # type: ignore [type-arg] process = JSONField(required=True) order_hr_id = SerializerMethodField(read_only=True, required=False) order_uuid = SerializerMethodField(read_only=True, required=False) diff --git a/payments/signals.py b/payments/signals.py index 922de735..dfaae48a 100644 --- a/payments/signals.py +++ b/payments/signals.py @@ -1,5 +1,6 @@ import logging import traceback +from typing import Any from django.db.models.signals import post_save from django.dispatch import receiver @@ -12,14 +13,16 @@ from vibes_auth.models import User logger = logging.getLogger("django") +# noinspection PyUnusedLocal @receiver(post_save, sender=User) -def create_balance_on_user_creation_signal(instance, created, **_kwargs): +def create_balance_on_user_creation_signal(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None: if created: Balance.objects.create(user=instance) +# noinspection PyUnusedLocal @receiver(post_save, sender=Transaction) -def process_transaction_changes(instance, created, **_kwargs): +def process_transaction_changes(instance: Transaction, created: bool, **kwargs: dict[Any, Any]) -> None: if created: try: gateway = None @@ -39,4 +42,4 @@ def process_transaction_changes(instance, created, **_kwargs): success = instance.process.get("success", False) if ("success" in status or success) and (instance.process.get("notify", False)): - balance_deposit_email.delay(instance.uuid) + balance_deposit_email.delay(instance.uuid) # type: ignore [attr-defined] diff --git a/payments/tests.py b/payments/tests.py index 0a9babfe..e69de29b 100644 --- a/payments/tests.py +++ b/payments/tests.py @@ -1,193 +0,0 @@ -# payments/tests/test_payments.py - - -import graphene -from django.contrib.auth import get_user_model -from django.contrib.auth.models import AnonymousUser -from django.test import TestCase -from graphene.test import Client as GrapheneClient -from rest_framework import status -from rest_framework.test import APIRequestFactory, force_authenticate - -from payments.graphene.mutations import Deposit # the GraphQL Deposit mutation -from payments.models import Balance, Transaction -from payments.views import CallbackAPIView, DepositView - -############################################################################### -# Model Tests -############################################################################### - - -# noinspection PyArgumentList -class BalanceModelTests(TestCase): - def setUp(self): - self.user_model = get_user_model() - # Create a user – the post-save signal will auto-create a Balance. - self.user = self.user_model.objects.create_user(email="test@example.com", password="pass") - self.balance = Balance.objects.get(user=self.user) - - def test_balance_rounding(self): - """ - If the balance amount has more than two decimal places, - the save() method should round it to 2 decimals. - """ - self.balance.amount = 10.129 - self.balance.save() - self.balance.refresh_from_db() - # round(10.129, 2) == 10.13 - self.assertAlmostEqual(float(self.balance.amount), 10.13, places=2) - - -# noinspection PyArgumentList -class TransactionModelTests(TestCase): - def setUp(self): - self.user_model = get_user_model() - self.user = self.user_model.objects.create_user(email="trans_test@example.com", password="pass") - self.balance = Balance.objects.get(user=self.user) - - def test_transaction_rounding(self): - """ - When a Transaction is saved with an amount having more than two decimals, - it should be rounded to 2 decimal places. - """ - t = Transaction(balance=self.balance, amount=5.6789, currency="EUR", payment_method="card") - t.save() - self.assertAlmostEqual(t.amount, 5.68, places=2) - - def test_transaction_zero_amount_raises(self): - """ - Saving a Transaction with a 0 amount should raise a ValueError. - """ - with self.assertRaises(ValueError): - t = Transaction(balance=self.balance, amount=0.0, currency="EUR", payment_method="card") - t.save() - - -############################################################################### -# API (View) Tests -############################################################################### - - -# noinspection PyArgumentList -class DepositViewTests(TestCase): - def setUp(self): - self.factory = APIRequestFactory() - self.user_model = get_user_model() - self.user = self.user_model.objects.create_user(email="deposit@example.com", password="pass") - self.deposit_view = DepositView.as_view() - - def test_deposit_view_unauthenticated(self): - """ - An unauthenticated user should receive a 401 Unauthorized response. - """ - request = self.factory.post("/deposit/", {"amount": 100.0}) - # Do not attach a user to the request. - response = self.deposit_view(request) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_deposit_view_authenticated(self): - """ - An authenticated user posting a deposit should get a 201 Created response - and a transaction with processing details. - """ - request = self.factory.post("/deposit/", {"amount": 100.0}) - force_authenticate(request, user=self.user) - response = self.deposit_view(request) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - # The response should include the 'process' field. - self.assertIn("process", response.data) - - -class CallbackViewTests(TestCase): - def setUp(self): - self.factory = APIRequestFactory() - self.callback_view = CallbackAPIView.as_view() - - def test_callback_view_unknown_gateway(self): - """ - If an unknown gateway is specified, the callback should return a 500 error. - """ - data = {"sample": "data"} - request = self.factory.post("/callback/?gateway=unknown", data, format="json") - response = self.callback_view(request) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) - - -############################################################################### -# Signal Tests -############################################################################### - - -# noinspection PyArgumentList -class SignalTests(TestCase): - def setUp(self): - self.user_model = get_user_model() - - def test_create_balance_on_user_creation(self): - """ - When a new User is created, the post_save signal should create an associated Balance. - """ - user = self.user_model.objects.create_user(email="signal@example.com", password="pass") - balance = Balance.objects.get(user=user) - self.assertIsNotNone(balance) - - -############################################################################### -# GraphQL Tests -############################################################################### - - -# noinspection PyArgumentList -class GraphQLDepositTests(TestCase): - def setUp(self): - self.user_model = get_user_model() - self.user = self.user_model.objects.create_user(email="graphql@example.com", password="pass") - # Ensure a Balance exists via the signal. - self.balance = Balance.objects.get(user=self.user) - - # Create a minimal schema including the Deposit mutation. - class Mutation(graphene.ObjectType): - deposit = Deposit.Field() - - self.schema = graphene.Schema(mutation=Mutation) - self.client = GrapheneClient(self.schema) - - def test_graphql_deposit_authenticated(self): - """ - An authenticated GraphQL deposit mutation should create a Transaction. - """ - mutation = """ - mutation Deposit($amount: Float!) { - deposit(amount: $amount) { - transaction { - id - amount - } - } - } - """ - result = self.client.post(mutation, variable_values={"amount": 100.0}, context_value={"user": self.user}) - # There should be no errors. - self.assertNotIn("errors", result) - transaction_data = result.get("data", "") - self.assertIsNotNone(transaction_data) - self.assertAlmostEqual(float(transaction_data), 100.0, places=2) - - def test_graphql_deposit_unauthenticated(self): - """ - An unauthenticated GraphQL deposit mutation should raise a permission error. - """ - mutation = """ - mutation Deposit($amount: Float!) { - deposit(amount: $amount) { - transaction { - id - amount - } - } - } - """ - result = self.client.post(mutation, variable_values={"amount": 100.0}, context_value={"user": AnonymousUser()}) - self.assertIn("errors", result) - error_message = result["errors"][0] - self.assertIn("permission", error_message.lower()) diff --git a/payments/utils/__init__.py b/payments/utils/__init__.py index 82d3e243..f8503c4a 100644 --- a/payments/utils/__init__.py +++ b/payments/utils/__init__.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _ from payments.utils.cbr import get_rates as get_rates_cbr -def get_rates(provider: str) -> dict[str, float]: +def get_rates(provider: str) -> dict[str, float] | None: if not provider: raise ValueError(_("a provider to get rates from is required")) diff --git a/payments/utils/cbr.py b/payments/utils/cbr.py index 7911ca4d..09352bae 100644 --- a/payments/utils/cbr.py +++ b/payments/utils/cbr.py @@ -3,13 +3,13 @@ from django.core.cache import cache from sentry_sdk import capture_exception -def get_rates() -> dict[str, float]: +def get_rates() -> dict[str, float] | None: try: - rates = cache.get("cbr_rates", None) + rates: dict[str, float] | None = cache.get("cbr_rates") if not rates: response = requests.get("https://www.cbr-xml-daily.ru/latest.js") - rates = response.json().get("rates") + rates: dict[str, float] = response.json().get("rates") cache.set("cbr_rates", rates, 60 * 60 * 24) return rates diff --git a/payments/utils/currencies.py b/payments/utils/currencies.py index 95ab5833..23dc2a4e 100644 --- a/payments/utils/currencies.py +++ b/payments/utils/currencies.py @@ -1,9 +1,11 @@ +from decimal import Decimal + import requests from constance import config from django.core.cache import cache -def update_currencies_to_euro(currency, amount): +def update_currencies_to_euro(currency: str, amount: str | float | int | Decimal) -> float: rates = cache.get("rates", None) if not rates: diff --git a/payments/utils/emailing.py b/payments/utils/emailing.py index 34df0767..b804b9ee 100644 --- a/payments/utils/emailing.py +++ b/payments/utils/emailing.py @@ -2,13 +2,12 @@ from datetime import datetime from celery.app import shared_task from constance import config -from django.core import mail from django.core.mail import EmailMessage from django.template.loader import render_to_string from django.utils.translation import activate from django.utils.translation import gettext_lazy as _ -from core.utils.constance import set_email_settings +from core.utils import get_dynamic_email_connection from payments.models import Transaction @@ -24,9 +23,6 @@ def balance_deposit_email(transaction_pk: str) -> tuple[bool, str]: activate(transaction.balance.user.language) - set_email_settings() - connection = mail.get_connection() - email = EmailMessage( _(f"{config.PROJECT_NAME} | balance deposit"), render_to_string( @@ -42,7 +38,7 @@ def balance_deposit_email(transaction_pk: str) -> tuple[bool, str]: ), to=[transaction.balance.user.email], from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" email.send() diff --git a/payments/views.py b/payments/views.py index 13904c47..a151d1c1 100644 --- a/payments/views.py +++ b/payments/views.py @@ -1,5 +1,6 @@ import logging import traceback +from typing import Any from drf_spectacular.utils import extend_schema, extend_schema_view from rest_framework import status @@ -33,7 +34,7 @@ class DepositView(APIView): user authentication, and creates a transaction. """ - def post(self, request: Request, *args, **kwargs) -> Response: + def post(self, request: Request, *args: list[Any], **kwargs: dict[Any, Any]) -> Response: logger.debug(request.__dict__) serializer = DepositSerializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -41,6 +42,7 @@ class DepositView(APIView): if not request.user.is_authenticated: return Response(data=serializer.errors, status=status.HTTP_401_UNAUTHORIZED) + # noinspection PyUnresolvedReferences transaction = Transaction.objects.create( balance=request.user.payments_balance, amount=serializer.validated_data["amount"], currency="EUR" ) @@ -68,7 +70,7 @@ class CallbackAPIView(APIView): a server error response if an unknown gateway or other issues occur. """ - def post(self, request: Request, *args, **kwargs) -> Response: + def post(self, request: Request, *args: list[Any], **kwargs: dict[Any, Any]) -> Response: logger.debug(f"{request.__dict__}\n") try: gateway = kwargs.get("gateway", "") diff --git a/payments/viewsets.py b/payments/viewsets.py index 957c7c49..bb6a08ea 100644 --- a/payments/viewsets.py +++ b/payments/viewsets.py @@ -6,7 +6,7 @@ from payments.serializers import TransactionSerializer class TransactionViewSet(ReadOnlyModelViewSet): # type: ignore - __doc__ = _( + __doc__ = _( # type: ignore [assignment] "ViewSet for handling read-only operations on the Transaction model. " "This class provides a read-only interface for interacting with transaction data. " "It uses the TransactionSerializer for serializing and deserializing " diff --git a/poetry.lock b/poetry.lock index 03bdf774..19d9d361 100644 --- a/poetry.lock +++ b/poetry.lock @@ -143,13 +143,13 @@ test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock [[package]] name = "asgiref" -version = "3.9.2" +version = "3.10.0" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.9" files = [ - {file = "asgiref-3.9.2-py3-none-any.whl", hash = "sha256:0b61526596219d70396548fc003635056856dba5d0d086f86476f10b33c75960"}, - {file = "asgiref-3.9.2.tar.gz", hash = "sha256:a0249afacb66688ef258ffe503528360443e2b9a8d8c4581b6ebefa58c841ef1"}, + {file = "asgiref-3.10.0-py3-none-any.whl", hash = "sha256:aef8a81283a34d0ab31630c9b7dfe70c812c95eba78171367ca8745e88124734"}, + {file = "asgiref-3.10.0.tar.gz", hash = "sha256:d89f2d8cd8b56dada7d52fa7dc8075baa08fb836560710d38c292a7a3f78c04e"}, ] [package.extras] @@ -194,23 +194,15 @@ files = [ [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - [[package]] name = "babel" version = "2.17.0" @@ -508,13 +500,13 @@ typing-extensions = ">=4.2.0" [[package]] name = "certifi" -version = "2025.8.3" +version = "2025.10.5" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" files = [ - {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, - {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, + {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, + {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, ] [[package]] @@ -1484,13 +1476,13 @@ redis = ["redis", "types-redis"] [[package]] name = "django-stubs-ext" -version = "5.2.5" +version = "5.2.7" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.10" files = [ - {file = "django_stubs_ext-5.2.5-py3-none-any.whl", hash = "sha256:9b4b8ac9d32f7e6c304fd05477f8688fae6ed57f6a0f9f4d074f9e55b5a3da14"}, - {file = "django_stubs_ext-5.2.5.tar.gz", hash = "sha256:ecc628df29d36cede638567c4e33ff485dd7a99f1552ad0cece8c60e9c3a8872"}, + {file = "django_stubs_ext-5.2.7-py3-none-any.whl", hash = "sha256:0466a7132587d49c5bbe12082ac9824d117a0dedcad5d0ada75a6e0d3aca6f60"}, + {file = "django_stubs_ext-5.2.7.tar.gz", hash = "sha256:b690655bd4cb8a44ae57abb314e0995dc90414280db8f26fff0cb9fb367d1cac"}, ] [package.dependencies] @@ -1701,13 +1693,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2025.9.1" +version = "2025.10.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf_spectacular_sidecar-2025.9.1-py3-none-any.whl", hash = "sha256:8e80625209b8a23ff27616db305b9ab71c2e2d1069dacd99720a9c11e429af50"}, - {file = "drf_spectacular_sidecar-2025.9.1.tar.gz", hash = "sha256:da2aa45da48fff76de7a1e357b84d1eb0b9df40ca89ec19d5fe94ad1037bb3c8"}, + {file = "drf_spectacular_sidecar-2025.10.1-py3-none-any.whl", hash = "sha256:f1de343184d1a938179ce363d318258fe1e5f02f2f774625272364835f1c42bd"}, + {file = "drf_spectacular_sidecar-2025.10.1.tar.gz", hash = "sha256:506a5a21ce1ad7211c28acb4e2112e213f6dc095a2052ee6ed6db1ffe8eb5a7b"}, ] [package.dependencies] @@ -2039,13 +2031,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.14" +version = "2.6.15" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e"}, - {file = "identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a"}, + {file = "identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757"}, + {file = "identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf"}, ] [package.extras] @@ -2053,13 +2045,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -2112,13 +2104,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.30.1" +version = "7.0.0" description = "IPython Kernel for Jupyter" optional = true -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4"}, - {file = "ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b"}, + {file = "ipykernel-7.0.0-py3-none-any.whl", hash = "sha256:28793cecaa6a669e3be80eb6d24803202388b6a955929b0a4e13404d8c92062b"}, + {file = "ipykernel-7.0.0.tar.gz", hash = "sha256:06aef83f27adbce00b23345aa70f749f907dc4ac6f4a41fe7bf5f780dc506225"}, ] [package.dependencies] @@ -2138,7 +2130,7 @@ traitlets = ">=5.4.0" [package.extras] cov = ["coverage[toml]", "matplotlib", "pytest-cov", "trio"] -docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx (<8.2.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<9)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] @@ -3587,19 +3579,19 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.4.0" +version = "4.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, - {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, + {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, + {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] [[package]] name = "pluggy" @@ -4099,13 +4091,13 @@ six = ">=1.5" [[package]] name = "python-json-logger" -version = "3.3.0" +version = "4.0.0" description = "JSON Log Formatter for the Python Logging Package" optional = true python-versions = ">=3.8" files = [ - {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"}, - {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"}, + {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, + {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, ] [package.extras] @@ -4170,18 +4162,20 @@ files = [ [[package]] name = "pywinpty" -version = "3.0.0" -description = "" +version = "3.0.2" +description = "Pseudo terminal support for Windows from Python." optional = true python-versions = ">=3.9" files = [ - {file = "pywinpty-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:327b6034e0dc38352c1c99a7c0b3e54941b4e506a5f21acce63609cd2ab6cce2"}, - {file = "pywinpty-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:29daa71ac5dcbe1496ef99f4cde85a732b1f0a3b71405d42177dbcf9ee405e5a"}, - {file = "pywinpty-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:1e0c4b01e5b03b1531d7c5d0e044b8c66dd0288c6d2b661820849f2a8d91aec3"}, - {file = "pywinpty-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:828cbe756b7e3d25d886fbd5691a1d523cd59c5fb79286bb32bb75c5221e7ba1"}, - {file = "pywinpty-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:de0cbe27b96e5a2cebd86c4a6b8b4139f978d9c169d44a8edc7e30e88e5d7a69"}, - {file = "pywinpty-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:007735316170ec1b6e773deadab5fe9ec4074dfdc06f27513fe87b8cfe45237d"}, - {file = "pywinpty-3.0.0.tar.gz", hash = "sha256:68f70e68a9f0766ffdea3fc500351cb7b9b012bcb8239a411f7ff0fc8f86dcb1"}, + {file = "pywinpty-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:65db57fd3387d71e8372b6a54269cbcd0f6dfa6d4616a29e0af749ec19f5c558"}, + {file = "pywinpty-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:327790d70e4c841ebd9d0f295a780177149aeb405bca44c7115a3de5c2054b23"}, + {file = "pywinpty-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:99fdd9b455f0ad6419aba6731a7a0d2f88ced83c3c94a80ff9533d95fa8d8a9e"}, + {file = "pywinpty-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51"}, + {file = "pywinpty-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b"}, + {file = "pywinpty-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a"}, + {file = "pywinpty-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767"}, + {file = "pywinpty-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:3962daf801bc38dd4de872108c424b5338c9a46c6efca5761854cd66370a9022"}, + {file = "pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004"}, ] [[package]] @@ -4495,13 +4489,13 @@ testing = ["pytest (>=8.3.5)"] [[package]] name = "rich" -version = "14.1.0" +version = "14.2.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" files = [ - {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"}, - {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"}, + {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, + {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, ] [package.dependencies] @@ -4995,13 +4989,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "types-python-dateutil" -version = "2.9.0.20250822" +version = "2.9.0.20251008" description = "Typing stubs for python-dateutil" optional = true python-versions = ">=3.9" files = [ - {file = "types_python_dateutil-2.9.0.20250822-py3-none-any.whl", hash = "sha256:849d52b737e10a6dc6621d2bd7940ec7c65fcb69e6aa2882acf4e56b2b508ddc"}, - {file = "types_python_dateutil-2.9.0.20250822.tar.gz", hash = "sha256:84c92c34bd8e68b117bff742bc00b692a1e8531262d4507b33afcc9f7716cd53"}, + {file = "types_python_dateutil-2.9.0.20251008-py3-none-any.whl", hash = "sha256:b9a5232c8921cf7661b29c163ccc56055c418ab2c6eabe8f917cbcc73a4c4157"}, + {file = "types_python_dateutil-2.9.0.20251008.tar.gz", hash = "sha256:c3826289c170c93ebd8360c3485311187df740166dbab9dd3b792e69f2bc1f9c"}, ] [[package]] @@ -5106,13 +5100,13 @@ files = [ [[package]] name = "virtualenv" -version = "20.34.0" +version = "20.35.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026"}, - {file = "virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a"}, + {file = "virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a"}, + {file = "virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44"}, ] [package.dependencies] @@ -5159,19 +5153,19 @@ files = [ [[package]] name = "websocket-client" -version = "1.8.0" +version = "1.9.0" description = "WebSocket client for Python with low level API options" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, + {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, + {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx_rtd_theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] -test = ["websockets"] +test = ["pytest", "websockets"] [[package]] name = "widgetsnbextension" diff --git a/pyproject.toml b/pyproject.toml index 9f9cf002..559eb970 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "eVibes" -version = "3.0.0" -description = "eVibes is an open-source eCommerce backend service built with Django. It’s designed for flexibility, making it ideal for various use cases and learning Django skills. The project is easy to customize, allowing for straightforward editing and extension." +version = "3.1.0" +description = "eVibes — your store without the extra baggage. Everything works out of the box: storefront, product catalog, cart, and orders. Minimal complexity, maximum flexibility — install, adjust to your needs, and start selling." authors = ["fureunoir "] readme = "README.md" package-mode = false @@ -103,9 +103,9 @@ testing = ["pytest", "pytest-django", "coverage"] linting = ["black", "isort", "flake8", "bandit"] [tool.mypy] -strict = true +strict = false disable_error_code = ["import-untyped", "no-redef"] -exclude = ["storefront/*"] +exclude = "(^|[\\/])(migrations|storefront)([\\/]|$)" plugins = ["mypy_django_plugin.main", "mypy_drf_plugin.main"] [tool.django-stubs] diff --git a/vibes_auth/admin.py b/vibes_auth/admin.py index 7dc34ba1..551ab544 100644 --- a/vibes_auth/admin.py +++ b/vibes_auth/admin.py @@ -1,3 +1,5 @@ +from typing import Any + from django.contrib import admin from django.contrib.auth.admin import ( GroupAdmin as BaseGroupAdmin, @@ -7,7 +9,8 @@ from django.contrib.auth.admin import ( ) from django.contrib.auth.models import Group as BaseGroup from django.contrib.auth.models import Permission -from django.db.models import Prefetch +from django.db.models import Prefetch, QuerySet +from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ from rest_framework_simplejwt.token_blacklist.admin import ( BlacklistedTokenAdmin as BaseBlacklistedTokenAdmin, @@ -29,7 +32,7 @@ from vibes_auth.forms import UserForm from vibes_auth.models import BlacklistedToken, Group, OutstandingToken, User -class BalanceInline(admin.TabularInline): +class BalanceInline(admin.TabularInline): # type: ignore [type-arg] model = Balance can_delete = False extra = 0 @@ -39,7 +42,7 @@ class BalanceInline(admin.TabularInline): icon = "fa-solid fa-wallet" -class OrderInline(admin.TabularInline): +class OrderInline(admin.TabularInline): # type: ignore [type-arg] model = Order extra = 0 verbose_name = _("order") @@ -48,7 +51,7 @@ class OrderInline(admin.TabularInline): icon = "fa-solid fa-cart-shopping" -class UserAdmin(ActivationActionsMixin, BaseUserAdmin): # type: ignore [misc] +class UserAdmin(ActivationActionsMixin, BaseUserAdmin): # type: ignore [misc, type-arg] inlines = (BalanceInline, OrderInline) fieldsets = ( (None, {"fields": ("email", "password")}), @@ -95,7 +98,7 @@ class UserAdmin(ActivationActionsMixin, BaseUserAdmin): # type: ignore [misc] readonly_fields = ("password",) form = UserForm - def get_queryset(self, request): + def get_queryset(self, request: HttpRequest) -> QuerySet[User]: qs = super().get_queryset(request) return qs.prefetch_related("groups", "payments_balance", "orders").prefetch_related( Prefetch( @@ -104,7 +107,7 @@ class UserAdmin(ActivationActionsMixin, BaseUserAdmin): # type: ignore [misc] ) ) - def save_model(self, request, obj, form, change): + def save_model(self, request: HttpRequest, obj: Any, form: UserForm, change: Any) -> None: if form.cleaned_data.get("attributes") is None: obj.attributes = None super().save_model(request, obj, form, change) diff --git a/vibes_auth/apps.py b/vibes_auth/apps.py index ae42c033..150780c2 100644 --- a/vibes_auth/apps.py +++ b/vibes_auth/apps.py @@ -10,5 +10,5 @@ class VibesAuthConfig(AppConfig): priority = 89 hide = False - def ready(self): + def ready(self) -> None: import vibes_auth.signals # noqa: F401 diff --git a/vibes_auth/forms.py b/vibes_auth/forms.py index 5330dc91..bd8f5e14 100644 --- a/vibes_auth/forms.py +++ b/vibes_auth/forms.py @@ -4,7 +4,7 @@ from core.widgets import JSONTableWidget from vibes_auth.models import User -class UserForm(ModelForm): +class UserForm(ModelForm): # type: ignore [type-arg] class Meta: model = User fields = "__all__" diff --git a/vibes_auth/graphene/mutations.py b/vibes_auth/graphene/mutations.py index 58c8931e..aaba1d36 100644 --- a/vibes_auth/graphene/mutations.py +++ b/vibes_auth/graphene/mutations.py @@ -70,10 +70,13 @@ class CreateUser(BaseMutation): language=language if language else LANGUAGE_CODE, attributes={"referrer": kwargs.get("referrer", "")} if kwargs.get("referrer", "") else {}, ) + # noinspection PyTypeChecker return CreateUser(success=True) else: + # noinspection PyTypeChecker return CreateUser(success=False) except IntegrityError: + # noinspection PyTypeChecker return CreateUser(success=True) except Exception as e: raise BadRequest(str(e)) from e @@ -179,6 +182,7 @@ class DeleteUser(BaseMutation): User.objects.get(email=email).delete() else: raise BadRequest("uuid or email must be specified") + # noinspection PyTypeChecker return DeleteUser(success=True) except User.DoesNotExist as dne: raise Http404(f"User with the given uuid: {uuid} or email: {email} does not exist.") from dne @@ -242,11 +246,13 @@ class VerifyJSONWebToken(BaseMutation): serializer.is_valid(raise_exception=True) user_uuid = serializer.validated_data["user"]["uuid"] user = User.objects.get(pk=user_uuid) + # noinspection PyTypeChecker return VerifyJSONWebToken( token_is_valid=True, user=user, ) except ValidationError: + # noinspection PyTypeChecker return VerifyJSONWebToken(token_is_valid=False, user=None) @@ -276,6 +282,7 @@ class ActivateUser(BaseMutation): except (TypeError, ValueError, OverflowError, User.DoesNotExist) as e: raise BadRequest(_(f"something went wrong: {e!s}")) from e + # noinspection PyTypeChecker return ActivateUser(success=True) @@ -289,10 +296,12 @@ class ResetPassword(BaseMutation): try: user = User.objects.get(email=email) except User.DoesNotExist: + # noinspection PyTypeChecker return ResetPassword(success=False) send_reset_password_email_task.delay(user_pk=user.uuid) + # noinspection PyTypeChecker return ResetPassword(success=True) @@ -323,6 +332,7 @@ class ConfirmResetPassword(BaseMutation): user.save() + # noinspection PyTypeChecker return ConfirmResetPassword(success=True) except (TypeError, ValueError, OverflowError, ValidationError, User.DoesNotExist) as e: diff --git a/vibes_auth/locale/ar_AR/LC_MESSAGES/django.mo b/vibes_auth/locale/ar_AR/LC_MESSAGES/django.mo index 13b44d22415e9822f2be459b91f16d0b10b127c1..8f57ecd25f8c13f9103df30094a0aebdf8570616 100644 GIT binary patch delta 3214 zcmZXVdvH|M9mh`qm6sSIB%modsQ8Q#td=5Bh|i`filDI;Et}n&4r~KS zh&0n$V_#1H5E%#?O(3oTGxlja?Q|HY(`jdVZtF0m9cN1Ei%w_yM|IlI_uiYbXGI*ZFnX82dss) zJm{L`5F2I{yd18F*fyKtO>i4*f`bs7<`|Ukr{E>5x@(Fj;sJZeaXMGXFa`i}9bJ6kUKzV9g?9u7y{?X4nd^hdGEZ=Ic&01aZ==hbqOx3A4%iAgpKpC8&~2Kt=K$I3J#d=r#^2<$s22 z;1Uk0G>y9fI=w4Jb!1B%DbaWN0yD%4~$n z)Z{}puJW~7w-0m{?Azyt6D$i+APxU1BD2`c5M;78yY znC8~M4;yC~vz=%@&io!0&oMp;^YCSB%r}{@r5^VLO>Eu_o8hf+FVwyXsB`7F>1g8_ zcn3V6@Y)-UxsP!Q%F_yb4E__|1vim*3txarbrmj$KY?=W9F(DdLzSSGclCaFHPpU5 z9M}8*6*@yqY$SXgdbZyKljZ8IQxca1w5T--kN4s3i{MMyL#|hNw1A zKzud>a63E!mGOnQ7;}r>|28^G(QZgt%xSm{{uRp511sY@(GGRVIw3)sz3^kO0zUzN z3uUNjl`;5a+F&i*1-Tw(5GqrzKzuMK;Re0`@6plaSV4j0@%Iv*ha|x?d^A>YH{8eg zsf1@CWj2}H;!+I3XBm${)%J$ljrkP32i^~#hg8?R3+32Fcwbhk>glY9YoLX@pd9%| z!XH5?_#0dV*O5O(x*7fkJ_{9LJ6E5inP;Hx$RVg&zXxmJbbFkR?9$5SvpnUM+JiBo zkISd&*C*qJkR(NKf~J}fbegmVH2w41gj|X&MlMIxaVsIQB6Oi zLDDWssK|H=qYsd>q*{|fb1$N-=+4YW?nag&TM^wKst|o-lnK2_4j-{XJY%h*oe%Vvr;mCM*3FX+zG z@65CNbAgx3XuXt62Yx=6%5r-6^!%me){bIONTq{FYfnDoWuw!6F7UbvslY>7CgaCv zY^RqBN(JV!{?lG!*LpoEKWnr3E@Ywu@ zvZ4<1PkXtWJ5oi0B`SYs?2GnB7I(9mg>=4@3yLjvYqw`V6uDot*zmh@oDTA~8;x1d z7I%1Q`D#l=f<|?c)Ew(+b}}tb=HQCgLt$E~v*!M4VL99%9&{t&fDQXy)s4DwcRcLZ zV9L6&a9=nW_StaI9cFPP>|^gSEsncM{wkK4LHDK`aYw^m<{4Dol&iE@HyZbCc)*0)?zQls zx_IS|yYa|TcLax?8-Dk?tCq$Vr#&4~45!>gxX%u6T;5QgbYrgKqS>)XLnT%;;@&{_ z1XKItRcRlM60t9yP=;Q|@<4o`ibr_aV#y;t%gSKb>n5x_jKe3xFEU5+j$>ZIu!lUl zx+z>%_S_LVBN(g<@3FUAc^O$m#ngYpiw=#31Mc|nTa9)`*f(5r>!LCdNYydvjq=^E zv`i{>EiZ9K~1sHujtPL{;phEKQCIV;#sAo K`tvKhm;496L*yd> delta 2199 zcmXxle@vBC9LMo50>T9^$}hp>%0()FhM@$QDTpN+pb`oqKeXr%{DGA@tC2me=8T4} z=5*OV%5+U)Iu@H|TiQ@`Ys*#eM@iFWbLRZV%CXr-_WnHg+%vzt&Ux2lX*HORjYyx?f%EWf%*B() zKfBByjd>Uo@H%S1x12#b>2liG7X%`nNCK5B*q1`+|PJ|1b^{8LnOw#B2=V zlUR)Nu?1)2$H*f#fLe+nROasDb2yHg(6e0B1j^CV1C>i3g470;qZ z{sU?zzv3jkgBkb$mGS_M#aM)7-*zHD*K4D&_i7ru7=_pYbT|iW%HT`!}qiU7qLfdOL_( zx+@-)B~<>wFfN!GIX3HXJ?#$E00xmH*gaJ0Vpw3EmJo8u3Q$W?i?!H_3$Y({-yf*w z9-!`<@;Lhdy^yPH#7Zt4LXC73>v0ZwT7mCl7%!tzd>a|FJwy#`I_XhIg{ah5U=?ma z-PeO>@Dg_8u37$bo;{+{!-Y(y$+Flv)S6wxiTFF}_}#%e{2SHb$~lplG@~-G74=={ zM*i8?{MmxHumo4IVHRK~Dnoskuk$}nrI`zPJe`E^q4q)-vds1wa*Oq2F^=LgOk)An zQ7t}&ou~}-qIUT=s7#Gu0se_P-dWtNz0rX4=->WQ1w-7$J+>P4f<5>Fe&S4L_$14Y zU>Gl8C*DM@ZPU|y)$lE>!a*cimQolQSP3dqt8gi9M=wmJmx>1Py>krpf|=|f9mk!h znSO|)cp5dpu0@fQo&$3ZzQy?DoP`R_h+Rx zr^jEzSJa@i5jDglLIX@AR7jLDcE4!m%UwMRd)hDB`I^us*S~*Jn@vR@2sX8UEcNkG zs+f?yKq$RRVFIBU>swGqG!abR-!B!ol28UW5Q#)QkwUB`CJR{{wL)#?t@* diff --git a/vibes_auth/locale/ar_AR/LC_MESSAGES/django.po b/vibes_auth/locale/ar_AR/LC_MESSAGES/django.po index 20f9cb57..181c4930 100644 --- a/vibes_auth/locale/ar_AR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/ar_AR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -93,8 +93,8 @@ msgstr "حذف مستخدم" #: vibes_auth/docs/drf/viewsets.py:34 msgid "reset a user's password by sending a reset password email" msgstr "" -"إعادة تعيين كلمة مرور المستخدم عن طريق إرسال بريد إلكتروني لإعادة تعيين كلمة " -"المرور" +"إعادة تعيين كلمة مرور المستخدم عن طريق إرسال بريد إلكتروني لإعادة تعيين كلمة" +" المرور" #: vibes_auth/docs/drf/viewsets.py:39 msgid "handle avatar upload for a user" @@ -106,7 +106,7 @@ msgstr "تأكيد إعادة تعيين كلمة مرور المستخدم" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "كلمات المرور غير متطابقة" @@ -149,8 +149,8 @@ msgstr "رقم هاتف مشوه: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "تنسيق السمة غير صالح: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "رابط التفعيل غير صالح!" @@ -162,18 +162,18 @@ msgstr "تم تفعيل الحساب بالفعل..." msgid "something went wrong: {e!s}" msgstr "حدث خطأ ما: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "الرمز غير صالح!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "المنتجات التي شاهدها هذا المستخدم مؤخرًا (بحد أقصى 48)، بترتيب زمني عكسي." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "المجموعات" @@ -181,7 +181,7 @@ msgstr "المجموعات" msgid "wishlist" msgstr "قائمة الرغبات" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "الصورة الرمزية" @@ -198,91 +198,108 @@ msgstr "اللغة هي واحدة من {LANGUAGES} مع {LANGUAGE_CODE} الا msgid "address set" msgstr "العناوين" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"يمثل كيان مستخدم مع حقول وأساليب مخصصة لوظائف موسعة. توسع هذه الفئة نموذج " +"AbstractUser وتدمج ميزات إضافية مثل تسجيل الدخول إلى البريد الإلكتروني " +"المخصص، وطرق التحقق من الصحة، وحالة الاشتراك، والتحقق، وتخزين السمات. كما " +"يوفر أيضًا أدوات مساعدة لإدارة العناصر التي تم عرضها مؤخرًا والتفعيل المستند" +" إلى الرمز المميز للتحقق من الحسابات. تم تصميم نموذج المستخدم للتعامل مع " +"حالات استخدام محددة لإدارة المستخدم المحسنة." + +#: vibes_auth/models.py:41 msgid "email" msgstr "البريد الإلكتروني" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "عنوان البريد الإلكتروني للمستخدم" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "رقم الهاتف" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "رقم هاتف المستخدم" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "الاسم الأول" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "اسم العائلة" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "صورة ملف تعريف المستخدم" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "تم التحقق" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "حالة التحقق من المستخدم" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "نشط" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "قم بإلغاء تحديد هذا بدلاً من حذف الحسابات" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "مشترك" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "حالة اشتراك المستخدم في النشرة الإخبارية" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "رمز التفعيل" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "السمات" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "المستخدم" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "المستخدمون" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "المجموعة" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "الرمز المميز" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "الرموز المميزة المعلقة" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "الرمز المميز المدرج في القائمة السوداء" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "الرموز المميزة المدرجة في القائمة السوداء" @@ -345,8 +362,7 @@ msgstr "مرحباً %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "لقد تلقينا طلباً لإعادة تعيين كلمة المرور الخاصة بك. يرجى إعادة تعيين كلمة " @@ -410,12 +426,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "مع أطيب تحياتي،
فريق %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | تفعيل الحساب" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | إعادة تعيين كلمة المرور" @@ -430,29 +446,29 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"يمثل طريقة عرض للحصول على زوج من رموز الوصول والتحديث وبيانات المستخدم. تدير " -"طريقة العرض هذه عملية التعامل مع المصادقة المستندة إلى الرمز المميز حيث يمكن " -"للعملاء الحصول على زوج من رموز JWT (الوصول والتحديث) باستخدام بيانات " +"يمثل طريقة عرض للحصول على زوج من رموز الوصول والتحديث وبيانات المستخدم. تدير" +" طريقة العرض هذه عملية التعامل مع المصادقة المستندة إلى الرمز المميز حيث " +"يمكن للعملاء الحصول على زوج من رموز JWT (الوصول والتحديث) باستخدام بيانات " "الاعتماد المقدمة. وهو مبني على طريقة عرض الرمز المميز الأساسي ويضمن تحديد " "المعدل المناسب للحماية من هجمات القوة الغاشمة." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "يعالج تحديث الرموز المميزة لأغراض المصادقة. يتم استخدام هذه الفئة لتوفير " -"وظيفة لعمليات تحديث الرموز كجزء من نظام المصادقة. وهي تضمن أن العملاء يمكنهم " -"طلب رمز محدث ضمن حدود المعدل المحدد. تعتمد طريقة العرض على أداة التسلسل " +"وظيفة لعمليات تحديث الرموز كجزء من نظام المصادقة. وهي تضمن أن العملاء يمكنهم" +" طلب رمز محدث ضمن حدود المعدل المحدد. تعتمد طريقة العرض على أداة التسلسل " "المرتبطة بها للتحقق من صحة مدخلات تحديث الرمز المميز وإنتاج مخرجات مناسبة." #: vibes_auth/views.py:66 @@ -467,25 +483,18 @@ msgstr "" msgid "the token is invalid" msgstr "الرمز المميز غير صالح" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "تنفيذ مجموعة عرض المستخدم.\n" -"يوفر مجموعة من الإجراءات التي تدير البيانات المتعلقة بالمستخدم مثل الإنشاء " -"والاسترجاع والتحديثات والحذف والإجراءات المخصصة بما في ذلك إعادة تعيين كلمة " -"المرور وتحميل الصورة الرمزية وتفعيل الحساب ودمج العناصر التي تم عرضها مؤخرًا. " -"تعمل هذه الفئة على توسيع mixins و GenericViewSet لمعالجة واجهة برمجة " -"التطبيقات القوية." +"يوفر مجموعة من الإجراءات التي تدير البيانات المتعلقة بالمستخدم مثل الإنشاء والاسترجاع والتحديثات والحذف والإجراءات المخصصة بما في ذلك إعادة تعيين كلمة المرور وتحميل الصورة الرمزية وتفعيل الحساب ودمج العناصر التي تم عرضها مؤخرًا. تعمل هذه الفئة على توسيع mixins و GenericViewSet لمعالجة واجهة برمجة التطبيقات القوية." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "تمت إعادة تعيين كلمة المرور بنجاح!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "لقد قمت بتفعيل الحساب بالفعل..." diff --git a/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.mo b/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.mo index ac4613950cd67b638fe53d84dca3d5ed36a89041..ab2f99bbb25761645cd2c6c4978db86e524bf8e9 100644 GIT binary patch delta 3128 zcmZXVeT*Gd8Hdky7y7keTP?Iux2M{Q+U=GW6k93n7R45%l-g3%f<1d@c6ZphGne_e zvK#f5C=pGoBwK8j8k2>fY;=RB8X998#Du6MhG--Fp(0{ZqKQ#4KEIh+B=Kb5 zdERs8ocFw6bNA)DetvK3!m^%64Z}lLAvbm#^A&jLQXY&W3yc}Xm+(L}Yan-+P4Mk-8{}?tCtME?!PW3#$erdXDBquf^Wj-2$Dgfu5iVuEipMhU zHv=exEDS;!`Xc1dJi&ut%#YwDunl$b`D*@asEb~NI`1z5!``^APST zwO@lu`7`jH@B*yS_5X$^;9;WK$ofC{l)C3}hD}eg-cN(5)Gt_LKF9pP8e=vv|7Gi4 z)B#0>lEKyRI=Bt0neK{1=<$w-A9o&2kDS|gcMgCK$=6W8g>3#?0&?|5Y?4d4NzX|rhTOrvu zcR>D3$U_-@6b{1k@OrrTeJUkI*@2>sBam{NN1&Q*2FmasD!vZYRR4kM@?~_M9JvNk z1+x<>vSFxwN1z-(4ppjYsAfC`m9b~xW;MkHl$~(t`ZD7E6+Nh0XHbqEhezNn^x*&> zy$l|Q%G`J0E_fQsfi5~s4lRc&-A1UAMQ|ZJ23v~c1d3AjJ*Xx;5A|985h}v&fil8A zxS07)sEGE!7#@Zy)$>r9{5_=1X5q&2{6)L6qM8$RR{crn23Pd<^+Gau=f1Uy3MWdsTmaCyF0~ z!|(>=gUH-Ci1N{D;wq|ndJ)Q8{90;xiyqZb$>zo-m15zYm9DRC4YChueS(KR3yoWm zdkd}n*Q%ycKkPu%CqoEdo#{r_B8!lFkn0diUNmD5RPW4B;AMSGER+(kyYctgu>-JwGf?2T|saBrfwY=6OMR#t!=~%M;eZV9c-X zwSL_Np$+4aAnLbGEPGDd=N#y_X+D(JlAuwnrWqzuHu_009MoMS1fqYXnYC0L>gnx!w= zTiiI#W?t0dJj&7myMNTTZ;3oeEq4SX5vQ}*j$$$NZQAf_^3~=kL1Vf~YQ*~*J6V<| z3vtD-Q<#BMJ&SfMZSC_Li9f+Szt1o0m6vxBL?dxcKWd+;2euK1fpyAO>^aSo*e3Br zXSzMxnewAJSJB4K9gE^L!(oSCS!b#}>$!4U(3#Q&W$E5h%~pcdvW$A~xlkqxV>Q3u z-si?*%X%|(X%_LK(U}THL)V#(o9$^W_#0GMzus@-=DCxdskrHCEEkTBQ`O8hZR`!5 zJDKGF+fp8NHXqv>wx_*nTGqAm^nl$Pr(@$qMlv_np0QDTn*NJ%L~*B$q&?ltCtqE= za`KVB`7I)FV=7`TuoEtfJ7n% delta 2199 zcmYk+S!@ka9LMp0Y3VK3QdKQ&ubonR-PTgIwv^hn+A5{?s3km*l<{B>i6uh3AW9l4 zM5T!bglGtnRFL4ILL!z#B2tY=EZ^VEG;wnO^Eqek%$c+NXC5zoU*I&xMxHcEIgv!9 zw>CS7v)XW=Y>qZt8)3Eu2hn~LFk4AGD#mOb?e*=?95B}h{zo8z~jJoePYR1WoekW#PA=V*( zSqGk4fhnkd52Ge_1_M0bF8P04$86en^auXINQ`E<>L`c_n2h}~jA>Yk1Mv`Yi`AmG zq8_z!pK(0?MonleCpCeI=;(%AD*R_fsIA!GdjR!+6~<#7YUEE*GkJ~e@gv4z6Kcr= zG{#^$vii0W`O9{qa^M*1IalIX|GiWma-taX$qcGijT+Ex)W{o90|_z;8A3g11a`wE zsFm7=de9Ek{YOyOpYz){P%BuE{jf2f_1BU_(u+nKgZnWNNq9StTH4E~C4Y{|_zTO) z`UHAAg_TTe80X`dRyFOZsIC3VD^N+hf}4iW{*po-U_!|2C&QsKiW7@aNpujk*HxH> zH<6!x=b)Ly_VnzF+QTqvNwZJ`F2oU7hWzX}2W?d?>iT=Ax8o6N1)K)I(v0dTsh2m9 zFixO74|U;D)X3|Q$=gd*hhI^zZ4;{FsNSAI98S9{s^1(ufn~S|n~?h)%Oh1QIZ=X| z`72aXeL^MM57f#;^!1V|33a{zwdX64Rkk&#t=fZH(W^KK-(foTVHW*yG3q)86SPUy zRK|1S9;)L%zA;?gg?2nDDF>kjl8ubXicvG$g}UxEYTz}ft-6Iu!Y8N|Ys8V*jFT~S z02AiA@Zmh>un8UEuVGU}@@8Wc9Kn)-<)f>U#%N(K=kwz>d!g~H_qNNm2nd&#neEC?p+rX+?k$*1JS11WvN~B*2;atDI z5PK5yi21}sLS+Wwl)6>#bE-X6Vq_CasO1F7YOM+7Lx5O9D2w$qQ%\n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "Potvrzení obnovení hesla uživatele" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Hesla se neshodují" @@ -147,8 +147,8 @@ msgstr "Chybně zadané telefonní číslo: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Nesprávný formát atributu: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Aktivační odkaz je neplatný!" @@ -160,19 +160,19 @@ msgstr "Účet byl již aktivován..." msgid "something went wrong: {e!s}" msgstr "Něco se pokazilo: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token je neplatný!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Produkty, které si tento uživatel prohlížel naposledy (max. 48), seřazené v " "opačném pořadí." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Skupiny" @@ -180,7 +180,7 @@ msgstr "Skupiny" msgid "wishlist" msgstr "Seznam přání" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -197,91 +197,109 @@ msgstr "Jazyk je jeden z {LANGUAGES} s výchozím {LANGUAGE_CODE}" msgid "address set" msgstr "Adresy" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Reprezentuje entitu User s upravenými poli a metodami pro rozšířenou " +"funkčnost. Tato třída rozšiřuje model AbstractUser a integruje další funkce," +" jako je vlastní přihlašování e-mailem, ověřovací metody, stav odběru, " +"ověřování a ukládání atributů. Poskytuje také nástroje pro správu naposledy " +"zobrazených položek a aktivaci založenou na tokenu pro ověřování účtů. Model" +" User je navržen tak, aby zvládal specifické případy použití pro rozšířenou " +"správu uživatelů." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "E-mailová adresa uživatele" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefonní číslo" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Telefonní číslo uživatele" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Křestní jméno" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Příjmení" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Obrázek profilu uživatele" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Je ověřeno" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Stav ověření uživatele" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Je aktivní" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Zrušení výběru této možnosti místo odstranění účtů" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Je přihlášena k odběru" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Stav odběru newsletteru uživatele" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Aktivační token" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atributy" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Uživatel" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Uživatelé" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Skupina" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Vynikající žeton" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Nevyplacené žetony" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token na černé listině" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Tokeny na černé listině" @@ -344,8 +362,7 @@ msgstr "Ahoj %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Obdrželi jsme žádost o obnovení vašeho hesla. Kliknutím na níže uvedené " @@ -361,8 +378,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Pokud výše uvedené tlačítko nefunguje, zkopírujte a vložte následující " -"adresu URL\n" +"Pokud výše uvedené tlačítko nefunguje, zkopírujte a vložte následující adresu URL\n" " do webového prohlížeče:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -410,12 +426,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "S pozdravem,
tým %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktivovat účet" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Obnovit heslo" @@ -430,26 +446,26 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Představuje zobrazení pro získání dvojice přístupových a obnovovacích tokenů " -"a dat uživatele. Toto zobrazení řídí proces zpracování ověřování na základě " -"tokenů, kdy klienti mohou získat dvojici tokenů JWT (přístupový a " +"Představuje zobrazení pro získání dvojice přístupových a obnovovacích tokenů" +" a dat uživatele. Toto zobrazení řídí proces zpracování ověřování na základě" +" tokenů, kdy klienti mohou získat dvojici tokenů JWT (přístupový a " "obnovovací) pomocí poskytnutých pověření. Je postaven nad základním " "zobrazením tokenu a zajišťuje správné omezení rychlosti pro ochranu před " "útoky hrubou silou." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Zpracovává obnovování tokenů pro účely ověřování. Tato třída slouží k " "zajištění funkčnosti operací obnovení tokenů v rámci systému ověřování. " @@ -469,25 +485,18 @@ msgstr "" msgid "the token is invalid" msgstr "Token je neplatný" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementace sady uživatelských zobrazení.\n" -"Poskytuje sadu akcí, které spravují data související s uživatelem, jako je " -"vytváření, načítání, aktualizace, mazání a vlastní akce včetně obnovení " -"hesla, nahrání avatara, aktivace účtu a sloučení naposledy zobrazených " -"položek. Tato třída rozšiřuje mixiny a GenericViewSet pro robustní " -"zpracování API." +"Poskytuje sadu akcí, které spravují data související s uživatelem, jako je vytváření, načítání, aktualizace, mazání a vlastní akce včetně obnovení hesla, nahrání avatara, aktivace účtu a sloučení naposledy zobrazených položek. Tato třída rozšiřuje mixiny a GenericViewSet pro robustní zpracování API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Heslo bylo úspěšně resetováno!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Účet jste již aktivovali..." diff --git a/vibes_auth/locale/da_DK/LC_MESSAGES/django.mo b/vibes_auth/locale/da_DK/LC_MESSAGES/django.mo index 094e963c2bc6495c8d16008884fc53e47defce14..14122866c928b74b48759dd33b49a5bdd6c9d12b 100644 GIT binary patch delta 3087 zcmY+EX>1f_7{^~|ISS>JLb=Kyr_wGUAQq`mL=aR2q!bjC>F#tpc6X-k%vQkQiijK` z_yMnw5JdwK4T%I1Ow@4D&edhO`&-+~Oo@hF- zzHokU`74H&LPjBT%Z%9t*Y)H>d#<-JZQYF73U6opLxnM4F|O*v8F;0yF)s7V`Wdr; z@hLct@t^&T83D%(DC(U9XEJVv!{HuSWlX^wrZby~kKsu83mgas@}X6q8xAjYHk4Ca25pwq}iBb1_Tke_**56+kq zum|jdy7){y{u=6{b5Q3lKzZD4urXWUDA)}5LpgFCW?^@{klqg1m;24Lbcm|i9WT5L z=P`aOp1%mo8UF~S=o+ks-G&%55srYhun|s%9>f;&8dNHdK#rKt;aqqD%Ap#?UmlF7 zqXSbQMw$kwR4k8~iPv|+q0H}xO35)OPd>eOOV^9w>tjLRtO+l%dyRmJtSBR0Wwb^PwWO2I`{qQ0Je5I`=|6 zeiiaFN2-bc1UjEFQb;aCS^6{F0sn>+zS)ks3hiE~ke`I3;dz*(>i>c};0C;rL6><- zW!*7?O$V4CMu8~RCoE&0VLWSWF=fXJw-SCSf~=V`5;h%Gad?6tTSLeya#fp*$7ob`=L@_c$bcz$uX!R`UocAC8!Ik2#*Yy z2p@*^Q0u$m`BP94I}4@o9F)Eb@%TzSz6vKX|2rh8#v+Wol7gwHvzUpKP>TM6?XW+) zHQpR^7nFyuLlxgaco#eh^?EMBa(ETW@L!>xV^8v?)Q#mc6E20*U;$PuDeu$aXU_1^ z!Rt^VE4!`eQ3F(UFN7+h6;KgLLgl&>*1>~No_z_)hPe!7XeFC?2&Nk9wIrZk$y_*D zMX`d;BXBcR)qVk0%@?7H><<_zm_i*ePQVTD4XFLfn+zHP?}3w`3~i0M5wg|nhN_(p zVNduCEXb1Y=;*?0F)MIKcS?d=e-qD z^f%fXdepmG!92lN;a7X8h)CI5`l@U-T{az2Wvh)rl>4Lxv=p)o>4zv%QB>emA`1 za4)hLc@SBRR3Hk!p5b!kzdJ$%qnyr$cOs?MOy|CMV8>KyDiN|3{ab2U1zT#W`cmr= zcPzLf?l(dG7pz1ID!fKSZ7K42)GOvsuR-~rkEl*s5MGrjL->1${$SR_83-wkicn8b zIWM(&ac49_jq-WWPwO6z$q8M?k_XE?p@Y~}DmV@nX`>|_{e&H5=P6P9ZcAQw;!w^`I|*w^XxW*-w>olur<-CWAG+A?(vxFZ z+q1bhz3*t{u!6h}{dUKzYq0~I#Vfb7Xp8nnH*R7x3rRokg+anv)#g|?dF}=lcerVf z)1hy*p)uoFL5Gu+tyVt3X;jBS^;l1`lWAE}fhkUw#3YWF_h}fkNP6oWuZ2ot3 zc7Ri%BSREs2sJIa^!^jw$u#!Uy|ygBxM{==Zk4_a;VsZo{XEO ze?tSafuFTna(SjxPOIy&8d^@BGFEqU#z=;j4q|J_MvL!xkuQPrwf3fjMLTtM#!l;y zWw%LU59h+Vb`fAV_)044tXiI@7qu_x*%;)-jp^O zXyd=Kg?0rdE|ua0*R}f;e=R%e*v5h41oXu delta 2199 zcmXxlO>C4!7{KwT(!y?WODRZ;wI2vnk@BS#S_%}ZwhC0O(qg4mq#mqV#K=K|xQU4Y zjTpojqXxA~2+<3n5#^vJ#6~%w5IiV{8Z}Bhm>5GyBq{p;@4h?X+273jcIV@nndRWX zr#;#6isCneGDuuUG);#lQI>wIyDt7dK@&{ibbBeQAf3A z4Y(W|aR6_`SCFs7D7qD6Xy*RJRXBkzXeAF_z*@}ug-$BGi#~KKo=n_}zCVPs@Hjg2 z)96Zm!mIHD&cuso%F{GjunEb2Y)4+jZuAVij*j!mO!EH{m2Y_PAa-#wsKya=LSLXW zKZ8yr!z{E89cUR=Vn3Rxo#;T%q2J$!{{06@`xu(RF`SR%v&g?GDW(@^T8evcHge!& z1WoP7Xv)uF4PM4UPJI=;4&;b_lEhn%B@4;^L{Ydis44SFm&<_7WJN!3k7hRukr|<@zm!m0fMsG(q zcH;L)KiR0{s6N4i2DIY?i6iJ197PY^32eqO%-s&m-462U#53qMtVOr11)FdiF2%Rd ziF}*9{{_q4q*6|TDXT_T)PtVte)RARp&8kQ?(u852v49LUO?uOJ0MPU9tVZ<8cWez z(t#f8P3Xji@P0giGZ;Vqpu%~I%jn^%AaA)2a0l%U+=`!}r@M+?oKPdK!8UZFFC^~A zg|t6J&(3!^8UI2jauFRby@32%nL|Ze&2Ai+k#-S_yxARudkiJBalJ2RE0M+t6&ems^Ni z2(#EubPyYe9wJ4Q5FT!C)K!F6?_pxOM19rCR diff --git a/vibes_auth/locale/da_DK/LC_MESSAGES/django.po b/vibes_auth/locale/da_DK/LC_MESSAGES/django.po index 7817d65b..d2656f2d 100644 --- a/vibes_auth/locale/da_DK/LC_MESSAGES/django.po +++ b/vibes_auth/locale/da_DK/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Bekræft nulstilling af en brugers adgangskode" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Adgangskoderne stemmer ikke overens" @@ -149,8 +149,8 @@ msgstr "Misdannet telefonnummer: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Ugyldigt attributformat: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Aktiveringslinket er ugyldigt!" @@ -162,19 +162,19 @@ msgstr "Kontoen er allerede aktiveret..." msgid "something went wrong: {e!s}" msgstr "Noget gik galt: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token er ugyldig!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "De produkter, som denne bruger har set for nylig (maks. 48), i omvendt " "kronologisk rækkefølge." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupper" @@ -182,7 +182,7 @@ msgstr "Grupper" msgid "wishlist" msgstr "Ønskeliste" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -199,91 +199,109 @@ msgstr "Sprog er en af {LANGUAGES} med standard {LANGUAGE_CODE}." msgid "address set" msgstr "Adresser" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Repræsenterer en User-enhed med tilpassede felter og metoder til udvidet " +"funktionalitet. Denne klasse udvider AbstractUser-modellen og integrerer " +"yderligere funktioner som brugerdefineret e-mail-login, valideringsmetoder, " +"abonnementsstatus, verificering og lagring af attributter. Den indeholder " +"også værktøjer til håndtering af nyligt viste elementer og tokenbaseret " +"aktivering til verificering af konti. User-modellen er designet til at " +"håndtere specifikke brugsscenarier for forbedret brugeradministration." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Brugerens e-mailadresse" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefonnummer" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Brugerens telefonnummer" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Fornavn" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Efternavn" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Billede af brugerprofil" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Er verificeret" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Brugerens verifikationsstatus" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Er aktiv" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Fravælg dette i stedet for at slette konti" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Er tilmeldt" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status for brugerens abonnement på nyhedsbrev" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Aktiveringstoken" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Egenskaber" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Bruger" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Brugere" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Gruppe" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Enestående token" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Udestående tokens" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Sortlistet token" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Sortlistede tokens" @@ -347,8 +365,7 @@ msgstr "Hej %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Vi har modtaget en anmodning om at nulstille din adgangskode. Nulstil " @@ -364,8 +381,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Hvis ovenstående knap ikke virker, bedes du kopiere og indsætte følgende " -"URL\n" +"Hvis ovenstående knap ikke virker, bedes du kopiere og indsætte følgende URL\n" " i din webbrowser:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -412,12 +428,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Med venlig hilsen,
teamet %(project_name)s." -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktiver konto" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Nulstil adgangskode" @@ -432,8 +448,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -442,16 +458,16 @@ msgstr "" "brugerens data. Denne visning administrerer processen med at håndtere " "tokenbaseret godkendelse, hvor klienter kan få et par JWT-tokens (adgang og " "opdatering) ved hjælp af de angivne legitimationsoplysninger. Den er bygget " -"oven på en basis-tokenvisning og sikrer korrekt hastighedsbegrænsning for at " -"beskytte mod brute force-angreb." +"oven på en basis-tokenvisning og sikrer korrekt hastighedsbegrænsning for at" +" beskytte mod brute force-angreb." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Håndterer opfriskning af tokens til autentificeringsformål. Denne klasse " "bruges til at levere funktionalitet til token-opdatering som en del af et " @@ -465,32 +481,25 @@ msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " msgstr "" -"Repræsenterer en visning til verificering af JSON Web Tokens (JWT) ved hjælp " -"af specifik serialiserings- og valideringslogik." +"Repræsenterer en visning til verificering af JSON Web Tokens (JWT) ved hjælp" +" af specifik serialiserings- og valideringslogik." #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "Tokenet er ugyldigt" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementering af brugervisningssæt.\n" -"Indeholder et sæt handlinger, der håndterer brugerrelaterede data såsom " -"oprettelse, hentning, opdateringer, sletning og brugerdefinerede handlinger, " -"herunder nulstilling af adgangskode, upload af avatar, kontoaktivering og " -"sammenlægning af nyligt viste elementer. Denne klasse udvider mixins og " -"GenericViewSet til robust API-håndtering." +"Indeholder et sæt handlinger, der håndterer brugerrelaterede data såsom oprettelse, hentning, opdateringer, sletning og brugerdefinerede handlinger, herunder nulstilling af adgangskode, upload af avatar, kontoaktivering og sammenlægning af nyligt viste elementer. Denne klasse udvider mixins og GenericViewSet til robust API-håndtering." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Adgangskoden er blevet nulstillet med succes!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Du har allerede aktiveret kontoen..." diff --git a/vibes_auth/locale/de_DE/LC_MESSAGES/django.mo b/vibes_auth/locale/de_DE/LC_MESSAGES/django.mo index 518351609e7edf008ba39365a7b75950504c47e4..9b78bb8196db33b5fc850987d93f6e64cebc5de1 100644 GIT binary patch delta 3191 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\n" "Language-Team: BRITISH ENGLISH \n" @@ -107,7 +107,7 @@ msgstr "Bestätigen Sie das Zurücksetzen des Passworts eines Benutzers" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Passwörter stimmen nicht überein" @@ -127,8 +127,8 @@ msgstr "" #: vibes_auth/graphene/mutations.py:41 msgid "the user's b64-encoded uuid who referred the new user to us." msgstr "" -"Die b64-kodierte uuid des Benutzers, der den neuen Benutzer an uns verwiesen " -"hat." +"Die b64-kodierte uuid des Benutzers, der den neuen Benutzer an uns verwiesen" +" hat." #: vibes_auth/graphene/mutations.py:61 msgid "password too weak" @@ -153,8 +153,8 @@ msgstr "Missgebildete Telefonnummer: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Ungültiges Attributformat: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Der Aktivierungslink ist ungültig!" @@ -166,19 +166,19 @@ msgstr "Das Konto wurde bereits aktiviert..." msgid "something went wrong: {e!s}" msgstr "Etwas ist schief gelaufen: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token ist ungültig!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Die Produkte, die dieser Benutzer zuletzt angesehen hat (maximal 48), in " "umgekehrter chronologischer Reihenfolge." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Gruppen" @@ -186,7 +186,7 @@ msgstr "Gruppen" msgid "wishlist" msgstr "Wunschzettel" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -204,91 +204,111 @@ msgstr "Sprache ist eine der {LANGUAGES} mit Voreinstellung {LANGUAGE_CODE}" msgid "address set" msgstr "Adressen" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Stellt eine Benutzerentität mit angepassten Feldern und Methoden für " +"erweiterte Funktionalität dar. Diese Klasse erweitert das AbstractUser-" +"Modell und integriert zusätzliche Funktionen wie benutzerdefinierte E-Mail-" +"Anmeldung, Validierungsmethoden, Abonnementstatus, Überprüfung und " +"Speicherung von Attributen. Außerdem bietet sie Dienstprogramme für die " +"Verwaltung der zuletzt angezeigten Elemente und die Token-basierte " +"Aktivierung zur Verifizierung von Konten. Das Benutzermodell wurde " +"entwickelt, um spezielle Anwendungsfälle für eine erweiterte " +"Benutzerverwaltung zu behandeln." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-Mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "E-Mail Adresse des Benutzers" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Rufnummer" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Rufnummer des Benutzers" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Vornamen" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Nachname" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Bild des Benutzerprofils" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Wird überprüft" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Verifizierungsstatus des Benutzers" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Ist aktiv" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Deaktivieren Sie diese Option, anstatt Konten zu löschen" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Ist abonniert" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status des Newsletter-Abonnements des Benutzers" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Aktivierungs-Token" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attribute" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Benutzer" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Benutzer" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Gruppe" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Hervorragende Wertmarke" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Ausstehende Wertmarken" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token auf der schwarzen Liste" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Token auf der schwarzen Liste" @@ -353,8 +373,7 @@ msgstr "Hallo %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Wir haben eine Anfrage erhalten, Ihr Passwort zurückzusetzen. Bitte setzen " @@ -370,8 +389,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Wenn die obige Schaltfläche nicht funktioniert, kopieren Sie bitte die " -"folgende URL und fügen Sie sie in Ihren Browser ein\n" +"Wenn die obige Schaltfläche nicht funktioniert, kopieren Sie bitte die folgende URL und fügen Sie sie in Ihren Browser ein\n" " in Ihren Webbrowser ein:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -379,8 +397,8 @@ msgid "" "if you did not send this request, please ignore this\n" " email." msgstr "" -"Wenn Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-" -"Mail." +"Wenn Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese " +"E-Mail." #: vibes_auth/templates/user_reset_password_email.html:102 #, python-format @@ -419,12 +437,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Mit freundlichen Grüßen,
das %(project_name)s-Team" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Konto freischalten" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Passwort zurücksetzen" @@ -439,35 +457,35 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Stellt eine Ansicht zum Abrufen eines Paars von Zugangs- und Aktualisierungs-" -"Tokens und der Benutzerdaten dar. Diese Ansicht verwaltet den Prozess der " -"Handhabung der Token-basierten Authentifizierung, bei der Clients ein Paar " -"JWT-Tokens (Zugriffs- und Aktualisierungs-Token) unter Verwendung der " -"bereitgestellten Anmeldeinformationen abrufen können. Sie baut auf einer " -"Basis-Token-Ansicht auf und gewährleistet eine angemessene Ratenbegrenzung " -"zum Schutz vor Brute-Force-Angriffen." +"Stellt eine Ansicht zum Abrufen eines Paars von Zugangs- und " +"Aktualisierungs-Tokens und der Benutzerdaten dar. Diese Ansicht verwaltet " +"den Prozess der Handhabung der Token-basierten Authentifizierung, bei der " +"Clients ein Paar JWT-Tokens (Zugriffs- und Aktualisierungs-Token) unter " +"Verwendung der bereitgestellten Anmeldeinformationen abrufen können. Sie " +"baut auf einer Basis-Token-Ansicht auf und gewährleistet eine angemessene " +"Ratenbegrenzung zum Schutz vor Brute-Force-Angriffen." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Verwaltet die Auffrischung von Token für Authentifizierungszwecke. Diese " -"Klasse wird verwendet, um Funktionen für die Auffrischung von Token als Teil " -"eines Authentifizierungssystems bereitzustellen. Sie stellt sicher, dass " +"Klasse wird verwendet, um Funktionen für die Auffrischung von Token als Teil" +" eines Authentifizierungssystems bereitzustellen. Sie stellt sicher, dass " "Clients ein aktualisiertes Token innerhalb definierter Ratengrenzen " "anfordern können. Die Ansicht verlässt sich auf den zugehörigen Serializer, " -"um die Eingaben für die Token-Aktualisierung zu validieren und entsprechende " -"Ausgaben zu erzeugen." +"um die Eingaben für die Token-Aktualisierung zu validieren und entsprechende" +" Ausgaben zu erzeugen." #: vibes_auth/views.py:66 msgid "" @@ -481,25 +499,18 @@ msgstr "" msgid "the token is invalid" msgstr "Das Token ist ungültig" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementierung der Benutzeransicht.\n" -"Stellt eine Reihe von Aktionen zur Verfügung, die benutzerbezogene Daten wie " -"Erstellung, Abruf, Aktualisierung, Löschung und benutzerdefinierte Aktionen " -"wie Kennwortrücksetzung, Avatar-Upload, Kontoaktivierung und Zusammenführung " -"kürzlich angesehener Elemente verwalten. Diese Klasse erweitert die Mixins " -"und GenericViewSet für eine robuste API-Behandlung." +"Stellt eine Reihe von Aktionen zur Verfügung, die benutzerbezogene Daten wie Erstellung, Abruf, Aktualisierung, Löschung und benutzerdefinierte Aktionen wie Kennwortrücksetzung, Avatar-Upload, Kontoaktivierung und Zusammenführung kürzlich angesehener Elemente verwalten. Diese Klasse erweitert die Mixins und GenericViewSet für eine robuste API-Behandlung." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Das Passwort wurde erfolgreich zurückgesetzt!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Sie haben das Konto bereits aktiviert..." diff --git a/vibes_auth/locale/en_GB/LC_MESSAGES/django.mo b/vibes_auth/locale/en_GB/LC_MESSAGES/django.mo index 14b6b38985c69237caadde8d3d846d32908fc1c7..d7e8f52ce032cfec210af8a63bcb6c83ba80a160 100644 GIT binary patch delta 3059 zcmeH|+iw+B6o*$^E(How6ev(&KtP33Euh?m1A^j(n;->?Iz4CFjy;!hW)2F892HSi z#0NlQi4RB=h%u2=Qy;_!FeGApLX6Rb2=V|%OzP!H34XshQ{%s2;!f9mYwwx8*JZDD zdTi~5jm7iB`W!Gu3aLdFRG7UCoBHu!JX>kjR%Z4boXY&C0cK~J4QNFbB%lu33Hh_bJP5`< zhJE2FD8paG^RJ-{eFwGg0#w9h!_1z6wQvLMgbL(Wn1SU)p>sRnAne-?6tZfs#4q;4 zMa=Nm~eY6{};WMH#Ur=50B+;lS&(ccj zlIu`ia&{c=S)b#Sy5tbl)m$o0FuM(!ze zQ&bZZp&Xq775RLqVqFF0&?bl}dl5!m0(JGpZj`7^pi+4{W)D=#YA2OaSPv7-6HwK@ z6YBk87@bwN3P1}czmpt|G|RG0L?so1xE6u?~A z0ChL*P>yVes)4;whK@oXehxRndhSaH?S^vbZ79b-gmUz1%sD&>m9l-4F_2xg|Qx) zfUHG|5A#SM8uufQMOx`cLq9P3m0OIcKAI7l!YUBjIO_Awa3)fZsAg1HD%ReyC{|X) zT-EymQbR**9?E_3;vHR?%6H3FtPi}r<7GoX+~z#xhiy)>5QMpmzuikYExwmd1&*6d zITzu8eoO1PfuLE^XP-qU4dA}oC4ML6x z_|VJyEq-!&^le>a(+$JC-&~MQ0?NCsUcIv-blh~1b2{?5t$vC(h0w=$A5DQ}+^mb; z)_osTjVvnaFxT#7r#HI+!4j3fwd9MwjVx~CV_qb4g=`qqJL}p!=UycUjlv H+C~S-*#3y5|90|${lV+5P<5v<2O$X|TP z#W9cLnRpl-@UhekjZWvj18cA!d+9%hsMyeJ=|6mdj48gu68sJA_(Xa?iFWiS`rQ;d z<61_)13PdH?n7QhHNB2t9op`5=)_*Za{7-q(--gJBJMx;1^$P{SjKQ|D1&pb78hU} zHscUpg1eAUVhr7i1L(?~#H(=%olqAKoxozu`9U8Q-o+rg6%V97gTCK`vv40e@^8?Y z{ESujJI=&E&?PVDrW3Qs>c?i}RqQ}>;03gwcV@EwPf|I^gS9w7W>Ag2=zu;$M}7z$ zNQO~pJ=#$V&c^lVN^LHYiY3Le0V@W?FI-z6!g6-QcuPvcx9;bS+t zv~QzJK905c4~~%ab7;-e@f6cCDJMt-Psco_w~_nDI0BxIljxQ-*F{{4E71XL&r!)z z8AX@o2V}A_f$dmAhPhNd=;;_lb72!Y!0qUaA4ik)Wpp5~ZfI%qLk3I)lyV47Q*%eiV~rLbqZR-MdfG4v!)E6#t?Fui>Q=sY6dk zGn&+$*oZ68)3FV!=|9G(xQF}E9QYCKXcGO2ty;jo<5skxL+F4`pr_+6bfB$FTl>(C z2GJQmfyMYL+RtvZoewZM|6ftD!C%n5nn3!F3f8Rz7othjhWF!AEW`JZzxad;V~FEO z-bMu}UWA3>ezV<4xq~asCuO<&Z!v*xC(L|{nZA&46)ZN|PTb=SWtbQsTwZ75;4POE zElDjuu->#@fE`Lo7gvwr+O+@VVQF&B@2RuzCS2YgB1zXi7t>xioe zmwO3uJ+X|qjVL2rMOW}9;tayXypw2i{;foztfq2ZdUIE*$z@_S5$1uVBTsTQX9~rA zw$u|VlUl^B*g)J&tRfZ@mK%xOP*Tk&jK_!{s^plND0dU?>okJXk{rkNcqMTeVX|4w wnL@cHt=y2hqVNJe6`e$1`s@mFKUelf(TnRc, 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -108,7 +108,7 @@ msgstr "Confirm a user's password reset" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Passwords do not match" @@ -151,8 +151,8 @@ msgstr "Malformed phone number: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Invalid attribute format: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Activation link is invalid!" @@ -164,19 +164,19 @@ msgstr "Account has been already activated..." msgid "something went wrong: {e!s}" msgstr "Something went wrong: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token is invalid!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "The products this user has viewed most recently (max 48), in reverse-" "chronological order." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Groups" @@ -184,7 +184,7 @@ msgstr "Groups" msgid "wishlist" msgstr "Wishlist" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -201,91 +201,109 @@ msgstr "Language is one of the {LANGUAGES} with default {LANGUAGE_CODE}" msgid "address set" msgstr "Adresses" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "User's email address" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Phone Number" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "User phone number" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "First name" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Last name" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "User profile image" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Is verified" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "User's verification status" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Is active" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Unselect this instead of deleting accounts" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Is subscribed" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "User's newsletter subscription status" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Activation token" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attributes" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "User" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Users" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Group" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Outstanding token" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Outstanding tokens" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Blacklisted token" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Blacklisted tokens" @@ -348,8 +366,7 @@ msgstr "Hello %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "We have received a request to reset your password. Please reset your " @@ -413,12 +430,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Best regards,
the %(project_name)s team" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Activate Account" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Reset Password" @@ -433,31 +450,31 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." #: vibes_auth/views.py:66 msgid "" @@ -471,24 +488,18 @@ msgstr "" msgid "the token is invalid" msgstr "The token is invalid" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Password has been reset successfully!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "You have already activated the account..." diff --git a/vibes_auth/locale/en_US/LC_MESSAGES/django.mo b/vibes_auth/locale/en_US/LC_MESSAGES/django.mo index 5d301c5ff6b9903a443e11cba8401b7cb6797ddc..2d79ab07762fe4af59376344f2d5846733dfa503 100644 GIT binary patch delta 3021 zcmeH|`)?Fg6vt0_Bem4ZqdbJEJgiWvRg{My6h*BxvFlj8Y77eMW%E$+X9#N;K5km%dEZ3Yy%v_{HNY#Uo!811AE|)eaw8; zn{PCm!TfzVg8B6dv%zq9-{QHG;dthY;2^jS_BSio0h9?W9EU^TRagltd7xSi#D+D% zo8eT5ZJP(j!liIH+zhd42cdlLggxPhP>z2R^D?}N`A{BJ*tdF=Miv^O4%!I$vv+t9 zjJ*fD!;hg1pN!{UK^Zy=weLJs#AQ`x>)=qh2=0Ljzs%?#5 zyaJ~&e>+~k0J|~&1?r&7uo{;2GaC&D!#daqYheKK#dbqo#UaQR`xH)r=b-``ru-{{ zkto_Q7UHB$g}RElF;nsT&2Rwgd!Vl5U8qPtfaUNs143FXjShzWZhD!_eES6?`SqBc1SmCEBWFG8iPYGg5mBVi-+ z2~gF(7V7;QP&IHEDuc(M44;VSr=Sdd4z=$as4lq%>5_s~5%wY$c0xsR393#0fI7I9 ze5=?(s4iI#wZ0XqOJ0xH&%kcXFF>7h5psKW4c-PTd8kV!LS3Z?2de+KqY$hefJ)sd zsA4+@yTc)T-2>J@MO+J2RFk2uVm8EA^PvpxfYh-agmU}@l*6Z?y5w7^F8KkD!My6^R0B|k_Cg;XgG=BD?n?))gL3F)D986hIeH=HRmh+9pb*q04N#eC zf(03BM$thnP#f1k9k>PRuHJ--uoEgH-$6P0JzNQ|z+P}U`6U)>gJj)yLJHqHVHqrq z#VFLTM!}xusZAQQi-^*u2$e<+In{vBP0<+6b0U%`PNRQb&FD(AxhLYJcK-ksCE?ngNUMCfGkDEBdUi7kcW|3 z$P-9!MD?U1oh$oYka5TgL_K~lQX1-vneoJpsXHu3$ZGU!spUy}#6wqB8oDkG2bm{@ zu@I?2<|Bp2c{Cy#k0Q$>t@xv%9~k}0O-G{ofHZ}5MQGos&zHfwk$OZmqry_Lmd3PL zX^J_g^a4^t6*d{=k$CaWj&!g6WlalnUe@t~&=1!-Yy7a?N#t{3Chb4xC7o8^OC@uT z8zh~y7q(~6TQhw9Z0H3^z0U`U(9Z;Jiru?Tmk(-bY{`XLHxWjsrZY(|747ze&}+-O zp~qp#q+i_Qw0drs&$5>CS9-Bs$4k3@%1LF~{GiTR&B;kupO+k{+f`ZHZw_y~tl#P< zqIY$X4L1z4eoJ092q5dWdG$_H=(wp|##xoktoD<<$%j6^`e+Iy?FKG(+IAf&A6QV7 zVP>TljB9ao1VY{CZ8yQ^7$Gk{n@DlFZ#^t`~T(q7cZxx;va&W@lgN( delta 2203 zcmXxlYfRN;9Ki7(aS+fB1(;&RMGGo0(Ii3C05vTWEh`n2vgn28Wwct$Eq7X5>#}^| zny&St%XE&}y1Ln$%GG4GwYJP=#0#kwwO-WRx^0!w_xnHp^NipB^E~Izd9J?)&i1{$ zA$P7Sb1*1_#Fa!_am2H@b_x&5P+7$GqKJpEnf6$D!~?WTrbg_b{ou5S<+Q)Tt7y;6 zMqG|d(Ec`J8$OJ)a2PMckFh->7o$|J;Dbvm2%L+T;4-Ao=*4R6L&l8V*n*E?Jsv@R z;uH_(d5>+mPLlJ;K0s&w z1v-%|v(S2UpanP+x1u}s2s+SS^!xkK-+wi2zl-kR2sYxm8SKAXlA#x8Iu)PBSxCai zYv|SZTo44a}mSs{-kOX0Q|Q8eM9=&W^mhD< z?qDv{kgv3&Th)(l-7f6G9P+#I5&Hf+^z45_cdm$09Jmy1SD^#dpx>)UZ$}q;JNj`G zjv@=m#r!$>>(PyN{3e=Y@1wWi)AaK%v5WS%>E{jXr)S=b?no zZ^vvjspp|vz5=}+d$5A>W0;C(_#P%XfDSZ){)sJW;%eefw4)JpLSyLd_ywJ4Gt1Vc z=s@ex74O9i9ze%Ag!Xd`lly;?iXEOt&*}$c?3lz7Y-ImTq88kVomhrPk)L>r2Xlx~ zBwu3^i?C2UZ;m@D_wc0Kq^$M)Ehf-r!pygr>GKJ9!D6TF#QioXgG4Xk_PP=$Z<$9d zNNV|s^`!LzoKR9ad3p`|)A5rJrzFq(nY#KVgxkA}Xd`YW))3@ha)nl)e+%v;wh#*m zw|hCUinxuqnr+-b*ZU{WlVYvXRQlw6QJK\n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "Confirm a user's password reset" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Passwords do not match" @@ -147,8 +147,8 @@ msgstr "Malformed phone number: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Invalid attribute format: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Activation link is invalid!" @@ -160,19 +160,19 @@ msgstr "Account has been already activated..." msgid "something went wrong: {e!s}" msgstr "Something went wrong: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token is invalid!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "The products this user has viewed most recently (max 48), in reverse-" "chronological order." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Groups" @@ -180,7 +180,7 @@ msgstr "Groups" msgid "wishlist" msgstr "Wishlist" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -197,91 +197,109 @@ msgstr "Language is one of the {LANGUAGES} with default {LANGUAGE_CODE}" msgid "address set" msgstr "Adresses" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Email" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "User's email address" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Phone Number" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "User phone number" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "First name" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Last name" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "User profile image" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Is verified" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "User's verification status" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Is active" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Unselect this instead of deleting accounts" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Is subscribed" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "User's newsletter subscription status" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Activation token" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attributes" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "User" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Users" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Group" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Outstanding token" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Outstanding tokens" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Blacklisted token" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Blacklisted tokens" @@ -344,8 +362,7 @@ msgstr "Hello %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "We have received a request to reset your password. Please reset your " @@ -409,12 +426,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Best regards,
the %(project_name)s team" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Activate Account" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Reset Password" @@ -429,31 +446,31 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." #: vibes_auth/views.py:66 msgid "" @@ -467,24 +484,18 @@ msgstr "" msgid "the token is invalid" msgstr "The token is invalid" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Password has been reset successfully!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "You have already activated the account..." diff --git a/vibes_auth/locale/es_ES/LC_MESSAGES/django.mo b/vibes_auth/locale/es_ES/LC_MESSAGES/django.mo index 10d01cfcfcfc1a51bfed53b99a0a2a1251c25497..5b1b40fcbfe94fc7c4383c8b317d56506781826d 100644 GIT binary patch delta 3176 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 diff --git a/vibes_auth/locale/es_ES/LC_MESSAGES/django.po b/vibes_auth/locale/es_ES/LC_MESSAGES/django.po index 42189f6c..86a4c9e5 100644 --- a/vibes_auth/locale/es_ES/LC_MESSAGES/django.po +++ b/vibes_auth/locale/es_ES/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Confirmar el restablecimiento de la contraseña de un usuario" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Las contraseñas no coinciden" @@ -150,8 +150,8 @@ msgstr "Número de teléfono malformado: ¡{phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Formato de atributo no válido: ¡{attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "El enlace de activación no es válido." @@ -163,19 +163,19 @@ msgstr "La cuenta ya ha sido activada..." msgid "something went wrong: {e!s}" msgstr "Algo salió mal: {e!s}." -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "¡La ficha no es válida!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Los productos que este usuario ha visto más recientemente (máx. 48), en " "orden cronológico inverso." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupos" @@ -183,7 +183,7 @@ msgstr "Grupos" msgid "wishlist" msgstr "Lista de deseos" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -200,91 +200,110 @@ msgstr "El idioma es uno de los {LANGUAGES} con {LANGUAGE_CODE} por defecto" msgid "address set" msgstr "Direcciones" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Representa una entidad Usuario con campos y métodos personalizados para una " +"funcionalidad ampliada. Esta clase amplía el modelo AbstractUser e integra " +"funciones adicionales como el inicio de sesión por correo electrónico " +"personalizado, métodos de validación, estado de suscripción, verificación y " +"almacenamiento de atributos. También proporciona utilidades para gestionar " +"los elementos vistos recientemente y la activación basada en tokens para " +"verificar las cuentas. El modelo User está diseñado para manejar casos de " +"uso específicos para una gestión de usuarios mejorada." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Correo electrónico" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Dirección de correo electrónico del usuario" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Número de teléfono" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Número de teléfono del usuario" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Nombre" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Apellido" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Imagen del perfil del usuario" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Se verifica" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Estado de verificación del usuario" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Está activo" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Deseleccione esta opción en lugar de eliminar cuentas" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Está suscrito" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Estado de suscripción del usuario al boletín" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Ficha de activación" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atributos" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Usuario" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Usuarios" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grupo" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Ficha pendiente" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Fichas pendientes" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Ficha en la lista negra" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Fichas en la lista negra" @@ -294,7 +313,8 @@ msgstr "`attributes` debe ser un diccionario" #: vibes_auth/serializers.py:101 msgid "business identificator is required when registering as a business" -msgstr "El identificador de empresa es necesario para registrarse como empresa" +msgstr "" +"El identificador de empresa es necesario para registrarse como empresa" #: vibes_auth/serializers.py:121 #, python-brace-format @@ -347,8 +367,7 @@ msgstr "Hola %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Hemos recibido una solicitud para restablecer su contraseña. Por favor, " @@ -412,12 +431,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Saludos cordiales,
el equipo %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Activar cuenta" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Restablecer contraseña" @@ -432,14 +451,14 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Representa una vista para obtener un par de tokens de acceso y actualización " -"y los datos del usuario. Esta vista gestiona el proceso de autenticación " +"Representa una vista para obtener un par de tokens de acceso y actualización" +" y los datos del usuario. Esta vista gestiona el proceso de autenticación " "basada en tokens donde los clientes pueden obtener un par de tokens JWT " "(acceso y actualización) utilizando las credenciales proporcionadas. Se " "construye sobre una vista de token base y asegura una limitación de tasa " @@ -447,18 +466,18 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Maneja la actualización de tokens con fines de autenticación. Esta clase se " "utiliza para proporcionar funcionalidad a las operaciones de actualización " "de tokens como parte de un sistema de autenticación. Garantiza que los " "clientes puedan solicitar un token actualizado dentro de los límites de " -"velocidad definidos. La vista depende del serializador asociado para validar " -"las entradas de actualización de tokens y producir las salidas apropiadas." +"velocidad definidos. La vista depende del serializador asociado para validar" +" las entradas de actualización de tokens y producir las salidas apropiadas." #: vibes_auth/views.py:66 msgid "" @@ -472,26 +491,18 @@ msgstr "" msgid "the token is invalid" msgstr "El token no es válido" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementación del conjunto de vistas de usuario.\n" -"Proporciona un conjunto de acciones que gestionan los datos relacionados con " -"el usuario, como la creación, recuperación, actualización, eliminación y " -"acciones personalizadas, incluyendo el restablecimiento de la contraseña, la " -"carga de avatares, la activación de cuentas y la fusión de elementos vistos " -"recientemente. Esta clase extiende los mixins y GenericViewSet para un " -"manejo robusto de la API." +"Proporciona un conjunto de acciones que gestionan los datos relacionados con el usuario, como la creación, recuperación, actualización, eliminación y acciones personalizadas, incluyendo el restablecimiento de la contraseña, la carga de avatares, la activación de cuentas y la fusión de elementos vistos recientemente. Esta clase extiende los mixins y GenericViewSet para un manejo robusto de la API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "La contraseña se ha restablecido correctamente." -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Ya ha activado la cuenta..." diff --git a/vibes_auth/locale/fa_IR/LC_MESSAGES/django.po b/vibes_auth/locale/fa_IR/LC_MESSAGES/django.po index f9883c19..aeeef784 100644 --- a/vibes_auth/locale/fa_IR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/fa_IR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -107,7 +107,7 @@ msgstr "" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "" @@ -150,8 +150,8 @@ msgstr "" msgid "Invalid attribute format: {attribute_pair}" msgstr "" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "something went wrong: {e!s}" msgstr "" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "" @@ -173,7 +173,7 @@ msgid "" "chronological order" msgstr "" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "" @@ -181,7 +181,7 @@ msgstr "" msgid "wishlist" msgstr "" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "" @@ -198,91 +198,102 @@ msgstr "" msgid "address set" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" + +#: vibes_auth/models.py:41 msgid "email" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "" @@ -400,12 +411,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "" @@ -444,7 +455,7 @@ msgstr "" msgid "the token is invalid" msgstr "" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" "Provides a set of actions that manage user-related data such as creation, " @@ -453,10 +464,10 @@ msgid "" "class extends the mixins and GenericViewSet for robust API handling." msgstr "" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "" diff --git a/vibes_auth/locale/fr_FR/LC_MESSAGES/django.mo b/vibes_auth/locale/fr_FR/LC_MESSAGES/django.mo index 729c358330a0023044cad11ca3f119324f3e37b1..0fa4abc76b925af23704d19b5b297d3c1602b4cc 100644 GIT binary patch delta 3232 zcmZvdYm61;8OL8>1%w3`C~^_yRk0|pTk(dhA})%SY7wZow1PN0=iRf@oilTs%OXwf z!KkgYiZQFz@S&}3S~#iJSlXybFKJKOrZM%4CK?lM@D}lwVDv-Nn)v(A%py(u<~;Lz z@6UDSJip`F;nr(&yB;>Q8nOhre2Ou9;r6LKXnUp`Gcw7TJK+k(@1AJP3ykN_;0!!6 z)0lwyjkAnd$M_j|CgXq4HfAwgdQy3BKfH+XAY26RgY%7PnP1RZ#l-L6Dez<11ABPT zHK#*#n3ZrITm#WF@zLgIfGoj)^DNZx_6^h5YP_$j3D%{`c_(C&i@`P1-J z_!{)7`v1U};jMVHlKIsves{7lqwpy6A5kFpGymr42;=08a^GNUS!uvts9Ze>FMuyV z_L!+yr;wfl*TXB|a(FkCXOBY}@<%8`UxftGybV=TpTbRW8dmGvHpmNL_Q0vI^&lO+ zCXd2P;7=;P1WBKn%_&{D3~qs!K^5mdsPDz|kRX}&pbY3DOw-^jI2F#X#!Fy7<7H6i zcEWMJ|KFw)GSPERS>1QQA27Zj%F;z7SVgu1%A-r6ifx^Z012hJ$di-v0;bT+77cu=oH$dD_D}H68j;ibJT2$Dks!7hVK^3@?T+ zLegwzoLAP!3OJMTW++2;Kt*yF)V_VNAN}T6bV7Ipo(6B~i}eW|(rtPuUD9Y)K?`?6 zvSaqZb+8S);rmdL_!ry{yDunTuLDp9KMPe$Z$LS;nD|rl$J#b}DsEcK?BppWYF{l; zSod}M3YXd(1YJepXsqyEiufAPYRE=p7NXQB8fpZhc$?IhVRGX5c9!z5b{Rr_n42}I znyOe$xl?rX0a}A7l*;!t$aRQPqdK`7k+(M@+Y!}<-V7C;>g#&sCPcNQH{&E^lk`tU zNWHlgS%oNc6K#;r`fA`+)R#_a=tcCkR8vJyG^KQ+oltcw++6jyLeX9JBlO z%tbY==aHWUapZ-Z9)GTTQEOl*%@WVgid!3T&4tD3Aj(`l@iNC{wOUY~vBS>G@`SlC z7l$7V+AyvMQLi22=9;JN69)9!G#^U+Bxn}1X~q>P8(k6%2mUq1-rho|mt{#X zluIWLC0^b2*$tWX!ZfzcBpwTDtmIjM?EyVG*6<<^z4h@Yx)-$Mbrz4h=)55>#aX-x z#!6eXx6rto%`EtF9%X5ty>Z0Z<2(;ii;kckaXO3b2seh#rcLL|R-30d&DB*_kl+?G2Vde+A}cf0c2^b$sSk_5QlX@}0wk~j+3*NgfT{l~nj zx#J3h)#a>sa-FU>q#LD<1<#Ik+C^cMdBa*IAdCG`f?F6oQ6)IO9>a)Co01$8eh z?kTqA3yMN1T`0oH<#m^4A4&>$OIzAAS;*3X0Eia0e5>VLEW~be+dLmF1KxD@VEL$R1n5Qiskqd)3>9k9i UCyrA=>G-Zw&p348l;!h20|X#Z$p8QV delta 2203 zcmYk-eMnVz9LMpmOUtWXOHIp~SIg2>)>dB4(lRx(CwthIP1CmKh-x)@rkZu?k5SnJ zl=MdrU}lCC^dtoSk-}K)pB06JwTOb+ipW755;17&{W<3d{qTEVzu!6c{2ssO+PV5p zo%1L$@`O?9i4TeJ0JDR*a3CL)jnQUnBFr}7c-jvFX5Y|`iZNSDdtIzqDeYe|llHKn z*$6B|^;d;q+=8jtj>-5VPBnAvK9!MN7!prl4i3f{NS{`TNmz}HX&Z0??!a_BkNnwB zd}z)+I0zr0Cj7)VNT&(33osGqV+rG19Tj!d?0=yfnUmeaD13|>_)ow63N_Gc)N^l9 zD^6qfyRiV5;|=7N#WUNjixj9S)RqTmOv5m;`}Q4j%XXu3;23J0OGDZJAE^Ayg&M3RGpJfSYC<z%eUiF+Ks5! z=^<*OZ*V5Y^W*RdR$?sfLG3^zYQk;kuvq(rN(S~JleXlEY%9*hINXQYiKBQ5TTri6 z(Ijuei%`k514(qdf)UtXmQ&FJRaO!jQ)QvfUnPe4g3#<$ln0u*R;8j&rxIVQL8&Jy z2~AFKizcVSxbADHx)xHR%6o;JbBm5aJ6+?C?_M0}etOwWj#(k0AD6@&v*7OB99%#wBch2YBA!qJe?YL&_9c<8_2&`&rHaaIzwwo?l1S&r zv0Al%t-x0(C;E%t2$ghViCg2h0y7BZiV}Smp)!wf>fEaLbEWLR zAp=A$F@+!n+#CQmsicY$Pi3x$E%FsXVj5AQ2IXV^S2@wG5lt(CfsX%U8xorOMh)pm I%*al92ea?LPyhe` diff --git a/vibes_auth/locale/fr_FR/LC_MESSAGES/django.po b/vibes_auth/locale/fr_FR/LC_MESSAGES/django.po index fdda99ee..5fa8d119 100644 --- a/vibes_auth/locale/fr_FR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/fr_FR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -108,7 +108,7 @@ msgstr "Confirmer la réinitialisation du mot de passe d'un utilisateur" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Les mots de passe ne correspondent pas" @@ -153,8 +153,8 @@ msgstr "Numéro de téléphone malformé : {phone_number} !" msgid "Invalid attribute format: {attribute_pair}" msgstr "Format d'attribut non valide : {attribute_pair} !" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Le lien d'activation n'est pas valide !" @@ -166,19 +166,19 @@ msgstr "Le compte a déjà été activé..." msgid "something went wrong: {e!s}" msgstr "Quelque chose a mal tourné : {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Le jeton n'est pas valide !" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" -"Les produits que cet utilisateur a consultés le plus récemment (max 48), par " -"ordre chronologique inverse." +"Les produits que cet utilisateur a consultés le plus récemment (max 48), par" +" ordre chronologique inverse." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Groupes" @@ -186,7 +186,7 @@ msgstr "Groupes" msgid "wishlist" msgstr "Liste de souhaits" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -206,91 +206,111 @@ msgstr "" msgid "address set" msgstr "Adresses" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Représente une entité Utilisateur avec des champs et des méthodes " +"personnalisés pour des fonctionnalités étendues. Cette classe étend le " +"modèle AbstractUser et intègre des fonctionnalités supplémentaires telles " +"que la connexion par courrier électronique, les méthodes de validation, " +"l'état de l'abonnement, la vérification et le stockage des attributs. Elle " +"fournit également des utilitaires pour la gestion des éléments récemment " +"consultés et l'activation par jeton pour la vérification des comptes. Le " +"modèle User est conçu pour gérer des cas d'utilisation spécifiques en vue " +"d'une gestion améliorée des utilisateurs." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Courriel" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Adresse électronique de l'utilisateur" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Numéro de téléphone" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Numéro de téléphone de l'utilisateur" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Prénom" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Nom de famille" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Image du profil de l'utilisateur" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Est vérifié" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Statut de vérification de l'utilisateur" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Est actif" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Désélectionner cette option au lieu de supprimer des comptes" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Est abonné" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Statut de l'abonnement à la lettre d'information de l'utilisateur" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Jeton d'activation" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attributs" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Utilisateur" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Utilisateurs" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Groupe" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Jeton exceptionnel" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Jetons en circulation" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Jeton sur liste noire" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Jetons sur liste noire" @@ -328,7 +348,8 @@ msgstr "Jeton non valide" #: vibes_auth/serializers.py:257 msgid "no user uuid claim present in token" -msgstr "Aucune revendication d'uuid d'utilisateur n'est présente dans le jeton" +msgstr "" +"Aucune revendication d'uuid d'utilisateur n'est présente dans le jeton" #: vibes_auth/serializers.py:259 msgid "user does not exist" @@ -355,8 +376,7 @@ msgstr "Bonjour %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Nous avons reçu une demande de réinitialisation de votre mot de passe. " @@ -373,8 +393,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Si le bouton ci-dessus ne fonctionne pas, veuillez copier et coller l'URL " -"suivante\n" +"Si le bouton ci-dessus ne fonctionne pas, veuillez copier et coller l'URL suivante\n" " suivante dans votre navigateur web :" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -406,8 +425,8 @@ msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" msgstr "" -"Merci de vous être inscrit à %(project_name)s. Veuillez activer votre compte " -"en cliquant sur le bouton ci-dessous :" +"Merci de vous être inscrit à %(project_name)s. Veuillez activer votre compte" +" en cliquant sur le bouton ci-dessous :" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -422,12 +441,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Meilleures salutations,
l'équipe %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Activer le compte" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Réinitialiser le mot de passe" @@ -442,8 +461,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -458,11 +477,11 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Gère le rafraîchissement des jetons à des fins d'authentification. Cette " "classe est utilisée pour fournir une fonctionnalité pour les opérations de " @@ -477,33 +496,25 @@ msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " msgstr "" -"Représente une vue permettant de vérifier les jetons Web JSON (JWT) à l'aide " -"d'une logique de sérialisation et de validation spécifique." +"Représente une vue permettant de vérifier les jetons Web JSON (JWT) à l'aide" +" d'une logique de sérialisation et de validation spécifique." #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "Le jeton n'est pas valide" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Mise en œuvre de l'ensemble des vues de l'utilisateur.\n" -"Fournit un ensemble d'actions qui gèrent les données liées à l'utilisateur, " -"telles que la création, la récupération, les mises à jour, la suppression et " -"les actions personnalisées, notamment la réinitialisation du mot de passe, " -"le téléchargement de l'avatar, l'activation du compte et la fusion des " -"éléments récemment consultés. Cette classe étend les mixins et " -"GenericViewSet pour une gestion robuste de l'API." +"Fournit un ensemble d'actions qui gèrent les données liées à l'utilisateur, telles que la création, la récupération, les mises à jour, la suppression et les actions personnalisées, notamment la réinitialisation du mot de passe, le téléchargement de l'avatar, l'activation du compte et la fusion des éléments récemment consultés. Cette classe étend les mixins et GenericViewSet pour une gestion robuste de l'API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Le mot de passe a été réinitialisé avec succès !" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Vous avez déjà activé le compte..." diff --git a/vibes_auth/locale/he_IL/LC_MESSAGES/django.mo b/vibes_auth/locale/he_IL/LC_MESSAGES/django.mo index 84f1bddd36562401d0d641d641251808463ea0ab..90d63da27f160e92480514c908ead6be41162bbc 100644 GIT binary patch delta 3156 zcmY+Edu$X{6o+pqZ?HlYgcjshi>Q%2>0RAe zoByu3f19Btka5WDLSvqXs|NC*Jv-Q#`T}FN!W+@g4l(9S^ie}u1AiK3jEjBoWyUN( z{}5h_{#TJPC2+#!;l8ur4D{u2ENq0MjLDlGI=5mt4ol&$a0DE|gRUuq_%PGp6>tv3 zw^;%w!&Pts+y(JzdZA)J3J1ZDpaTCi;srPoeH@Qs{F_QTRT!$EHrfXHn>TonjCmgp zfS*7){w&hJf^zf?)VkA985a~A^9&pZm&4bf61fN)U_Y|ZzH8wy{F^OwsH%A(8fb;{ z(7Pl18Q35F9Mnb^;22nNr7_pR5?BGN;Po&CiN)-JI*LP(CFXND8=i(r=xWtp8I;q} zg2|8|%^awssE(M7#&^Nd*k6M>l6RppIRS^mQ;@yQ*H9%t4{wKKSfry_3Kd8U>JH>a zQ-3*n8N&|v7F-FZT@`NB2o+ElROIhL1$rT3A!U%GQ4o`v4^^oZP>xnZtzQSVZhNG^ z0{NRmW2pZ`Iv=B{BtJq$`U~6%|AAb5vx9I|+Lxe8eiV*}-@!Py{%?2&t|6OSu;0mG zzMnCh;P2S~N%Za47;^*qUHS5G!xUu9v_VCF6kZKaL0zh|a1k6pv5 zsEjv5W!4IH1U=BgBa!|UT!DTX>TQ`t^t!~gQ1kQa=qTeYP#eD(@dL=;e9uEA9ylpH zf@yFjdJ0k;a{zM8<^6h~->uQHbE<@)&(S2SFRj6CXi&W#DZJ0*XtaC6L9)Wr!-F z;M6FD!FSNOMrJ|O@54l$znU%t_rg3bC2E5r@@fa?sSl9KI2W0T+=D!T=uYTj-i4@| z%Mcys3`B3poyfh&gNQER5M&^7IZ`eE{ScLF4RR}@4@h5IPUr4OiA7YYb+Nc-!Pipe z+x3W=?n+-95OpkE67?T}I+mqK{$Umiu<((rld(?9bG?oBY1gZ_ z@m$tRH@KUegspX*WFl*0sf2BCy!tf#+BCB_cup#z@mwnIx#?6a$?BFP~Jc@CQ;5^lK0);cjSm%)~FpK>C<)@g{jNt;a9xv2`fo}Cjh zP45e!!e(nix9ycGk*c z&DeKND9`(?tZrjfhyCAiVbk6nnrLyc7sGx8Md{QT!j~7`9FT delta 2203 zcmXxleMr?;9LMpmbuF*?v*knCgZi`epqsTUGt(Z_ZM7ckLAUg#<~GMFS<7gHqU=Y1 zlo=Ih)F1uRS~0{yM1uXbHAb<279@_LGTaEF1wle#Y|z8|bMLu_zP`@+{qFspbH3+$ zf1UZVrzsds3tcc;3o(Z%o@myIn+yLbq5 z@fz~a?(j!z9>mEwf?Dtcr^iF5F)qb4+=!LTZ%uUcpv&$9w~;m304Cz!sEHrC@fd2N zan$!-qIR6k>f5mt>#!fWWvR@%4|7n@J%ifVB@8pa{orogz_pBj)(w1xAxvVqdXR@% zn2igt1PieV^YJwD73)JC#a&e99^)!}iP}&Z7qx*34D^Ndbhu{`)KPrpJcYV{4X0y2 zYUTG(I~m3le1sYJ9F_7ggOyl}WZ%9b5Ro&;S6jA4jK?f2AbEQ?$}#?7*2w z!P^y7YI{*BAH;0@A6uyUES~lNkFu>2t~ax-7mP1r7vpn$_%>rd$E<+yKNO6flkA)2 zVNpOwE3QR8W4lqsbP}ua3TgpQkvT1kZ)rzMP^qs%ZrN5hZo_)U?WkYLpQz%UFgNyj z54F)*sOJU+u2X|r*%4G~zelD19xlgZDoUxVKu*IVs3P5us)fU-i8@dV>&8;NjLO&$ zcH=m1!_Ilp8VGEJj#4#_+W9FCMi07*I)dxYTeyYsFQ{L`R936|xu~sSqs?&mSK*5|3~O3)t68c|BKqeGi0&RJn4(`$d`}nkTuwD)En+B@@(rx zeQyADM5Cyq9YY^O6u>f^kBu0?Oy;+KI@E>zjy^s?Wy0eej$=N4i@oTh&%x>lDzO>s zFb{8`7BY;hQ7;D{)}S`ljH\n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "אשר את איפוס הסיסמה של המשתמש" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "הסיסמאות אינן תואמות" @@ -147,8 +147,8 @@ msgstr "מספר טלפון שגוי: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "פורמט תכונה לא חוקי: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "קישור ההפעלה אינו תקף!" @@ -160,17 +160,17 @@ msgstr "החשבון כבר הופעל..." msgid "something went wrong: {e!s}" msgstr "משהו השתבש: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "האסימון אינו חוקי!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "המוצרים שהמשתמש צפה בהם לאחרונה (מקסימום 48), בסדר כרונולוגי הפוך." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "קבוצות" @@ -178,7 +178,7 @@ msgstr "קבוצות" msgid "wishlist" msgstr "רשימת משאלות" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "אוואטר" @@ -195,91 +195,107 @@ msgstr "השפה היא אחת ה-{LANGUAGES} עם ברירת מחדל {LANGUAGE msgid "address set" msgstr "כתובות" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"מייצג ישות משתמש עם שדות ושיטות מותאמים אישית לפונקציונליות מורחבת. מחלקה זו" +" מרחיבה את המודל AbstractUser ומשלבת תכונות נוספות כגון כניסה מותאמת אישית " +"באמצעות דוא\"ל, שיטות אימות, מצב מנוי, אימות ואחסון תכונות. היא מספקת גם כלי" +" עזר לניהול פריטים שנצפו לאחרונה והפעלה מבוססת אסימון לאימות חשבונות. המודל " +"User נועד לטפל במקרי שימוש ספציפיים לניהול משתמשים משופר." + +#: vibes_auth/models.py:41 msgid "email" msgstr "דוא\"ל" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "כתובת הדוא\"ל של המשתמש" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "מספר טלפון" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "מספר הטלפון של המשתמש" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "שם פרטי" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "שם משפחה" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "תמונת פרופיל המשתמש" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "מאומת" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "סטטוס אימות המשתמש" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "פעיל" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "בטל את הבחירה במקום למחוק חשבונות" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "מנוי" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "סטטוס המנוי לניוזלטר של המשתמש" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "אסימון הפעלה" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "תכונות" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "משתמש" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "משתמשים" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "קבוצה" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "אסימון יוצא מן הכלל" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "אסימונים מצטיינים" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "אסימון ברשימה השחורה" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "אסימונים ברשימה השחורה" @@ -342,12 +358,11 @@ msgstr "שלום %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" -"קיבלנו בקשה לאיפוס הסיסמה שלך. אנא איפס את הסיסמה שלך על ידי לחיצה על הכפתור " -"שלהלן:" +"קיבלנו בקשה לאיפוס הסיסמה שלך. אנא איפס את הסיסמה שלך על ידי לחיצה על הכפתור" +" שלהלן:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -403,12 +418,12 @@ msgstr "הפעל חשבון" msgid "best regards,
the %(project_name)s team" msgstr "בברכה,
צוות %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | הפעל חשבון" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | איפוס סיסמה" @@ -423,8 +438,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -436,11 +451,11 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "מטפל ברענון אסימונים למטרות אימות. מחלקה זו משמשת לספק פונקציונליות עבור " "פעולות רענון אסימונים כחלק ממערכת אימות. היא מבטיחה שלקוחות יוכלו לבקש " @@ -459,23 +474,20 @@ msgstr "" msgid "the token is invalid" msgstr "האסימון אינו חוקי" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "יישום הגדרת תצוגת משתמש. מספק סט פעולות לניהול נתונים הקשורים למשתמש, כגון " "יצירה, אחזור, עדכונים, מחיקה ופעולות מותאמות אישית, כולל איפוס סיסמה, העלאת " "אווטאר, הפעלת חשבון ומיזוג פריטים שנצפו לאחרונה. מחלקה זו מרחיבה את mixins " "ו-GenericViewSet לטיפול חזק ב-API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "הסיסמה אופסה בהצלחה!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "כבר הפעלת את החשבון..." diff --git a/vibes_auth/locale/hi_IN/LC_MESSAGES/django.po b/vibes_auth/locale/hi_IN/LC_MESSAGES/django.po index d607ec4d..22f1151f 100644 --- a/vibes_auth/locale/hi_IN/LC_MESSAGES/django.po +++ b/vibes_auth/locale/hi_IN/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -107,7 +107,7 @@ msgstr "" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "" @@ -150,8 +150,8 @@ msgstr "" msgid "Invalid attribute format: {attribute_pair}" msgstr "" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "something went wrong: {e!s}" msgstr "" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "" @@ -173,7 +173,7 @@ msgid "" "chronological order" msgstr "" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "" @@ -181,7 +181,7 @@ msgstr "" msgid "wishlist" msgstr "" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "" @@ -198,91 +198,102 @@ msgstr "" msgid "address set" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" + +#: vibes_auth/models.py:41 msgid "email" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "" @@ -400,12 +411,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "" @@ -444,7 +455,7 @@ msgstr "" msgid "the token is invalid" msgstr "" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" "Provides a set of actions that manage user-related data such as creation, " @@ -453,10 +464,10 @@ msgid "" "class extends the mixins and GenericViewSet for robust API handling." msgstr "" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "" diff --git a/vibes_auth/locale/hr_HR/LC_MESSAGES/django.po b/vibes_auth/locale/hr_HR/LC_MESSAGES/django.po index f9883c19..aeeef784 100644 --- a/vibes_auth/locale/hr_HR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/hr_HR/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -107,7 +107,7 @@ msgstr "" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "" @@ -150,8 +150,8 @@ msgstr "" msgid "Invalid attribute format: {attribute_pair}" msgstr "" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "something went wrong: {e!s}" msgstr "" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "" @@ -173,7 +173,7 @@ msgid "" "chronological order" msgstr "" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "" @@ -181,7 +181,7 @@ msgstr "" msgid "wishlist" msgstr "" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "" @@ -198,91 +198,102 @@ msgstr "" msgid "address set" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" + +#: vibes_auth/models.py:41 msgid "email" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "" @@ -400,12 +411,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "" @@ -444,7 +455,7 @@ msgstr "" msgid "the token is invalid" msgstr "" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" "Provides a set of actions that manage user-related data such as creation, " @@ -453,10 +464,10 @@ msgid "" "class extends the mixins and GenericViewSet for robust API handling." msgstr "" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "" diff --git a/vibes_auth/locale/id_ID/LC_MESSAGES/django.mo b/vibes_auth/locale/id_ID/LC_MESSAGES/django.mo index 9d9ac1a4f6041b31aa8755490112c28f74d077bd..f9f902b799932c58236161a5f0240cc4ac9b0e26 100644 GIT binary patch delta 3118 zcmY+ES!`5Q7{^abk+O(@f~8_PDB@NsD6%LBbzxCi1#v0JotfL|p)+@ex%Z+~aa=Gi zLHkg_=z|1}2tgkd6k^mE6%#{zaY=|K7ek=fB!qTpeOU)-`T(Q%onQ;uBjdw z)v(pja>zJj_5fp^f*oh@p*`GaOjn&TkHE_q|2Wu~FBy*>!Wnpcs4vuL zLdJg#H>MemKdW}{HEQ~RI(HPx z;BttOW)4&;mZdDD>rcWl%)bbgk~g6|c^?jghah*G!%!jr8P0-D98zjlKpEme)j&Lk z_)AeQ6OY3^@Gdy@+}cH3pbXjpW%)iRLrR+-o!;?Vwwi!!BRLKW}u$w z3s8o>ldd0xO66fFL%)Nn{>F*MTm?r!y_OrHint85zxn_j3Az#$aoi25uSun^bh2Tn+CM07)L{FH}`g4);uXZg$w9VZbq)jQ)J&Or26zD)Y-5ru0VG6R{8^taV?Zb}DUN)_oag!CnKpy^rqq)jR7 zZz^Cli!4`%whEbmtU#)_@o7iYZbsH7z1p9Ja;*P=d58)ugQ(I6AgYHU$Qnd{Fr+vs zx(28s>u+<@&Z3k{`xoGF{jQ<2FrA#Tx7he<-J(^YU$K4=xv0n9>!L23jl-x^bocu? z+v)s5F0@{dvqeAZD$(yOvHQNr4{}REs(9HbxwTlz`Gw@P z3nD*X@gkqgayeH!V>^8>iYv?&T(_UZac5cKPy{p9O5)rr$G%^&$5$gSuz+?{33~I+uJZ?=1BiuuNzZqnesxr%n$PU zIPlOAWy? z@=Y4=?BseaOKaH=dR(!rRqNIA*=BF?3s~*~XV=Ghk9&h2Kj*x}$0VPu)|_Q2?-xo1 z&$`Gj_LV0#RduV^tyG52X8a1tB~MABPaP`O%1LIhHxAnD;v^`igYGIMO94Kmhk=Jh poQXr3on!}H5%D04ak^91QZ(IOBy&}8>y_nGC))PTI`4(E{sn$66kq@V delta 2199 zcmXxlduWwq9KiA4a;x2rYqmK}x2cs@uDq?yP3JCFnz_=ZuH{)bg)U}g85K3oAKi2) z5|NM%vJ{b&h*na6lvED?8srvH{$U_U1ws8G28q`9d(L|v_B)^FdEay1=k|Nvjr5PL z&zzZ5_-;@(5z~pr2@yMS^_6^3o-K}eydYv5-c0*+NyKK_MWqo>(0;NkqKo#AcpdGU zRK&Ho1byBHY{chrDjvpa{0^HVGVwE&XF^}U_cp4q>*~AnNt)#seC*dmWr2pur;)6a&zHl5FQ=Gyg{1xr^T+;p7If`(x-Hof=adc*96JsWsOuG&jVlT1_F^CRuKe}?mXa`@RD|Q0iicxf6W9Xh=#MiN! zUemY_S;S2IL*+3pRFJan)r)8cJJAk?lJ-ZqlJ*y9@?AzdD!)GW-l#-#XBP4o&3v?D z8t3B>y27LAgnq{w&;K+sp_2=X&<K#;>6RdJoNkqc{i0(LKC~Q^ z6Pb?=v(G&IK~^W;M1Ob$d6~uMxEn{3b`NKe$;W22 z!$EWcUt$5~OD`3+KU*H;lX+yzYWLq#O59I4DvO=DXO7;&A;~V?quEyOpH(+?Guf4J zR+d`{Pm_g7XSX%mNIsmDrIla~tZJ@*uVs&ix~I-+39*!DBN~Z2h*bpnn$3^p=!xke zHWD5?GCI15JBhoA^@J-}M0kAfC9WVEh=+(K`@fCImkm^IPZ|#=x;4IbJYcPW>k{ooFX~jXpw=hg46_#bw}x#s`? diff --git a/vibes_auth/locale/id_ID/LC_MESSAGES/django.po b/vibes_auth/locale/id_ID/LC_MESSAGES/django.po index f3dc01b1..d36723c2 100644 --- a/vibes_auth/locale/id_ID/LC_MESSAGES/django.po +++ b/vibes_auth/locale/id_ID/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Mengonfirmasi pengaturan ulang kata sandi pengguna" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Kata sandi tidak cocok" @@ -150,8 +150,8 @@ msgstr "Nomor telepon rusak: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Format atribut tidak valid: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Tautan aktivasi tidak valid!" @@ -163,19 +163,19 @@ msgstr "Akun sudah diaktifkan..." msgid "something went wrong: {e!s}" msgstr "Ada yang tidak beres: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token tidak valid!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Produk yang terakhir dilihat pengguna ini (maksimal 48), dalam urutan " "kronologis terbalik." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grup" @@ -183,7 +183,7 @@ msgstr "Grup" msgid "wishlist" msgstr "Daftar keinginan" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -201,91 +201,110 @@ msgstr "" msgid "address set" msgstr "Alamat" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Mewakili entitas Pengguna dengan bidang dan metode yang disesuaikan untuk " +"fungsionalitas yang diperluas. Kelas ini memperluas model AbstractUser dan " +"mengintegrasikan fitur-fitur tambahan seperti login email khusus, metode " +"validasi, status langganan, verifikasi, dan penyimpanan atribut. Kelas ini " +"juga menyediakan utilitas untuk mengelola item yang baru saja dilihat dan " +"aktivasi berbasis token untuk memverifikasi akun. Model Pengguna dirancang " +"untuk menangani kasus penggunaan tertentu untuk meningkatkan manajemen " +"pengguna." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Email" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Alamat email pengguna" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Nomor Telepon" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Nomor telepon pengguna" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Nama depan" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Nama belakang" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Gambar profil pengguna" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Sudah diverifikasi" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Status verifikasi pengguna" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Aktif" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Batalkan pilihan ini alih-alih menghapus akun" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Sudah berlangganan" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status berlangganan buletin pengguna" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Token aktivasi" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atribut" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Pengguna" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Pengguna" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Kelompok" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Token yang luar biasa" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Token yang beredar" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token yang masuk daftar hitam" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Token yang masuk daftar hitam" @@ -348,12 +367,11 @@ msgstr "Halo %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" -"Kami telah menerima permintaan untuk mengatur ulang kata sandi Anda. Silakan " -"atur ulang kata sandi Anda dengan mengeklik tombol di bawah ini:" +"Kami telah menerima permintaan untuk mengatur ulang kata sandi Anda. Silakan" +" atur ulang kata sandi Anda dengan mengeklik tombol di bawah ini:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -365,8 +383,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Jika tombol di atas tidak berfungsi, silakan salin dan tempelkan URL " -"berikut\n" +"Jika tombol di atas tidak berfungsi, silakan salin dan tempelkan URL berikut\n" " ke dalam peramban web Anda:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -414,12 +431,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Salam hormat, tim %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktifkan Akun" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Atur Ulang Kata Sandi" @@ -434,8 +451,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -449,11 +466,11 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Menangani penyegaran token untuk tujuan otentikasi. Kelas ini digunakan " "untuk menyediakan fungsionalitas untuk operasi penyegaran token sebagai " @@ -474,25 +491,18 @@ msgstr "" msgid "the token is invalid" msgstr "Token tidak valid" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementasi set tampilan pengguna.\n" -"Menyediakan serangkaian tindakan yang mengelola data terkait pengguna " -"seperti pembuatan, pengambilan, pembaruan, penghapusan, dan tindakan khusus " -"termasuk pengaturan ulang kata sandi, unggahan avatar, aktivasi akun, dan " -"penggabungan item yang baru dilihat. Kelas ini memperluas mixin dan " -"GenericViewSet untuk penanganan API yang kuat." +"Menyediakan serangkaian tindakan yang mengelola data terkait pengguna seperti pembuatan, pengambilan, pembaruan, penghapusan, dan tindakan khusus termasuk pengaturan ulang kata sandi, unggahan avatar, aktivasi akun, dan penggabungan item yang baru dilihat. Kelas ini memperluas mixin dan GenericViewSet untuk penanganan API yang kuat." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Kata sandi telah berhasil diatur ulang!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Anda telah mengaktifkan akun..." diff --git a/vibes_auth/locale/it_IT/LC_MESSAGES/django.mo b/vibes_auth/locale/it_IT/LC_MESSAGES/django.mo index 1bbaf2544a52c8c780739e84978b8bd11b3da661..cd66bc16f29a13bc5dbfe0fe4c5d1e0dd4e25d17 100644 GIT binary patch delta 3156 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 diff --git a/vibes_auth/locale/it_IT/LC_MESSAGES/django.po b/vibes_auth/locale/it_IT/LC_MESSAGES/django.po index aa661e71..53934424 100644 --- a/vibes_auth/locale/it_IT/LC_MESSAGES/django.po +++ b/vibes_auth/locale/it_IT/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -107,7 +107,7 @@ msgstr "Confermare la reimpostazione della password di un utente" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Le password non corrispondono" @@ -150,8 +150,8 @@ msgstr "Numero di telefono malformato: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Formato attributo non valido: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Il link di attivazione non è valido!" @@ -163,19 +163,19 @@ msgstr "L'account è già stato attivato..." msgid "something went wrong: {e!s}" msgstr "Qualcosa è andato storto: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Il gettone non è valido!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "I prodotti che questo utente ha visualizzato più di recente (max 48), in " "ordine cronologico inverso." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Gruppi" @@ -183,7 +183,7 @@ msgstr "Gruppi" msgid "wishlist" msgstr "Lista dei desideri" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -202,91 +202,110 @@ msgstr "" msgid "address set" msgstr "Indirizzi" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Rappresenta un'entità Utente con campi e metodi personalizzati per " +"funzionalità estese. Questa classe estende il modello AbstractUser e integra" +" funzionalità aggiuntive come il login via e-mail personalizzato, i metodi " +"di convalida, lo stato di iscrizione, la verifica e la memorizzazione degli " +"attributi. Fornisce inoltre utilità per la gestione degli elementi " +"visualizzati di recente e l'attivazione basata su token per la verifica " +"degli account. Il modello User è progettato per gestire casi d'uso specifici" +" per una migliore gestione degli utenti." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Email" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Indirizzo e-mail dell'utente" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Numero di telefono" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Numero di telefono dell'utente" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Nome" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Cognome" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Immagine del profilo utente" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "È verificato" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Stato di verifica dell'utente" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "È attivo" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Deselezionare questa opzione invece di eliminare gli account" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "È iscritto" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Stato di iscrizione alla newsletter dell'utente" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Token di attivazione" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attributi" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Utente" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Utenti" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Gruppo" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Gettone eccezionale" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Gettoni in sospeso" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token in lista nera" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Gettoni nella lista nera" @@ -351,8 +370,7 @@ msgstr "Hello %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Abbiamo ricevuto una richiesta di reimpostazione della password. La " @@ -416,12 +434,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Cordiali saluti,
il team %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Attiva l'account" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Reimpostare la password" @@ -436,8 +454,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -452,17 +470,17 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Gestisce l'aggiornamento dei token per l'autenticazione. Questa classe è " "utilizzata per fornire funzionalità per le operazioni di aggiornamento dei " "token come parte di un sistema di autenticazione. Garantisce che i client " -"possano richiedere un token aggiornato entro limiti di velocità definiti. La " -"vista si affida al serializzatore associato per convalidare gli input di " +"possano richiedere un token aggiornato entro limiti di velocità definiti. La" +" vista si affida al serializzatore associato per convalidare gli input di " "aggiornamento dei token e produrre output appropriati." #: vibes_auth/views.py:66 @@ -477,26 +495,18 @@ msgstr "" msgid "the token is invalid" msgstr "Il token non è valido" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementazione del set di viste utente.\n" -"Fornisce un insieme di azioni che gestiscono i dati relativi all'utente, " -"come la creazione, il recupero, gli aggiornamenti, la cancellazione e le " -"azioni personalizzate, tra cui la reimpostazione della password, il " -"caricamento dell'avatar, l'attivazione dell'account e l'unione degli " -"elementi visti di recente. Questa classe estende i mixin e GenericViewSet " -"per una gestione robusta delle API." +"Fornisce un insieme di azioni che gestiscono i dati relativi all'utente, come la creazione, il recupero, gli aggiornamenti, la cancellazione e le azioni personalizzate, tra cui la reimpostazione della password, il caricamento dell'avatar, l'attivazione dell'account e l'unione degli elementi visti di recente. Questa classe estende i mixin e GenericViewSet per una gestione robusta delle API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "La password è stata reimpostata con successo!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Avete già attivato l'account..." diff --git a/vibes_auth/locale/ja_JP/LC_MESSAGES/django.mo b/vibes_auth/locale/ja_JP/LC_MESSAGES/django.mo index 359786123e3cdcb61ca13953f56f33ac785ded32..6ebb33a4a19eb6141e46442cf35042f7aed729a2 100644 GIT binary patch delta 3252 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 diff --git a/vibes_auth/locale/ja_JP/LC_MESSAGES/django.po b/vibes_auth/locale/ja_JP/LC_MESSAGES/django.po index 0afea4ec..2c386e38 100644 --- a/vibes_auth/locale/ja_JP/LC_MESSAGES/django.po +++ b/vibes_auth/locale/ja_JP/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "ユーザーのパスワード・リセットを確認する" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "パスワードが一致しない" @@ -114,9 +114,7 @@ msgstr "ユーザーアカウントの有効化" #: vibes_auth/docs/drf/viewsets.py:67 msgid "activation link is invalid or account already activated" -msgstr "" -"アクティベーションリンクが無効であるか、アカウントがすでにアクティベーション" -"されています。" +msgstr "アクティベーションリンクが無効であるか、アカウントがすでにアクティベーションされています。" #: vibes_auth/docs/drf/viewsets.py:72 msgid "merge client-stored recently viewed products" @@ -149,8 +147,8 @@ msgstr "電話番号が不正です:{phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "無効な属性形式です:{attribute_pair}です!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "アクティベーションリンクが無効です!" @@ -162,17 +160,17 @@ msgstr "アカウントはすでに有効になっています..." msgid "something went wrong: {e!s}" msgstr "何かが間違っていた:{e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "トークンが無効です!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "このユーザーが最近閲覧した商品(最大48件)を逆順に表示します。" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "グループ" @@ -180,7 +178,7 @@ msgstr "グループ" msgid "wishlist" msgstr "ウィッシュリスト" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "アバター" @@ -197,91 +195,104 @@ msgstr "言語は {LANGUAGES} のいずれかで、デフォルトは {LANGUAGE_ msgid "address set" msgstr "住所" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"拡張機能のためにカスタマイズされたフィールドとメソッドを持つ User エンティティを表します。このクラスは AbstractUser " +"モデルを拡張し、カスタムメールログイン、検証メソッド、購読ステータス、検証、属性保存などの追加機能を統合しています。また、最近閲覧したアイテムを管理するユーティリティや、アカウントを検証するためのトークンベースのアクティベーションも提供します。Userモデルは、ユーザ管理を強化するための特定のユースケースを扱うように設計されています。" + +#: vibes_auth/models.py:41 msgid "email" msgstr "電子メール" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "ユーザーのメールアドレス" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "電話番号" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "ユーザー電話番号" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "名前" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "姓" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "ユーザープロフィール画像" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "確認済み" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "ユーザーの認証状況" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "アクティブ" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "アカウントを削除する代わりに、この選択を解除する" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "購読中" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "ユーザーのニュースレター購読状況" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "アクティベーション・トークン" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "属性" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "ユーザー" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "ユーザー" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "グループ" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "卓越したトークン" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "トークン残高" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "ブラックリストトークン" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "ブラックリストに載ったトークン" @@ -344,12 +355,9 @@ msgstr "こんにちは %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" -msgstr "" -"パスワードの再設定依頼が届いております。以下のボタンをクリックして、パスワー" -"ドをリセットしてください:" +msgstr "パスワードの再設定依頼が届いております。以下のボタンをクリックして、パスワードをリセットしてください:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -361,8 +369,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"上記のボタンが機能しない場合は、次のURLをコピーしてウェブブラウザに貼り付けて" -"ください。\n" +"上記のボタンが機能しない場合は、次のURLをコピーしてウェブブラウザに貼り付けてください。\n" " をウェブブラウザに貼り付けてください:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -393,9 +400,7 @@ msgstr "アカウントの有効化" msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" -msgstr "" -"%(project_name)sにご登録いただきありがとうございます。下のボタンをクリックし" -"てアカウントを有効にしてください:" +msgstr "%(project_name)sにご登録いただきありがとうございます。下のボタンをクリックしてアカウントを有効にしてください:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -410,12 +415,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "よろしくお願いします、
%(project_name)sチーム" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME}| アカウントの有効化| アカウントの有効化" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | パスワードのリセット" @@ -424,68 +429,53 @@ msgstr "{config.PROJECT_NAME} | パスワードのリセット" msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." -msgstr "" -"電話番号の形式が無効です。電話番号は次の形式で入力してください:" -"\"+999999999\".15桁まで入力可能です。" +msgstr "電話番号の形式が無効です。電話番号は次の形式で入力してください:\"+999999999\".15桁まで入力可能です。" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"アクセストークンとリフレッシュトークンのペアとユーザーデータを取得するための" -"ビューを表します。このビューは、クライアントが提供されたクレデンシャルを使用" -"して JWT トークンのペア(アクセスとリフレッシュ)を取得できる、トークン・ベー" -"スの認証を処理するプロセスを管理します。ベースのトークンビューの上に構築さ" -"れ、ブルートフォース攻撃から保護するために適切なレート制限を保証します。" +"アクセストークンとリフレッシュトークンのペアとユーザーデータを取得するためのビューを表します。このビューは、クライアントが提供されたクレデンシャルを使用して" +" JWT " +"トークンのペア(アクセスとリフレッシュ)を取得できる、トークン・ベースの認証を処理するプロセスを管理します。ベースのトークンビューの上に構築され、ブルートフォース攻撃から保護するために適切なレート制限を保証します。" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"認証目的のトークンのリフレッシュを処理します。このクラスは、認証システムの一" -"部としてトークンのリフレッシュ操作の機能を提供するために使用されます。このク" -"ラスは、クライアントがリフレッシュされたトークンを定義されたレート制限内で要" -"求できるようにします。ビューは、トークン更新の入力を検証して適切な出力を行う" -"ために、 関連するシリアライザに依存します。" +"認証目的のトークンのリフレッシュを処理します。このクラスは、認証システムの一部としてトークンのリフレッシュ操作の機能を提供するために使用されます。このクラスは、クライアントがリフレッシュされたトークンを定義されたレート制限内で要求できるようにします。ビューは、トークン更新の入力を検証して適切な出力を行うために、" +" 関連するシリアライザに依存します。" #: vibes_auth/views.py:66 msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " -msgstr "" -"特定のシリアライズと検証ロジックを使用して JSON ウェブトークン (JWT) を検証す" -"るビューを表します。" +msgstr "特定のシリアライズと検証ロジックを使用して JSON ウェブトークン (JWT) を検証するビューを表します。" #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "トークンが無効" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "ユーザービューセットの実装。\n" -"作成、取得、更新、削除、およびパスワードリセット、アバターアップロード、アカ" -"ウントの有効化、最近見たアイテムのマージなどのカスタムアクションなど、ユーザ" -"関連のデータを管理するアクションのセットを提供します。このクラスは、堅牢なAPI" -"ハンドリングのためにミキシンとGenericViewSetを拡張します。" +"作成、取得、更新、削除、およびパスワードリセット、アバターアップロード、アカウントの有効化、最近見たアイテムのマージなどのカスタムアクションなど、ユーザ関連のデータを管理するアクションのセットを提供します。このクラスは、堅牢なAPIハンドリングのためにミキシンとGenericViewSetを拡張します。" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "パスワードのリセットに成功しました!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "あなたはすでにアカウントを有効にしています..." diff --git a/vibes_auth/locale/kk_KZ/LC_MESSAGES/django.po b/vibes_auth/locale/kk_KZ/LC_MESSAGES/django.po index d607ec4d..22f1151f 100644 --- a/vibes_auth/locale/kk_KZ/LC_MESSAGES/django.po +++ b/vibes_auth/locale/kk_KZ/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) 2025 EGOR GORBUNOV # This file is distributed under the same license as the EVIBES package. # EGOR GORBUNOV , 2025. -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: LANGUAGE \n" @@ -107,7 +107,7 @@ msgstr "" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "" @@ -150,8 +150,8 @@ msgstr "" msgid "Invalid attribute format: {attribute_pair}" msgstr "" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "something went wrong: {e!s}" msgstr "" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "" @@ -173,7 +173,7 @@ msgid "" "chronological order" msgstr "" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "" @@ -181,7 +181,7 @@ msgstr "" msgid "wishlist" msgstr "" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "" @@ -198,91 +198,102 @@ msgstr "" msgid "address set" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" + +#: vibes_auth/models.py:41 msgid "email" msgstr "" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "" @@ -400,12 +411,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "" @@ -444,7 +455,7 @@ msgstr "" msgid "the token is invalid" msgstr "" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" "Provides a set of actions that manage user-related data such as creation, " @@ -453,10 +464,10 @@ msgid "" "class extends the mixins and GenericViewSet for robust API handling." msgstr "" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "" diff --git a/vibes_auth/locale/ko_KR/LC_MESSAGES/django.mo b/vibes_auth/locale/ko_KR/LC_MESSAGES/django.mo index 9a2f72eae52dbfddd8a19fba53bdc3452e306c05..273691950182234f135b8df8358858e1a1a374c4 100644 GIT binary patch delta 3162 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 diff --git a/vibes_auth/locale/ko_KR/LC_MESSAGES/django.po b/vibes_auth/locale/ko_KR/LC_MESSAGES/django.po index f8369b71..cdf54526 100644 --- a/vibes_auth/locale/ko_KR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/ko_KR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "사용자의 비밀번호 재설정 확인" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "비밀번호가 일치하지 않습니다." @@ -147,8 +147,8 @@ msgstr "잘못된 전화 번호입니다: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "잘못된 속성 형식입니다: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "활성화 링크가 유효하지 않습니다!" @@ -160,17 +160,17 @@ msgstr "계정이 이미 활성화되었습니다..." msgid "something went wrong: {e!s}" msgstr "문제가 발생했습니다: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "토큰이 유효하지 않습니다!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "이 사용자가 가장 최근에 본 제품(최대 48개)을 시간 역순으로 표시합니다." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "그룹" @@ -178,7 +178,7 @@ msgstr "그룹" msgid "wishlist" msgstr "위시리스트" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "아바타" @@ -195,91 +195,106 @@ msgstr "언어는 {LANGUAGES} 중 하나이며 기본값은 {LANGUAGE_CODE}입 msgid "address set" msgstr "주소" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"확장 기능을 위한 사용자 정의 필드 및 메서드가 있는 사용자 엔티티를 나타냅니다. 이 클래스는 AbstractUser 모델을 확장하여 " +"사용자 지정 이메일 로그인, 유효성 검사 방법, 가입 상태, 인증 및 속성 저장과 같은 추가 기능을 통합합니다. 또한 최근에 본 항목을 " +"관리하기 위한 유틸리티와 계정 인증을 위한 토큰 기반 활성화도 제공합니다. 사용자 모델은 향상된 사용자 관리를 위한 특정 사용 사례를 " +"처리하도록 설계되었습니다." + +#: vibes_auth/models.py:41 msgid "email" msgstr "이메일" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "사용자의 이메일 주소" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "전화 번호" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "사용자 전화번호" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "이름" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "성" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "사용자 프로필 이미지" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "확인됨" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "사용자 인증 상태" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "활성화됨" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "계정을 삭제하는 대신 이 옵션을 선택 해제합니다." -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "구독 중" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "사용자의 뉴스레터 구독 상태" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "활성화 토큰" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "속성" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "사용자" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "사용자" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "그룹" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "뛰어난 토큰" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "우수 토큰" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "블랙리스트에 오른 토큰" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "블랙리스트에 오른 토큰" @@ -342,12 +357,9 @@ msgstr "안녕하세요 %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" -msgstr "" -"비밀번호 재설정 요청을 받았습니다. 아래 버튼을 클릭하여 비밀번호를 재설정하세" -"요:" +msgstr "비밀번호 재설정 요청을 받았습니다. 아래 버튼을 클릭하여 비밀번호를 재설정하세요:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -390,9 +402,7 @@ msgstr "계정 활성화" msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" -msgstr "" -"가입해 주셔서 감사합니다 %(project_name)s. 아래 버튼을 클릭하여 계정을 활성화" -"하세요:" +msgstr "가입해 주셔서 감사합니다 %(project_name)s. 아래 버튼을 클릭하여 계정을 활성화하세요:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -407,12 +417,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "감사합니다,
%(project_name)s 팀" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | 계정 활성화" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | 비밀번호 재설정" @@ -422,67 +432,55 @@ msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." msgstr "" -"잘못된 전화번호 형식입니다. 번호는 다음과 같은 형식으로 입력해야 합니다: " -"\"+999999999\". 최대 15자리까지 입력할 수 있습니다." +"잘못된 전화번호 형식입니다. 번호는 다음과 같은 형식으로 입력해야 합니다: \"+999999999\". 최대 15자리까지 입력할 수 " +"있습니다." #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"액세스 및 새로 고침 토큰과 사용자 데이터 쌍을 가져오기 위한 보기를 나타냅니" -"다. 이 보기는 클라이언트가 제공된 자격 증명을 사용하여 한 쌍의 JWT 토큰(액세" -"스 및 새로 고침)을 얻을 수 있는 토큰 기반 인증을 처리하는 프로세스를 관리합니" -"다. 기본 토큰 보기 위에 구축되며 무차별 암호 대입 공격으로부터 보호하기 위해 " -"적절한 속도 제한을 보장합니다." +"액세스 및 새로 고침 토큰과 사용자 데이터 쌍을 가져오기 위한 보기를 나타냅니다. 이 보기는 클라이언트가 제공된 자격 증명을 사용하여 한" +" 쌍의 JWT 토큰(액세스 및 새로 고침)을 얻을 수 있는 토큰 기반 인증을 처리하는 프로세스를 관리합니다. 기본 토큰 보기 위에 " +"구축되며 무차별 암호 대입 공격으로부터 보호하기 위해 적절한 속도 제한을 보장합니다." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"인증 목적으로 토큰을 새로 고치는 작업을 처리합니다. 이 클래스는 인증 시스템" -"의 일부로 토큰 새로 고침 작업을 위한 기능을 제공하는 데 사용됩니다. 클라이언" -"트가 정의된 속도 제한 내에서 토큰 새로 고침을 요청할 수 있도록 합니다. 이 보" -"기는 연결된 직렬화기에 의존하여 토큰 새로 고침 입력의 유효성을 검사하고 적절" -"한 출력을 생성합니다." +"인증 목적으로 토큰을 새로 고치는 작업을 처리합니다. 이 클래스는 인증 시스템의 일부로 토큰 새로 고침 작업을 위한 기능을 제공하는 데 " +"사용됩니다. 클라이언트가 정의된 속도 제한 내에서 토큰 새로 고침을 요청할 수 있도록 합니다. 이 보기는 연결된 직렬화기에 의존하여 토큰" +" 새로 고침 입력의 유효성을 검사하고 적절한 출력을 생성합니다." #: vibes_auth/views.py:66 msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " -msgstr "" -"특정 직렬화 및 유효성 검사 로직을 사용하여 JSON 웹 토큰(JWT)을 확인하기 위한 " -"보기를 나타냅니다." +msgstr "특정 직렬화 및 유효성 검사 로직을 사용하여 JSON 웹 토큰(JWT)을 확인하기 위한 보기를 나타냅니다." #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "토큰이 유효하지 않습니다." -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "사용자 보기 세트 구현.\n" -"생성, 검색, 업데이트, 삭제, 비밀번호 재설정, 아바타 업로드, 계정 활성화, 최근" -"에 본 항목 병합 등의 사용자 관련 데이터와 사용자 지정 작업을 관리하는 일련의 " -"작업을 제공합니다. 이 클래스는 강력한 API 처리를 위해 믹스인 및 " -"GenericViewSet을 확장합니다." +"생성, 검색, 업데이트, 삭제, 비밀번호 재설정, 아바타 업로드, 계정 활성화, 최근에 본 항목 병합 등의 사용자 관련 데이터와 사용자 지정 작업을 관리하는 일련의 작업을 제공합니다. 이 클래스는 강력한 API 처리를 위해 믹스인 및 GenericViewSet을 확장합니다." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "비밀번호가 성공적으로 재설정되었습니다!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "이미 계정을 활성화하셨습니다..." diff --git a/vibes_auth/locale/nl_NL/LC_MESSAGES/django.mo b/vibes_auth/locale/nl_NL/LC_MESSAGES/django.mo index 7ec828df4575f89cb8c503b194f1b7da771ac3f7..8ca1dd4c6db14d40c49d8e31239f0241ef4a9175 100644 GIT binary patch delta 3139 zcmY+Edx#ZP9LJBkTI)N@SE(HW_#Lk_eLuHUgm+eZF&NH#@t(`J8j+oZoxy$E)_= zS3f?Y>3PE_AmflZ{fyZP*AC#pc;swjN_~uZ6i#M+s@a$?S&tmZ9r)8AV|?~+8)D1? z)`#H5tp6Np%=z%bVGX^r;dIuk;8^$+9BEA5yvAe(8;9Wq@OL;I4(GwtOoZ4l)8M&q zF2uH34zGl3;e~Ju#HM*2%J+ltEchOjghUc&z$72NcO)HZ&Hrk*RJqGzVFY_Q6 za{%^-A3+)ZG+TcKW#}8Id*4Gv+-HO_55aM872FLK$ZxO$`x1rpR^cG*n}?Z@RkJO7 z@f@7T`lW3D1Z-mcGnArkI0p7P&zMW$`LG4H!OLL)@x|}8Mf!{*~G(q`S z1eY+;g)1RWnz>M=XwO*A-fw}U*xwCRlDD8Dc^3|bMVeuQ@-IW%*?0oJ0q=p+MmH2a1?A9QD9_)9a4$`8Wv@HouV^?$*=a6Qqe z6n%Nw+}D_?@B{W|(I8vc|HB#+vwm!%F;iHdu3tp@nM|Tk`uvu{>97d7V_txY^NjMb_xk4qx z(p)C`Az1?{x7iG(cn=%^zk}-TAD~Ln4b@Ej={%KUG_-I!l);ryr3;}V-wt(t7nI}s zpzIuiEsFFDCY|sfD24aqjkp<-W%CMDcYg*e@B}Qub~;TZdIze@kHNKi4`py3`PTd8 z@LE`eB-OkKo8iZ>&KGBnG10*vp*;Hw%7Kxs#?YVUYDmy#B^(IrQ0KS7t#A(<3@4LU zotpvG#2%EMosg#Q9jlp1FQabm++}c3;<8n81Ij5m$rXf(zo$Zg0F zM2@LU8rV&nT5~zJK$A1Zq_or6xE>+Qkhkz0_vkY+@EH4JH2{re(h+^k1tAlD&1V-=H|vW1sXy`Xec=JeN6 z+q3k@hCZ*Jp-)i5BFi;ltVAXvE0FpfJlYVArO3VMtno$YGt#fzeB?YNhp2)2A^Mcm z3+s?;5LzH@!Y0U%VDFfh&6Z@mz4uM}H4IIEOm5CLui9TZ`_(>6R>m%}E=c@jqkYg% zN;Y4Mld$4%as}JryK*76UQnXc+_4?bOKK5&Wxvy9cCD*;e%Y48q93%_E;JWB9q)0V z#m2Q5-eF%Hm=L*T~y{)g??d zm!sfbE)0S+?D+qsos%c^PA0=@T=t5zMqqnO9JJb-aWv<IQdBq1nzGPnv5($}xSSgAExSys z>{)6kdl)1ShEY`~m2{PSCN;;ftVA`xGmibFrjW9_pgrdjjQ1RHQJixn+}Sa3e9QjY I1?|KC1=(937ytkO delta 2203 zcmXxkS!_&E9LMp0bxNl-RcmYMVyCvEv?z*NTCJTbQ%gtewWNY3`=bU@zp7nnxyu7*0dE3Ev)F>gM2aywN zR*NOA`J!xzH(MKHwiUBzzxJE0q8*oDwvP7tM6=1XpJQ*@DFL%?I1bg{BFw>R?1~N8 z8Si4QnPV@hbmu~H5`lxU9gau(v{LMd<;a*;g@bS>X5e|`WB2&doS$JEe2tp$2hRYV zwx^wk9k3WDF}_t$QAek}AKXUfWKS^;-=PNnj+FZwW^>8hgureYfQ!_hbxD{ufFL>{p)>L{8~ zJNE_i@egW2W4WjW6riIArc>dbm7|VgqvrwC{qxubn@}@S_<6aGMLxu3=u z%t3bFHX*lcH!26}P~%+g#QyK2a-R!Ju$0W8Y7M9f-9*j&32Gt%W+5|B0}aO%45D^w z8)~2$)boc?zdz%(8&NyhjD7KK7xrIU;-eSMGy(TxS0v%B9<{ZXP+R^C)360YWPK{V z)#EOfrK3n^S$Am9!~?Y3^5bgSM{x*kKMB(Zb5UAoF#sAMccO>hBfODj;Zrb=&iprO!LdEfMxf*OD*4DR+h$aU`%qhd z8pq-rRFotpkD(9ik&f&FYU0;%06s-N*232?%;3OvbhAVZ>Oi;buq%4Z+-yCPH)SEKrAz!;2{GAg7` zq%7lGlTs;hPu?A5F&8w5iq12e(4T}#I+06MszC`6rGzG-{|oJg%1~l>q~_+pB(EMt z`JkeN*2I@YGEY}1tz9B#rDGUJP?Xqn(uW_Zqu m-ax(HV~FYAHD1fG6Mrt|$kKp6{4X)P{gIZ;tZ*n}PV#@mNW6^z diff --git a/vibes_auth/locale/nl_NL/LC_MESSAGES/django.po b/vibes_auth/locale/nl_NL/LC_MESSAGES/django.po index bcd30fd4..c73b257e 100644 --- a/vibes_auth/locale/nl_NL/LC_MESSAGES/django.po +++ b/vibes_auth/locale/nl_NL/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Bevestig het resetten van het wachtwoord van een gebruiker" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Wachtwoorden komen niet overeen" @@ -151,8 +151,8 @@ msgstr "Misvormd telefoonnummer: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Ongeldig attribuutformaat: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Activeringslink is ongeldig!" @@ -164,19 +164,19 @@ msgstr "Account is al geactiveerd..." msgid "something went wrong: {e!s}" msgstr "Er ging iets mis: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token is invalid!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "De producten die deze gebruiker het laatst heeft bekeken (max 48), in " "omgekeerd-chronologische volgorde." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Groepen" @@ -184,7 +184,7 @@ msgstr "Groepen" msgid "wishlist" msgstr "Verlanglijst" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -201,91 +201,110 @@ msgstr "Taal is een van de {LANGUAGES} met standaard {LANGUAGE_CODE}" msgid "address set" msgstr "Adressen" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Representeert een User entiteit met aangepaste velden en methodes voor " +"uitgebreide functionaliteit. Deze klasse breidt het AbstractUser-model uit " +"en integreert extra functies zoals aangepaste e-mailaanmelding, " +"validatiemethoden, abonnementsstatus, verificatie en opslag van attributen. " +"Het biedt ook hulpprogramma's voor het beheren van recent bekeken items en " +"op token gebaseerde activering voor het verifiëren van accounts. Het User-" +"model is ontworpen voor specifieke gebruikssituaties voor verbeterd " +"gebruikersbeheer." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "E-mailadres gebruiker" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefoonnummer" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Telefoonnummer gebruiker" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Voornaam" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Achternaam" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Afbeelding gebruikersprofiel" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Is geverifieerd" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Verificatiestatus van de gebruiker" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Is actief" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Deselecteer dit in plaats van accounts te verwijderen" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Is geabonneerd" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Inschrijvingsstatus nieuwsbrief gebruiker" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Activeringstoken" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attributen" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Gebruiker" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Gebruikers" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Groep" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Uitstekende penning" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Uitstaande tokens" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token op zwarte lijst" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Tokens op de zwarte lijst" @@ -348,12 +367,11 @@ msgstr "Hallo %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" -"We hebben een verzoek ontvangen om je wachtwoord opnieuw in te stellen. Klik " -"op de knop hieronder om je wachtwoord opnieuw in te stellen:" +"We hebben een verzoek ontvangen om je wachtwoord opnieuw in te stellen. Klik" +" op de knop hieronder om je wachtwoord opnieuw in te stellen:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -397,8 +415,8 @@ msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" msgstr "" -"Bedankt voor het aanmelden bij %(project_name)s. Activeer je account door op " -"de onderstaande knop te klikken:" +"Bedankt voor het aanmelden bij %(project_name)s. Activeer je account door op" +" de onderstaande knop te klikken:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -413,12 +431,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Vriendelijke groeten,
het %(project_name)s team" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Account activeren" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Wachtwoord opnieuw instellen" @@ -433,8 +451,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -443,16 +461,16 @@ msgstr "" "verversingstokens en gebruikersgegevens. Deze weergave beheert het proces " "van het afhandelen van authenticatie op basis van tokens, waarbij clients " "een paar JWT-tokens kunnen krijgen (toegang en verversen) met behulp van " -"verstrekte referenties. Het is gebouwd bovenop een basis token view en zorgt " -"voor een goede rate limiting om te beschermen tegen brute force aanvallen." +"verstrekte referenties. Het is gebouwd bovenop een basis token view en zorgt" +" voor een goede rate limiting om te beschermen tegen brute force aanvallen." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Ververst tokens voor authenticatiedoeleinden. Deze klasse wordt gebruikt om " "functionaliteit te bieden voor het verversen van tokens als onderdeel van " @@ -473,25 +491,18 @@ msgstr "" msgid "the token is invalid" msgstr "Het token is ongeldig" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementatie van gebruikersviewset.\n" -"Biedt een set acties voor het beheren van gebruikersgerelateerde gegevens " -"zoals aanmaken, opvragen, bijwerken, verwijderen en aangepaste acties zoals " -"wachtwoord opnieuw instellen, avatar uploaden, account activeren en onlangs " -"bekeken items samenvoegen. Deze klasse breidt de mixins en GenericViewSet " -"uit voor robuuste API afhandeling." +"Biedt een set acties voor het beheren van gebruikersgerelateerde gegevens zoals aanmaken, opvragen, bijwerken, verwijderen en aangepaste acties zoals wachtwoord opnieuw instellen, avatar uploaden, account activeren en onlangs bekeken items samenvoegen. Deze klasse breidt de mixins en GenericViewSet uit voor robuuste API afhandeling." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Wachtwoord is succesvol gereset!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Je hebt de account al geactiveerd..." diff --git a/vibes_auth/locale/no_NO/LC_MESSAGES/django.mo b/vibes_auth/locale/no_NO/LC_MESSAGES/django.mo index 43ec4ea325b497fb797f2f9072b7887d181bb100..9744e19de758fedeafba19a9d4f1e2c0f2ebc33d 100644 GIT binary patch delta 3122 zcmY+Fd5Be29LLY3rRJ2)luKoLDzimr%Cc!O)3Mc7vrH?k?!0&Az3aR0-s#@+#%y~^ zNt@IkZ6Fj>8c7zEl?g4-KoBAXMnt7xe?&Vd{nG}0zW3c1b$Gw~IqUEIwlnkNvQJkv z_jQkc#?Z>hROF&j#ykpF9>#~ZZmcoY4rA8CGZ_Ck&X_%nCmzlj_``T(LgueK!k9&j z--9PJ{_{vY}fp&h3ZtxTD*c`{7i$9BzVg{TfKy<{F~-b<$HCdKAD#wdh%M$hs8no)95K7$MQ}fqL(>$0 zc`$>H4$OiWY34(vVoAZMSbqdgVtx};O5TL>fA%c_*ux$Y@I^N=su0s0+RLFP06W~5rqU!&GkHI_f zMh5-FQ~HDPBsOh^T@;8?{jN1;4dcEOjp?QC2`zsmO^<_g9~62 z>f(3dhdHySup@+?ArEUULvCe{hun%&lsY9jgNvPB}pQoc|vKgKQx4~Yx7b!V-1n0qBP_JhU`56tnpdvE~k`;3*Cs9P}O}KR79!;?}f_s6HuYu38`Q6HB>4OLK)i4CLV&B2IbIP zsE96tr*pqqPUj}L9%|zkP_N==s9cYo)jBW}4l|wyZ-;L|8Pvt&S9Q;T3t=Br&8&f1 ze;lf&UVt+6GpJM@giRIM?{ri|-6U2#1Imy^Q2!HFK!vOU$H2`{A>IZz!VlnhcomyS zuelkb(%c6XiLI~$w%ZCi)Vo^K+`*T~=k3~pQg#cXaH`2Wc_3rdq*N&?X+SF@*C9tB zGF;xPor#>C_XssyRP@_8C4ZERR7gbI+}2)!@>ESlL~Z7Ofab%Ck#mvDk*g72US61& z!fA+7xe}R+D7u#*S0L9QHzVT^gL8Yh@QHb@| zQtg5k@~@s(yB%6|EWDxUFN3OsrAYHeKK+Q=Rfq~pjoQj{tO8t!sA2~YUYi+(@aG|a z9jl<86)Db(O;1q8+inYr&fTxwnHL%-Ip34PU; z8ktY(;XSTw2SXQ?GaJNZTX(*i&>u|LeYbaUS?i6sY@0O( zvQioj<+GVbMaD*#hJ#`0@_g^?{LaApG#qH?P8>>uitDwDy$zx)u|sJx9F|#W_z>Ge zdUC8D!~yqKo_f7=a#LRWq~_wDfgrd6-%5 z2rDtCePXL~e%L@;0d`LIga`J!yFP=ar#awz`!e=X>p?E{>h8MLHVey>_Mczgg?avlg+6 z%2wW7>e8lej9jIXwN-L1OX}8DR11S)>{4%C&rp*2FpkNe0$F5`Ke zvj67~7Zp%0j)F?w4TfzikIjbnF3lals@PSNNR}s+Y-EdaQS&43t<7Dpj%ertZNm0P72yMr3JZ5>f=TPjHsi$p7leG=*NJO}^A2Q>}PcKpgO y=2ZLcJj)phY83WB+Ncqfh&-Vs-^!^0S57&oMVAKUdKhD38Yo%4+vgm=bHYDT7#n2( delta 2199 zcmY+_ZD^Hc7{KvsZF4VnTyDPC+_V>G&eCnoso6HmX1bNV%+qq~#r44~BQa7*IiI4m z8AKEzMp~n!f~0|8A_vh3gJH2i+lM7lL=jOS1=Uvn|2fb3(2dvm-S_i&p8LM9`+CmK z_Wj(QnW!v!HE8|BRYX%^#3AgQ#s}@G(uf@e5xenv#^YrXk1{SUk9dsn&gl{B8Gnse zGoG7@Sb%HM=WWF%+=KJ+B+kZ9aaBYnF3`D>3s=k_upTRL9rDcR!Yb@R=8Rpq4EJFT z4kG{JGd^7N7?$8Ty5R2;Q#^Dg;})#MP1w%-(MQJzy_x)nVPsA56&B;S=)^xH}8zhOUoIbTbMhVNvvVK zD8uJUI_>Dn_Mkf$z*antPIwW0JEoAiqoOvqz$IuZSD;1OiOrbCMfehWRHx80KZCv< zBe()HqjYYdGliyXIp6XK+Hf;=qbom=Tt9~v{@? zy|@D}AQ{g@JEgjl3tP~Yew=s~J%aOS(Otx~_zU`W)LoN1^9D3CtI*=wh#uK?Y{VDQ zg$$z^{uOJngaWAWkm~5PaG?cF;cm3551<)2lz0q1;}4O|#yC<(@egt;QAL5c&_<+Q zqZQpyH=5CYT#EbfK70#jGk^R^$1_YV$({95^a~yM4EExKIEF5$f$dq<8?X)2XwAHi z-v0otsbO@XzvDElVsxtWm?AwE-L@`0N$6dr_gxPwCXm$u$c$->mw4 zD@r;Z!\n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Bekreft tilbakestilling av en brukers passord" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Passordene stemmer ikke overens" @@ -149,8 +149,8 @@ msgstr "Feilaktig telefonnummer: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Ugyldig attributtformat: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Aktiveringslenken er ugyldig!" @@ -162,19 +162,19 @@ msgstr "Kontoen er allerede aktivert..." msgid "something went wrong: {e!s}" msgstr "Noe gikk galt: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Tokenet er ugyldig!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Produktene som denne brukeren har sett på sist (maks. 48), i omvendt " "kronologisk rekkefølge." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupper" @@ -182,7 +182,7 @@ msgstr "Grupper" msgid "wishlist" msgstr "Ønskeliste" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -199,91 +199,109 @@ msgstr "Språket er en av {LANGUAGES} med standard {LANGUAGE_CODE}." msgid "address set" msgstr "Adresser" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Representerer en User-enhet med tilpassede felt og metoder for utvidet " +"funksjonalitet. Denne klassen utvider AbstractUser-modellen og integrerer " +"tilleggsfunksjoner som egendefinert e-postinnlogging, valideringsmetoder, " +"abonnementsstatus, verifisering og lagring av attributter. Den inneholder " +"også verktøy for håndtering av nylig viste elementer og tokenbasert " +"aktivering for å verifisere kontoer. User-modellen er utformet for å " +"håndtere spesifikke brukstilfeller for forbedret brukeradministrasjon." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-post" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Brukerens e-postadresse" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefonnummer" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Brukerens telefonnummer" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Fornavn" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Etternavn" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Bilde av brukerprofil" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Er verifisert" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Brukerens bekreftelsesstatus" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Er aktiv" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Fjern dette valget i stedet for å slette kontoer" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Er abonnert" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status for brukerens abonnement på nyhetsbrev" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Aktiveringstoken" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Egenskaper" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Bruker" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Brukere" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Gruppe" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Enestående symbol" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Outstanding tokens" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Svartelistet token" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Svartelistede tokens" @@ -347,8 +365,7 @@ msgstr "Hallo %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Vi har mottatt en forespørsel om å tilbakestille passordet ditt. Vennligst " @@ -412,12 +429,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Med vennlig hilsen,
teamet %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktiver konto" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Tilbakestill passord" @@ -432,26 +449,26 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Representerer en visning for å hente et par tilgangs- og oppdateringstokener " -"og brukerdata. Denne visningen administrerer prosessen med å håndtere " -"tokenbasert autentisering, der klienter kan hente et par JWT-tokens (tilgang " -"og oppdatering) ved hjelp av oppgitt legitimasjon. Den er bygget på toppen " -"av en grunnleggende token-visning og sørger for riktig hastighetsbegrensning " -"for å beskytte mot brute force-angrep." +"Representerer en visning for å hente et par tilgangs- og oppdateringstokener" +" og brukerdata. Denne visningen administrerer prosessen med å håndtere " +"tokenbasert autentisering, der klienter kan hente et par JWT-tokens (tilgang" +" og oppdatering) ved hjelp av oppgitt legitimasjon. Den er bygget på toppen " +"av en grunnleggende token-visning og sørger for riktig hastighetsbegrensning" +" for å beskytte mot brute force-angrep." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Håndterer oppdatering av tokens for autentiseringsformål. Denne klassen " "brukes til å tilby funksjonalitet for tokenoppdatering som en del av et " @@ -465,32 +482,25 @@ msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " msgstr "" -"Representerer en visning for verifisering av JSON Web Tokens (JWT) ved hjelp " -"av spesifikk serialiserings- og valideringslogikk." +"Representerer en visning for verifisering av JSON Web Tokens (JWT) ved hjelp" +" av spesifikk serialiserings- og valideringslogikk." #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "Tokenet er ugyldig" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementering av brukervisningssett.\n" -"Tilbyr et sett med handlinger som håndterer brukerrelaterte data som " -"oppretting, henting, oppdateringer, sletting og egendefinerte handlinger, " -"inkludert tilbakestilling av passord, opplasting av avatar, kontoaktivering " -"og sammenslåing av nylig viste elementer. Denne klassen utvider mixins og " -"GenericViewSet for robust API-håndtering." +"Tilbyr et sett med handlinger som håndterer brukerrelaterte data som oppretting, henting, oppdateringer, sletting og egendefinerte handlinger, inkludert tilbakestilling av passord, opplasting av avatar, kontoaktivering og sammenslåing av nylig viste elementer. Denne klassen utvider mixins og GenericViewSet for robust API-håndtering." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Passordet har blitt tilbakestilt!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Du har allerede aktivert kontoen..." diff --git a/vibes_auth/locale/pl_PL/LC_MESSAGES/django.mo b/vibes_auth/locale/pl_PL/LC_MESSAGES/django.mo index 1f11975b3ef1e2ae426f22417a089ce51f6cc74d..b8f1690f0065c0f4bb3b094a85f1eaebf66ec750 100644 GIT binary patch delta 3148 zcmZ9MdyEy;9mfx_EFcI-3!+jy_^Q@r1!{eQuu>@x6-5zhk#ctC?C#vh%ynii*LzdE zmKL#%j~MC$ZPNIR##myg!5Gw}vZf93uWDLNYNBcSifw{v+N7;bKi|2tvG(Nt=5x-O zIluS0Pi}v1SNDT?eGeH%h%7=@PBG>Oa7RB6#$D5m8JlFxci~r9|9OTnzhXWAB+kG; z%`_%r|N4`SxtjGW@NCxqnr+PK@XR?qy;s1CS#N`zX1w@RLXr?6hcV;=U+Ad?|B zhM*LE5Aril@gNxUGMozEgfjfga{UgJq4%NAeFzotq2LrJ!Si7Z@x?p>Rf^{! zN6g!BCHxR7pvB6+A~=VM4qOOv(yW3i#SJBE<@|3b9$;f1d;#7Hm!H~GbT5=cPe6J8Gbl$-l$=5uWN1EQ z%dCOQ)OILCw?Uo19qQco%k{&MpLu>E`9GJ*&sixYe}wY%uWLw>%+AMPr(_d})p z2>cTK00wmZzu`FCMKsIVKaZD7CgTV^!hVMa>9D_Ii7|UwzX&g4y{t=tn44WC_ri-= zKMi#q--D|8-{E@Le@@Tg%}^0Fp;Epds+2#5%IH&2j=urd!C%0$;2fgm0+-13g{tW@@GAHUoDTm1`=Gg?7wJ^El;!zQ zslElSgLjwfx8Y*l|4*67vqgldCfWoy!T`#lpO$Y@2QR_Cd6tQ~{aFd|^(co*H!*Y-H7s(YCXB7f5@ZX~y@|&VqOlR#Ss=(_36({ z+OReAsr7Ll$L9BaF(Yo$P2CYB=oi7bQI@)Gkh~Ykl2CHCszY zqj}alMw;x7Lf$m<2;U=S3asv8huzTwFU~r(tEls&>f@!uE+bf?igx#W(YJ-gHXrjM zNSbk;4ceQ>y#1fZqs(F>8jU%fCw2^tHE*+q59F(DW(1AuGO01|1HNQip3J}%U#BpG zhx<<2b4u68LFL%Np8AfBaXCkyOT(nqu1B_!)EtPErzF%gtT~$|ovh>2P7?cys#Ogt zs#ctgKORK*>uj~=vd_MAwpX*yl@YCR-lcxcink%k^J>!ar8+-gb61VLt+?v{dDSbT z^-ERJfu3XZSW(iT5>d&bctt_0X}eMEwS3whiK;HBID%=U9UqJlVe2YK$kyd)o07hH zxHV{Rbq(K&Bb;Z+%kiT&c4_C>!LY+-nAnb1`@#+<-GMh2FX)mKUn_FjOO>nU?G~0u zYtnFOerz8adNp^!m{fe`O=PPHwXoL}JzW&JlMul8UhL3L6<^JhmW$gumJDa(dz+(? zO{%FMf4r8&ZS<`rns&p5Rs6Nh@uTekKU+5NwWe*>d?QntMnCU&@tyJ=laqQhcsM)b H(A@t50az`u delta 2203 zcmY+_drZ}39LMo5dbk|yprWB<$i+(tbkPVwM34jpAx%rUNK&|_6m)Y&4ffNvhSxb| zxv5jUi~3KBL;XW-Oy*y$7;Tk*P`Z_C>kr#pIyR;E=Xaj-N6+~FUeELUo%3A2&+|L< zG@hvOh7$wd7^R7Lp2!_*wganTxKKWhGus$t_6cUuz7sUtKs!3#Y!mI~ab~5of5I8G zr-aO&!$MSlYcLl-!({BiXR#mWn|byNm1*3VkU(G#j>jUTPpigBSc{BlEtrjMn2M*6 zKfA?6a~{H2yn~wXJ!gncC(_QxM6ATcjBgE8)KRzlz)fUMHi*&q8*1P`T>AlPpnp-{ zdxBbV3bXIPd|Zot$RkT&)E1nM>UTG4VTUlt_;$uU_!f(4-_QemiUEvcy6Px|Q!xc+ zV;<&U17_k*DpEO3>36mQvxF)uOiIL+5tX^HZ3FeW;m# zk6OvE_zd31$@mbJ@*s@@%tf+qt;i$mK%IeosBtb#CjVbkxy_9_tmb4;wI0-juA^rD zBWfZcW+78i1I@)LxDJ)6&8UICKz)A?>hs53`w}XH12_wZlgPhP5}+5&G#)!K89DHF z9F^MhsFV+33XWhCr+zBE4PZOVn#=uCmUV^pX8e+N4j=xC_E~(Hb`}RF9qXL!9+g~f z97Vk@L#VxefXmR*!ZWQvt>hzAhPI*h@Bk{6M^F>KhUM6g85m?V|E)rOz6f=gm!Kx> zt)QX_Y(u4{50%;DXb*^P_v5^AOYU;syuzHJm=#0)l8sa}c7#8%h7 zjnipALQO1bw$6@cRz{_g8x5$_-Q&EBO5Jy;Eg8f#yo)d37%m(G%R*(O6!rZY)FIq} z3D}0pY$xX7G1OuI850@b=4FOgScaNm4Qfw6$7bxpR(y(jeOl&(Gt`Od=pZV^4^ab+ zXaCYL(^-LO3bnFxNH*;%k`x<8 z9pY$ym7*|G)>7dZ`Q;t1EZi?u+JBXJqJ~f!Rh0Hu2u)5!S(#6~rv{~os3tTyof%C| zMf<8#twOT+egA*qi1=jzSCU2c!sGilWBhA4MOsxMv5+Vt^oEoXm4pskEb%&_H)1tW zPrOR#Jd_gU#B$g_H``5+v)#P(*DmQ^s4Cx zNkwNTQWm+&GUpqS2dMuU1;kQ!kJq%\n" "Language-Team: BRITISH ENGLISH \n" @@ -52,7 +52,8 @@ msgstr "Uzyskanie pary tokenów" #: vibes_auth/docs/drf/views.py:16 msgid "obtain a token pair (refresh and access) for authentication." -msgstr "Uzyskanie pary tokenów (odświeżenie i dostęp) w celu uwierzytelnienia." +msgstr "" +"Uzyskanie pary tokenów (odświeżenie i dostęp) w celu uwierzytelnienia." #: vibes_auth/docs/drf/views.py:35 msgid "refresh a token pair" @@ -106,7 +107,7 @@ msgstr "Potwierdzenie zresetowania hasła użytkownika" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Hasła nie są zgodne" @@ -151,8 +152,8 @@ msgstr "Zniekształcony numer telefonu: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Nieprawidłowy format atrybutu: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Link aktywacyjny jest nieprawidłowy!" @@ -164,19 +165,19 @@ msgstr "Konto zostało już aktywowane..." msgid "something went wrong: {e!s}" msgstr "Coś poszło nie tak: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token jest nieprawidłowy!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Produkty ostatnio przeglądane przez tego użytkownika (maks. 48), w " "kolejności odwrotnej do chronologicznej." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupy" @@ -184,7 +185,7 @@ msgstr "Grupy" msgid "wishlist" msgstr "Lista życzeń" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Awatar" @@ -201,91 +202,110 @@ msgstr "Język jest jednym z {LANGUAGES} z domyślnym {LANGUAGE_CODE}." msgid "address set" msgstr "Adresy" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Reprezentuje encję User z niestandardowymi polami i metodami dla " +"rozszerzonej funkcjonalności. Ta klasa rozszerza model AbstractUser i " +"integruje dodatkowe funkcje, takie jak niestandardowy login e-mail, metody " +"walidacji, status subskrypcji, weryfikacja i przechowywanie atrybutów. " +"Zapewnia również narzędzia do zarządzania ostatnio przeglądanymi elementami " +"i aktywację opartą na tokenach do weryfikacji kont. Model User został " +"zaprojektowany do obsługi określonych przypadków użycia w celu ulepszonego " +"zarządzania użytkownikami." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Adres e-mail użytkownika" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Numer telefonu" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Numer telefonu użytkownika" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Imię" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Nazwisko" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Obraz profilu użytkownika" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Czy zweryfikowano" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Status weryfikacji użytkownika" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Jest aktywny" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Odznacz to zamiast usuwać konta" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Jest subskrybowany" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status subskrypcji newslettera użytkownika" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Token aktywacyjny" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atrybuty" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Użytkownik" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Użytkownicy" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grupa" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Wyjątkowy token" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Zaległe tokeny" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token na czarnej liście" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Tokeny znajdujące się na czarnej liście" @@ -348,8 +368,7 @@ msgstr "Witaj %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Otrzymaliśmy prośbę o zresetowanie hasła. Zresetuj hasło, klikając poniższy " @@ -413,12 +432,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Najlepsze pozdrowienia,
zespół %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktywuj konto" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Resetuj hasło" @@ -428,19 +447,19 @@ msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." msgstr "" -"Nieprawidłowy format numeru telefonu. Numer musi być wprowadzony w formacie: " -"\"+999999999\". Dozwolone do 15 cyfr." +"Nieprawidłowy format numeru telefonu. Numer musi być wprowadzony w formacie:" +" \"+999999999\". Dozwolone do 15 cyfr." #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"Reprezentuje widok pobierania pary tokenów dostępu i odświeżania oraz danych " -"użytkownika. Ten widok zarządza procesem obsługi uwierzytelniania opartego " +"Reprezentuje widok pobierania pary tokenów dostępu i odświeżania oraz danych" +" użytkownika. Ten widok zarządza procesem obsługi uwierzytelniania opartego " "na tokenach, w którym klienci mogą uzyskać parę tokenów JWT (dostęp i " "odświeżanie) przy użyciu dostarczonych poświadczeń. Jest on zbudowany w " "oparciu o podstawowy widok tokenu i zapewnia odpowiednie ograniczenie " @@ -448,11 +467,11 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Obsługuje odświeżanie tokenów do celów uwierzytelniania. Klasa ta służy do " "zapewnienia funkcjonalności dla operacji odświeżania tokenów w ramach " @@ -473,25 +492,18 @@ msgstr "" msgid "the token is invalid" msgstr "Token jest nieprawidłowy" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementacja zestawu widoków użytkownika.\n" -"Zapewnia zestaw akcji, które zarządzają danymi związanymi z użytkownikiem, " -"takimi jak tworzenie, pobieranie, aktualizacje, usuwanie i niestandardowe " -"akcje, w tym resetowanie hasła, przesyłanie awatara, aktywacja konta i " -"scalanie ostatnio przeglądanych elementów. Ta klasa rozszerza mixiny i " -"GenericViewSet dla solidnej obsługi API." +"Zapewnia zestaw akcji, które zarządzają danymi związanymi z użytkownikiem, takimi jak tworzenie, pobieranie, aktualizacje, usuwanie i niestandardowe akcje, w tym resetowanie hasła, przesyłanie awatara, aktywacja konta i scalanie ostatnio przeglądanych elementów. Ta klasa rozszerza mixiny i GenericViewSet dla solidnej obsługi API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Hasło zostało pomyślnie zresetowane!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Konto zostało już aktywowane..." diff --git a/vibes_auth/locale/pt_BR/LC_MESSAGES/django.mo b/vibes_auth/locale/pt_BR/LC_MESSAGES/django.mo index 280de48dc6b1f328413375106f5fcf95e0ccb3e1..aeda549472a17de8771b22063e1f6c2864fc33b4 100644 GIT binary patch delta 3164 zcmY+EX^a#_6vt};kxMS+P!I|g&t+l73j|>m5KsXXTvQNhdwO?UX1dqzo>hoC;1LzC zC?0_iCTJ8k9?_uU2Ry z_4jqPL!$>gZWtwOA~vVLG55hW1Gz9Z4>G2+!I&-ZOxE8GHs%x7V}|e!{C21@0sG62 zG3H{{Z@`mT|1sQ{6X4_#x!>9F9M-Myc=!MuV@%CF$K-rA_Q4787dR4*#JPWRYli|IPGtF+O*!RMt;agCFzgw^uj$%EL%V^FwO-x$YXn}HcC*)_I z;X*RzHFy-PLmhmeSbqw2(C1L^9fr!dVYD%~!HKXH?tn_Z z-oFXzy}OF_6Of1 zBGxnDNic%S@KH#N<~gY5d>iUBejlo*zJ@KZ7xFVR$yN!jhLXP4!9-eyP))R{;4UaF zKZVF>zJ*KS->?}jr3|QLZiNbD8Op#1y>RnZ}57&9GCg_pop@B+9U zPSW@PF_XD$^g?AcosL=n7r}w>et0x|6w2`q$bX1=0TQEm6QY*+3hMpAq$x=)RKRnf z_7_7{Y8_Ny32f$k^AM9O;5$$m4@U<*I0;I#v!NWc!fRm&Z-nnbNi>sAQkO4=3*q%p zlI?`LzZa?kA3*v06RJ{Eny9KApUH#oS+l86^ckLuEy6CtR3Vjf z0X7L+iLJrT!Ny~kV3%T-W7lA+p!#YAwnFFgKau?ztcNP|d05|QWg<;AT#oFYZWwdq z&;Bj7JxiBjsJZ%vK0ytOU8xCU6*dLC3aeesr3KSiirtXS@^4j|>Q87srbcSRq-%dn zIuF6tVly#XBJT+(&HKi@VzQ**^1d5zxPG&lEG{-@?5PZTwqePt#E-2Xra`*V-W;Tz z)~hCIR0%fuCEFhOW3xWuZCV4M4>D5_O^q=j<2<}C28!u zH1k@CN`5(eI|x(1BX+5evr;L@-?8n!ORF(^G8e* z8f{W-OT0Mf%65|!7YPsganK%ki?U}Mvol?q#z9+EXOd9tI{YTPB(<)bM7ArAx`PsT zs%b#%0W&35aiQbfj%_av8&^}-X|%x)r?t6+WXUS%&STND*@+u@m>XVH4b!B_uI%*f ze=-je%NapO$lGaTJMmcdZPMj?iq%#VlE!sW)R6lgPqM8@1`~>3L71jJ1BL{nYLckr zN@! zdS#aoPQLBi$Y$C__K2RftW9hoq>X*A${~_7@Z>i@1fq#@751lF#Wl!fSN0fhI+1b=p+Uh+O$r<_{ zrOE`(szqT`i4H&ZLoaZ#4X8n4yMv@ko8`44FC1reCj*Pz-7X7o+i?>|)p7?#ujTs+ z!HdGwasKkYs%1UU9tG;N8~qd&@;BAYaUq(D$GcU!(N{~*mxC z)rVeWWmc2LqV>UCEmxasD|M|{qs`4Rx7KQFwpmvH|KU0JxcJ@o^PF=(_kG>hb1rNc zY0D0m7aj;&H!+2%9TV{awp_|T+M~r0n+hTx!|9BNQV|a^E-H!G%y>&_L?h$VcrD|~ zbi|do0G)3w*5VU584uwV_$AgyWaCFVS8-u{8G$o!94G0SzLG)}@Q zyaDIp4D7<2@I~Y+F@PS$aWr%1@HV`NZfHIi-M|ve`h^vAxEJl{QEW}zgWm7M3LHdN z{w=zbpKvUW;6(frO?isJJgh~sAKQ>yu@kLEV_ezXisbX^i_PdlcA*pQM{D5?G?VWq*N>pD=^%RMXYg_S z2iM^vR47N2jc@2Y$AuxZ$~#%M6K+LUx&u9$UbGetpgTQ@9?{R}8J|T{`WN1UaN4(j8~#Z z_9}Y656!@5=zQm}7|VENoVOAwvzUq2U#y~I5p6?v_7c|P5lrC-`a1oAo3N0BH6uOf z1D-|p5C_proWKIiw>CPIQLe4$zn`_Wc>cB$!lG~&HYcA&IGN3Jb3qR}pmh_b&>tUn z?BZ-Q2~%t%S-CeMH%R`uSlfJpr0|F^Ax1AsUI>i93n=2vc7~Sj2Y`mk_>s8;H3+zmCYawRD=2!Nx?-tdt=_+Y`lj&y3^ztYtc26kn3jQ<}KIlh4a diff --git a/vibes_auth/locale/pt_BR/LC_MESSAGES/django.po b/vibes_auth/locale/pt_BR/LC_MESSAGES/django.po index 1e3763a3..1e3284ed 100644 --- a/vibes_auth/locale/pt_BR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/pt_BR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -105,7 +105,7 @@ msgstr "Confirmar a redefinição de senha de um usuário" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "As senhas não correspondem" @@ -148,8 +148,8 @@ msgstr "Número de telefone malformado: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Formato de atributo inválido: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "O link de ativação é inválido!" @@ -161,19 +161,19 @@ msgstr "A conta já foi ativada..." msgid "something went wrong: {e!s}" msgstr "Algo deu errado: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "O token é inválido!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" -"Os produtos que esse usuário visualizou mais recentemente (máximo de 48), em " -"ordem cronológica inversa." +"Os produtos que esse usuário visualizou mais recentemente (máximo de 48), em" +" ordem cronológica inversa." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupos" @@ -181,7 +181,7 @@ msgstr "Grupos" msgid "wishlist" msgstr "Lista de desejos" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -198,91 +198,110 @@ msgstr "O idioma é um dos {LANGUAGES} com o padrão {LANGUAGE_CODE}" msgid "address set" msgstr "Endereços" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Representa uma entidade de usuário com campos e métodos personalizados para " +"funcionalidade estendida. Essa classe estende o modelo AbstractUser e " +"integra recursos adicionais, como login de e-mail personalizado, métodos de " +"validação, status de assinatura, verificação e armazenamento de atributos. " +"Ela também fornece utilitários para gerenciar itens visualizados " +"recentemente e ativação baseada em token para verificação de contas. O " +"modelo User foi projetado para lidar com casos de uso específicos para o " +"gerenciamento aprimorado de usuários." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Endereço de e-mail do usuário" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Número de telefone" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Número de telefone do usuário" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Primeiro nome" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Sobrenome" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Imagem do perfil do usuário" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "É verificado" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Status de verificação do usuário" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Está ativo" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Desmarque essa opção em vez de excluir contas" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Está inscrito" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Status da assinatura do boletim informativo do usuário" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Token de ativação" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atributos" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Usuário" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Usuários" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grupo" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Token excepcional" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Tokens pendentes" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token na lista negra" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Tokens na lista negra" @@ -346,8 +365,7 @@ msgstr "Olá %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Recebemos uma solicitação para redefinir sua senha. Para redefinir sua " @@ -411,12 +429,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Atenciosamente,
a equipe %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Ativar conta" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Redefinir senha" @@ -431,32 +449,32 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" "Representa uma visualização para obter um par de tokens de acesso e " "atualização e os dados do usuário. Essa visualização gerencia o processo de " -"manipulação da autenticação baseada em token, em que os clientes podem obter " -"um par de tokens JWT (acesso e atualização) usando as credenciais " +"manipulação da autenticação baseada em token, em que os clientes podem obter" +" um par de tokens JWT (acesso e atualização) usando as credenciais " "fornecidas. Ela é construída sobre uma visualização de token de base e " "garante a limitação de taxa adequada para proteger contra ataques de força " "bruta." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Trata da atualização de tokens para fins de autenticação. Essa classe é " "usada para fornecer funcionalidade para operações de atualização de tokens " -"como parte de um sistema de autenticação. Ela garante que os clientes possam " -"solicitar um token atualizado dentro dos limites de taxa definidos. A " +"como parte de um sistema de autenticação. Ela garante que os clientes possam" +" solicitar um token atualizado dentro dos limites de taxa definidos. A " "exibição depende do serializador associado para validar as entradas de " "atualização de token e produzir saídas apropriadas." @@ -465,32 +483,25 @@ msgid "" "Represents a view for verifying JSON Web Tokens (JWT) using specific " "serialization and validation logic. " msgstr "" -"Representa uma visualização para verificação de JSON Web Tokens (JWT) usando " -"lógica específica de serialização e validação." +"Representa uma visualização para verificação de JSON Web Tokens (JWT) usando" +" lógica específica de serialização e validação." #: vibes_auth/views.py:79 msgid "the token is invalid" msgstr "O token é inválido" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementação do conjunto de visualizações do usuário.\n" -"Fornece um conjunto de ações que gerenciam dados relacionados ao usuário, " -"como criação, recuperação, atualizações, exclusão e ações personalizadas, " -"incluindo redefinição de senha, upload de avatar, ativação de conta e " -"mesclagem de itens visualizados recentemente. Essa classe estende os mixins " -"e o GenericViewSet para um tratamento robusto da API." +"Fornece um conjunto de ações que gerenciam dados relacionados ao usuário, como criação, recuperação, atualizações, exclusão e ações personalizadas, incluindo redefinição de senha, upload de avatar, ativação de conta e mesclagem de itens visualizados recentemente. Essa classe estende os mixins e o GenericViewSet para um tratamento robusto da API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "A senha foi redefinida com sucesso!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Você já ativou a conta..." diff --git a/vibes_auth/locale/ro_RO/LC_MESSAGES/django.mo b/vibes_auth/locale/ro_RO/LC_MESSAGES/django.mo index 05b1ea795786478199cc6a8293b1fb80c9fb448f..af4349ca0a17491e05495699291099ab3d20e21f 100644 GIT binary patch delta 3165 zcmZvdX>1i$7={l}C}ojF5M;4O0Z}X!+zzp`ajYG(j|I0!D?n#Hc^i#27Wv7^6l}j4>f<;`7eTC75{9Z=Ua*Ip=)q+Kdvk^{V{!@)HpD-UefHUyNfyQ{OFCA>m zCCp!g6PW*Xf-z%Y?U3}|S@1mOjqqgH4M!SNHoH(}u&^JFg@3@Ia3~K{b1KA!nGR2c zb0D_O)$lC13f97VAU4fzDBt(NYWN0}w^q zybAlmgHVRw&*q;(8Ttb1+&54W_Zn`@?Qk4ygj=Bk`5hKvZ=%q>?QkIW%?1>*YVOTm zJObx3-;u3<3#*v_40X{FI2!gEVa(}p46K6<@C@ifd@+whmEt+b5%VFO4Znd3=oIB& z5llqUfwLe^nmJIVSeCJny}t*Z#QIjKlI($sMka`Z^XKBPg0Mnaa%Jg7{qgfg@m>ijyW zb9ZI)#~^>^xzXf*63W}ml#(ByJUtBWhW|hs-)zENrS<`+l<$M%;ny%n*Z&Q_glmXK zrI^FZ6}^qQS)1USG{{EOw@x+YdG^geE&Un}mno1kFkxbP;aqqQ^VQJ8hag!rd!RD# zZnj>9*NSKo#78p&s+7y1ny?Yd@c_<&w?SpY_YJTg^CqYsa9|befYtCeI1_e3l3@wtFnms64)O;0TtPHsHWNtWne!%1%3!Ar}-JG35Q@!8Ji3TzR5 zLY1)Q>@;!iV(OOIV;I66$v-H~Ymp0)oFZO&vOx&# zlKfg~d8QuOP|7Q#Z>Csyb*8U?Dz|#Bd@YX#L_^JUW1^-1T8E;KN9G~=rkfEpP# zq9)RBf_^XPwWJC43F-%}GUjH=!i-l{UceLdHw)#8Y;oG&V*j1J7On{0z`B0qMeFS? zUesoDaTt|~UZekzZk#!1T$+icj z4lmD}IP&n_LsMWy$9J&X+VkR|QDsFPmDalc)Mh6nSfcVeQeU(;vACYiyvUVeKML#Z z@;28V7r7T&Y)Cp*d7O-eQ%4W9FcO{?gn8}6n1ImM?sv_>b-4Qv9wMVJwH6u z)zefvwya9U1^b`!>Bh8huG4v_3tv@P5*sU za7eZ1TX$+w)#Dwjt9XmU9p$9Xx`%@5l+#QAx;!q#-m&r~ujCd5O>cLy8W&1Iy}i`6 zq?1#wQ)f#pZh+HifjL;oL#vDXTrMkaA<3{?=vh!ZvNlO!TIFQBZBD|*zoZR%o*F-* zoGal{;3ejkWJyaZ&aG6lLB7~Q&r-!#G_7mROy8O_3hwG#pc*Q)D<1- bqHH{^W8=YU*QEAxp=Zhf)uiYMVZn* z#Oh0Zuux*GK7_N;hf0W~7Z^)cP!fv*3kf4AB!XrC|2fZYcAejSpXZ$Cez~sa>{##E z_VmQ8+&6;OOUx(grbisZE&06Ao-B;mn-lRA-pcqwQN*K+^NJ%LXS}Z@Vm;$;aS`J= zsfg=v6?(r8tiz{q9uDHQ_!-tmq~m)!*Yif{OahnUHMj=3XS88Cb|G^{A1=XzScRvM zzxbRN*F25|cmZATFNrB`TE@5mXJIQgGkcC96M-4cLhz$fcOctbMouz3;2&#@@st=8t!i3m;$;<4?VS|6wi`vRrSJ!ns(9 zH{l9girsiK9!I_s!)Pkbp(l3^gem% z>WJlZ79oGp!3&#>XVIPaBY*KVFYe@bbO)1Y4l5QW#fL7q0oPzNdO~S5RYU0KKSFEk zEZ*t$uaeFraw<`KLw14|>}K49xA_G$cbAjv1yquDf7o4cJM0t!O~l@IjzU%8Mk8}o<}EaBC%F?C%W)` z=*~YxQ#gk1{8wa6QN1L)uom?D+mLL>6PV_dqMwd87)I6*qganuumqQJp5C|-kKk5x zXXEJiFQVTop-}uKtiv3fYMpeP(6)N6@0PfbJ$*33FdS zY#=I$ZNv`3$I0VePuxS?OFTpr5_yD0eLpdc;J{)xvBLT9BBojgosG$0PohU}8puX; zCGRyPim97wJ`uJm;(<&r;z6t?wh|WJI>NS@Nc)W2sFln=nfcg6SouAK1v#DIvCaH& z?8M~+DbCaYWOA;ywOOJi@xDY!5f\n" "Language-Team: BRITISH ENGLISH \n" @@ -107,7 +107,7 @@ msgstr "Confirmați resetarea parolei unui utilizator" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Parolele nu se potrivesc" @@ -151,8 +151,8 @@ msgstr "Număr de telefon malformat: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Format de atribut invalid: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Linkul de activare este invalid!" @@ -164,19 +164,19 @@ msgstr "Contul a fost deja activat..." msgid "something went wrong: {e!s}" msgstr "Ceva nu a mers bine: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token-ul nu este valabil!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Produsele pe care acest utilizator le-a vizualizat cel mai recent (max 48), " "în ordine cronologică inversă." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupuri" @@ -184,7 +184,7 @@ msgstr "Grupuri" msgid "wishlist" msgstr "Lista dorințelor" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -201,91 +201,110 @@ msgstr "Limba este una dintre {LANGUAGES} cu implicit {LANGUAGE_CODE}" msgid "address set" msgstr "Adrese" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Reprezintă o entitate utilizator cu câmpuri și metode personalizate pentru " +"funcționalitate extinsă. Această clasă extinde modelul AbstractUser și " +"integrează caracteristici suplimentare, cum ar fi autentificarea prin e-mail" +" personalizat, metode de validare, starea abonamentului, verificarea și " +"stocarea atributelor. De asemenea, oferă utilitare pentru gestionarea " +"elementelor vizualizate recent și activare pe bază de token pentru " +"verificarea conturilor. Modelul User este conceput pentru a gestiona cazuri " +"de utilizare specifice pentru gestionarea îmbunătățită a utilizatorilor." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-mail" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Adresa de e-mail a utilizatorului" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Număr de telefon" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Numărul de telefon al utilizatorului" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Numele și prenumele" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Numele de familie" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Imagine profil utilizator" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Este verificat" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Statutul de verificare al utilizatorului" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Este activ" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Deselectați acest lucru în loc să ștergeți conturile" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Este abonat" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Starea abonării utilizatorului la buletinul informativ" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Jeton de activare" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Atribute" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Utilizator" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Utilizatori" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grup" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Simbol excepțional" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Jetoane restante" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token pe lista neagră" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Jetoane pe lista neagră" @@ -350,8 +369,7 @@ msgstr "Bună ziua %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Am primit o cerere de resetare a parolei dumneavoastră. Vă rugăm să vă " @@ -367,8 +385,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Dacă butonul de mai sus nu funcționează, vă rugăm să copiați și să lipiți " -"următoarea adresă URL\n" +"Dacă butonul de mai sus nu funcționează, vă rugăm să copiați și să lipiți următoarea adresă URL\n" " în browserul dvs. web:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -416,12 +433,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Cele mai bune salutări,
echipa %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Activare cont" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Resetați parola" @@ -436,8 +453,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -452,11 +469,11 @@ msgstr "" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Gestionează actualizarea jetoanelor în scopul autentificării. Această clasă " "este utilizată pentru a oferi funcționalitate pentru operațiunile de " @@ -478,25 +495,18 @@ msgstr "" msgid "the token is invalid" msgstr "Jetonul nu este valabil" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementarea setului de vizualizări ale utilizatorului.\n" -"Oferă un set de acțiuni care gestionează datele legate de utilizator, cum ar " -"fi crearea, recuperarea, actualizările, ștergerea și acțiunile " -"personalizate, inclusiv resetarea parolei, încărcarea avatarului, activarea " -"contului și îmbinarea elementelor vizualizate recent. Această clasă extinde " -"mixinele și GenericViewSet pentru o gestionare robustă a API." +"Oferă un set de acțiuni care gestionează datele legate de utilizator, cum ar fi crearea, recuperarea, actualizările, ștergerea și acțiunile personalizate, inclusiv resetarea parolei, încărcarea avatarului, activarea contului și îmbinarea elementelor vizualizate recent. Această clasă extinde mixinele și GenericViewSet pentru o gestionare robustă a API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Parola a fost resetată cu succes!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Ați activat deja contul..." diff --git a/vibes_auth/locale/ru_RU/LC_MESSAGES/django.mo b/vibes_auth/locale/ru_RU/LC_MESSAGES/django.mo index 4a6e0a62287b469da76bd978108c0b2191f927df..ca06fe9d9aa3753d419aecfa22197007055cda58 100644 GIT binary patch delta 3383 zcmZ9NdvH|M9mh`qkwm#yW+1kh$DvYj2y(={4X=i$ zp&V*b{N=$#baY@L#7MIODiv#ErsMU!u%7uRp;9sk<;gItg(o3*n?FN^{0q1YHgHI( zSr27M0;&cI^~7I_4lvONe+%z|i)Ta^^+Or-ER^L(pbR||b2MR)qUn$+vkEFwcR(rH z40ZlKsB^pH@h>2M=1>FipHJs?MheN_pe+3o?t%Y-6u#-hT!nT&RLGCQ3*aX(N!9;b z>%5#Tc+<}Oz9#aFC8yvy%>U^^V?Jg6Bb2>AiimNE_B~!~Hs)G7r{QIAKJMHIH^MdW zS=b6cgZIM*N`5u`8IIcr4oGc`MunJK)XmL%0++W3~2efpg(rsG9l>tc8Oyt8hKzlTiDbF2{Ji z|5bDzW}+T9s2B4zJO+oLY9sT#D2I>0$y$fqX-i1WjEWDBmg}1{Auma`D8*mN`pgi~ohSZzuksFbD$T&pLvI*IMY(f-CMN27MgD5h$BjXXhkSWMo=^usg z+H8&}0sE|gZ5@1-8Z{NAnrcJ^*@E1Ks8I@M+pM#_=toUM2U({MZ6l(BT#poQQ)&WRkv@%_P#CE}g8MS#0af`?*BYx3~6WQ*PRx_Aq%r1=O=D zzs*g`R;Q51X|9fgnqfW3PNrqacuaA7NKEU{m04R?mUVSl71-03hi zV5fEj13@J?%(onz2pKULh7Yrb^%W=VQ#i1$EC*zfZrMS1 zkh>JU!yTHFK2ps63cR9YPgR2BiiS*$W4_BC8PLW^Rd}HE(W2%B z%1ii|og`fZPO-7cBJzZWF?lXcYHDs6x$C>$m&Pq^Dq`bP*6S#Vwl2?FN!5@C)y^KP zeBkU=Ros;SgLu-bSSce_wjPs%Op(d3Px(HMW3~cFzYT0uZT(zKjIQJk6@aaX?-rTW cNihdQL6!J?6N%Eh3!JgGUR#I0Y<#8hYqic<=l}o! delta 2203 zcmYk-drXye9LMo5S2^Ipgrh)lv5@eB7wQCvLWm|p9xF8!^(dFtl%>*aAuD_~yI@Uo zj`@%Ol=FtVIR*t_5M81Gv;sSdtSfa?|IJiyFce6 z=hQA|I4%CLk(!BYA{=M-0j@~oi`1HAwl&7=b(}@{M!@V9$_dG4+bFlBm{n80g87s) zf@Y86Le%rtViJR;4OEB!@D1|N$&|}54eM|*?OT+L9`vz)!=Gv6uc(Iq^vicp4UM6G z_W(8G9D3h@Ww;LekxQ0JtJ^Ub_1yiafgQmB?b}KJLJvMm`3qgZe=#1D=&l|V#7xY= zC$R*JFp4wqL*yschgyn3)Xd$+MfdlbQ1^f0mwQn&IEV!}JeB#^l*IEC^)wkfF$>x7 zb`&+WXHZjq8FTPHHnZz9dD;w4%-amBmiiNH`2@-%_#5TBY>=T?vuo45>piT?66){c zJgju4n>|lv2iD*PoQtt^uMLZFDV|0?_77jh7@{|t`epb8u11}nH*pVkqLv`B&^v}z zsQaV7Ex4Mp)8=QsM?RLva5dr@zTUxBjNmAiVD(JzzIJ?^@=;90uTTwK^u3O&DBncg zSIT-_#d>@n=W&KvRmb|tT%h6y)TZbx^49JcYDxN0BOAn(c+IabnB!d!qh@9aYHhdS zbGR4Z#qY2lBTQ=*p2CfI3uo#4FJ&Pbso06hcnK%sFUa!QZPW+?^Sw9OYOjqE0_KBTAbI?K35QtMPl&z8sGwp;#UFWmJvJ2p#K}i6kO{NF`n%Vu>PR3sIu+vrOY@ zEjgWcr3Uxgd-bM}=YY67S=G$^c*+{jd2c}#^N1Jy`ZYL>c!^j=R1r$Ggrjv<;#j(W zGQ7ClKcRGNBzTWl9Fb21h)skx5vR(1wSxQaCzZ61l$LwAN7m1}{~2rz_eG~V_Dr9X abS$Q8V=&P7U&=^Y*S&%{eYyFq+5ZFGEX-s8 diff --git a/vibes_auth/locale/ru_RU/LC_MESSAGES/django.po b/vibes_auth/locale/ru_RU/LC_MESSAGES/django.po index ba78ac7a..d957f6df 100644 --- a/vibes_auth/locale/ru_RU/LC_MESSAGES/django.po +++ b/vibes_auth/locale/ru_RU/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Подтверждение сброса пароля пользоват #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Пароли не совпадают" @@ -120,7 +120,8 @@ msgstr "Ссылка на активацию недействительна ил #: vibes_auth/docs/drf/viewsets.py:72 msgid "merge client-stored recently viewed products" -msgstr "Объедините недавно просмотренные продукты, хранящиеся в памяти клиента" +msgstr "" +"Объедините недавно просмотренные продукты, хранящиеся в памяти клиента" #: vibes_auth/graphene/mutations.py:41 msgid "the user's b64-encoded uuid who referred the new user to us." @@ -151,8 +152,8 @@ msgstr "Некорректный номер телефона: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Недопустимый формат атрибута: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Ссылка на активацию недействительна!" @@ -164,19 +165,19 @@ msgstr "Аккаунт уже активирован..." msgid "something went wrong: {e!s}" msgstr "Что-то пошло не так: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Токен недействителен!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" -"Продукты, которые этот пользователь просматривал в последнее время (не более " -"48), в обратном хронологическом порядке." +"Продукты, которые этот пользователь просматривал в последнее время (не более" +" 48), в обратном хронологическом порядке." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Группы" @@ -184,7 +185,7 @@ msgstr "Группы" msgid "wishlist" msgstr "Список желаний" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Аватар" @@ -201,91 +202,110 @@ msgstr "Язык - один из {LANGUAGES}, по умолчанию {LANGUAGE_ msgid "address set" msgstr "Адреса" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Представляет сущность User с настраиваемыми полями и методами для расширения" +" функциональности. Этот класс расширяет модель AbstractUser и включает в " +"себя дополнительные возможности, такие как пользовательский вход по " +"электронной почте, методы проверки, статус подписки, верификация и хранение " +"атрибутов. Он также предоставляет утилиты для управления недавно " +"просмотренными элементами и активации на основе токенов для проверки учетных" +" записей. Модель User предназначена для обработки конкретных случаев " +"использования для расширенного управления пользователями." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Электронная почта" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Адрес электронной почты пользователя" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Номер телефона" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Номер телефона пользователя" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Имя" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Фамилия" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Изображение профиля пользователя" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Проверено" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Статус верификации пользователя" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Активен" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Снимите этот флажок вместо удаления учетных записей" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Подписан" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Статус подписки пользователя на рассылку новостей" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Активационный токен" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Атрибуты" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Пользователь" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Пользователи" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Группа" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Выдающийся жетон" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Выпущенные токены" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Токен в черном списке" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Чёрный список токенов" @@ -348,8 +368,7 @@ msgstr "Привет %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Мы получили запрос на сброс вашего пароля. Пожалуйста, сбросьте пароль, " @@ -365,8 +384,7 @@ msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" msgstr "" -"Если кнопка выше не работает, пожалуйста, скопируйте и вставьте следующий " -"URL-адрес\n" +"Если кнопка выше не работает, пожалуйста, скопируйте и вставьте следующий URL-адрес\n" " в свой веб-браузер:" #: vibes_auth/templates/user_reset_password_email.html:100 @@ -413,12 +431,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "С наилучшими пожеланиями,
команда %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Активировать учетную запись" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Сброс пароля" @@ -433,8 +451,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -442,23 +460,23 @@ msgstr "" "Представляет собой представление для получения пары токенов доступа и " "обновления и данных пользователя. Это представление управляет процессом " "аутентификации на основе токенов, когда клиенты могут получить пару JWT-" -"токенов (доступ и обновление), используя предоставленные учетные данные. Оно " -"построено поверх базового представления токенов и обеспечивает надлежащее " +"токенов (доступ и обновление), используя предоставленные учетные данные. Оно" +" построено поверх базового представления токенов и обеспечивает надлежащее " "ограничение скорости для защиты от атак грубой силы." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Обрабатывает обновление токенов для целей аутентификации. Этот класс " "используется для обеспечения функциональности операций обновления токенов в " "рамках системы аутентификации. Он гарантирует, что клиенты могут запросить " -"обновленный токен в рамках установленных ограничений скорости. Представление " -"полагается на ассоциированный сериализатор для проверки входных данных " +"обновленный токен в рамках установленных ограничений скорости. Представление" +" полагается на ассоциированный сериализатор для проверки входных данных " "обновления маркера и создания соответствующих выходных данных." #: vibes_auth/views.py:66 @@ -473,25 +491,18 @@ msgstr "" msgid "the token is invalid" msgstr "Токен недействителен" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Реализация набора пользовательских представлений.\n" -"Предоставляет набор действий, которые управляют пользовательскими данными, " -"такими как создание, получение, обновление, удаление, а также " -"пользовательскими действиями, включая сброс пароля, загрузку аватара, " -"активацию учетной записи и объединение недавно просмотренных элементов. Этот " -"класс расширяет миксины и GenericViewSet для надежной работы с API." +"Предоставляет набор действий, которые управляют пользовательскими данными, такими как создание, получение, обновление, удаление, а также пользовательскими действиями, включая сброс пароля, загрузку аватара, активацию учетной записи и объединение недавно просмотренных элементов. Этот класс расширяет миксины и GenericViewSet для надежной работы с API." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Пароль был успешно сброшен!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Вы уже активировали учетную запись..." diff --git a/vibes_auth/locale/sv_SE/LC_MESSAGES/django.mo b/vibes_auth/locale/sv_SE/LC_MESSAGES/django.mo index ca17463c3ea37b7f94ba4f12843b0184107e3502..eb48ac071a7c7264f64d1245d1c2b4d32bddda2d 100644 GIT binary patch delta 3115 zcmY+FTWl0n7{^b!7m8f8+*)A}P?5HBM-YT^6%kYfK>=a9JKc^uJ5y$6D<$G;un`H- zhk7NxfQ5*LM1z7+^noTOLNpQ}AwFR6Nl{dci4SVx?>{?LJn1*TbIzRe-DmsehTU6B zmxlLw#W1o+Ei%8iF)zT){dh2*8DLCHg)z^Ve#WKMXR)Wq-|JV-~ai z2u@)A=MBb;f#Zgh_0EGcS#N-&;XYVxOvxN(GKYPaY?0F3+0Fn)dR&5 zp$u(-y1yOj-gD{t zRmh(?GK&09VseU=Qt~~Nr$58z;op$PHyyaE)V>In@)Pi8cnN0c`oG|Na2wIcp<%r2 z)eEQLUiKH#AUoMVZJ~qpvhl`DWqrPMi!tn(z7%RKycJG|%b*PGfQsZ*sGfKSqRU)? zG_n~uu^f2~l%q4C^vqA!o8U~=S%@j~22{yTLY2OBI-Q(_^5`PG6IPNIrED&g1FPU- zxE0QV2O-rm7a?Ufzd$MMOM2u;73>SEp+3VJDE$*4Nj2->Q~Lf3Ofqa-f%0t4ZN@}! zGt~NPsFGZQ`bw@sMg9kz2M16W?Jt4-;cBRwuZQ{^Ti|548%~2qQ+^9;^!*RxExJrS zRHW;nn$3mk>cdbD9D`DP3M%3Yupa)Hax{gP!4*)cZh{J+1L}Ndx;_Gxxf5_Y_RUvJ zvao`mGreerQnU-wC+78Z|6|zB`YhD>Reba+(R)xCIR)>B=b#+5@J{b%K&5^elw)mh zAbbOsWUz|~4QxJvGJFB5M!!NeTV+GJ=98f=ZiO=N1nhvj;2_wW#-WO42;{1n4b_ZU zNYnp2HZqeVjFQ>PlTsvObxJ9F6p?cpibA!k)q)|X?n2Zz8p_5RWH6#stBe}hO}-}0 zsZ!Fwn)i%Js=vnF2vsnfv`B}VNkf@YRO*QZ$UVp`WI3`5;Y&<9ekoM6>yXWeK09S` z39Z`R#>0us?h{k=$iHLe(3o-+t1(KfV z1ND>MGZv!a<7f50=x1U#@NJLVooA{>ml~U*IJ7fyqO}lY9WS}< z`mvJ>?btzCHtUw}Sj~-5eJ>nZFV!ule2Y+O*@W5x2Y(b1Qgmir@>koTecSkR%;lvxmn&6V;A3DW(ure z`!;rSoky!imK1dy1h$&Lt?sNA-)FFKo8Z09g9GC|RgqXuhTi(_3Exf@y7aC1Jl zyMI>h7W|t7X4@#tzGlbF}kvZOyUmHB*NE1D=H&`v3p{ delta 2199 zcmY+_dq~x19LMpm^JwQ}r`cuM#e3^AGb=rnT28Z8tF(KWE6t^JBc-UoTJmFst;H&2 z)E^1&bj?$%0WauzG*a?>T?$q3?M;&+q5&xqP4J_iOK( z_A2l3z`zls)Dx*hB;M?MtVraCvL$G?A#QAWBi4!9ifgFMJ;UkPi&{`I7qx&g^z^_SD%`Vb)K+YE?nm7}i9_%lYUa05 zD|vwZup0;Czo?XlXcS=t$-Xrqx2y$q2HH^L{5F{Uw^F&mg|D!ZlR?!^p(bq^2~%)2DpT801MNgTe-QQeCtSM&mBDK`3Lg(4|4K=KUNqCb_#F;I4!r%0 zO6_S>%DXTP|HFDt{ZM*4gS%OlCN!R99iY7uchP>zD{zQ*Ee}nk{W9Gw6Vo|3RISvb zl24@;)o~kY1%F^EUP1m@e5U_)j6}w^2x@{AsE(Gq_I8ZWZozEqKyB4M)Sf?eK1WT+ zdqrgemFz4(RZCD4Xuxu8#>sdd$(p@FcEf`7t`5^t6B&idWFG4Ei=YOWj!JnW?#6wn zZ%sTWl!wxGt^eRLA?cupZY6L#$wu8sOzgy1Fb{tbrb3}{1!jMcASLQ zoo`WxE{BaDgR^mv-v1^lI%IoLr}+|U0=G~dKSHgz2ghT8gCO%!1J)snvTsnS{t5N> zzq|HjROarWwz?Y|a5%Hj`7@7-Iy#DE*Ust&cHvHZj(VVhlc>{t6O-`~R^SWNM2lFq z?pL5vUyGX9Vblk#1J&;Z)N6PbJq_GLMSB$D2 zF&34Pg{Z^Wf^irtRaCSvm0E)JL<^JG`u#yxqSB_K)oBIVFBNqTW!+_or@AeuhbXBJVGh$L(C-f z$}S~V5e0-^&2nNkF`rmY1c?MfXKEqw5s^!*A*N`2r8-ttP?_Z#bx!SB5M63SSOaIBF5~YN`0bdgwR*NTi8~xV~^9k*@ w4x5V3P^^6JDqlJm#BQM8jv``?yT*5?(+mC*_v5N?sPlc&f&rb2G76GE05%Z19{>OV diff --git a/vibes_auth/locale/sv_SE/LC_MESSAGES/django.po b/vibes_auth/locale/sv_SE/LC_MESSAGES/django.po index 09dc82e9..318ccdb8 100644 --- a/vibes_auth/locale/sv_SE/LC_MESSAGES/django.po +++ b/vibes_auth/locale/sv_SE/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -106,7 +106,7 @@ msgstr "Bekräfta återställning av en användares lösenord" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Lösenorden stämmer inte överens" @@ -150,8 +150,8 @@ msgstr "Missbildat telefonnummer: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Ogiltigt attributformat: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Aktiveringslänken är ogiltig!" @@ -163,19 +163,19 @@ msgstr "Kontot har redan aktiverats..." msgid "something went wrong: {e!s}" msgstr "Något gick fel: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token är ogiltig!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "De produkter som den här användaren har tittat på senast (max 48), i omvänd " "kronologisk ordning." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Grupper" @@ -183,7 +183,7 @@ msgstr "Grupper" msgid "wishlist" msgstr "Önskelista" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -200,91 +200,109 @@ msgstr "Språk är en av {LANGUAGES} med standard {LANGUAGE_CODE}." msgid "address set" msgstr "Adresser" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Representerar en User-entitet med anpassade fält och metoder för utökad " +"funktionalitet. Denna klass utökar AbstractUser-modellen och integrerar " +"ytterligare funktioner som anpassad e-postinloggning, valideringsmetoder, " +"prenumerationsstatus, verifiering och lagring av attribut. Den innehåller " +"också verktyg för att hantera nyligen visade objekt och tokenbaserad " +"aktivering för att verifiera konton. User-modellen är utformad för att " +"hantera specifika användningsfall för förbättrad användarhantering." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-post" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Användarens e-postadress" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefonnummer" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Användarens telefonnummer" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Förnamn" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Efternamn" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Bild på användarprofil" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Är verifierad" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Användarens verifieringsstatus" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Är aktiv" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Avmarkera detta istället för att radera konton" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Är prenumererad" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Användarens status för prenumeration på nyhetsbrev" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Aktiveringstoken" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Attribut" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Användare" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Användare" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grupp" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Utestående symbol" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Utestående polletter" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Svartlistad token" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Svartlistade tokens" @@ -347,8 +365,7 @@ msgstr "Hej %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Vi har fått en begäran om att återställa ditt lösenord. Vänligen återställ " @@ -396,8 +413,8 @@ msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" msgstr "" -"Tack för att du registrerat dig för %(project_name)s. Vänligen aktivera ditt " -"konto genom att klicka på knappen nedan:" +"Tack för att du registrerat dig för %(project_name)s. Vänligen aktivera ditt" +" konto genom att klicka på knappen nedan:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -412,12 +429,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Bästa hälsningar,
teamet %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Aktivera konto" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Återställ lösenord" @@ -432,32 +449,32 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" "Representerar en vy för att hämta ett par access- och refresh-tokens och " "användardata. Den här vyn hanterar processen för hantering av tokenbaserad " -"autentisering där klienter kan hämta ett par JWT-tokens (access och refresh) " -"med hjälp av angivna referenser. Den är byggd ovanpå en bas-tokenvy och " +"autentisering där klienter kan hämta ett par JWT-tokens (access och refresh)" +" med hjälp av angivna referenser. Den är byggd ovanpå en bas-tokenvy och " "säkerställer korrekt hastighetsbegränsning för att skydda mot brute force-" "attacker." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Hanterar uppdatering av tokens för autentiseringsändamål. Denna klass " "används för att tillhandahålla funktionalitet för uppdatering av token som " -"en del av ett autentiseringssystem. Den säkerställer att klienter kan begära " -"en uppfräschad token inom definierade hastighetsgränser. Vyn förlitar sig på " -"den associerade serialiseraren för att validera inmatningar för " +"en del av ett autentiseringssystem. Den säkerställer att klienter kan begära" +" en uppfräschad token inom definierade hastighetsgränser. Vyn förlitar sig " +"på den associerade serialiseraren för att validera inmatningar för " "tokenuppdatering och producera lämpliga utmatningar." #: vibes_auth/views.py:66 @@ -472,25 +489,18 @@ msgstr "" msgid "the token is invalid" msgstr "Token är ogiltig" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Implementering av användarvyuppsättning.\n" -"Tillhandahåller en uppsättning åtgärder som hanterar användarrelaterade data " -"som skapande, hämtning, uppdateringar, borttagning och anpassade åtgärder " -"inklusive återställning av lösenord, uppladdning av avatar, kontoaktivering " -"och sammanslagning av nyligen visade objekt. Denna klass utökar mixins och " -"GenericViewSet för robust API-hantering." +"Tillhandahåller en uppsättning åtgärder som hanterar användarrelaterade data som skapande, hämtning, uppdateringar, borttagning och anpassade åtgärder inklusive återställning av lösenord, uppladdning av avatar, kontoaktivering och sammanslagning av nyligen visade objekt. Denna klass utökar mixins och GenericViewSet för robust API-hantering." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Lösenordet har återställts framgångsrikt!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Du har redan aktiverat kontot..." diff --git a/vibes_auth/locale/th_TH/LC_MESSAGES/django.mo b/vibes_auth/locale/th_TH/LC_MESSAGES/django.mo index ca69505a83bcfb5b4a93ad234a7ee07661a4e715..dee454c86214cd2faa65e7e0e743cf7528f90a47 100644 GIT binary patch delta 3462 zcmY+FdvFx>9l*blC=fwn2!y=IMu<`f5!6bh1QKkq*!n`#h=Ovt+ax>O1Ml{*=;+C7 zcnoS`2{uqgbWp)z$}44WT02u;qjelwTWjlc>C_pu>J+DcIMcM_=lk0|kez(@^Lu{Z zdl_C=_Q>|K!iQDm1HzL)8jyJ-M7F?X7x3bFXp~5QnaEl=o%v^@MgGiuLIro=rx%Ji ztlv0RWFd1OPGSDvi$v;R)3{LYTzD1pZdePq!3iP-d4|Cp7Jdus;eTKytmMT|njto1 zHXIMzA-3ffI0G(&O>i^BraTAL_Y-g={2f%sUyXPgUd+6KR~7c9jX@_1olq66hy2OY zya+~y;Q8<+sD@vU=6``|=v}DyPC<>htV-ko*Z{lXZm5BL1yk@mqENl7;Dy+i2N{r6 z*&1!^gbSEI6|MgRmNWkxs-n|y5-h70xfIsHR@e!r!8F7dc?@bP4nVHRn{XaH1vQ|_ zntzR8Dg(VR1LCB#LoLP45tGsWW;l`c-B3$%1ZpHNz%lR*h;I2C)Rcb#uYr@eq@`H` z)sYy~9>`B5|7z$_7B<4?;T>>xO{i!aREPFK_53(gM^8r_K^oN11jv$fK+V+cPz^1I zdjB4%_clcHU64OHFp2!PFnE!frsNZ-o_+~8!T&)TUpC^druGr2DL(-l;fF9z*AK%} zd^szKM!%$mG{j64J`3Mt{q3oo=iCvLWSO7*4$kSh!p!jVc@lQBP|?Ok*aNi(ejf3U z@Hq3z%SF22EASdvKPx=n1U4tyN3 z{R)vEG9QTe9(;~@^OZyi{{Yp|8CQj=TnbfT7HTi7i{_6;+za)0;#aU8)_zyy@B00B zGg!mI?5j}@pNHk7>P?8#^46R%(h=Va4Yo&I3GZWn5NhPrq(dE;4%M-_5Ear7m%+X8 zmv9*Nz`?m1AoU++kYQor_xTdwQMePn1GRaQbe^&RwIn+tz6Eb&UPU-57=tXyNl0>J z%>2-i4yYwbNAq0~Uxq8NFJCbjgtwyId^S)OP3jQ24R%4QA_w8W;QR13_*!R}q3sJp zLodQTtp6L*F0$>~P|t5*FY~XVX5{W4gaPe>+JAC@fkyUD#2N}umZTeM4{Ya^)qSX$ zxPDO>(Q-JRQf-9l@Zfdf`M<(jm^b_={AEl-j-7dKXLLz8E6CjprbSyfMARRbrO3o+ zelgSxG(__zNZBPG%@a^dF&5EY&~IO#%aJS0NQ5s=NX$7;i`HKsN^Meqr;(LPF#x$WIadslNcxX1!VMpND7} zRv!ZbUkeYNQ9b3>kq;MJkZxh<3X+oc2aJQje6L1<_z}#G6VR@FM-=>l6CJ zJhP6aM(rFM9zw(6IRN0`!kGtGo1dJ zYo`;spHIhKCzFmPx$V6%rnb=8lXJ7NxNEegG6_3rZaZn$?#sqp8)b=v6W+0U?U{_v8E@Q3AW>z~1cJi)+?+zmkEEP+~u-oSy8dFoysNKv; zJ3X@}mLpiAa#n}F=viZN4Tsr?XYy$`*Jj<;Z(HAr+{szkaQf2Rb~9E#8k4q_TV==9 zS1X?*XjDf@O|u{8B+Kf_Xk4*V6sGN1dBw})FL^BR2Lqq?P*B_)6dwxwL#37Dfj_{y z_ounlca;wK`}Cy0H}KirANV_i;m2xnQL^)_T7OUAKOOi-0)MwTJfODx zO+j&k(Xhok)mXg*ogCN{_-j?Cztv3f4dqA8b$mEx4lw9OeE#<2qaWt#exKY-sBLv*s$A{lNDERg5MS<2H#p zZgf0h2Ivk|4lFg9+Gm-~ttRe4>ugY(@O43Pi}3}8MRNjMhmB^GlVNr-9Y#l)xPsmN z-k0@t-h$~P$D)pH>OtOzypzpM-oXZ|%<>BJ>%5QVH@s_=$qRkh%% z@m2#g>NGt^OVv1GGJ42+d}hr^@=D!?ypB2bb~+*q alHw8!&50YoHi;PYo@kzT?Ej4qPWc81Bb>wl delta 2205 zcmY+_eN0t#9LMo53dn^nC?F5&jSMjoGc-c-A$f=}6(3ST^kNjQX%ip&BTYQcY!_X) zF>9&i)ae@9n$Fu;TSHySDqEY4{_tU=a$&144jGdY4wgce$;T$q2`vsHmH`Ks4UHf0u zKzC5Tdw^PTgxR-a1vX+2a>>#ewGE#{_4^TOVFxk9`1Xana2jXPKC27(5EC(l>8hhJ z=3xZKV>wR5W-P`%$WJVedK7)A%>9is@BwN;(>SRGRHCOJ)KTG@HK88GT4x99`f<#` z9@NZ#My=#3K7oH>Hr__1JVfIqEJLzy>yS&P5}`GHN1WW+4ku15L(UjG{92E^44HsNZ*@?myz%XHXgJ!y+8WA^%EABE4v)sTjk2 zWW(E0RBBJ6Qr?ddyoasq`aF93gEwXy%UZ?xm0Y||`vOL|et4|eCfdDE^O(3^N+)`2 z_F^O6^{6~YW#Kcyv)}GKi(hm8Auh!@vrtMy&j$C`AW5-}$SoE_rSufOk3V50){!P< zs)K{}P~3R|H36^RRZ4iLYB}+N^GEEaoxu)k!EaC#&F7#L)}cCVLG6JJuHEkJ#5J5h zgfns2B=!r|;ub7;-i+jUc7RGEsrnX6xp1C?R{9_ETPv9y*o0eY$51ODG9{Qm9_qeg zEXM|nVkdr%x9}~Dy$~$$7OtmVT4pv*@Ba}hA9JD)GjaKgfo-VQafkCf&Zn(W+F$`{ zbM_*A+C9`nCQS_?K%(EYkMlKX?g$z@BMA zhP>%P$EWc#&JQ42wXJlbeokpDe^Yr{xQi)~6NHr*Y zIsLsb+HdjcM6%{TN1bXV>IrSUY(kS%Q5KXr6}`61RvA!ZR-#GAx;Vkl8agor3Hh0sPCL8y!h@Q-X6zsz>}Z;Y#lk-cnnuFV@C_fn1} X>{}5I#s5$HDr;X)ad~`r(e}beyVlT< diff --git a/vibes_auth/locale/th_TH/LC_MESSAGES/django.po b/vibes_auth/locale/th_TH/LC_MESSAGES/django.po index f2e3ccb7..a74f4485 100644 --- a/vibes_auth/locale/th_TH/LC_MESSAGES/django.po +++ b/vibes_auth/locale/th_TH/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "ยืนยันการรีเซ็ตรหัสผ่านข #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "รหัสผ่านไม่ตรงกัน" @@ -147,8 +147,8 @@ msgstr "หมายเลขโทรศัพท์ไม่ถูกต้อ msgid "Invalid attribute format: {attribute_pair}" msgstr "รูปแบบแอตทริบิวต์ไม่ถูกต้อง: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "ลิงก์การเปิดใช้งานไม่ถูกต้อง!" @@ -160,17 +160,18 @@ msgstr "บัญชีได้รับการเปิดใช้งาน msgid "something went wrong: {e!s}" msgstr "เกิดข้อผิดพลาด: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "โทเคนไม่ถูกต้อง!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" -msgstr "สินค้าที่ผู้ใช้รายนี้ดูล่าสุด (สูงสุด 48 รายการ) เรียงตามลำดับเวลาล่าสุด" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" +msgstr "" +"สินค้าที่ผู้ใช้รายนี้ดูล่าสุด (สูงสุด 48 รายการ) เรียงตามลำดับเวลาล่าสุด" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "กลุ่ม" @@ -178,7 +179,7 @@ msgstr "กลุ่ม" msgid "wishlist" msgstr "รายการสิ่งที่ต้องการ" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "อวตาร" @@ -195,91 +196,109 @@ msgstr "ภาษาเป็นหนึ่งใน {LANGUAGES} ที่ม msgid "address set" msgstr "ที่อยู่" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"แทนที่เอนทิตีผู้ใช้ที่มีฟิลด์และเมธอดที่ปรับแต่งได้สำหรับฟังก์ชันการทำงานที่ขยายออกไป" +" คลาสนี้สืบทอดมาจากโมเดล AbstractUser และรวมคุณสมบัติเพิ่มเติม เช่น " +"การเข้าสู่ระบบด้วยอีเมลที่กำหนดเอง วิธีการตรวจสอบความถูกต้อง " +"สถานะการสมัครสมาชิก การยืนยัน และการจัดเก็บแอตทริบิวต์ " +"นอกจากนี้ยังมียูทิลิตี้สำหรับจัดการรายการที่ดูล่าสุดและการเปิดใช้งานแบบใช้โทเค็นเพื่อยืนยันบัญชี" +" " +"โมเดลผู้ใช้ได้รับการออกแบบมาเพื่อจัดการกรณีการใช้งานเฉพาะสำหรับการจัดการผู้ใช้ที่ดียิ่งขึ้น" + +#: vibes_auth/models.py:41 msgid "email" msgstr "อีเมล" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "ที่อยู่อีเมลของผู้ใช้" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "หมายเลขโทรศัพท์" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "หมายเลขโทรศัพท์ผู้ใช้" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "ชื่อ" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "นามสกุล" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "รูปภาพโปรไฟล์ผู้ใช้" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "ได้รับการยืนยันแล้ว" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "สถานะการยืนยันของผู้ใช้" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "กำลังใช้งานอยู่" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "ยกเลิกการเลือกสิ่งนี้แทนการลบบัญชี" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "สมัครสมาชิกแล้ว" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "สถานะการสมัครสมาชิกจดหมายข่าวของผู้ใช้" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "โทเค็นการเปิดใช้งาน" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "คุณลักษณะ" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "ผู้ใช้" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "ผู้ใช้" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "กลุ่ม" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "โทเค็นที่ยังไม่ได้ใช้" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "โทเค็นที่ยังไม่ได้ใช้" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "โทเค็นที่ถูกขึ้นบัญชีดำ" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "โทเค็นที่ถูกขึ้นบัญชีดำ" @@ -342,11 +361,11 @@ msgstr "สวัสดีครับ/ค่ะ %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" -"เราได้รับคำขอให้คุณรีเซ็ตรหัสผ่านของคุณ กรุณาทำการรีเซ็ตรหัสผ่านของคุณโดยคลิกที่ปุ่มด้านล่าง:" +"เราได้รับคำขอให้คุณรีเซ็ตรหัสผ่านของคุณ " +"กรุณาทำการรีเซ็ตรหัสผ่านของคุณโดยคลิกที่ปุ่มด้านล่าง:" #: vibes_auth/templates/user_reset_password_email.html:95 msgid "reset password" @@ -357,7 +376,9 @@ msgstr "รีเซ็ตรหัสผ่าน" msgid "" "if the button above does not work, please copy and paste the following URL\n" " into your web browser:" -msgstr "หากปุ่มด้านบนไม่ทำงาน โปรดคัดลอกและวาง URL ต่อไปนี้ลงในเว็บเบราว์เซอร์ของคุณ:" +msgstr "" +"หากปุ่มด้านบนไม่ทำงาน โปรดคัดลอกและวาง URL " +"ต่อไปนี้ลงในเว็บเบราว์เซอร์ของคุณ:" #: vibes_auth/templates/user_reset_password_email.html:100 msgid "" @@ -386,7 +407,8 @@ msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" msgstr "" -"ขอบคุณที่ลงทะเบียนสำหรับ %(project_name)s กรุณาเปิดใช้งานบัญชีของคุณโดยคลิกที่ปุ่มด้านล่าง:" +"ขอบคุณที่ลงทะเบียนสำหรับ %(project_name)s " +"กรุณาเปิดใช้งานบัญชีของคุณโดยคลิกที่ปุ่มด้านล่าง:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -399,12 +421,12 @@ msgstr "เปิดใช้งานบัญชี" msgid "best regards,
the %(project_name)s team" msgstr "ขอแสดงความนับถือ
ทีมงาน %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | เปิดใช้งานบัญชี" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | ตั้งค่ารหัสผ่านใหม่" @@ -414,34 +436,37 @@ msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." msgstr "" -"รูปแบบหมายเลขโทรศัพท์ไม่ถูกต้อง. หมายเลขต้องถูกป้อนในรูปแบบ: \"+999999999\". " -"อนุญาตให้ใช้ได้ถึง 15 หลัก." +"รูปแบบหมายเลขโทรศัพท์ไม่ถูกต้อง. หมายเลขต้องถูกป้อนในรูปแบบ: \"+999999999\"." +" อนุญาตให้ใช้ได้ถึง 15 หลัก." #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"แสดงมุมมองสำหรับการรับคู่ของโทเค็นการเข้าถึงและโทเค็นการรีเฟรช รวมถึงข้อมูลของผู้ใช้ " -"มุมมองนี้จัดการกระบวนการตรวจสอบสิทธิ์ที่ใช้โทเค็น โดยลูกค้าสามารถรับคู่ของโทเค็น JWT " -"(โทเค็นการเข้าถึงและโทเค็นการรีเฟรช) โดยใช้ข้อมูลประจำตัวที่ให้มา " -"มุมมองนี้สร้างขึ้นบนมุมมองโทเค็นพื้นฐานและรับประกันการจำกัดอัตราที่เหมาะสมเพื่อป้องกันการโจมตีแบบ " -"brute force" +"แสดงมุมมองสำหรับการรับคู่ของโทเค็นการเข้าถึงและโทเค็นการรีเฟรช " +"รวมถึงข้อมูลของผู้ใช้ มุมมองนี้จัดการกระบวนการตรวจสอบสิทธิ์ที่ใช้โทเค็น " +"โดยลูกค้าสามารถรับคู่ของโทเค็น JWT (โทเค็นการเข้าถึงและโทเค็นการรีเฟรช) " +"โดยใช้ข้อมูลประจำตัวที่ให้มา " +"มุมมองนี้สร้างขึ้นบนมุมมองโทเค็นพื้นฐานและรับประกันการจำกัดอัตราที่เหมาะสมเพื่อป้องกันการโจมตีแบบ" +" brute force" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "จัดการการรีเฟรชโทเค็นเพื่อวัตถุประสงค์ในการยืนยันตัวตน " -"คลาสนี้ใช้เพื่อให้บริการฟังก์ชันสำหรับการรีเฟรชโทเค็นเป็นส่วนหนึ่งของระบบยืนยันตัวตน " -"มันทำให้แน่ใจว่าลูกค้าสามารถขอโทเค็นที่รีเฟรชแล้วได้ภายในขีดจำกัดอัตราที่กำหนดไว้ " +"คลาสนี้ใช้เพื่อให้บริการฟังก์ชันสำหรับการรีเฟรชโทเค็นเป็นส่วนหนึ่งของระบบยืนยันตัวตน" +" " +"มันทำให้แน่ใจว่าลูกค้าสามารถขอโทเค็นที่รีเฟรชแล้วได้ภายในขีดจำกัดอัตราที่กำหนดไว้" +" " "หน้าจอนี้พึ่งพาตัวจัดลำดับที่เกี่ยวข้องเพื่อตรวจสอบความถูกต้องของข้อมูลการรีเฟรชโทเค็นและสร้างผลลัพธ์ที่เหมาะสม" #: vibes_auth/views.py:66 @@ -456,23 +481,22 @@ msgstr "" msgid "the token is invalid" msgstr "โทเค็นไม่ถูกต้อง" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" -"การใช้งานชุดมุมมองผู้ใช้ ให้ชุดของการดำเนินการที่จัดการข้อมูลที่เกี่ยวข้องกับผู้ใช้ เช่น การสร้าง " -"การดึงข้อมูล การอัปเดต การลบ และการดำเนินการที่กำหนดเอง รวมถึงการรีเซ็ตรหัสผ่าน " -"การอัปโหลดอวาตาร์ การเปิดใช้งานบัญชี และการรวมรายการที่ดูล่าสุด คลาสนี้ขยายส่วนผสมและ " -"GenericViewSet เพื่อการจัดการ API ที่มีความแข็งแกร่ง" +"การใช้งานชุดมุมมองผู้ใช้ " +"ให้ชุดของการดำเนินการที่จัดการข้อมูลที่เกี่ยวข้องกับผู้ใช้ เช่น การสร้าง " +"การดึงข้อมูล การอัปเดต การลบ และการดำเนินการที่กำหนดเอง " +"รวมถึงการรีเซ็ตรหัสผ่าน การอัปโหลดอวาตาร์ การเปิดใช้งานบัญชี " +"และการรวมรายการที่ดูล่าสุด คลาสนี้ขยายส่วนผสมและ GenericViewSet " +"เพื่อการจัดการ API ที่มีความแข็งแกร่ง" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "รหัสผ่านได้รับการรีเซ็ตเรียบร้อยแล้ว!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "คุณได้เปิดใช้งานบัญชีเรียบร้อยแล้ว..." diff --git a/vibes_auth/locale/tr_TR/LC_MESSAGES/django.mo b/vibes_auth/locale/tr_TR/LC_MESSAGES/django.mo index 8d967b725673d59efc7b52ddfcd42552b0660e55..8b34ce4f76cb794095f62238dd35a7c1456e9438 100644 GIT binary patch delta 3207 zcmZXUTZ~;*8OPW3g1tkFot9F{0;wQOM_QoJf!fXp)KcUoP%edbopaWlS(&}}8TQ_1 zaGK}=5kbZBP(<682@tEOJWL9MCSX$MjFEr|36KB}80v#SxRuBQQ4@dvefD6DE9cw4 zwbovj@ABX0C%69Awcc7b=ck5N!&YOL%{JzTaMuYuX!p!BW~j@Ud*Qi^-xUlE)|M;p$AIB7ORmEyXRQThHs*v!va{E?AT@(z@zAHoOVzahdm_v5Zo zyALYm&%)E-Td<1i{{<)E9-{dw^DB7SH_Mo9@CftYLm&?`fB6|`fbpyF0>%R^3Unr& zQOFu|0B(f8hwI?SP@moqtR9xcc3KxyJrsEapzrE_5) zR7STz{XbOTX1EV-g)hNPa52JJq3?ei9qu-};Tre=+zt=HdGKQ>wSNXBvbmfpm7fMF zyV(GhsjH#HmOylD?uFX_bEphGR`M`Z2BzT!+;5K3xfynoe;p7*)%G69o#p_P*xK+u zcog0V2N8%eG!6OE%p33<@FS>9Ueeq7jJHFH%|mJD09**4hb=|$0v$#EH>itdAz{s1 zsL1*tugosE1pXN6pY9;M3qDiMpM8EuLmQzSuR@)-4|c(sb_*Sqh}JT@c~ZineY2#z zyA@L!)s(*Vn9`;u;a!4NHK5h7Yp}(bGNG)f;g{J^^o*hGW}xiPV6Ez}rcXp3->yN~ zBq}v!0?`&?laRiK=?l0L+kq*is`KTTvUnr53%d|g8NZHg!>-0u=K0tO*ooM6x_=f% z$;=+?Vr(Ne({|F)XQ$>mC`7o3J~Al&Ej7JKkFu#WGfiKNn#HbHhjtUDvfhBTzQv;- zQ@aY2u+-3GAtKdpD<;KPFnuYrG5sej!0x~#F6l$!)i=+d;OA{i+0z%Lc5Mg66D=(< zeRQQ-wet_h^M28_{ie*P)+c$$$L!r9AF|bEmN(+C*VpV|@KG(ZE~(kr=R*zpgAG=H zJNHRV@0&?A4~@h{?B4(4qElM^l`KzPH7`z$8#NylyF-%udg^k|VYOQ5?6HI1<;|42 zC=C1ZUh88QA{#a8A?dNBoLqBSKI1@-&6<_0nud{LHp@98W1&yOV5nYMtnDf8ba|eJ zN>g_dQ0nTw*KW_Pi?W6tNgJb~#+zmy@IBB|V6jUa_ty76wP;04QRj_epRB96j9`f> zjCOp{+TzAB7W1OoXeN2qYi}I#_PEGHX1OEO6L#kfJH&~Rx7moV%2(UW2%4kIq$a$t zvXW_eG9OobOksKt&sng0X=|HL!t{9LaX6-9i@|8-Ba&ys)GtF~rzZC@^wZ;cNXu0& za!KS;hr4!cYLYUsx((V4Sl+fJ%BWt@`lkIU|EKwqS z9<#HPw=tL2+7q!dfH2T$Ov)6)kk8x*eO~<6@0neNHf-)HWS9kRSn|lmkZR`I}W{{s~bT(kfH delta 2199 zcmXxldrVe!9LMo53i>?Yqj8B#$fXccg3Lff5q-c5h=P?Sfl?uDp#v|grc&-~x<;AI zwX8P(=%UEHZYuixQR|}U(m$Lq8Y}+L%~q{{ntwRkbZYOYe1uC#Diug43`Xd8RdDDz+efS~ot2J24OY zkw3f4L1P}p$vBQ0@NH*^hbGgm#1w468v3_3Dtge@?gu|1W3mxUz+0$}|8(s;sE+QT z?t6%uaSo&3jg{Dp5#*9hrPprEMLl;vYGQ{lNdGqAE}X%|w13nEe1!2BV7Piv2s1GU zi?9MqunlM8KI9e~L~X?t)XM#X3-KXpLJK&l353zp4RutwW-X|#=yHC9y55iJ7(tEv zI%+1r;}rZG)9@~8$%8cJV>z<=wgtIlyHPptDXO27X{`T;RDR(^D>jlDRP7jQKtG^H zK8zYjh*8KqR7Z0#12>>n>RnVvyHNM{p??33Yo9}{;1w*yo9V2-mL#61XrzhQi&;p* z+qbBtJ%L*CQOv>n*g@83^0Wwkz_ey_zKm&Iq}_oBXczM1ZrT^HjCKJD^9(j4f7au1 zte|oTOK}AC+C0VvoSyIR<=d!{e}WoVzwbr3kc|knOrnmPvQG(jL!>FW+phi06+SgFIFoxjU_rH_M3QqK*mUaY{<>ROu{z4_?BUJXLa<^8h6qRJFk$kd^sQY)J zR%nm&AZi5$P&qJ!>+nBJp?_;4!?cI(Sd2YLzSvRRi$nN2*3I%)XaIR3>^rQ-VPq*S zi<`+iD@Jv+99d=SK~3l@)C5joE?!1Y9sS`h#Ib&wSvEe8)u^|k3-yJ2AGhNd?tFj@ zQW9lw;1RYI^}MYZhq2O3MbA~yM3{KAtkV9gBoeO?nw5%X^8%sSsA#nFh>dDcI*3MM z3ZbphHmGRObD}l>wXJdW7^F_LEa1qZ@y+r3kDio=g#rP9P|Q5;yzm+3JyL_s!tx=lUJPlKO(8T A1ONa4 diff --git a/vibes_auth/locale/tr_TR/LC_MESSAGES/django.po b/vibes_auth/locale/tr_TR/LC_MESSAGES/django.po index eb403f57..67cecd84 100644 --- a/vibes_auth/locale/tr_TR/LC_MESSAGES/django.po +++ b/vibes_auth/locale/tr_TR/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ -# +# msgid "" msgstr "" "Project-Id-Version: EVIBES 3.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-13 13:56+0300\n" +"POT-Creation-Date: 2025-10-13 18:49+0300\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \n" "Language-Team: BRITISH ENGLISH \n" @@ -105,7 +105,7 @@ msgstr "Bir kullanıcının parola sıfırlamasını onaylama" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Parolalar eşleşmiyor" @@ -148,8 +148,8 @@ msgstr "Hatalı biçimlendirilmiş telefon numarası: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Geçersiz öznitelik biçimi: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Aktivasyon bağlantısı geçersiz!" @@ -161,19 +161,19 @@ msgstr "Hesap zaten etkinleştirildi..." msgid "something went wrong: {e!s}" msgstr "Bir şeyler ters gitti: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Jeton geçersiz!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Bu kullanıcının en son görüntülediği ürünler (en fazla 48), ters kronolojik " "sırayla." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Gruplar" @@ -181,7 +181,7 @@ msgstr "Gruplar" msgid "wishlist" msgstr "İstek Listesi" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -198,91 +198,110 @@ msgstr "Dil, varsayılan {LANGUAGE_CODE} ile {LANGUAGES}'dan biridir" msgid "address set" msgstr "Adresler" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Genişletilmiş işlevsellik için özelleştirilmiş alanlara ve yöntemlere sahip " +"bir Kullanıcı varlığını temsil eder. Bu sınıf AbstractUser modelini " +"genişletir ve özel e-posta girişi, doğrulama yöntemleri, abonelik durumu, " +"doğrulama ve öznitelik depolama gibi ek özellikleri entegre eder. Ayrıca son" +" görüntülenen öğeleri yönetmek için yardımcı programlar ve hesapları " +"doğrulamak için token tabanlı aktivasyon sağlar. User modeli, gelişmiş " +"kullanıcı yönetimi için belirli kullanım durumlarını ele almak üzere " +"tasarlanmıştır." + +#: vibes_auth/models.py:41 msgid "email" msgstr "E-posta" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Kullanıcının e-posta adresi" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Telefon Numarası" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Kullanıcı telefon numarası" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "İlk isim" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Soyadı" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Kullanıcı profili resmi" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Doğrulandı" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Kullanıcının doğrulama durumu" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Aktif" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Hesapları silmek yerine bunun seçimini kaldırın" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Abone olundu" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Kullanıcının haber bülteni abonelik durumu" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Etkinleştirme belirteci" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Nitelikler" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Kullanıcı" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Kullanıcılar" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Grup" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Olağanüstü belirteç" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Ödenmemiş jetonlar" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Kara listeye alınmış belirteç" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Kara listeye alınmış belirteçler" @@ -345,8 +364,7 @@ msgstr "Merhaba %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Şifrenizi sıfırlamak için bir talep aldık. Lütfen aşağıdaki butona " @@ -410,12 +428,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "Saygılarımla,
the %(project_name)s team" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Hesabı Etkinleştir" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Şifreyi Sıfırla" @@ -430,8 +448,8 @@ msgstr "" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." @@ -440,21 +458,21 @@ msgstr "" "bir görünümü temsil eder. Bu görünüm, istemcilerin sağlanan kimlik " "bilgilerini kullanarak bir çift JWT belirteci (erişim ve yenileme) " "alabildiği belirteç tabanlı kimlik doğrulama işlemini yönetir. Temel bir " -"token görünümünün üzerine inşa edilmiştir ve kaba kuvvet saldırılarına karşı " -"koruma sağlamak için uygun hız sınırlaması sağlar." +"token görünümünün üzerine inşa edilmiştir ve kaba kuvvet saldırılarına karşı" +" koruma sağlamak için uygun hız sınırlaması sağlar." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" "Kimlik doğrulama amacıyla belirteçlerin yenilenmesini işler. Bu sınıf, bir " "kimlik doğrulama sisteminin parçası olarak belirteç yenileme işlemleri için " -"işlevsellik sağlamak üzere kullanılır. İstemcilerin tanımlanan hız sınırları " -"içinde yenilenmiş bir belirteç talep edebilmesini sağlar. Görünüm, token " +"işlevsellik sağlamak üzere kullanılır. İstemcilerin tanımlanan hız sınırları" +" içinde yenilenmiş bir belirteç talep edebilmesini sağlar. Görünüm, token " "yenileme girdilerini doğrulamak ve uygun çıktıları üretmek için ilişkili " "serileştiriciye dayanır." @@ -470,24 +488,18 @@ msgstr "" msgid "the token is invalid" msgstr "Belirteç geçersiz" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Kullanıcı görünümü kümesi uygulaması.\n" -"Oluşturma, alma, güncelleme, silme gibi kullanıcıyla ilgili verileri ve " -"parola sıfırlama, avatar yükleme, hesap etkinleştirme ve son görüntülenen " -"öğeleri birleştirme gibi özel eylemleri yöneten bir dizi eylem sağlar. Bu " -"sınıf, sağlam API kullanımı için mixin'leri ve GenericViewSet'i genişletir." +"Oluşturma, alma, güncelleme, silme gibi kullanıcıyla ilgili verileri ve parola sıfırlama, avatar yükleme, hesap etkinleştirme ve son görüntülenen öğeleri birleştirme gibi özel eylemleri yöneten bir dizi eylem sağlar. Bu sınıf, sağlam API kullanımı için mixin'leri ve GenericViewSet'i genişletir." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Şifre başarıyla sıfırlandı!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Hesabı zaten etkinleştirdiniz..." diff --git a/vibes_auth/locale/vi_VN/LC_MESSAGES/django.mo b/vibes_auth/locale/vi_VN/LC_MESSAGES/django.mo index 5b1ad7edfcfcdd678b2dbefa359c57267b861551..59f3289050c32eb13dec316ec6ece89ac9889fd1 100644 GIT binary patch delta 3259 zcmZ9Nd5jcQ9>?Es=x~S}f{4gG6|ZF+Wo5++a6nW%5Dyk~@u;b;nXXKC_1Im_GV9SA zG^imOGI(FW1m$od6YyYKB(ZQdYBVvDXuNCx&|TLxVpbEfuKM{_*C_HbzxurUcfOw9 z8+)^rPsa{<(9kl-WaPZT#@q{+9m0opN4+uGI%DpHe_;I8Fk{|hJbpN5;J-!~<1@eT zFk|L2eiXx38%qjumRo!(P=h8+5Qqd6ut^&cz?=$a17(ge8!^RG|_2hq8aLEC)`YwYZtACGH5-N5O+)rW$h+oqt1lG7f9F%glyNa4F=^ ztm31{^gva8JyuZ2W(HKq=R>97I;dJ`gG$X>xD0N9I`=bF>ZYOe5LlT>M-#K56kd|D z6H4(WD8t@?m%{x}9?mBm7OsK{^(HtJz56LGO2^NlUGux4JbfSP6?_e^hCf0nT!ee_crny|7g~4=oC%+Rt#B{=BRrQd zou>C6&{1(c1yw8`!E@j@a3nnC)LMkjgj%1QaxqkdvhYvven`2PJy1pc2|N_;hcdj5 z@QM?l_DzE`_5LrQ(*kdW%Kc|h7w?Cs!-msp#kL5pVI06)pcdunt&o>y*1`~Ofl|;w zh3THN;Mwp7h)?DbI10WFE638=ONX?YA0SaTQ;3g#I4*`dkb?^0qfiImg-XHaa0C1n z@^Ver8MUh3lJa9np_@@N@E#7drF1k;tC$=4QWHtLJmm;@Euu@+#vs_1{DacC0XYkC zHK1jXg~(xuA~6n8BTz}M)t6&))j6P@p!}`AFB+sxxl>b0cr{6l%!0EK<@-Y9 zQbdueM=n5A+1DU?ayXr&VII5)xeWO;G7QnvQv?@D{~&}KF*hL!^O?v%TS8}kI&e}d z=PFF4M!yMa%I`p%G|+)V)4qjQrv1fGX}=1oT+OE$QM&}WA?ekAEJoAUuiW{_5l9Q7 zIvI>iMTR5SBcwU`?HCL76jl8LZBE)*kn)Ow1xPK8N}ihDzuM{B^Yt6+7A!7#Me7Bj zA9mWm`eD|(|XaWtog$J7ZftCoC74%lYkIs@HmX$IsbZq0J8( z?Q(9;INCm7K%*^{TS{)x??`4#Ay<^x=oS4|-@P!|+nDHd!m#MKl%*4gicXu?WEX_i z$(0JWqgYt(XILqRKDPVxi_e7q<0pi>puiHWTf{g5`1bao@Vpde)1{iYB9Vwjt$3cfdg%Aw3UNhS&?{)mR`3Juj9U&o6&lI;L`SJSEEg~<$d(av|RtTvNl(r$C)xt zDA~NO38QtsZO^j3J7}_({~FAL61!)Ove~V)`*GjykVKG&TH;p3 z)gIZfj17KQRb3w*bK>?dkA8F9FKa`e Aod5s; delta 2203 zcmXxle@vBC9LMo5dJ!&qF@Y3{A6K#@!hYWPrN$3MQo;O{1V~UgvjS!dT1@oOKU~ZZ)mrgQ4%n18r7O|AFmxrZ~qyv})^d!KX8_k5r0 z;I_d=Zz3u1tERk7TF%$LNuTUF1h(YGJAKi@;Si*QjH}EkAFrMY=K_N`V z415mrF%KIs2fswVVne8-7)537HZH+Os0|f!Q5z^lPhY5{!#%4-9Yu??8+E@A=i)GG z<$s}eas_AMO-#XisFVj86k!C(zO^B@Y$vJ)_M_$*NFo1w>73<49ad8rbgdt?pi`)o zkD(S4VihtAHPI_L4>zMS)sC8|6ZQSCQJ+8T#wSr39K~mGVlMetN&-AZD^0*JFbyeq zJAz8>aa77LUV~B z^mufXk`a6nFQZl#H$R$@MW|};M!g+Bp)xdzO8q#h25zE`Bqf_{U^eP|9_q*jP-p(L z8;_vo^Uk@>ebmG`RE}1*23KPzmfXOL#W|?VEkUKe+>I-p)fnOW24wTrjU9Lt z-^2_iBZ;1ErPI%aUC|4+kUVq4N>DqkK~;YXZon=K;23Jhmr$R-j$!;43oxBLZ^e!H zD*lEq;Uuc2GC9{Iz5n%ein-8+O6f6F%7*<9@Jr>qgsjnS;p>?Ae6*OBqpG<9#W2pvy3v4YUs^EMGr#1e_bTf{U%S#BiqwSN`URNF*nxf?V&m1-3v$8NRm zTA@?u_hYK*%}~oC*7`lp8^gppVm(nxsI4Tt2EQA9=V#MTCrSwYjJ`+kHraGS^${fW z\n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "Xác nhận việc đặt lại mật khẩu của người dùng" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "Mật khẩu không khớp." @@ -124,8 +124,8 @@ msgstr "" #: vibes_auth/graphene/mutations.py:41 msgid "the user's b64-encoded uuid who referred the new user to us." msgstr "" -"Mã UUID được mã hóa bằng B64 của người dùng đã giới thiệu người dùng mới cho " -"chúng tôi." +"Mã UUID được mã hóa bằng B64 của người dùng đã giới thiệu người dùng mới cho" +" chúng tôi." #: vibes_auth/graphene/mutations.py:61 msgid "password too weak" @@ -150,8 +150,8 @@ msgstr "Số điện thoại không hợp lệ: {phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "Định dạng thuộc tính không hợp lệ: {attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "Liên kết kích hoạt không hợp lệ!" @@ -163,19 +163,19 @@ msgstr "Tài khoản đã được kích hoạt..." msgid "something went wrong: {e!s}" msgstr "Có sự cố xảy ra: {e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "Token không hợp lệ!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "" "Các sản phẩm mà người dùng này đã xem gần đây nhất (tối đa 48), theo thứ tự " "thời gian ngược." -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "Nhóm" @@ -183,7 +183,7 @@ msgstr "Nhóm" msgid "wishlist" msgstr "Danh sách mong muốn" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "Avatar" @@ -200,91 +200,109 @@ msgstr "Ngôn ngữ là một trong những {LANGUAGES} với mặc định {LAN msgid "address set" msgstr "Địa chỉ" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"Đại diện cho thực thể Người dùng với các trường và phương thức tùy chỉnh để " +"mở rộng chức năng. Lớp này kế thừa từ mô hình AbstractUser và tích hợp các " +"tính năng bổ sung như đăng nhập bằng email tùy chỉnh, phương thức xác thực, " +"trạng thái đăng ký, xác minh và lưu trữ thuộc tính. Nó cũng cung cấp các " +"công cụ để quản lý các mục đã xem gần đây và kích hoạt dựa trên token để xác" +" minh tài khoản. Mô hình Người dùng được thiết kế để xử lý các trường hợp sử" +" dụng cụ thể nhằm nâng cao quản lý người dùng." + +#: vibes_auth/models.py:41 msgid "email" msgstr "Email" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "Địa chỉ email của người dùng" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "Số điện thoại" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "Số điện thoại của người dùng" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "Họ" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "Họ" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "Hình ảnh hồ sơ người dùng" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "Đã được xác minh" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "Trạng thái xác minh của người dùng" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "Đang hoạt động" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "Hủy chọn tùy chọn này thay vì xóa tài khoản." -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "Đã đăng ký" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "Tình trạng đăng ký bản tin của người dùng" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "Mã kích hoạt" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "Thuộc tính" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "Người dùng" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "Người dùng" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "Nhóm" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "Token xuất sắc" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "Token xuất sắc" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "Token bị đưa vào danh sách đen" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "Các token bị đưa vào danh sách đen" @@ -347,8 +365,7 @@ msgstr "Xin chào %(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "" "Chúng tôi đã nhận được yêu cầu đặt lại mật khẩu của bạn. Vui lòng đặt lại " @@ -394,8 +411,8 @@ msgid "" "thank you for signing up for %(project_name)s. please activate your account\n" " by clicking the button below:" msgstr "" -"Cảm ơn bạn đã đăng ký cho %(project_name)s. Vui lòng kích hoạt tài khoản của " -"bạn bằng cách nhấp vào nút bên dưới:" +"Cảm ơn bạn đã đăng ký cho %(project_name)s. Vui lòng kích hoạt tài khoản của" +" bạn bằng cách nhấp vào nút bên dưới:" #: vibes_auth/templates/user_verification_email.html:96 msgid "" @@ -408,12 +425,12 @@ msgstr "Kích hoạt tài khoản" msgid "best regards,
the %(project_name)s team" msgstr "Trân trọng,
Đội ngũ %(project_name)s" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME} | Kích hoạt tài khoản" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME} | Đặt lại mật khẩu" @@ -423,38 +440,38 @@ msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." msgstr "" -"Định dạng số điện thoại không hợp lệ. Số điện thoại phải được nhập theo định " -"dạng: \"+999999999\". Cho phép tối đa 15 chữ số." +"Định dạng số điện thoại không hợp lệ. Số điện thoại phải được nhập theo định" +" dạng: \"+999999999\". Cho phép tối đa 15 chữ số." #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" "Đại diện cho một giao diện để lấy cặp token truy cập và token làm mới cùng " "với dữ liệu người dùng. Giao diện này quản lý quá trình xác thực dựa trên " -"token, cho phép các client lấy cặp token JWT (truy cập và làm mới) bằng cách " -"sử dụng thông tin đăng nhập được cung cấp. Nó được xây dựng dựa trên một " +"token, cho phép các client lấy cặp token JWT (truy cập và làm mới) bằng cách" +" sử dụng thông tin đăng nhập được cung cấp. Nó được xây dựng dựa trên một " "giao diện token cơ sở và đảm bảo giới hạn tốc độ thích hợp để bảo vệ khỏi " "các cuộc tấn công dò mật khẩu." #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"Xử lý việc làm mới token cho mục đích xác thực. Lớp này được sử dụng để cung " -"cấp chức năng cho các hoạt động làm mới token như một phần của hệ thống xác " -"thực. Nó đảm bảo rằng các client có thể yêu cầu token đã được làm mới trong " -"giới hạn tỷ lệ được định nghĩa. Giao diện người dùng dựa vào trình " -"serializer liên quan để xác thực các đầu vào làm mới token và tạo ra các đầu " -"ra phù hợp." +"Xử lý việc làm mới token cho mục đích xác thực. Lớp này được sử dụng để cung" +" cấp chức năng cho các hoạt động làm mới token như một phần của hệ thống xác" +" thực. Nó đảm bảo rằng các client có thể yêu cầu token đã được làm mới trong" +" giới hạn tỷ lệ được định nghĩa. Giao diện người dùng dựa vào trình " +"serializer liên quan để xác thực các đầu vào làm mới token và tạo ra các đầu" +" ra phù hợp." #: vibes_auth/views.py:66 msgid "" @@ -468,24 +485,21 @@ msgstr "" msgid "the token is invalid" msgstr "Token không hợp lệ" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "Thực hiện bộ xem người dùng. Cung cấp một tập hợp các hành động quản lý dữ " "liệu liên quan đến người dùng như tạo, truy xuất, cập nhật, xóa và các hành " -"động tùy chỉnh bao gồm đặt lại mật khẩu, tải lên avatar, kích hoạt tài khoản " -"và hợp nhất các mục đã xem gần đây. Lớp này mở rộng các mixin và " +"động tùy chỉnh bao gồm đặt lại mật khẩu, tải lên avatar, kích hoạt tài khoản" +" và hợp nhất các mục đã xem gần đây. Lớp này mở rộng các mixin và " "GenericViewSet để xử lý API một cách mạnh mẽ." -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "Mật khẩu đã được đặt lại thành công!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "Bạn đã kích hoạt tài khoản..." diff --git a/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.mo b/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.mo index 0414134376bc40f6b01c55f21b284158bf82b5d7..f14e069e44f71672488c4ea32a727896023154b9 100644 GIT binary patch delta 3013 zcmY+Fd2AF_7{FfzkxMQu0wRnGqF9P3iV6tzKv6{GR#DmR4(;e3b$1qoM0Y6^DKv_5 z6oC|r7K?@@q(JEbjTkjX{Yy>o2n5-g-5Ql()ELF+@0)ow`qFQI-}kQXc<)VrpM82k z>eQg_TNN#Y3`eGPQ>q#+>A?>z-BYRZ0;N{NvDn}DQtET;!rrWboqd$D=%0P5Qg>q? zh1X*L*-xoqaAbdf-#g(%>_u=Wtbv6}rPN-ONp!TsE8#D2035&%s=6BDLrs8}!Ko16 z>QQ(jTmnbJ^$?$`5lZaM@Dg|&O5h)Ao`(amhx0QC|Ed_JgpLv@8?Ax-sWamNz12x5CI1oL0f(?ij%F^DKmt(i zKyonk7e}wqQ3cI2>X zjb@I7sh<$NU4Nl-E? z(e`|JJN8ph9M)>qL7CS8slGZ2uY+Ggxhof-d^g6>St##+9tzb`7L<%OLb+@^VGnpx z^E8xk7fPVNL2=Y=j9-z#Q2NJ1nKuRYfU|V}Jk6zgJOanyU%h}LrEky^zSZo6QtIEJ zJgffPtT}KLoC%Xq9Cm1a3MXTK1toyO8~pX7p&Z>^Py!A^2`mLuGI1S>INGKs9MJX& zZGQvh?0$l>us3xS#{=PPI6~VI$Z4uonsrc)-~=pyU2QQ6*GO8*J9`55+QXXiad`~k zbKo_3yYebzGikgY@9cw~<^S`NK;&a2uS4FxwDHKzo~9JBtGl({h0${U(xhwzsh$u+ zw@Wm6+TI0{J24fx3%M1Ufjopr#yydH5uUl4k1RnZB2v|Rko%EY$U>wSB2|>i&k_F@ zA#y%Tkx7W$g|4;;nKTGaO17foRBxn09## zeOZjz&)a4+B;(0w(6(aHK$z8=Kj}L(RZ^O;lWvKm7onID4yL%Nd+(11q@1c|cUN`(rFWdnj%-V{ zv%l8O9Clu-aksU&Oq+8Ktt|e zn?EPpy3Y9DLAj0fPTj_H?KMuzkpi#Su(N+t zXJsbab|m+Dn{#aI+4SnpcWUwnR{QZ_<}-Ubw^!vh9C6dD{~aY@=U|u7UUhdj{AQKUcT5(b?7LytNjW&Yn7_ bz11J}gOKu7w@_$0v&T2GRyBPvtf}umXNG2< delta 2199 zcmYM#S!fkk9LMp0%wlfLjd9DOW^rp>Qny~SS))naYqU|LCNbK&KwDH?BBT#?P!MgY zib!ZFLMw^{#RUV_7Z+;N_C-*PsCh6ThzN>O#EnM#{Z0NC5BcBEIcH|hK9jE6R||uC z{gYaZw3Zl3#1hTE#|0_;kT$29eU)Ig1;){a|G*Nn!0wP4LPcfIH%g=ZD3@Y?oR5|CZ;fQs(64^OWn@ft1Cy}})$s!_KSOo&0`*)sYQ}kt zeg~G~ay*Y*vJ86Ni20~?e?(2}7mU!q9rp`oaXRHox`1yn2~!!a8j4~L=HUlej78Xp zqwxpi5o<$jMLTNc9^oh0jhaw7m72f|4D`SpGF-Dd)K+Y8_oA*J!z?_H8u>NUOzvVj zKE#3e9JS;T3S}5WR^K)umuv^>3>-xDb8;Z-znje8RMcZNCxfiDq6TykHS+7IfkYXF zEI@TM3A1q}YNeV`9es;>ejn=o-@JSdwSw(93h!mH{#ueGTG2?;a1Z7p2i}gLmi7c{ z$!}sFzQOgJ`W#xz!|#}u?mNsuD52brODK0U%}UBOyb2>JAL3!n`~qr#9RZn1WFC4& zZhp^_7NH&}Lnd#lyuQiZiQ2>csD@g++=_bc4AP`^c>TYqGxgfbiJaVG%0ZfEDp7~5 z+1-mDQT`dVWPf>m7i!O+y8odD5-IF4)6GWBG#~YLl;clWi>vVo(oSI2!}!2ZQIBf) zDr%(HQ8VlG@)Inj{1VmS#Nj=bpzfir){ zMu#khYIuv=9NxeXQ3E@G>gX_PMb3ErKd6&4(h%F)O`~$ z&<%6Fq5)NILhaoiOu?h5j!)o1{N2kbOoz$Y0Jj9S1r3;h@wA+bmRxBS!R0V5(Ecmw z^SXl2{wVR~w26cUp~RupKMPx<0%4h)cEYxRLr?}4RN?oB(YCI)*rT}$zl$H{OL=CZ+m_aD% zOa+Z$w&zvR;n4m~C-fQpl3=SXk\n" "Language-Team: BRITISH ENGLISH \n" @@ -104,7 +104,7 @@ msgstr "确认用户密码重置" #: vibes_auth/docs/drf/viewsets.py:58 vibes_auth/graphene/mutations.py:311 #: vibes_auth/serializers.py:105 vibes_auth/serializers.py:109 -#: vibes_auth/viewsets.py:82 +#: vibes_auth/viewsets.py:83 msgid "passwords do not match" msgstr "密码不匹配" @@ -147,8 +147,8 @@ msgstr "畸形电话号码:{phone_number}!" msgid "Invalid attribute format: {attribute_pair}" msgstr "属性格式无效:{attribute_pair}!" -#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:125 -#: vibes_auth/viewsets.py:144 +#: vibes_auth/graphene/mutations.py:267 vibes_auth/viewsets.py:126 +#: vibes_auth/viewsets.py:145 msgid "activation link is invalid!" msgstr "激活链接无效!" @@ -160,17 +160,17 @@ msgstr "帐户已激活..." msgid "something went wrong: {e!s}" msgstr "出了问题:{e!s}" -#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:93 +#: vibes_auth/graphene/mutations.py:318 vibes_auth/viewsets.py:94 msgid "token is invalid!" msgstr "令牌无效!" #: vibes_auth/graphene/object_types.py:40 msgid "" -"the products this user has viewed most recently (max 48), in reverse‐" -"chronological order" +"the products this user has viewed most recently (max 48), in " +"reverse‐chronological order" msgstr "该用户最近查看过的产品(最多 48 个),按倒序排列。" -#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:180 +#: vibes_auth/graphene/object_types.py:42 vibes_auth/models.py:132 msgid "groups" msgstr "组别" @@ -178,7 +178,7 @@ msgstr "组别" msgid "wishlist" msgstr "愿望清单" -#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:102 +#: vibes_auth/graphene/object_types.py:47 vibes_auth/models.py:58 msgid "avatar" msgstr "阿凡达" @@ -195,91 +195,104 @@ msgstr "语言是{LANGUAGES}之一,默认为{LANGUAGE_CODE}。" msgid "address set" msgstr "地址" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:30 +msgid "" +"Represents a User entity with customized fields and methods for extended " +"functionality. This class extends the AbstractUser model and integrates " +"additional features like custom email login, validation methods, " +"subscription status, verification, and attributes storage. It also provides " +"utilities for managing recently viewed items and token-based activation for " +"verifying accounts. The User model is designed to handle specific use cases " +"for enhanced user management." +msgstr "" +"代表具有自定义字段和方法以扩展功能的用户实体。该类扩展了 AbstractUser " +"模型,并集成了其他功能,如自定义电子邮件登录、验证方法、订阅状态、验证和属性存储。它还为管理最近查看的项目和基于令牌的激活提供了实用工具,以便验证账户。用户模型旨在处理增强用户管理的特定用例。" + +#: vibes_auth/models.py:41 msgid "email" msgstr "电子邮件" -#: vibes_auth/models.py:85 +#: vibes_auth/models.py:41 msgid "user email address" msgstr "用户电子邮件地址" -#: vibes_auth/models.py:87 +#: vibes_auth/models.py:43 msgid "phone_number" msgstr "电话号码" -#: vibes_auth/models.py:92 +#: vibes_auth/models.py:48 msgid "user phone number" msgstr "用户电话号码" -#: vibes_auth/models.py:98 +#: vibes_auth/models.py:54 msgid "first_name" msgstr "姓名" -#: vibes_auth/models.py:99 +#: vibes_auth/models.py:55 msgid "last_name" msgstr "姓氏" -#: vibes_auth/models.py:105 +#: vibes_auth/models.py:61 msgid "user profile image" msgstr "用户配置文件图像" -#: vibes_auth/models.py:110 +#: vibes_auth/models.py:66 msgid "is verified" msgstr "已核实" -#: vibes_auth/models.py:111 +#: vibes_auth/models.py:67 msgid "user verification status" msgstr "用户验证状态" -#: vibes_auth/models.py:114 +#: vibes_auth/models.py:70 msgid "is_active" msgstr "处于活动状态" -#: vibes_auth/models.py:116 +#: vibes_auth/models.py:72 msgid "unselect this instead of deleting accounts" msgstr "取消选择此选项,而不是删除账户" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "is_subscribed" msgstr "已订阅" -#: vibes_auth/models.py:119 +#: vibes_auth/models.py:75 msgid "user's newsletter subscription status" msgstr "用户的通讯订阅状态" -#: vibes_auth/models.py:122 +#: vibes_auth/models.py:78 msgid "activation token" msgstr "激活令牌" -#: vibes_auth/models.py:124 +#: vibes_auth/models.py:80 msgid "attributes" msgstr "属性" -#: vibes_auth/models.py:158 +#: vibes_auth/models.py:110 msgid "user" msgstr "用户" -#: vibes_auth/models.py:159 +#: vibes_auth/models.py:111 msgid "users" msgstr "用户" -#: vibes_auth/models.py:179 +#: vibes_auth/models.py:131 msgid "group" msgstr "组别" -#: vibes_auth/models.py:196 +#: vibes_auth/models.py:148 msgid "outstanding token" msgstr "出色的代币" -#: vibes_auth/models.py:197 +#: vibes_auth/models.py:149 msgid "outstanding tokens" msgstr "未兑代币" -#: vibes_auth/models.py:215 +#: vibes_auth/models.py:167 msgid "blacklisted token" msgstr "黑名单令牌" -#: vibes_auth/models.py:216 +#: vibes_auth/models.py:168 msgid "blacklisted tokens" msgstr "黑名单令牌" @@ -342,8 +355,7 @@ msgstr "你好%(user_first_name)s," #: vibes_auth/templates/user_reset_password_email.html:92 msgid "" -"we have received a request to reset your password. please reset your " -"password\n" +"we have received a request to reset your password. please reset your password\n" " by clicking the button below:" msgstr "我们收到了重置密码的请求。请点击下面的按钮重置密码:" @@ -403,12 +415,12 @@ msgstr "" msgid "best regards,
the %(project_name)s team" msgstr "致以最崇高的敬意,
%(project_name)s_团队" -#: vibes_auth/utils/emailing.py:27 +#: vibes_auth/utils/emailing.py:23 #, python-brace-format msgid "{config.PROJECT_NAME} | Activate Account" msgstr "{config.PROJECT_NAME}| 激活帐户" -#: vibes_auth/utils/emailing.py:69 +#: vibes_auth/utils/emailing.py:63 #, python-brace-format msgid "{config.PROJECT_NAME} | Reset Password" msgstr "{config.PROJECT_NAME}| 重置密码" @@ -417,32 +429,28 @@ msgstr "{config.PROJECT_NAME}| 重置密码" msgid "" "invalid phone number format. the number must be entered in the format: " "\"+999999999\". up to 15 digits allowed." -msgstr "" -"电话号码格式无效。电话号码必须按格式输入:\"+999999999\".最多允许 15 位数字。" +msgstr "电话号码格式无效。电话号码必须按格式输入:\"+999999999\".最多允许 15 位数字。" #: vibes_auth/views.py:29 msgid "" -"Represents a view for getting a pair of access and refresh tokens and user's " -"data. This view manages the process of handling token-based authentication " +"Represents a view for getting a pair of access and refresh tokens and user's" +" data. This view manages the process of handling token-based authentication " "where clients can get a pair of JWT tokens (access and refresh) using " "provided credentials. It is built on top of a base token view and ensures " "proper rate limiting to protect against brute force attacks." msgstr "" -"代表用于获取一对访问和刷新令牌以及用户数据的视图。该视图管理处理基于令牌的身" -"份验证的流程,客户端可使用提供的凭据获取一对 JWT 令牌(访问和刷新)。它建立在" -"基本令牌视图之上,并确保适当的速率限制,以防止暴力攻击。" +"代表用于获取一对访问和刷新令牌以及用户数据的视图。该视图管理处理基于令牌的身份验证的流程,客户端可使用提供的凭据获取一对 JWT " +"令牌(访问和刷新)。它建立在基本令牌视图之上,并确保适当的速率限制,以防止暴力攻击。" #: vibes_auth/views.py:47 msgid "" -"Handles refreshing of tokens for authentication purposes. This class is used " -"to provide functionality for token refresh operations as part of an " -"authentication system. It ensures that clients can request a refreshed token " -"within defined rate limits. The view relies on the associated serializer to " -"validate token refresh inputs and produce appropriate outputs." +"Handles refreshing of tokens for authentication purposes. This class is used" +" to provide functionality for token refresh operations as part of an " +"authentication system. It ensures that clients can request a refreshed token" +" within defined rate limits. The view relies on the associated serializer to" +" validate token refresh inputs and produce appropriate outputs." msgstr "" -"处理刷新令牌以进行身份验证。该类用于为作为身份验证系统一部分的令牌刷新操作提" -"供功能。它能确保客户端在规定的速率限制内请求刷新令牌。视图依赖于相关的序列化" -"器来验证令牌刷新输入并产生适当的输出。" +"处理刷新令牌以进行身份验证。该类用于为作为身份验证系统一部分的令牌刷新操作提供功能。它能确保客户端在规定的速率限制内请求刷新令牌。视图依赖于相关的序列化器来验证令牌刷新输入并产生适当的输出。" #: vibes_auth/views.py:66 msgid "" @@ -454,23 +462,18 @@ msgstr "代表使用特定序列化和验证逻辑验证 JSON Web 标记 (JWT) msgid "the token is invalid" msgstr "令牌无效" -#: vibes_auth/viewsets.py:43 +#: vibes_auth/viewsets.py:44 msgid "" "User view set implementation.\n" -"Provides a set of actions that manage user-related data such as creation, " -"retrieval, updates, deletion, and custom actions including password reset, " -"avatar upload, account activation, and recently viewed items merging. This " -"class extends the mixins and GenericViewSet for robust API handling." +"Provides a set of actions that manage user-related data such as creation, retrieval, updates, deletion, and custom actions including password reset, avatar upload, account activation, and recently viewed items merging. This class extends the mixins and GenericViewSet for robust API handling." msgstr "" "用户视图集实施。\n" -"该类提供了一组操作,用于管理用户相关数据,如创建、检索、更新、删除以及自定义" -"操作,包括密码重置、上传头像、激活账户和合并最近查看的项目。该类对 mixins 和 " -"GenericViewSet 进行了扩展,以实现强大的 API 处理功能。" +"该类提供了一组操作,用于管理用户相关数据,如创建、检索、更新、删除以及自定义操作,包括密码重置、上传头像、激活账户和合并最近查看的项目。该类对 mixins 和 GenericViewSet 进行了扩展,以实现强大的 API 处理功能。" -#: vibes_auth/viewsets.py:97 +#: vibes_auth/viewsets.py:98 msgid "password reset successfully" msgstr "密码已重置成功!" -#: vibes_auth/viewsets.py:130 +#: vibes_auth/viewsets.py:131 msgid "account already activated!" msgstr "您已经激活了账户..." diff --git a/vibes_auth/models.py b/vibes_auth/models.py index 2133a8ab..2eb00d04 100644 --- a/vibes_auth/models.py +++ b/vibes_auth/models.py @@ -9,7 +9,6 @@ from django.db.models import ( EmailField, ImageField, JSONField, - QuerySet, UUIDField, ) from django.utils.translation import gettext_lazy as _ @@ -21,63 +20,20 @@ from rest_framework_simplejwt.token_blacklist.models import ( ) from core.abstract import NiceModel -from core.models import Order, Wishlist from evibes.settings import LANGUAGE_CODE, LANGUAGES -from payments.models import Balance from vibes_auth.managers import UserManager from vibes_auth.validators import validate_phone_number class User(AbstractUser, NiceModel): # type: ignore [django-manager-missing] - """ - Represents a User entity with customized fields and methods for extended functionality. - - This class extends the AbstractUser model and integrates additional features like - custom email login, validation methods, subscription status, verification, and - attributes storage. It also provides utilities for managing recently viewed items and - token-based activation for verifying accounts. The User model is designed to handle - specific use cases for enhanced user management. - - Attributes: - email: EmailField to store the user's email address. - phone_number: CharField for the user's phone number, allowing for optional storage and validation. - username: Has been set to None as email is the primary unique identifier. - first_name: Optional CharField for the user's first name. - last_name: Optional CharField for the user's last name. - avatar: ImageField for storing the path to the user's profile picture. - is_verified: BooleanField indicating whether the user's email has been verified. - is_active: BooleanField to toggle user activity without deleting the account. - is_subscribed: BooleanField indicating the user's newsletter subscription status. - activation_token: UUIDField for assigning a unique activation token to the user. - language: CharField storing the user's preferred language setting. - attributes: JSONField for custom storage of user-specific additional attributes. - USERNAME_FIELD: Specifies the unique identifier for the user (email in this case). - REQUIRED_FIELDS: A list of fields required when creating a user via createsuperuser, left empty here. - objects: Custom manager for the User model providing additional methods for user creation. - payments_balance: Reference to the user's payment balance (related to the external model). - user_related_wishlist: Reference to the user's wishlist (related to the external model). - orders: QuerySet representing the user's associated orders. - - Methods: - add_to_recently_viewed(product_uuid): - Adds a product's UUID to the user's recently viewed items cache. Keeps a maximum - of 48 items and maintains their order of viewing. - - recently_viewed: (read-only property) - Retrieves a list of UUIDs representing the products recently viewed by the user - from the cache. - - check_token(token): - Validates the input token against the user's activation token. - - __str__(): - Returns the string representation of the user, which is the email address. - - Meta: - swappable: Configures the model to be replaceable with another user model. - verbose_name: Sets the human-readable name for singular instances of the model. - verbose_name_plural: Sets the human-readable name for multiple instances of the model. - """ + __doc__ = _( + "Represents a User entity with customized fields and methods for extended functionality. " # type: ignore + "This class extends the AbstractUser model and integrates additional features like " + "custom email login, validation methods, subscription status, verification, and " + "attributes storage. It also provides utilities for managing recently viewed items and " + "token-based activation for verifying accounts. The User model is designed to handle " + "specific use cases for enhanced user management." + ) def get_uuid_as_path(self, *args): return "users/" + str(self.uuid) + "/" + args[0] @@ -128,10 +84,6 @@ class User(AbstractUser, NiceModel): # type: ignore [django-manager-missing] # noinspection PyClassVar objects = UserManager() # type: ignore [misc, assignment] - payments_balance: "Balance" - user_related_wishlist: "Wishlist" - orders: QuerySet["Order"] - def add_to_recently_viewed(self, product_uuid): recently_viewed = self.recently_viewed if product_uuid not in recently_viewed: diff --git a/vibes_auth/tests.py b/vibes_auth/tests.py index c43a3687..e69de29b 100644 --- a/vibes_auth/tests.py +++ b/vibes_auth/tests.py @@ -1,116 +0,0 @@ -from django.contrib.auth.tokens import PasswordResetTokenGenerator -from django.test import TestCase -from django.urls import reverse -from django.utils.http import urlsafe_base64_encode -from graphene.test import Client -from rest_framework.test import APIClient - -from core.graphene.schema import schema -from vibes_auth.models import User - - -class AuthTests(TestCase): - def setUp(self): - self.client = Client(schema) - self.api_client = APIClient() - self.user = User.objects.create_user( - email="testuser@example.com", - password="testpassword", - first_name="Test", - last_name="User", - ) - self.admin = User.objects.create_superuser( - email="admin@example.com", - password="adminpassword", - first_name="Admin", - last_name="User", - ) - - def test_create_user(self): - query = """ - mutation { - createUser(email: "newuser@example.com", password: "newpassword", confirmPassword: "newpassword") { - user { - email - firstName - lastName - } - } - } - """ - result = self.client.post(query) - self.assertIsNone(result.get("errors")) - data = result["data"] - self.assertEqual(data, "newuser@example.com") - self.assertEqual(User.objects.count(), 3) # Initial two + new user - - def test_obtain_token_view(self): - url = reverse("token_obtain_pair") - response = self.api_client.post(url, {"email": self.user.email, "password": "testpassword"}) - self.assertEqual(response.status_code, 200) - self.assertIn("access", response.data) - self.assertIn("refresh", response.data) - - def test_refresh_token_view(self): - obtain_url = reverse("token_obtain_pair") - refresh_url = reverse("token_refresh") - - # Obtain tokens - obtain_response = self.api_client.post(obtain_url, {"email": self.user.email, "password": "testpassword"}) - refresh_token = obtain_response.data["refresh"] - - # Refresh tokens - response = self.api_client.post(refresh_url, {"refresh": refresh_token}) - self.assertEqual(response.status_code, 200) - self.assertIn("access", response.data) - - def test_verify_token_view(self): - obtain_url = reverse("token_obtain_pair") - verify_url = reverse("token_verify") - - # Obtain tokens - obtain_response = self.api_client.post(obtain_url, {"email": self.user.email, "password": "testpassword"}) - access_token = obtain_response.data["access"] - - # Verify token - response = self.api_client.post(verify_url, {"token": access_token}) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.data["token"], "The token is valid") - - def test_reset_password(self): - url = reverse("user-reset-password") - response = self.api_client.post(url, {"email": self.user.email}) - self.assertEqual(response.status_code, 200) - - def test_confirm_password_reset(self): - url = reverse("user-confirm-password-reset") - uid = urlsafe_base64_encode(str(self.user.pk).encode()) - token = PasswordResetTokenGenerator().make_token(self.user) - - response = self.api_client.post( - url, - { - "uidb64": uid, - "token": token, - "password": "newpassword", - "confirm_password": "newpassword", - }, - ) - self.assertEqual(response.status_code, 200) - - def test_upload_avatar(self): - url = reverse("user-upload-avatar", kwargs={"pk": self.user.pk}) - self.api_client.force_authenticate(user=self.user) - - with open("path/to/avatar.png", "rb") as avatar: - response = self.api_client.put(url, {"avatar": avatar}) - self.assertEqual(response.status_code, 200) - - def test_activate_user(self): - url = reverse("user-activate") - uid = urlsafe_base64_encode(str(self.user.pk).encode()) - token = PasswordResetTokenGenerator().make_token(self.user) - - response = self.api_client.post(url, {"uidb64": uid, "token": token}) - self.assertEqual(response.status_code, 200) - self.assertTrue(User.objects.get(pk=self.user.pk).is_active) diff --git a/vibes_auth/utils/emailing.py b/vibes_auth/utils/emailing.py index de97955f..611fa705 100644 --- a/vibes_auth/utils/emailing.py +++ b/vibes_auth/utils/emailing.py @@ -1,7 +1,6 @@ from celery.app import shared_task from constance import config from django.contrib.auth.tokens import PasswordResetTokenGenerator -from django.core import mail from django.core.mail import EmailMessage from django.template.loader import render_to_string from django.utils.encoding import force_bytes @@ -9,7 +8,7 @@ from django.utils.http import urlsafe_base64_encode from django.utils.translation import activate from django.utils.translation import gettext_lazy as _ -from core.utils.constance import set_email_settings +from core.utils import get_dynamic_email_connection from vibes_auth.models import User @@ -21,9 +20,6 @@ def send_verification_email_task(user_pk: str) -> tuple[bool, str]: activate(user.language) - set_email_settings() - connection = mail.get_connection() - email_subject = _(f"{config.PROJECT_NAME} | Activate Account") email_body = render_to_string( "user_verification_email.html", @@ -40,7 +36,7 @@ def send_verification_email_task(user_pk: str) -> tuple[bool, str]: body=email_body, from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", to=[user.email], - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" email.send() @@ -63,9 +59,6 @@ def send_reset_password_email_task(user_pk: str) -> tuple[bool, str]: activate(user.language) - set_email_settings() - connection = mail.get_connection() - email_subject = _(f"{config.PROJECT_NAME} | Reset Password") email_body = render_to_string( "user_reset_password_email.html", @@ -83,7 +76,7 @@ def send_reset_password_email_task(user_pk: str) -> tuple[bool, str]: body=email_body, from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>", to=[user.email], - connection=connection, + connection=get_dynamic_email_connection(), ) email.content_subtype = "html" email.send() diff --git a/vibes_auth/validators.py b/vibes_auth/validators.py index c171bb11..300cf8ca 100644 --- a/vibes_auth/validators.py +++ b/vibes_auth/validators.py @@ -5,7 +5,7 @@ from django.core.validators import EmailValidator from django.utils.translation import gettext_lazy as _ -def validate_phone_number(value: str): +def validate_phone_number(value: str) -> None: phone_regex = re.compile(r"^\+?1?\d{9,15}$") # The regex pattern to match valid phone numbers if not phone_regex.match(value): raise ValidationError( @@ -16,7 +16,7 @@ def validate_phone_number(value: str): ) -def is_valid_email(value: str): +def is_valid_email(value: str) -> bool: validator = EmailValidator() try: validator(value) @@ -25,7 +25,7 @@ def is_valid_email(value: str): return False -def is_valid_phone_number(value: str): +def is_valid_phone_number(value: str) -> bool: try: validate_phone_number(value) return True diff --git a/vibes_auth/views.py b/vibes_auth/views.py index 52826bb3..7cd1609c 100644 --- a/vibes_auth/views.py +++ b/vibes_auth/views.py @@ -1,4 +1,5 @@ import logging +from typing import Any from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ @@ -25,7 +26,7 @@ logger = logging.getLogger("django") @extend_schema_view(**TOKEN_OBTAIN_SCHEMA) class TokenObtainPairView(TokenViewBase): - __doc__ = _( + __doc__ = _( # type: ignore [assignment] "Represents a view for getting a pair of access and refresh tokens and user's data. " "This view manages the process of handling token-based authentication where " "clients can get a pair of JWT tokens (access and refresh) using provided " @@ -37,13 +38,13 @@ class TokenObtainPairView(TokenViewBase): _serializer_class = TokenObtainPairSerializer # type: ignore [assignment] @method_decorator(ratelimit(key="ip", rate="10/h" if not DEBUG else "888/h")) - def post(self, request: Request, *args, **kwargs) -> Response: + def post(self, request: Request, *args: list[Any], **kwargs: dict[Any, Any]) -> Response: return super().post(request, *args, **kwargs) @extend_schema_view(**TOKEN_REFRESH_SCHEMA) class TokenRefreshView(TokenViewBase): - __doc__ = _( + __doc__ = _( # type: ignore [assignment] "Handles refreshing of tokens for authentication purposes. " "This class is used to provide functionality for token refresh " "operations as part of an authentication system. It ensures that " @@ -56,20 +57,20 @@ class TokenRefreshView(TokenViewBase): _serializer_class = TokenRefreshSerializer # type: ignore [assignment] @method_decorator(ratelimit(key="ip", rate="10/h" if not DEBUG else "888/h")) - def post(self, request: Request, *args, **kwargs) -> Response: + def post(self, request: Request, *args: list[Any], **kwargs: dict[Any, Any]) -> Response: return super().post(request, *args, **kwargs) @extend_schema_view(**TOKEN_VERIFY_SCHEMA) class TokenVerifyView(TokenViewBase): - __doc__ = _( + __doc__ = _( # type: ignore [assignment] "Represents a view for verifying JSON Web Tokens (JWT) using specific serialization and validation logic. " ) serializer_class = TokenVerifySerializer # type: ignore [assignment] _serializer_class = TokenVerifySerializer # type: ignore [assignment] - def post(self, request: Request, *args, **kwargs) -> Response: + def post(self, request: Request, *args: list[Any], **kwargs: dict[Any, Any]) -> Response: try: serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) diff --git a/vibes_auth/viewsets.py b/vibes_auth/viewsets.py index be1881f7..cd5ffb1c 100644 --- a/vibes_auth/viewsets.py +++ b/vibes_auth/viewsets.py @@ -2,6 +2,7 @@ import logging import traceback from contextlib import suppress from secrets import compare_digest +from typing import Type from django.contrib.auth.password_validation import validate_password from django.contrib.auth.tokens import PasswordResetTokenGenerator @@ -31,6 +32,7 @@ from vibes_auth.utils.emailing import send_reset_password_email_task logger = logging.getLogger("django") +# noinspection PyUnusedLocal @extend_schema_view(**USER_SCHEMA) class UserViewSet( mixins.CreateModelMixin, @@ -39,7 +41,7 @@ class UserViewSet( mixins.DestroyModelMixin, GenericViewSet, ): - __doc__ = _( + __doc__ = _( # type: ignore [assignment] "User view set implementation.\n" "Provides a set of actions that manage user-related data such as creation, " "retrieval, updates, deletion, and custom actions including password reset, " @@ -58,7 +60,7 @@ class UserViewSet( with suppress(User.DoesNotExist): user = User.objects.get(email=request.data.get("email")) if user: - send_reset_password_email_task.delay(user_pk=user.uuid) + send_reset_password_email_task.delay(user_pk=user.uuid) # type: ignore [attr-defined] return Response(status=status.HTTP_200_OK) @action(detail=True, methods=["put"], permission_classes=[IsAuthenticated]) @@ -77,16 +79,16 @@ class UserViewSet( @method_decorator(ratelimit(key="ip", rate="2/h" if not DEBUG else "888/h")) def confirm_password_reset(self, request: Request, *args, **kwargs) -> Response: try: - if not compare_digest(request.data.get("password"), request.data.get("confirm_password")): + if not compare_digest(request.data.get("password"), request.data.get("confirm_password")): # type: ignore [arg-type] return Response( {"error": _("passwords do not match")}, status=status.HTTP_400_BAD_REQUEST, ) - uuid = urlsafe_base64_decode(request.data.get("uidb_64")).decode() + uuid = urlsafe_base64_decode(request.data.get("uidb_64")).decode() # type: ignore [arg-type] user = User.objects.get(pk=uuid) - validate_password(password=request.data.get("password"), user=user) + validate_password(password=request.data.get("password"), user=user) # type: ignore [arg-type] password_reset_token = PasswordResetTokenGenerator() if not password_reset_token.check_token(user, request.data.get("token")): @@ -116,11 +118,11 @@ class UserViewSet( @method_decorator(ratelimit(key="ip", rate="2/h" if not DEBUG else "888/h")) def activate(self, request: Request) -> Response: detail = "" - activation_error = None + activation_error: Type[Exception] | None = None try: - uuid = urlsafe_base64_decode(request.data.get("uidb_64")).decode() - user = User.objects.nocache().get(pk=uuid) - if not user.check_token(urlsafe_base64_decode(request.data.get("token")).decode()): + uuid = urlsafe_base64_decode(request.data.get("uidb_64")).decode() # type: ignore [arg-type] + user = User.objects.get(pk=uuid) + if not user.check_token(urlsafe_base64_decode(request.data.get("token")).decode()): # type: ignore [arg-type] return Response( {"error": _("activation link is invalid!")}, status=status.HTTP_400_BAD_REQUEST, @@ -139,7 +141,7 @@ class UserViewSet( detail = str(traceback.format_exc()) if user is None: if DEBUG: - raise Exception from activation_error + raise Exception from activation_error # type: ignore [misc] return Response( {"error": _("activation link is invalid!"), "detail": detail}, status=status.HTTP_400_BAD_REQUEST,