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 0d514146..aa360179 100644 Binary files a/core/locale/ar_AR/LC_MESSAGES/django.mo and b/core/locale/ar_AR/LC_MESSAGES/django.mo differ 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 d4e477b0..3502a453 100644 Binary files a/core/locale/cs_CZ/LC_MESSAGES/django.mo and b/core/locale/cs_CZ/LC_MESSAGES/django.mo differ diff --git a/core/locale/cs_CZ/LC_MESSAGES/django.po b/core/locale/cs_CZ/LC_MESSAGES/django.po index e46bea30..21e8b2bd 100644 --- a/core/locale/cs_CZ/LC_MESSAGES/django.po +++ b/core/locale/cs_CZ/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 "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 5a4ffb42..9e5ed830 100644 Binary files a/core/locale/da_DK/LC_MESSAGES/django.mo and b/core/locale/da_DK/LC_MESSAGES/django.mo differ 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 c0de90f1..6e3ac554 100644 Binary files a/core/locale/de_DE/LC_MESSAGES/django.mo and b/core/locale/de_DE/LC_MESSAGES/django.mo differ diff --git a/core/locale/de_DE/LC_MESSAGES/django.po b/core/locale/de_DE/LC_MESSAGES/django.po index a77323fd..66817bd7 100644 --- a/core/locale/de_DE/LC_MESSAGES/django.po +++ b/core/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-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \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 debdfe8f..f2df83a7 100644 Binary files a/core/locale/en_GB/LC_MESSAGES/django.mo and b/core/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/core/locale/en_GB/LC_MESSAGES/django.po b/core/locale/en_GB/LC_MESSAGES/django.po index 70416d60..82c2bb53 100644 --- a/core/locale/en_GB/LC_MESSAGES/django.po +++ b/core/locale/en_GB/LC_MESSAGES/django.po @@ -7,7 +7,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" @@ -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 2c698a48..92c7108f 100644 Binary files a/core/locale/en_US/LC_MESSAGES/django.mo and b/core/locale/en_US/LC_MESSAGES/django.mo differ diff --git a/core/locale/en_US/LC_MESSAGES/django.po b/core/locale/en_US/LC_MESSAGES/django.po index 17a9810e..74bfb5c3 100644 --- a/core/locale/en_US/LC_MESSAGES/django.po +++ b/core/locale/en_US/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 "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 845933c4..76f76c8a 100644 Binary files a/core/locale/es_ES/LC_MESSAGES/django.mo and b/core/locale/es_ES/LC_MESSAGES/django.mo differ diff --git a/core/locale/es_ES/LC_MESSAGES/django.po b/core/locale/es_ES/LC_MESSAGES/django.po index 629b1e56..212a1ad9 100644 --- a/core/locale/es_ES/LC_MESSAGES/django.po +++ b/core/locale/es_ES/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 "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 ec52ac0e..fdba5980 100644 Binary files a/core/locale/fr_FR/LC_MESSAGES/django.mo and b/core/locale/fr_FR/LC_MESSAGES/django.mo differ 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 d491655e..9987a4a4 100644 Binary files a/core/locale/he_IL/LC_MESSAGES/django.mo and b/core/locale/he_IL/LC_MESSAGES/django.mo differ diff --git a/core/locale/he_IL/LC_MESSAGES/django.po b/core/locale/he_IL/LC_MESSAGES/django.po index 310d5230..c63acef1 100644 --- a/core/locale/he_IL/LC_MESSAGES/django.po +++ b/core/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-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 "תצורה" @@ -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 6f55377b..1c324bd2 100644 Binary files a/core/locale/id_ID/LC_MESSAGES/django.mo and b/core/locale/id_ID/LC_MESSAGES/django.mo differ diff --git a/core/locale/id_ID/LC_MESSAGES/django.po b/core/locale/id_ID/LC_MESSAGES/django.po index cbad8b2b..87d53546 100644 --- a/core/locale/id_ID/LC_MESSAGES/django.po +++ b/core/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-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \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 0a4a7104..2d1397b1 100644 Binary files a/core/locale/it_IT/LC_MESSAGES/django.mo and b/core/locale/it_IT/LC_MESSAGES/django.mo differ 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 dd5bd095..43b350d6 100644 Binary files a/core/locale/ja_JP/LC_MESSAGES/django.mo and b/core/locale/ja_JP/LC_MESSAGES/django.mo differ 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 6164697a..6f33fb39 100644 Binary files a/core/locale/ko_KR/LC_MESSAGES/django.mo and b/core/locale/ko_KR/LC_MESSAGES/django.mo differ 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 08a4160f..7e9107b9 100644 Binary files a/core/locale/nl_NL/LC_MESSAGES/django.mo and b/core/locale/nl_NL/LC_MESSAGES/django.mo differ 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 91d207d0..ec8af072 100644 Binary files a/core/locale/no_NO/LC_MESSAGES/django.mo and b/core/locale/no_NO/LC_MESSAGES/django.mo differ 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 3eb776cf..987739e0 100644 Binary files a/core/locale/pl_PL/LC_MESSAGES/django.mo and b/core/locale/pl_PL/LC_MESSAGES/django.mo differ 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 32c47431..6227f93c 100644 Binary files a/core/locale/pt_BR/LC_MESSAGES/django.mo and b/core/locale/pt_BR/LC_MESSAGES/django.mo differ 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 b448d423..33316bb6 100644 Binary files a/core/locale/ro_RO/LC_MESSAGES/django.mo and b/core/locale/ro_RO/LC_MESSAGES/django.mo differ diff --git a/core/locale/ro_RO/LC_MESSAGES/django.po b/core/locale/ro_RO/LC_MESSAGES/django.po index 623ba1ff..1c9f4da7 100644 --- a/core/locale/ro_RO/LC_MESSAGES/django.po +++ b/core/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-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \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 49f14783..37d97b91 100644 Binary files a/core/locale/ru_RU/LC_MESSAGES/django.mo and b/core/locale/ru_RU/LC_MESSAGES/django.mo differ 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 9d381370..4fe54ffd 100644 Binary files a/core/locale/sv_SE/LC_MESSAGES/django.mo and b/core/locale/sv_SE/LC_MESSAGES/django.mo differ diff --git a/core/locale/sv_SE/LC_MESSAGES/django.po b/core/locale/sv_SE/LC_MESSAGES/django.po index a5752096..099ac2b4 100644 --- a/core/locale/sv_SE/LC_MESSAGES/django.po +++ b/core/locale/sv_SE/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 "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 dafa0df8..b32192f8 100644 Binary files a/core/locale/th_TH/LC_MESSAGES/django.mo and b/core/locale/th_TH/LC_MESSAGES/django.mo differ diff --git a/core/locale/th_TH/LC_MESSAGES/django.po b/core/locale/th_TH/LC_MESSAGES/django.po index 1b980200..7067d43b 100644 --- a/core/locale/th_TH/LC_MESSAGES/django.po +++ b/core/locale/th_TH/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 "แก้ไขแล้ว" 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 d501bbbb..4cff1ece 100644 Binary files a/core/locale/tr_TR/LC_MESSAGES/django.mo and b/core/locale/tr_TR/LC_MESSAGES/django.mo differ 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 2cab3f7c..07aed3fe 100644 Binary files a/core/locale/vi_VN/LC_MESSAGES/django.mo and b/core/locale/vi_VN/LC_MESSAGES/django.mo differ diff --git a/core/locale/vi_VN/LC_MESSAGES/django.po b/core/locale/vi_VN/LC_MESSAGES/django.po index 3196d2c5..6a3b0088 100644 --- a/core/locale/vi_VN/LC_MESSAGES/django.po +++ b/core/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-01-30 03:27+0000\n" "Last-Translator: EGOR GORBUNOV \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 d041a5c3..9dd63ea9 100644 Binary files a/core/locale/zh_Hans/LC_MESSAGES/django.mo and b/core/locale/zh_Hans/LC_MESSAGES/django.mo differ 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 d6790b56..ffaeaeec 100644 Binary files a/evibes/locale/ar_AR/LC_MESSAGES/django.mo and b/evibes/locale/ar_AR/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/ar_AR/LC_MESSAGES/django.po b/evibes/locale/ar_AR/LC_MESSAGES/django.po index c2448c90..aa84c80f 100644 --- a/evibes/locale/ar_AR/LC_MESSAGES/django.po +++ b/evibes/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-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 "عنوان 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 2ca0a26d..90fc4e79 100644 Binary files a/evibes/locale/cs_CZ/LC_MESSAGES/django.mo and b/evibes/locale/cs_CZ/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/cs_CZ/LC_MESSAGES/django.po b/evibes/locale/cs_CZ/LC_MESSAGES/django.po index 5bb49d8a..ab21c4cf 100644 --- a/evibes/locale/cs_CZ/LC_MESSAGES/django.po +++ b/evibes/locale/cs_CZ/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 "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 2ff85521..2d740464 100644 Binary files a/evibes/locale/da_DK/LC_MESSAGES/django.mo and b/evibes/locale/da_DK/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/da_DK/LC_MESSAGES/django.po b/evibes/locale/da_DK/LC_MESSAGES/django.po index 4f1f5f16..94944578 100644 --- a/evibes/locale/da_DK/LC_MESSAGES/django.po +++ b/evibes/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-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 "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 21ad6813..afe01b4b 100644 Binary files a/evibes/locale/de_DE/LC_MESSAGES/django.mo and b/evibes/locale/de_DE/LC_MESSAGES/django.mo differ 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 6ec7de00..f3bbb6fa 100644 Binary files a/evibes/locale/en_GB/LC_MESSAGES/django.mo and b/evibes/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/en_GB/LC_MESSAGES/django.po b/evibes/locale/en_GB/LC_MESSAGES/django.po index d9277f09..7ec96eea 100644 --- a/evibes/locale/en_GB/LC_MESSAGES/django.po +++ b/evibes/locale/en_GB/LC_MESSAGES/django.po @@ -7,7 +7,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" @@ -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 0fce29ce..5a503738 100644 Binary files a/evibes/locale/en_US/LC_MESSAGES/django.mo and b/evibes/locale/en_US/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/en_US/LC_MESSAGES/django.po b/evibes/locale/en_US/LC_MESSAGES/django.po index 8036da1f..17ce3137 100644 --- a/evibes/locale/en_US/LC_MESSAGES/django.po +++ b/evibes/locale/en_US/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 "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 80ceb8ef..57d145b6 100644 Binary files a/evibes/locale/es_ES/LC_MESSAGES/django.mo and b/evibes/locale/es_ES/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/es_ES/LC_MESSAGES/django.po b/evibes/locale/es_ES/LC_MESSAGES/django.po index b7e4b83b..bac536da 100644 --- a/evibes/locale/es_ES/LC_MESSAGES/django.po +++ b/evibes/locale/es_ES/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 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 ba9710ee..1aca4009 100644 Binary files a/evibes/locale/fr_FR/LC_MESSAGES/django.mo and b/evibes/locale/fr_FR/LC_MESSAGES/django.mo differ 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 0833f9a2..7b018d39 100644 Binary files a/evibes/locale/he_IL/LC_MESSAGES/django.mo and b/evibes/locale/he_IL/LC_MESSAGES/django.mo differ 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 64868dcc..93b5cec1 100644 Binary files a/evibes/locale/id_ID/LC_MESSAGES/django.mo and b/evibes/locale/id_ID/LC_MESSAGES/django.mo differ 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 48890fca..82dc635a 100644 Binary files a/evibes/locale/it_IT/LC_MESSAGES/django.mo and b/evibes/locale/it_IT/LC_MESSAGES/django.mo differ 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 b85b1854..e11945d6 100644 Binary files a/evibes/locale/ja_JP/LC_MESSAGES/django.mo and b/evibes/locale/ja_JP/LC_MESSAGES/django.mo differ 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 317ed6a8..c16cdecf 100644 Binary files a/evibes/locale/ko_KR/LC_MESSAGES/django.mo and b/evibes/locale/ko_KR/LC_MESSAGES/django.mo differ 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 e85dfe8e..8ba012f9 100644 Binary files a/evibes/locale/nl_NL/LC_MESSAGES/django.mo and b/evibes/locale/nl_NL/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/nl_NL/LC_MESSAGES/django.po b/evibes/locale/nl_NL/LC_MESSAGES/django.po index d10eaa7b..ed214bbe 100644 --- a/evibes/locale/nl_NL/LC_MESSAGES/django.po +++ b/evibes/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-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 "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 53d15cdf..33066ed1 100644 Binary files a/evibes/locale/no_NO/LC_MESSAGES/django.mo and b/evibes/locale/no_NO/LC_MESSAGES/django.mo differ 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 b1c0024d..7b096549 100644 Binary files a/evibes/locale/pl_PL/LC_MESSAGES/django.mo and b/evibes/locale/pl_PL/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/pl_PL/LC_MESSAGES/django.po b/evibes/locale/pl_PL/LC_MESSAGES/django.po index 62267d46..6100332b 100644 --- a/evibes/locale/pl_PL/LC_MESSAGES/django.po +++ b/evibes/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-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 "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 f4ae5d27..866b9426 100644 Binary files a/evibes/locale/pt_BR/LC_MESSAGES/django.mo and b/evibes/locale/pt_BR/LC_MESSAGES/django.mo differ 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 e34a8b64..424dbf6f 100644 Binary files a/evibes/locale/ro_RO/LC_MESSAGES/django.mo and b/evibes/locale/ro_RO/LC_MESSAGES/django.mo differ 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 e44e8a20..5bef8948 100644 Binary files a/evibes/locale/ru_RU/LC_MESSAGES/django.mo and b/evibes/locale/ru_RU/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/ru_RU/LC_MESSAGES/django.po b/evibes/locale/ru_RU/LC_MESSAGES/django.po index 0ea49355..7e2308d7 100644 --- a/evibes/locale/ru_RU/LC_MESSAGES/django.po +++ b/evibes/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-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 "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 8394b669..8dd6eaf6 100644 Binary files a/evibes/locale/sv_SE/LC_MESSAGES/django.mo and b/evibes/locale/sv_SE/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/sv_SE/LC_MESSAGES/django.po b/evibes/locale/sv_SE/LC_MESSAGES/django.po index dfdf1a6c..c3320353 100644 --- a/evibes/locale/sv_SE/LC_MESSAGES/django.po +++ b/evibes/locale/sv_SE/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 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 082008ca..9320688c 100644 Binary files a/evibes/locale/th_TH/LC_MESSAGES/django.mo and b/evibes/locale/th_TH/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/th_TH/LC_MESSAGES/django.po b/evibes/locale/th_TH/LC_MESSAGES/django.po index 686c2aff..04550de8 100644 --- a/evibes/locale/th_TH/LC_MESSAGES/django.po +++ b/evibes/locale/th_TH/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 "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 22a57327..ec0f7d03 100644 Binary files a/evibes/locale/tr_TR/LC_MESSAGES/django.mo and b/evibes/locale/tr_TR/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/tr_TR/LC_MESSAGES/django.po b/evibes/locale/tr_TR/LC_MESSAGES/django.po index 8b39831d..2ee92d69 100644 --- a/evibes/locale/tr_TR/LC_MESSAGES/django.po +++ b/evibes/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-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 "Ş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 11994889..2c49f2a4 100644 Binary files a/evibes/locale/vi_VN/LC_MESSAGES/django.mo and b/evibes/locale/vi_VN/LC_MESSAGES/django.mo differ 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 843117ea..8ba95180 100644 Binary files a/evibes/locale/zh_Hans/LC_MESSAGES/django.mo and b/evibes/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/evibes/locale/zh_Hans/LC_MESSAGES/django.po b/evibes/locale/zh_Hans/LC_MESSAGES/django.po index bd7a6750..13f62136 100644 --- a/evibes/locale/zh_Hans/LC_MESSAGES/django.po +++ b/evibes/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-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 "抽象应用程序接口密钥" -#: 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 13b44d22..8f57ecd2 100644 Binary files a/vibes_auth/locale/ar_AR/LC_MESSAGES/django.mo and b/vibes_auth/locale/ar_AR/LC_MESSAGES/django.mo differ 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 ac461395..ab2f99bb 100644 Binary files a/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.mo and b/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.po b/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.po index 86400846..576ef676 100644 --- a/vibes_auth/locale/cs_CZ/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 094e963c..14122866 100644 Binary files a/vibes_auth/locale/da_DK/LC_MESSAGES/django.mo and b/vibes_auth/locale/da_DK/LC_MESSAGES/django.mo differ 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 51835160..9b78bb81 100644 Binary files a/vibes_auth/locale/de_DE/LC_MESSAGES/django.mo and b/vibes_auth/locale/de_DE/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/de_DE/LC_MESSAGES/django.po b/vibes_auth/locale/de_DE/LC_MESSAGES/django.po index bba5b508..d84f064e 100644 --- a/vibes_auth/locale/de_DE/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 14b6b389..d7e8f52c 100644 Binary files a/vibes_auth/locale/en_GB/LC_MESSAGES/django.mo and b/vibes_auth/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/en_GB/LC_MESSAGES/django.po b/vibes_auth/locale/en_GB/LC_MESSAGES/django.po index 4ca25fc7..96fcc53a 100644 --- a/vibes_auth/locale/en_GB/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 5d301c5f..2d79ab07 100644 Binary files a/vibes_auth/locale/en_US/LC_MESSAGES/django.mo and b/vibes_auth/locale/en_US/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/en_US/LC_MESSAGES/django.po b/vibes_auth/locale/en_US/LC_MESSAGES/django.po index 4e32e82b..ef55d6d2 100644 --- a/vibes_auth/locale/en_US/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 10d01cfc..5b1b40fc 100644 Binary files a/vibes_auth/locale/es_ES/LC_MESSAGES/django.mo and b/vibes_auth/locale/es_ES/LC_MESSAGES/django.mo differ 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 729c3583..0fa4abc7 100644 Binary files a/vibes_auth/locale/fr_FR/LC_MESSAGES/django.mo and b/vibes_auth/locale/fr_FR/LC_MESSAGES/django.mo differ 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 84f1bddd..90d63da2 100644 Binary files a/vibes_auth/locale/he_IL/LC_MESSAGES/django.mo and b/vibes_auth/locale/he_IL/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/he_IL/LC_MESSAGES/django.po b/vibes_auth/locale/he_IL/LC_MESSAGES/django.po index cb4082e7..74864de0 100644 --- a/vibes_auth/locale/he_IL/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 9d9ac1a4..f9f902b7 100644 Binary files a/vibes_auth/locale/id_ID/LC_MESSAGES/django.mo and b/vibes_auth/locale/id_ID/LC_MESSAGES/django.mo differ 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 1bbaf254..cd66bc16 100644 Binary files a/vibes_auth/locale/it_IT/LC_MESSAGES/django.mo and b/vibes_auth/locale/it_IT/LC_MESSAGES/django.mo differ 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 35978612..6ebb33a4 100644 Binary files a/vibes_auth/locale/ja_JP/LC_MESSAGES/django.mo and b/vibes_auth/locale/ja_JP/LC_MESSAGES/django.mo differ 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 9a2f72ea..27369195 100644 Binary files a/vibes_auth/locale/ko_KR/LC_MESSAGES/django.mo and b/vibes_auth/locale/ko_KR/LC_MESSAGES/django.mo differ 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 7ec828df..8ca1dd4c 100644 Binary files a/vibes_auth/locale/nl_NL/LC_MESSAGES/django.mo and b/vibes_auth/locale/nl_NL/LC_MESSAGES/django.mo differ 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 43ec4ea3..9744e19d 100644 Binary files a/vibes_auth/locale/no_NO/LC_MESSAGES/django.mo and b/vibes_auth/locale/no_NO/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/no_NO/LC_MESSAGES/django.po b/vibes_auth/locale/no_NO/LC_MESSAGES/django.po index 12110bd6..98e24211 100644 --- a/vibes_auth/locale/no_NO/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 1f11975b..b8f1690f 100644 Binary files a/vibes_auth/locale/pl_PL/LC_MESSAGES/django.mo and b/vibes_auth/locale/pl_PL/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/pl_PL/LC_MESSAGES/django.po b/vibes_auth/locale/pl_PL/LC_MESSAGES/django.po index 462aedae..b18273c4 100644 --- a/vibes_auth/locale/pl_PL/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 280de48d..aeda5494 100644 Binary files a/vibes_auth/locale/pt_BR/LC_MESSAGES/django.mo and b/vibes_auth/locale/pt_BR/LC_MESSAGES/django.mo differ 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 05b1ea79..af4349ca 100644 Binary files a/vibes_auth/locale/ro_RO/LC_MESSAGES/django.mo and b/vibes_auth/locale/ro_RO/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/ro_RO/LC_MESSAGES/django.po b/vibes_auth/locale/ro_RO/LC_MESSAGES/django.po index 5dab60bc..d17932ce 100644 --- a/vibes_auth/locale/ro_RO/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 4a6e0a62..ca06fe9d 100644 Binary files a/vibes_auth/locale/ru_RU/LC_MESSAGES/django.mo and b/vibes_auth/locale/ru_RU/LC_MESSAGES/django.mo differ 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 ca17463c..eb48ac07 100644 Binary files a/vibes_auth/locale/sv_SE/LC_MESSAGES/django.mo and b/vibes_auth/locale/sv_SE/LC_MESSAGES/django.mo differ 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 ca69505a..dee454c8 100644 Binary files a/vibes_auth/locale/th_TH/LC_MESSAGES/django.mo and b/vibes_auth/locale/th_TH/LC_MESSAGES/django.mo differ 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 8d967b72..8b34ce4f 100644 Binary files a/vibes_auth/locale/tr_TR/LC_MESSAGES/django.mo and b/vibes_auth/locale/tr_TR/LC_MESSAGES/django.mo differ 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 5b1ad7ed..59f32890 100644 Binary files a/vibes_auth/locale/vi_VN/LC_MESSAGES/django.mo and b/vibes_auth/locale/vi_VN/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/vi_VN/LC_MESSAGES/django.po b/vibes_auth/locale/vi_VN/LC_MESSAGES/django.po index 567b179c..a6d660f6 100644 --- a/vibes_auth/locale/vi_VN/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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 04141343..f14e069e 100644 Binary files a/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.mo and b/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.po b/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.po index 8e3a2b03..9785b891 100644 --- a/vibes_auth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/vibes_auth/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" @@ -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,