diff --git a/apps/blog/migrations/0003_alter_blog_slogan_alter_blog_slug_alter_blog_summary_and_more.py b/apps/blog/migrations/0003_alter_blog_slogan_alter_blog_slug_alter_blog_summary_and_more.py new file mode 100644 index 0000000..52a48a9 --- /dev/null +++ b/apps/blog/migrations/0003_alter_blog_slogan_alter_blog_slug_alter_blog_summary_and_more.py @@ -0,0 +1,76 @@ +# Generated by Django 5.2.12 on 2026-05-03 14:09 + +import dj_language.field +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_alter_blog_slogan_alter_blog_title'), + ('dj_language', '0002_auto_20220120_1344'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='slogan', + field=models.JSONField(default=list, verbose_name='Slogan'), + ), + migrations.AlterField( + model_name='blog', + name='slug', + field=models.JSONField(blank=True, default=list, help_text='URL slug for the blog', null=True, verbose_name='Slug'), + ), + migrations.AlterField( + model_name='blog', + name='summary', + field=models.JSONField(blank=True, default=list, null=True, verbose_name='Summary'), + ), + migrations.AlterField( + model_name='blog', + name='title', + field=models.JSONField(default=list, verbose_name='Title'), + ), + migrations.AlterField( + model_name='blogcontent', + name='content', + field=models.JSONField(blank=True, default=list, help_text='The main content text', null=True, verbose_name='Content'), + ), + migrations.AlterField( + model_name='blogcontent', + name='slug', + field=models.JSONField(blank=True, default=list, help_text='URL slug for this content (optional)', null=True, verbose_name='Slug'), + ), + migrations.AlterField( + model_name='blogcontent', + name='title', + field=models.JSONField(blank=True, default=list, help_text='Title of this content section', null=True, verbose_name='Content Title'), + ), + migrations.AlterField( + model_name='blogseo', + name='blog', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seos', to='blog.blog', verbose_name='Blog'), + ), + migrations.AlterField( + model_name='blogseo', + name='description', + field=models.CharField(blank=True, help_text='describes and summarizes the contents of the page for the benefit of users and search engines', max_length=170, null=True, verbose_name='Description'), + ), + migrations.AlterField( + model_name='blogseo', + name='keywords', + field=models.CharField(blank=True, help_text='keywords in the content that make it possible for people to find the site via search engines', max_length=700, null=True, verbose_name='Keywords'), + ), + migrations.AlterField( + model_name='blogseo', + name='language', + field=dj_language.field.LanguageField(default=69, limit_choices_to={'status': True}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='dj_language.language', verbose_name='Language'), + ), + migrations.AlterField( + model_name='blogseo', + name='title', + field=models.CharField(blank=True, help_text='maximum length of page title is 70 characters and minimum length is 30', max_length=140, null=True, verbose_name='SEO Title'), + ), + ] diff --git a/apps/blog/models.py b/apps/blog/models.py index b8bc186..bdb4765 100644 --- a/apps/blog/models.py +++ b/apps/blog/models.py @@ -9,21 +9,25 @@ class Blog(models.Model): """ Blog model with title, thumbnail, slogan, summary, views count and timestamps """ - title = models.JSONField(default=list, null=False, blank=False, verbose_name=_('title')) # [{"title": "", "language_code": "en"},{"title": "", "language_code": "fa"},...] + title = models.JSONField(default=list, null=False, blank=False, verbose_name=_('Title')) # [{"title": "", "language_code": "en"},{"title": "", "language_code": "fa"},...] + thumbnail = models.ImageField( upload_to='blog/thumbnails/%Y/%m/', verbose_name=_('Thumbnail'), help_text=_('Blog thumbnail image') ) - slogan = models.JSONField(default=list, null=False, blank=False, verbose_name=_('slogan')) - summary = models.JSONField(default=list, null=True, blank=True, verbose_name=_('summary')) + slogan = models.JSONField(default=list, null=False, blank=False, verbose_name=_('Slogan')) + + summary = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Summary')) + views_count = models.PositiveIntegerField( default=0, verbose_name=_('Views Count'), help_text=_('Number of times this blog was viewed') ) - slug = models.JSONField(default=list, null=True, blank=True, verbose_name=_('slug'), help_text=_('URL slug for the blog')) + slug = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Slug'), help_text=_('URL slug for the blog')) + created_at = models.DateTimeField( auto_now_add=True, @@ -129,9 +133,10 @@ class BlogContent(models.Model): related_name='contents', verbose_name=_('Blog') ) - title = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Content title'), help_text=_('Title of this content section')) - content = models.JSONField(default=list, null=True, blank=True, verbose_name=_('content'), help_text=_('The main content text')) - slug = models.JSONField(default=list, null=True, blank=True, verbose_name=_('slug'), help_text=_('URL slug for this content (optional)')) + title = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Content Title'), help_text=_('Title of this content section')) + content = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Content'), help_text=_('The main content text')) + slug = models.JSONField(default=list, null=True, blank=True, verbose_name=_('Slug'), help_text=_('URL slug for this content (optional)')) + image = models.ImageField( upload_to='blog/content_images/%Y/%m/', null=True, @@ -176,20 +181,23 @@ class BlogContent(models.Model): class BlogSeo(models.Model): - blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name='seos', verbose_name=_('blog')) + blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name='seos', verbose_name=_('Blog')) title = models.CharField( - _('seo title'), max_length=140, null=True, blank=True, + _('SEO Title'), max_length=140, null=True, blank=True, help_text=_('maximum length of page title is 70 characters and minimum length is 30'), ) keywords = models.CharField( + _('Keywords'), max_length=700, null=True, blank=True, help_text=_('keywords in the content that make it possible for people to find the site via search engines') ) description = models.CharField( + _('Description'), max_length=170, null=True, blank=True, help_text=_('describes and summarizes the contents of the page for the benefit of users and search engines'), ) - language = LanguageField(null=True) + language = LanguageField(null=True, verbose_name=_('Language')) + class Meta: verbose_name = _('Blog SEO') diff --git a/apps/chat/migrations/0003_alter_chatmessage_options_and_more.py b/apps/chat/migrations/0003_alter_chatmessage_options_and_more.py new file mode 100644 index 0000000..7b6bc0e --- /dev/null +++ b/apps/chat/migrations/0003_alter_chatmessage_options_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 5.2.12 on 2026-05-03 14:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('chat', '0002_roommessage_is_locked'), + ] + + operations = [ + migrations.AlterModelOptions( + name='chatmessage', + options={'verbose_name': 'Chat Message', 'verbose_name_plural': 'Chat Messages'}, + ), + migrations.AlterModelOptions( + name='messagereadstatus', + options={'verbose_name': 'Message Read Status', 'verbose_name_plural': 'Message Read Statuses'}, + ), + migrations.AlterModelOptions( + name='roommessage', + options={'verbose_name': 'Room Message', 'verbose_name_plural': 'Room Messages'}, + ), + migrations.AlterField( + model_name='chatmessage', + name='message_metadata', + field=models.JSONField(blank=True, null=True, verbose_name='Message Metadata'), + ), + migrations.AlterField( + model_name='roommessage', + name='unread_messages_count', + field=models.IntegerField(default=0, verbose_name='Unread Messages Count'), + ), + ] diff --git a/apps/chat/models.py b/apps/chat/models.py index ea5dbc6..aeeef61 100644 --- a/apps/chat/models.py +++ b/apps/chat/models.py @@ -1,8 +1,8 @@ - from django.db import models from django.utils import timezone +from django.utils.translation import gettext_lazy as _ -from apps.account.models import User, User +from apps.account.models import User from apps.course.models import Course @@ -15,90 +15,92 @@ def chat_upload_path(instance, filename): return f'chat/room_{instance.room_id}/{date.year}/{date.month:02d}/{date.day:02d}/{filename}' - class RoomMessage(models.Model): class RoomTypeChoices(models.TextChoices): - GROUP = 'group', 'Group' - PRIVATE = 'private', 'Private' + GROUP = 'group', _('Group') + PRIVATE = 'private', _('Private') name = models.CharField( max_length=255, - verbose_name="Room Name" + verbose_name=_("Room Name") ) description = models.TextField( - verbose_name="Description", + verbose_name=_("Description"), blank=True, null=True ) - course = models.ForeignKey(Course,on_delete=models.CASCADE, null=True, blank=True ,related_name="room_messages", verbose_name="Course") + course = models.ForeignKey(Course, on_delete=models.CASCADE, null=True, blank=True, related_name="room_messages", verbose_name=_("Course")) initiator = models.ForeignKey( User, on_delete=models.CASCADE, related_name="initiated_rooms", - verbose_name="Initiator" + verbose_name=_("Initiator") ) recipient = models.ForeignKey( User, on_delete=models.CASCADE, related_name="messages_received", - verbose_name="Recipient", + verbose_name=_("Recipient"), null=True, blank=True ) - created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created At") + created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created At")) updated_at = models.DateTimeField( auto_now=True, - verbose_name="Updated At" + verbose_name=_("Updated At") ) is_locked = models.BooleanField( default=False, - verbose_name="Is Locked", - help_text="If True, only the professor and admins can send new messages." + verbose_name=_("Is Locked"), + help_text=_("If True, only the professor and admins can send new messages.") ) room_type = models.CharField( max_length=10, choices=RoomTypeChoices.choices, default=RoomTypeChoices.GROUP, - verbose_name="Room Type" + verbose_name=_("Room Type") ) - unread_messages_count = models.IntegerField(default=0) + unread_messages_count = models.IntegerField(default=0, verbose_name=_("Unread Messages Count")) def __str__(self): if self.room_type == self.RoomTypeChoices.GROUP: return f"Group Room: {self.course.title if self.course else 'N/A'}" return f"Private Room with {self.recipient}" - + class Meta: + verbose_name = _("Room Message") + verbose_name_plural = _("Room Messages") + class ChatMessage(models.Model): class ChatTypeChoices(models.TextChoices): - TEXT = 'text', 'Text' - FILE = 'file', 'File' - AUDIO = 'audio', 'Audio' - IMAGE = 'image', 'Image' + TEXT = 'text', _('Text') + FILE = 'file', _('File') + AUDIO = 'audio', _('Audio') + IMAGE = 'image', _('Image') room = models.ForeignKey( RoomMessage, on_delete=models.CASCADE, related_name="messages", - verbose_name="Room", + verbose_name=_("Room"), ) sender = models.ForeignKey( User, on_delete=models.CASCADE, related_name="messages_sent", - verbose_name="Sender" + verbose_name=_("Sender") ) - content = models.TextField(verbose_name="Message Content") + content = models.TextField(verbose_name=_("Message Content")) content_type = models.CharField( max_length=10, choices=ChatTypeChoices.choices, default=ChatTypeChoices.TEXT, - verbose_name="Chat Type" + verbose_name=_("Chat Type") ) content_size = models.PositiveIntegerField( - verbose_name="Content Size (bytes)", + verbose_name=_("Content Size (bytes)"), blank=True, null=True ) @@ -107,23 +109,23 @@ class ChatMessage(models.Model): blank=True, null=True, max_length=500, - verbose_name="File Attachment", - help_text="For file and audio messages" + verbose_name=_("File Attachment"), + help_text=_("For file and audio messages") ) image_attachment = models.ImageField( upload_to=chat_upload_path, blank=True, null=True, max_length=500, - verbose_name="Image Attachment", - help_text="For image messages" + verbose_name=_("Image Attachment"), + help_text=_("For image messages") ) - is_read = models.BooleanField(default=False, verbose_name="Is Read") - message_metadata = models.JSONField(blank=True, null=True) - sent_at = models.DateTimeField(auto_now_add=True, verbose_name="Sent At") - updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated At") - deleted_at = models.DateTimeField(null=True, blank=True, verbose_name="Deleted At") - is_deleted = models.BooleanField(default=False, verbose_name="Is deleted") + is_read = models.BooleanField(default=False, verbose_name=_("Is Read")) + message_metadata = models.JSONField(blank=True, null=True, verbose_name=_("Message Metadata")) + sent_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Sent At")) + updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) + deleted_at = models.DateTimeField(null=True, blank=True, verbose_name=_("Deleted At")) + is_deleted = models.BooleanField(default=False, verbose_name=_("Is deleted")) @property def file_url(self): @@ -151,25 +153,31 @@ class ChatMessage(models.Model): def __str__(self): return f"Message from {self.sender} in {self.room}" + class Meta: + verbose_name = _("Chat Message") + verbose_name_plural = _("Chat Messages") + class MessageReadStatus(models.Model): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="read_statuses", - verbose_name="User" + verbose_name=_("User") ) message = models.ForeignKey( ChatMessage, on_delete=models.CASCADE, related_name="read_statuses", - verbose_name="Message" + verbose_name=_("Message") ) - is_read = models.BooleanField(default=False, verbose_name="Is Read") - read_at = models.DateTimeField(null=True, blank=True, verbose_name="Read At") + is_read = models.BooleanField(default=False, verbose_name=_("Is Read")) + read_at = models.DateTimeField(null=True, blank=True, verbose_name=_("Read At")) class Meta: unique_together = ("user", "message") # جلوگیری از ثبت تکراری + verbose_name = _("Message Read Status") + verbose_name_plural = _("Message Read Statuses") def __str__(self): return f"User {self.user.fullname} read Message {self.message.id}: {self.is_read}" diff --git a/apps/course/migrations/0004_alter_lessoncompletion_options_and_more.py b/apps/course/migrations/0004_alter_lessoncompletion_options_and_more.py new file mode 100644 index 0000000..cf071bc --- /dev/null +++ b/apps/course/migrations/0004_alter_lessoncompletion_options_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 5.2.12 on 2026-05-03 14:02 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_alter_user_email_alter_user_username'), + ('course', '0003_rename_is_chat_group_lock_course_is_group_chat_locked_and_more'), + ] + + operations = [ + migrations.AlterModelOptions( + name='lessoncompletion', + options={'verbose_name': 'Lesson Completion', 'verbose_name_plural': 'Lesson Completions'}, + ), + migrations.AlterModelOptions( + name='participant', + options={'verbose_name': 'Participant', 'verbose_name_plural': 'Participants'}, + ), + migrations.AlterField( + model_name='lessoncompletion', + name='course_lesson', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='completions', to='course.courselesson', verbose_name='Course Lesson'), + ), + migrations.AlterField( + model_name='lessoncompletion', + name='student', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lesson_completions', to='account.studentuser', verbose_name='Student'), + ), + migrations.AlterField( + model_name='participant', + name='course', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='course.course', verbose_name='Course'), + ), + migrations.AlterField( + model_name='participant', + name='is_active', + field=models.BooleanField(default=True, verbose_name='Is Active'), + ), + migrations.AlterField( + model_name='participant', + name='joined_date', + field=models.DateTimeField(auto_now_add=True, verbose_name='Joined Date'), + ), + migrations.AlterField( + model_name='participant', + name='student', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participated_courses', to='account.studentuser', verbose_name='Student'), + ), + migrations.AlterField( + model_name='participant', + name='unread_messages_count', + field=models.IntegerField(default=0, verbose_name='Unread Messages Count'), + ), + ] diff --git a/apps/course/models/course.py b/apps/course/models/course.py index 99bf5af..c001140 100644 --- a/apps/course/models/course.py +++ b/apps/course/models/course.py @@ -26,7 +26,8 @@ def course_attachment_file_upload_to(instance, filename): class CourseCategory(models.Model): - name = models.CharField(max_length=255, verbose_name='Category Name') + name = models.CharField(max_length=255, verbose_name=_('Category Name')) + slug = models.SlugField(unique=True, max_length=255) def __str__(self): @@ -44,25 +45,26 @@ class CourseCategory(models.Model): class Course(models.Model): class LevelChoices(TextChoices): - BEGINNER = 'beginner', 'Beginner' - MID = 'mid', 'Mid Level' - ADVANCED = 'advanced', 'Advanced' + BEGINNER = 'beginner', _('Beginner') + MID = 'mid', _('Mid Level') + ADVANCED = 'advanced', _('Advanced') class StatusChoices(TextChoices): - INACTIVE = 'inactive', 'Inactive' # Not Active (does not show) - UPCOMING = 'upcoming', 'Upcoming' # Upcoming (visible but registration not allowed)-Предстоящие - REGISTERING = 'registering', 'Registering' # Registering (registration is open)-регистрация - ONGOING = 'ongoing', 'Ongoing' # Ongoing (course has started, registration closed)-В процессе - FINISHED = 'finished', 'Finished' # Finished (course has ended)-закончился + INACTIVE = 'inactive', _('Inactive') # Not Active (does not show) + UPCOMING = 'upcoming', _('Upcoming') # Upcoming (visible but registration not allowed)-Предстоящие + REGISTERING = 'registering', _('Registering') # Registering (registration is open)-регистрация + ONGOING = 'ongoing', _('Ongoing') # Ongoing (course has started, registration closed)-В процессе + FINISHED = 'finished', _('Finished') # Finished (course has ended)-закончился class VedioTypeChoices(models.TextChoices): - YOUTUBE_LINK = 'youtube_link', 'Youtube Link' - VIDEO_FILE = 'video_file', 'Video File' + YOUTUBE_LINK = 'youtube_link', _('Youtube Link') + VIDEO_FILE = 'video_file', _('Video File') + - title = models.CharField(max_length=255, verbose_name='Course Title') + title = models.CharField(max_length=255, verbose_name=_('Course Title')) slug = models.SlugField(allow_unicode=True, unique=True) - category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE, related_name='courses', verbose_name='Category') + category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE, related_name='courses', verbose_name=_('Category')) professor = models.ForeignKey( ProfessorUser, on_delete=models.CASCADE, @@ -73,7 +75,7 @@ class Course(models.Model): video_type = models.CharField( max_length=20, choices=VedioTypeChoices.choices, - verbose_name='Preview Video Type (YouTube Link or File Upload)' + verbose_name=_('Preview Video Type (YouTube Link or File Upload)') ) video_file = models.FileField( upload_to=course_file_upload_to, @@ -82,18 +84,18 @@ class Course(models.Model): ) video_link = models.CharField(max_length=500, null=True, blank=True) - is_online = models.BooleanField(default=False, verbose_name='Is Online Course') - online_link = models.CharField(max_length=500, null=True, blank=True, verbose_name='Online Class Link') - level = models.CharField(max_length=10, choices=LevelChoices.choices, verbose_name='Course Level') - duration = models.PositiveIntegerField(verbose_name='Duration (in hours)') - lessons_count = models.PositiveIntegerField(verbose_name='Number of Lessons') + is_online = models.BooleanField(default=False, verbose_name=_('Is Online Course')) + online_link = models.CharField(max_length=500, null=True, blank=True, verbose_name=_('Online Class Link')) + level = models.CharField(max_length=10, choices=LevelChoices.choices, verbose_name=_('Course Level')) + duration = models.PositiveIntegerField(verbose_name=_('Duration (in hours)')) + lessons_count = models.PositiveIntegerField(verbose_name=_('Number of Lessons')) - description = models.TextField(verbose_name='Course Description') - short_description = models.CharField(max_length=500, blank=True, null=True, verbose_name="Short Description") - status = models.CharField(max_length=15, choices=StatusChoices.choices, default=StatusChoices.INACTIVE, verbose_name='Course Status') - is_free = models.BooleanField(default=True, verbose_name='Is Free') - price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='Course Price') - discount_percentage = models.PositiveIntegerField(default=0, verbose_name='Discount Percentage') + description = models.TextField(verbose_name=_('Course Description')) + short_description = models.CharField(max_length=500, blank=True, null=True, verbose_name=_("Short Description")) + status = models.CharField(max_length=15, choices=StatusChoices.choices, default=StatusChoices.INACTIVE, verbose_name=_('Course Status')) + is_free = models.BooleanField(default=True, verbose_name=_('Is Free')) + price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name=_('Course Price')) + discount_percentage = models.PositiveIntegerField(default=0, verbose_name=_('Discount Percentage')) final_price = models.DecimalField( verbose_name=_('Course Final Price'), decimal_places=2, max_digits=10, default=0.00, blank=True, help_text=_('This field is automatically calculated based on the discount percentage.') @@ -148,8 +150,9 @@ class Course(models.Model): class Meta: - verbose_name = "Course" - verbose_name_plural = "Courses" + verbose_name = _("Course") + verbose_name_plural = _("Courses") + indexes = [ models.Index(fields=['status']), models.Index(fields=['is_free']), @@ -165,8 +168,8 @@ class Glossary(models.Model): """ Base Glossary model that contains the actual content """ - title = models.CharField(max_length=555, verbose_name='Glossary Title') - description = models.TextField(verbose_name='Description') + title = models.CharField(max_length=555, verbose_name=_('Glossary Title')) + description = models.TextField(verbose_name=_('Description')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -174,16 +177,17 @@ class Glossary(models.Model): return self.title class Meta: - verbose_name = "Glossary" - verbose_name_plural = "Glossaries" + verbose_name = _("Glossary") + verbose_name_plural = _("Glossaries") + class CourseGlossary(models.Model): """ Intermediate model that connects Course with Glossary """ - course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='glossaries', verbose_name='Course') - glossary = models.ForeignKey(Glossary, on_delete=models.CASCADE, related_name='course_glossaries', verbose_name='Glossary') + course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='glossaries', verbose_name=_('Course')) + glossary = models.ForeignKey(Glossary, on_delete=models.CASCADE, related_name='course_glossaries', verbose_name=_('Glossary')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -200,20 +204,21 @@ class CourseGlossary(models.Model): class Meta: ordering = ("-id",) - verbose_name = "Course Glossary" - verbose_name_plural = "Course Glossaries" + verbose_name = _("Course Glossary") + verbose_name_plural = _("Course Glossaries") + class Attachment(models.Model): """ Base Attachment model that contains the actual file """ - title = models.CharField(max_length=255, verbose_name='Attachment Title') + title = models.CharField(max_length=255, verbose_name=_('Attachment Title')) file = models.FileField( upload_to=attachment_file_upload_to, - verbose_name='Attachment File' + verbose_name=_('Attachment File') ) - file_size = models.PositiveIntegerField(verbose_name='File Size (in bytes)', null=True, blank=True) + file_size = models.PositiveIntegerField(verbose_name=_('File Size (in bytes)'), null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -227,16 +232,17 @@ class Attachment(models.Model): return self.title class Meta: - verbose_name = "Attachment" - verbose_name_plural = "Attachments" + verbose_name = _("Attachment") + verbose_name_plural = _("Attachments") + class CourseAttachment(models.Model): """ Intermediate model that connects Course with Attachment """ - course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='attachments', verbose_name='Course') - attachment = models.ForeignKey(Attachment, on_delete=models.CASCADE, related_name='course_attachments', verbose_name='Attachment') + course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='attachments', verbose_name=_('Course')) + attachment = models.ForeignKey(Attachment, on_delete=models.CASCADE, related_name='course_attachments', verbose_name=_('Attachment')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -257,8 +263,9 @@ class CourseAttachment(models.Model): class Meta: ordering = ("-id",) - verbose_name = "Course Attachment" - verbose_name_plural = "Course Attachments" + verbose_name = _("Course Attachment") + verbose_name_plural = _("Course Attachments") + indexes = [ models.Index(fields=['course']), models.Index(fields=['attachment']), diff --git a/apps/course/models/lesson.py b/apps/course/models/lesson.py index c3f12cb..d8dc00f 100644 --- a/apps/course/models/lesson.py +++ b/apps/course/models/lesson.py @@ -18,18 +18,20 @@ class Lesson(models.Model): Base Lesson model that contains the actual content (video file or link) """ class ContentTypeChoices(models.TextChoices): - YOUTUBE_LINK = 'youtube_link', 'Youtube Link' - VIDEO_FILE = 'video_file', 'Video File' + YOUTUBE_LINK = 'youtube_link', _('Youtube Link') + VIDEO_FILE = 'video_file', _('Video File') - title = models.CharField(max_length=255, verbose_name='Lesson Title') - content_type = models.CharField(max_length=50, choices=ContentTypeChoices.choices, verbose_name='Content Type') + title = models.CharField(max_length=255, verbose_name=_('Lesson Title')) + content_type = models.CharField(max_length=50, choices=ContentTypeChoices.choices, verbose_name=_('Content Type')) + content_file = models.FileField( null=True, blank=True, upload_to=lesson_file_upload_to, ) - video_link = models.CharField(max_length=500, null=True, blank=True, verbose_name='Link') - duration = models.PositiveIntegerField(verbose_name='Duration (in minutes)') + video_link = models.CharField(max_length=500, null=True, blank=True, verbose_name=_('Link')) + duration = models.PositiveIntegerField(verbose_name=_('Duration (in minutes)')) + created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -37,8 +39,9 @@ class Lesson(models.Model): return self.title class Meta: - verbose_name = "Lesson" - verbose_name_plural = "Lessons" + verbose_name = _("Lesson") + verbose_name_plural = _("Lessons") + indexes = [ models.Index(fields=['content_type']), models.Index(fields=['created_at']), @@ -49,10 +52,11 @@ class CourseLesson(models.Model): """ Intermediate model that connects Course with Lesson """ - course = models.ForeignKey("course.Course", on_delete=models.CASCADE, related_name='lessons', verbose_name='Course') - lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='course_lessons', verbose_name='Lesson') - title = models.CharField(max_length=255, verbose_name='Course Lesson Title', null=True, blank=True) - priority = models.IntegerField(null=True, blank=True, verbose_name='Priority') + course = models.ForeignKey("course.Course", on_delete=models.CASCADE, related_name='lessons', verbose_name=_('Course')) + lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='course_lessons', verbose_name=_('Lesson')) + title = models.CharField(max_length=255, verbose_name=_('Course Lesson Title'), null=True, blank=True) + priority = models.IntegerField(null=True, blank=True, verbose_name=_('Priority')) + is_active = models.BooleanField(default=True, verbose_name=_('Is Active')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated At")) @@ -100,8 +104,9 @@ class CourseLesson(models.Model): lessons.filter(priority__gte=self.priority).update(priority=models.F('priority') + 1) class Meta: - verbose_name = "Course Lesson" - verbose_name_plural = "Course Lessons" + verbose_name = _("Course Lesson") + verbose_name_plural = _("Course Lessons") + indexes = [ models.Index(fields=['course']), models.Index(fields=['lesson']), @@ -116,18 +121,24 @@ class LessonCompletion(models.Model): student = models.ForeignKey( StudentUser, on_delete=models.CASCADE, - related_name='lesson_completions' + related_name='lesson_completions', + verbose_name=_('Student') ) course_lesson = models.ForeignKey( CourseLesson, on_delete=models.CASCADE, - related_name='completions' + related_name='completions', + verbose_name=_('Course Lesson') ) + completed_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) class Meta: unique_together = ('student', 'course_lesson') + verbose_name = _("Lesson Completion") + verbose_name_plural = _("Lesson Completions") + indexes = [ models.Index(fields=['student']), models.Index(fields=['course_lesson']), diff --git a/apps/course/models/live_session.py b/apps/course/models/live_session.py index e73861b..c58f0bf 100644 --- a/apps/course/models/live_session.py +++ b/apps/course/models/live_session.py @@ -61,12 +61,13 @@ class CourseLiveSession(models.Model): USER_ROLE_CHOICES = ( - ("participant", "Participant"), - ("moderator", "Moderator"), - ("observer", "Observer"), + ("participant", _("Participant")), + ("moderator", _("Moderator")), + ("observer", _("Observer")), ) + class LiveSessionUser(models.Model): session = models.ForeignKey( CourseLiveSession, @@ -123,11 +124,12 @@ class LiveSessionUser(models.Model): RECORDING_TYPE_CHOICES = ( - ("voice", "Voice"), - ("video", "Video"), + ("voice", _("Voice")), + ("video", _("Video")), ) + class LiveSessionRecording(models.Model): session = models.ForeignKey( CourseLiveSession, diff --git a/apps/course/models/participant.py b/apps/course/models/participant.py index 80947f3..497d300 100644 --- a/apps/course/models/participant.py +++ b/apps/course/models/participant.py @@ -1,6 +1,5 @@ - from django.db import models - +from django.utils.translation import gettext_lazy as _ from apps.account.models import StudentUser, User from apps.course.models import Course @@ -10,19 +9,23 @@ class Participant(models.Model): student = models.ForeignKey( StudentUser, on_delete=models.CASCADE, - related_name='participated_courses' + related_name='participated_courses', + verbose_name=_('Student') ) course = models.ForeignKey( Course, on_delete=models.CASCADE, - related_name='participants' + related_name='participants', + verbose_name=_('Course') ) - is_active = models.BooleanField(default=True) - joined_date = models.DateTimeField(auto_now_add=True) - unread_messages_count = models.IntegerField(default=0) + is_active = models.BooleanField(default=True, verbose_name=_('Is Active')) + joined_date = models.DateTimeField(auto_now_add=True, verbose_name=_('Joined Date')) + unread_messages_count = models.IntegerField(default=0, verbose_name=_('Unread Messages Count')) class Meta: unique_together = ('student', 'course') + verbose_name = _('Participant') + verbose_name_plural = _('Participants') indexes = [ models.Index(fields=['student']), models.Index(fields=['course']), diff --git a/apps/quiz/migrations/0002_alter_participantanswer_answer_timing_and_more.py b/apps/quiz/migrations/0002_alter_participantanswer_answer_timing_and_more.py new file mode 100644 index 0000000..173ff55 --- /dev/null +++ b/apps/quiz/migrations/0002_alter_participantanswer_answer_timing_and_more.py @@ -0,0 +1,147 @@ +# Generated by Django 5.2.12 on 2026-05-03 14:09 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0004_alter_lessoncompletion_options_and_more'), + ('quiz', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='participantanswer', + name='answer_timing', + field=models.PositiveSmallIntegerField(default=0, verbose_name='Seconds Take to Answer'), + ), + migrations.AlterField( + model_name='participantanswer', + name='at_time', + field=models.DateTimeField(verbose_name='At Time'), + ), + migrations.AlterField( + model_name='participantanswer', + name='option_num', + field=models.PositiveSmallIntegerField(choices=[(1, 'Option 1'), (2, 'Option 2'), (3, 'Option 3'), (4, 'Option 4')], verbose_name='Selected Option'), + ), + migrations.AlterField( + model_name='participantanswer', + name='participant', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='quiz.quizparticipant', verbose_name='Participant'), + ), + migrations.AlterField( + model_name='participantanswer', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.question', verbose_name='Question'), + ), + migrations.AlterField( + model_name='question', + name='correct_answer', + field=models.PositiveSmallIntegerField(choices=[(1, 'Option 1'), (2, 'Option 2'), (3, 'Option 3'), (4, 'Option 4')], verbose_name='Correct Answer'), + ), + migrations.AlterField( + model_name='question', + name='created_at', + field=models.DateTimeField(auto_now_add=True, verbose_name='Created At'), + ), + migrations.AlterField( + model_name='question', + name='option1', + field=models.CharField(max_length=255, verbose_name='Option 1'), + ), + migrations.AlterField( + model_name='question', + name='option2', + field=models.CharField(max_length=255, verbose_name='Option 2'), + ), + migrations.AlterField( + model_name='question', + name='option3', + field=models.CharField(max_length=255, verbose_name='Option 3'), + ), + migrations.AlterField( + model_name='question', + name='option4', + field=models.CharField(max_length=255, verbose_name='Option 4'), + ), + migrations.AlterField( + model_name='question', + name='priority', + field=models.IntegerField(blank=True, null=True, verbose_name='Priority'), + ), + migrations.AlterField( + model_name='question', + name='question', + field=models.CharField(max_length=255, verbose_name='Question'), + ), + migrations.AlterField( + model_name='question', + name='quiz', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='quiz.quiz', verbose_name='Quiz'), + ), + migrations.AlterField( + model_name='quiz', + name='each_question_timing', + field=models.PositiveIntegerField(verbose_name='Each Question Timing'), + ), + migrations.AlterField( + model_name='quiz', + name='lesson', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quizzes', to='course.courselesson', verbose_name='Lesson'), + ), + migrations.AlterField( + model_name='quiz', + name='status', + field=models.BooleanField(default=True, verbose_name='Status'), + ), + migrations.AlterField( + model_name='quiz', + name='title', + field=models.CharField(help_text='Quiz Title', max_length=255, verbose_name='Title'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='ended_at', + field=models.DateTimeField(verbose_name='Ended At'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='question_score', + field=models.PositiveIntegerField(verbose_name='Question Score'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='quiz', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='quiz.quiz', verbose_name='Quiz'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='started_at', + field=models.DateTimeField(verbose_name='Started At'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='timing_score', + field=models.PositiveIntegerField(verbose_name='Timing Score'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='total_score', + field=models.PositiveIntegerField(verbose_name='Total Score'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='total_timing', + field=models.PositiveIntegerField(help_text='Seconds take to finish the quiz', verbose_name='Total Timing'), + ), + migrations.AlterField( + model_name='quizparticipant', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='uquizzes', to=settings.AUTH_USER_MODEL, verbose_name='User'), + ), + ] diff --git a/apps/quiz/models/participant.py b/apps/quiz/models/participant.py index 3400977..f2a46da 100644 --- a/apps/quiz/models/participant.py +++ b/apps/quiz/models/participant.py @@ -1,26 +1,25 @@ from django.db import models from django.db.models import F, Window from django.db.models.functions import Rank +from django.utils.translation import gettext_lazy as _ from apps.account.models import User - - class QuizParticipant(models.Model): - quiz = models.ForeignKey('quiz.Quiz', on_delete=models.CASCADE, related_name='participants') - user = models.ForeignKey('account.User', on_delete=models.CASCADE, verbose_name='user', related_name='uquizzes') - started_at = models.DateTimeField(verbose_name='started at') - ended_at = models.DateTimeField(verbose_name='ended at') - total_timing = models.PositiveIntegerField(help_text='Seconds take to finish the quiz') + quiz = models.ForeignKey('quiz.Quiz', on_delete=models.CASCADE, related_name='participants', verbose_name=_('Quiz')) + user = models.ForeignKey('account.User', on_delete=models.CASCADE, verbose_name=_('User'), related_name='uquizzes') + started_at = models.DateTimeField(verbose_name=_('Started At')) + ended_at = models.DateTimeField(verbose_name=_('Ended At')) + total_timing = models.PositiveIntegerField(verbose_name=_('Total Timing'), help_text=_('Seconds take to finish the quiz')) - question_score = models.PositiveIntegerField() - timing_score = models.PositiveIntegerField() - total_score = models.PositiveIntegerField() + question_score = models.PositiveIntegerField(verbose_name=_('Question Score')) + timing_score = models.PositiveIntegerField(verbose_name=_('Timing Score')) + total_score = models.PositiveIntegerField(verbose_name=_('Total Score')) class Meta: - verbose_name = "Participant" - verbose_name_plural = "Participants" + verbose_name = _("Participant") + verbose_name_plural = _("Participants") ordering = ("-id",) def __str__(self): @@ -40,25 +39,24 @@ class QuizParticipant(models.Model): ) - class ParticipantAnswer(models.Model): CHOICES = [ - (1, 'Option 1'), - (2, 'Option 2'), - (3, 'Option 3'), - (4, 'Option 4'), + (1, _('Option 1')), + (2, _('Option 2')), + (3, _('Option 3')), + (4, _('Option 4')), ] - participant = models.ForeignKey(QuizParticipant, on_delete=models.CASCADE, related_name='answers') - question = models.ForeignKey("quiz.Question", on_delete=models.CASCADE) - option_num = models.PositiveSmallIntegerField(choices=CHOICES, verbose_name='selected option') - at_time = models.DateTimeField() - answer_timing = models.PositiveSmallIntegerField(default=0, verbose_name='seconds take to answer') + participant = models.ForeignKey(QuizParticipant, on_delete=models.CASCADE, related_name='answers', verbose_name=_('Participant')) + question = models.ForeignKey("quiz.Question", on_delete=models.CASCADE, verbose_name=_('Question')) + option_num = models.PositiveSmallIntegerField(choices=CHOICES, verbose_name=_('Selected Option')) + at_time = models.DateTimeField(verbose_name=_('At Time')) + answer_timing = models.PositiveSmallIntegerField(default=0, verbose_name=_('Seconds Take to Answer')) class Meta: - verbose_name = "User Quiz Answer" - verbose_name_plural = "User Quiz Answers" + verbose_name = _("User Quiz Answer") + verbose_name_plural = _("User Quiz Answers") ordering = ("-id",) def __str__(self): diff --git a/apps/quiz/models/quiz.py b/apps/quiz/models/quiz.py index 1be1190..eebac93 100644 --- a/apps/quiz/models/quiz.py +++ b/apps/quiz/models/quiz.py @@ -5,17 +5,17 @@ from apps.account.models import User class Quiz(models.Model): - lesson = models.ForeignKey("course.CourseLesson", verbose_name=_('lesson'), related_name='quizzes', on_delete=models.CASCADE) + lesson = models.ForeignKey("course.CourseLesson", verbose_name=_('Lesson'), related_name='quizzes', on_delete=models.CASCADE) - title = models.CharField(max_length=255, verbose_name=_('title'), help_text="Quiz Title") - description = models.CharField(max_length=55, blank=True, null=True, verbose_name="Description") - each_question_timing = models.PositiveIntegerField() - status = models.BooleanField(default=True) + title = models.CharField(max_length=255, verbose_name=_('Title'), help_text=_("Quiz Title")) + description = models.CharField(max_length=55, blank=True, null=True, verbose_name=_("Description")) + each_question_timing = models.PositiveIntegerField(verbose_name=_("Each Question Timing")) + status = models.BooleanField(default=True, verbose_name=_("Status")) class Meta: - verbose_name = "Quiz" - verbose_name_plural = "Quizzes" + verbose_name = _("Quiz") + verbose_name_plural = _("Quizzes") ordering = ("-id",) def __str__(self): @@ -25,30 +25,28 @@ class Quiz(models.Model): return f"Quiz(id={self.id})" - - class Question(models.Model): CHOICES = [ - (1, 'Option 1'), - (2, 'Option 2'), - (3, 'Option 3'), - (4, 'Option 4'), + (1, _('Option 1')), + (2, _('Option 2')), + (3, _('Option 3')), + (4, _('Option 4')), ] - quiz = models.ForeignKey(Quiz, verbose_name='quiz', on_delete=models.CASCADE, related_name='questions') - question = models.CharField(max_length=255) - option1 = models.CharField(max_length=255, verbose_name='option 1') - option2 = models.CharField(max_length=255, verbose_name='option 2') - option3 = models.CharField(max_length=255, verbose_name='option 3') - option4 = models.CharField(max_length=255, verbose_name='option 4') - correct_answer = models.PositiveSmallIntegerField(choices=CHOICES) - created_at = models.DateTimeField(auto_now_add=True, verbose_name='created at') - priority = models.IntegerField(null=True, blank=True) + quiz = models.ForeignKey(Quiz, verbose_name=_('Quiz'), on_delete=models.CASCADE, related_name='questions') + question = models.CharField(max_length=255, verbose_name=_('Question')) + option1 = models.CharField(max_length=255, verbose_name=_('Option 1')) + option2 = models.CharField(max_length=255, verbose_name=_('Option 2')) + option3 = models.CharField(max_length=255, verbose_name=_('Option 3')) + option4 = models.CharField(max_length=255, verbose_name=_('Option 4')) + correct_answer = models.PositiveSmallIntegerField(choices=CHOICES, verbose_name=_('Correct Answer')) + created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('Created At')) + priority = models.IntegerField(null=True, blank=True, verbose_name=_('Priority')) class Meta: - verbose_name = "Question" - verbose_name_plural = "Questions" + verbose_name = _("Question") + verbose_name_plural = _("Questions") ordering = ("-priority", "-id",) def __str__(self): @@ -61,6 +59,6 @@ class Question(models.Model): class QuizRankUser(User): class Meta: proxy = True - verbose_name = 'Rank Quiz' - verbose_name_plural = 'Rank Quizzes' + verbose_name = _('Rank Quiz') + verbose_name_plural = _('Rank Quizzes') diff --git a/apps/transaction/migrations/0002_alter_participantinfo_options_and_more.py b/apps/transaction/migrations/0002_alter_participantinfo_options_and_more.py new file mode 100644 index 0000000..3bc0270 --- /dev/null +++ b/apps/transaction/migrations/0002_alter_participantinfo_options_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 5.2.12 on 2026-05-03 14:09 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0004_alter_lessoncompletion_options_and_more'), + ('transaction', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterModelOptions( + name='participantinfo', + options={'verbose_name': 'Participant Info', 'verbose_name_plural': 'Participant Infos'}, + ), + migrations.AlterModelOptions( + name='transactionparticipant', + options={'verbose_name': 'Transaction Participant', 'verbose_name_plural': 'Transaction Participants'}, + ), + migrations.AlterField( + model_name='transactionparticipant', + name='course', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_transactions', to='course.course', verbose_name='Course'), + ), + migrations.AlterField( + model_name='transactionparticipant', + name='is_deleted', + field=models.BooleanField(default=False, verbose_name='Is Deleted'), + ), + migrations.AlterField( + model_name='transactionparticipant', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transactions', to=settings.AUTH_USER_MODEL, verbose_name='User'), + ), + ] diff --git a/apps/transaction/models.py b/apps/transaction/models.py index b852d90..46b603e 100644 --- a/apps/transaction/models.py +++ b/apps/transaction/models.py @@ -13,9 +13,6 @@ def receipt_file_upload_to(instance, filename): return os.path.join(f"receipts/{instance.transaction.id}/{filename}") - - - class TransactionParticipant(models.Model): @@ -30,15 +27,15 @@ class TransactionParticipant(models.Model): FREE = 'free', _('Free') PAYMENT_GATEWAY = 'Payment_Gateway', _('Payment Gateway') - user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='transactions') - course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='course_transactions') + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='transactions', verbose_name=_('User')) + course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='course_transactions', verbose_name=_('Course')) payment_method=models.CharField(max_length=20, choices=PaymentMethods.choices, default=PaymentMethods.PAYMENT_GATEWAY, verbose_name=_('Transaction Payment Method')) # is_paid = models.BooleanField(default=False, verbose_name='Payment Status', help_text='Indicates whether the payment has been completed or not') - price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='Transaction Price') + price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name=_('Transaction Price')) status = models.CharField(max_length=20, choices=TransactionStatus.choices, default=TransactionStatus.PENDING, verbose_name=_('Transaction Status')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated at")) - is_deleted = models.BooleanField(default=False) + is_deleted = models.BooleanField(default=False, verbose_name=_('Is Deleted')) def __str__(self): return f"{self.user.email} - {self.course.title} ({self.status})" @@ -59,31 +56,37 @@ class TransactionParticipant(models.Model): course=self.course ).first() - + class Meta: + verbose_name = _('Transaction Participant') + verbose_name_plural = _('Transaction Participants') class ParticipantInfo(models.Model): class GenderChoices(models.TextChoices): - MALE = 'male', 'Male' - FEMALE = 'female', 'Female' + MALE = 'male', _('Male') + FEMALE = 'female', _('Female') transaction_participant = models.ForeignKey( TransactionParticipant, on_delete=models.CASCADE, related_name='participant_infos', - verbose_name="Transaction Participant" + verbose_name=_("Transaction Participant") ) - fullname = models.CharField(max_length=255, verbose_name="Full Name", help_text="Enter the full name of the user.") - email = models.EmailField(verbose_name="Email Address", help_text="Enter the user's email address.") + fullname = models.CharField(max_length=255, verbose_name=_("Full Name"), help_text=_("Enter the full name of the user.")) + email = models.EmailField(verbose_name=_("Email Address"), help_text=_("Enter the user's email address.")) phone_number = PhoneNumberField(validators=[validate_possible_number], null=True, blank=True, verbose_name=_('phone')) gender = models.CharField( - max_length=20, choices=GenderChoices.choices, null=True, blank=True, verbose_name=_('Gender'), help_text="Select the user's gender." + max_length=20, choices=GenderChoices.choices, null=True, blank=True, verbose_name=_('Gender'), help_text=_("Select the user's gender.") ) birthdate = models.DateField(verbose_name=_('birthdate'), null=True, blank=True) def __str__(self): return f"{self.fullname} (Transaction: {self.transaction_participant.id}) - {self.email}" + class Meta: + verbose_name = _('Participant Info') + verbose_name_plural = _('Participant Infos') + class TransactionReceipt(models.Model): """ diff --git a/dynamic_preferences/locale/ru/LC_MESSAGES/django.po b/dynamic_preferences/locale/ru/LC_MESSAGES/django.po index c1fa761..b9e5867 100644 --- a/dynamic_preferences/locale/ru/LC_MESSAGES/django.po +++ b/dynamic_preferences/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-04-04 06:07+0330\n" +"POT-Creation-Date: 2026-05-02 15:29+0330\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -19,62 +19,67 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " "(n%100>=11 && n%100<=14)? 2 : 3);\n" -#: dynamic_preferences/admin.py:52 + +#: .\dynamic_preferences\admin.py:59 msgid "Verbose name" msgstr "" -#: dynamic_preferences/admin.py:56 +#: .\dynamic_preferences\admin.py:63 msgid "Help text" msgstr "" -#: dynamic_preferences/admin.py:77 +#: .\dynamic_preferences\admin.py:84 msgid "Default Value" msgstr "" -#: dynamic_preferences/admin.py:86 dynamic_preferences/models.py:30 +#: .\dynamic_preferences\admin.py:93 .\dynamic_preferences\models.py:30 msgid "Section Name" msgstr "" -#: dynamic_preferences/apps.py:10 +#: .\dynamic_preferences\admin.py:118 +msgid "Reset selected preferences to default values" +msgstr "" + +#: .\dynamic_preferences\apps.py:10 msgid "Settings" msgstr "" -#: dynamic_preferences/models.py:34 +#: .\dynamic_preferences\models.py:34 msgid "Name" msgstr "" -#: dynamic_preferences/models.py:37 +#: .\dynamic_preferences\models.py:37 msgid "Raw Value" msgstr "" -#: dynamic_preferences/models.py:51 +#: .\dynamic_preferences\models.py:51 msgid "Verbose Name" msgstr "" -#: dynamic_preferences/models.py:57 +#: .\dynamic_preferences\models.py:57 msgid "Help Text" msgstr "" -#: dynamic_preferences/models.py:94 +#: .\dynamic_preferences\models.py:94 msgid "Global preference" msgstr "" -#: dynamic_preferences/models.py:95 +#: .\dynamic_preferences\models.py:95 msgid "Global preferences" msgstr "" -#: dynamic_preferences/templates/dynamic_preferences/form.html:11 +#: .\dynamic_preferences\templates\dynamic_preferences\form.html:11 msgid "Submit" msgstr "" -#: dynamic_preferences/users/apps.py:11 +#: .\dynamic_preferences\users\apps.py:11 msgid "Preferences - Users" msgstr "" -#: dynamic_preferences/users/models.py:14 +#: .\dynamic_preferences\users\models.py:14 msgid "user preference" msgstr "" -#: dynamic_preferences/users/models.py:15 +#: .\dynamic_preferences\users\models.py:15 msgid "user preferences" msgstr "" diff --git a/locale/fa/LC_MESSAGES/django.po b/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index ef9a417..0000000 --- a/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,1328 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#: config/settings/base.py:485 config/settings/base.py:496 -#: config/settings/base.py:507 config/settings/base.py:518 -#: config/settings/base.py:530 -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-04-04 06:00+0330\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: apps/account/admin/professor.py:59 apps/account/admin/student.py:46 -msgid "Personal info" -msgstr "اطلاعات شخصی" - -#: apps/account/admin/professor.py:60 apps/account/admin/student.py:47 -#: apps/account/admin/user.py:72 apps/account/admin/user.py:99 -#: apps/account/admin/user.py:288 apps/account/admin/user.py:291 -#: templates/admin/filer/folder/directory_table.html:129 -msgid "Permissions" -msgstr "مجوزها" - -#: apps/account/admin/professor.py:63 apps/account/admin/student.py:50 -#: apps/account/admin/user.py:105 -msgid "Important dates" -msgstr "تاریخ‌های مهم" - -#: apps/account/admin/user.py:64 apps/account/admin/user.py:166 -msgid "Location" -msgstr "موقعیت" - -#: apps/account/admin/user.py:68 -msgid "Password" -msgstr "رمز عبور" - -#: apps/account/admin/user.py:80 -msgid "Basic Information" -msgstr "اطلاعات پایه" - -#: apps/account/admin/user.py:87 -msgid "Country & City" -msgstr "کشور و شهر" - -#: apps/account/admin/user.py:93 -msgid "Device Information" -msgstr "اطلاعات دستگاه" - -#: apps/account/admin/user.py:122 apps/account/admin/user.py:147 -msgid "Date Joined" -msgstr "تاریخ عضویت" - -#: apps/account/admin/user.py:126 -msgid "Last Login" -msgstr "آخرین ورود" - -#: apps/account/admin/user.py:170 -msgid "password" -msgstr "رمز عبور" - -#: apps/account/admin/user.py:177 apps/course/admin/course.py:159 -msgid "Student" -msgstr "دانشجو" - -#: apps/account/admin/user.py:197 -msgid "Age" -msgstr "سن" - -#: apps/account/admin/user.py:217 apps/account/admin/user.py:349 -#: apps/course/admin/course.py:79 config/settings/base.py:447 -#: config/settings/base.py:542 config/settings/base.py:547 -msgid "Courses" -msgstr "دوره‌ها" - -#: apps/account/admin/user.py:298 apps/course/admin/course.py:45 -msgid "Course Categories" -msgstr "دسته‌بندی‌های دوره" - -#: apps/account/admin/user.py:317 apps/course/admin/course.py:64 -msgid "Edit" -msgstr "ویرایش" - -#: apps/account/admin/user.py:329 apps/course/admin/course.py:312 -msgid "Professor" -msgstr "استاد" - -#: apps/account/models/notification.py:10 apps/hadis/models/hadis.py:10 -#: apps/hadis/models/hadis.py:21 apps/hadis/models/hadis.py:49 -#: apps/podcast/models.py:6 apps/quiz/models/quiz.py:9 apps/video/models.py:7 -msgid "title" -msgstr "عنوان" - -#: apps/account/models/notification.py:11 -msgid "message" -msgstr "پیام" - -#: apps/account/models/notification.py:12 -msgid "user" -msgstr "کاربر" - -#: apps/account/models/notification.py:13 -msgid "is read" -msgstr "خوانده شده" - -#: apps/account/models/notification.py:18 -msgid "service" -msgstr "سرویس" - -#: apps/account/models/notification.py:20 apps/hadis/models/hadis.py:28 -#: apps/hadis/models/hadis.py:54 apps/hadis/models/hadis.py:66 -#: apps/hadis/models/transmitter.py:44 apps/library/models.py:70 -#: apps/library/models.py:114 apps/podcast/models.py:11 -#: apps/podcast/models.py:26 apps/podcast/models.py:78 apps/video/models.py:12 -#: apps/video/models.py:27 apps/video/models.py:85 -msgid "created at" -msgstr "ایجاد شده " - -#: apps/account/models/notification.py:21 apps/hadis/models/hadis.py:29 -#: apps/library/models.py:71 apps/library/models.py:115 -#: apps/podcast/models.py:12 apps/podcast/models.py:27 -#: apps/podcast/models.py:79 apps/video/models.py:13 apps/video/models.py:28 -#: apps/video/models.py:86 -msgid "updated at" -msgstr "به‌روزرسانی شده " - -#: apps/account/models/user.py:34 apps/transaction/models.py:43 -msgid "birthdate" -msgstr "تاریخ تولد" - -#: apps/account/models/user.py:41 -msgid "Phone Number" -msgstr "شماره تلفن" - -#: apps/account/models/user.py:46 apps/transaction/models.py:41 -msgid "Gender" -msgstr "جنسیت" - -#: apps/account/models/user.py:50 -msgid "City" -msgstr "شهر" - -#: apps/account/models/user.py:51 apps/account/models/user.py:121 -msgid "country" -msgstr "کشور" - -#: apps/account/models/user.py:53 -msgid "device id" -msgstr "شناسه دستگاه" - -#: apps/account/models/user.py:119 -msgid "lat" -msgstr "عرض جغرافیایی" - -#: apps/account/models/user.py:120 -msgid "lon" -msgstr "طول جغرافیایی" - -#: apps/account/models/user.py:122 -msgid "city" -msgstr "شهر" - -#: apps/account/templates/account/group_help_text.html:5 -msgid "Driver before template" -msgstr "راننده قبل از قالب" - -#: apps/account/templates/account/group_help_text.html:11 -msgid "Active drivers" -msgstr "رانندگان فعال" - -#: apps/account/templates/account/group_help_text.html:19 -msgid "Inactive drivers" -msgstr "رانندگان غیرفعال" - -#: apps/account/templates/account/group_help_text.html:27 -msgid "Total points" -msgstr "مجموع امتیازات" - -#: apps/account/templates/account/group_help_text.html:35 -msgid "Total races" -msgstr "مجموع مسابقات" - -#: apps/account/templates/account/user_list_section.html:8 -msgid "Total Actice Users" -msgstr "مجموع کاربران فعال" - -#: apps/account/templates/account/user_list_section.html:16 -msgid "Total Guest Users" -msgstr "مجموع کاربران مهمان" - -#: apps/account/templates/account/user_list_section.html:22 -msgid "Total Students" -msgstr "مجموع دانشجویان" - -#: apps/account/templates/account/user_list_section.html:28 -msgid "Total Professors" -msgstr "مجموع اساتید" - -#: apps/api/admin.py:27 -msgid "Dimensions" -msgstr "ابعاد" - -#: apps/api/admin.py:31 -msgid "Preview" -msgstr "پیش‌نمایش" - -#: apps/certificate/admin.py:23 apps/transaction/admin.py:37 -msgid "Timestamps" -msgstr "مهرهای زمانی" - -#: apps/certificate/admin.py:29 apps/course/admin/course.py:273 -#: apps/library/admin.py:20 apps/video/admin.py:78 -msgid "Status" -msgstr "وضعیت" - -#: apps/certificate/models.py:12 -msgid "pending" -msgstr " انتظار" - -#: apps/certificate/models.py:13 -msgid "approved" -msgstr "تأیید شده" - -#: apps/certificate/models.py:14 -msgid "canceled" -msgstr "لغو شده" - -#: apps/certificate/models.py:20 -msgid "certificate_file" -msgstr "فایل گواهینامه" - -#: apps/course/admin/course.py:97 -msgid "Course Weekly Schedule" -msgstr "برنامه هفتگی دوره" - -#: apps/course/admin/course.py:101 utils/schema.py:47 -msgid "Course Features" -msgstr "ویژگی‌های دوره" - -#: apps/course/admin/course.py:154 -msgid "Enrollment Details" -msgstr "جزئیات ثبت‌نام" - -#: apps/course/admin/course.py:179 apps/course/admin/course.py:293 -msgid "Course" -msgstr "دوره" - -#: apps/course/admin/course.py:191 -msgid "Participant" -msgstr "شرکت‌کننده" - -#: apps/course/admin/course.py:192 -msgid "Participants" -msgstr "شرکت‌کنندگان" - -#: apps/course/admin/course.py:222 -msgid "Select Student" -msgstr "انتخاب دانشجو" - -#: apps/course/admin/course.py:276 -msgid "Course Details" -msgstr "جزئیات دوره" - -#: apps/course/admin/course.py:280 -msgid "Media" -msgstr "رسانه" - -#: apps/course/admin/course.py:283 -msgid "Pricing" -msgstr "قیمت‌گذاری" - -#: apps/course/admin/course.py:286 -msgid "Timing & Features" -msgstr "زمان‌بندی و ویژگی‌ها" - -#: apps/course/admin/course.py:301 -msgid "No description" -msgstr "بدون توضیحات" - -#: apps/course/admin/course.py:316 apps/transaction/admin.py:49 -msgid "Price" -msgstr "قیمت" - -#: apps/course/admin/course.py:319 -msgid "Free" -msgstr "رایگان" - -#: apps/course/admin/course.py:340 -msgid "View Lessons" -msgstr "مشاهده دروس" - -#: apps/course/admin/course.py:351 apps/course/admin/course.py:386 -msgid "Course not found" -msgstr "دوره یافت نشد" - -#: apps/course/admin/course.py:376 -msgid "Add Student to Course" -msgstr "افزودن دانشجو به دوره" - -#: apps/course/admin/course.py:396 -#, python-brace-format -msgid "Student {student.fullname} is already enrolled in this course" -msgstr "دانشجو {student.fullname} قبلاً در این دوره ثبت‌نام کرده است" - -#: apps/course/admin/course.py:405 -#, python-brace-format -msgid "" -"Student {student.fullname} has been successfully added to {course.title}" -msgstr "دانشجو {student.fullname} با موفقیت به دوره {course.title} اضافه شد" - -#: apps/course/admin/course.py:418 -msgid "Change detail action for {}" -msgstr "تغییر عملیات جزئیات برای {}" - -#: apps/course/admin/lesson.py:59 apps/hadis/admin/hadis.py:148 -msgid "Content" -msgstr "محتوا" - -#: apps/course/admin/lesson.py:82 -msgid "Duration" -msgstr "مدت زمان" - -#: apps/course/models/course.py:69 -msgid "Thumbnail" -msgstr "تصویر بندانگشتی" - -#: apps/course/models/course.py:95 -msgid "Course Final Price" -msgstr "قیمت نهایی دوره" - -#: apps/course/models/course.py:96 -msgid "" -"This field is automatically calculated based on the discount percentage." -msgstr "این فیلد به صورت خودکار بر اساس درصد تخفیف محاسبه می‌شود." - -#: apps/course/models/course.py:99 -msgid "Timing" -msgstr "زمان‌بندی" - -#: apps/course/models/course.py:100 -msgid "Course features" -msgstr "ویژگی‌های دوره" - -#: apps/course/models/course.py:101 apps/course/models/lesson.py:35 -#: apps/course/models/lesson.py:98 apps/transaction/models.py:20 -msgid "Created at" -msgstr "ایجاد شده در" - -#: apps/course/models/course.py:102 apps/course/models/lesson.py:36 -msgid "Updated At" -msgstr "به‌روزرسانی شده در" - -#: apps/course/models/lesson.py:25 -msgid "Is Active" -msgstr "فعال است" - -#: apps/course/templates/course/add_student_form.html:25 -msgid "Submit form" -msgstr "ارسال فرم" - -#: apps/hadis/admin/category.py:38 apps/hadis/models/category.py:21 -msgid "Source Type" -msgstr "نوع منبع" - -#: apps/hadis/admin/category.py:69 -msgid "This item can not be modified" -msgstr "این مورد قابل تغییر نیست" - -#: apps/hadis/admin/category.py:198 -msgid "Category saved successfully. Tree will be reloaded." -msgstr "دسته‌بندی با موفقیت ذخیره شد. درخت مجدداً بارگذاری خواهد شد." - -#: apps/hadis/admin/hadis.py:17 -msgid "Red" -msgstr "قرمز" - -#: apps/hadis/admin/hadis.py:18 -msgid "Blue" -msgstr "آبی" - -#: apps/hadis/admin/hadis.py:19 -msgid "Green" -msgstr "سبز" - -#: apps/hadis/admin/hadis.py:20 -msgid "Yellow" -msgstr "زرد" - -#: apps/hadis/admin/hadis.py:21 -msgid "Orange" -msgstr "نارنجی" - -#: apps/hadis/admin/hadis.py:22 -msgid "Purple" -msgstr "بنفش" - -#: apps/hadis/admin/hadis.py:23 -msgid "Pink" -msgstr "صورتی" - -#: apps/hadis/admin/hadis.py:24 -msgid "Brown" -msgstr "قهوه‌ای" - -#: apps/hadis/admin/hadis.py:25 -msgid "Gray" -msgstr "خاکستری" - -#: apps/hadis/admin/hadis.py:26 -msgid "Black" -msgstr "سیاه" - -#: apps/hadis/admin/hadis.py:41 -msgid "Link" -msgstr "پیوند" - -#: apps/hadis/admin/hadis.py:43 apps/hadis/models/hadis.py:22 -msgid "text" -msgstr "متن" - -#: apps/hadis/admin/hadis.py:44 -msgid "link" -msgstr "پیوند" - -#: apps/hadis/admin/hadis.py:76 apps/hadis/models/hadis.py:91 -msgid "Reference Images" -msgstr "تصاویر مرجع" - -#: apps/hadis/admin/hadis.py:109 -msgid "Reference Information" -msgstr "اطلاعات مرجع" - -#: apps/hadis/admin/hadis.py:112 -msgid "Additional Information" -msgstr "اطلاعات تکمیلی" - -#: apps/hadis/admin/hadis.py:125 -msgid "Hadis Overview" -msgstr "نمای کلی حدیث" - -#: apps/hadis/models/category.py:9 -#: apps/hadis/templates/admin/category_index.html:25 -msgid "Shia" -msgstr "شیعه" - -#: apps/hadis/models/category.py:10 -#: apps/hadis/templates/admin/category_index.html:31 -msgid "Sunni" -msgstr "سنی" - -#: apps/hadis/models/category.py:13 -#: apps/hadis/templates/admin/category_index.html:158 -msgid "Quran" -msgstr "قرآن" - -#: apps/hadis/models/category.py:14 -#: apps/hadis/templates/admin/category_index.html:161 -msgid "Hadith" -msgstr "حدیث" - -#: apps/hadis/models/category.py:17 -msgid "Level 1 (Root)" -msgstr "سطح ۱ (ریشه)" - -#: apps/hadis/models/category.py:18 -msgid "Level 2 (Child)" -msgstr "سطح ۲ (فرزند)" - -#: apps/hadis/models/category.py:19 -msgid "Level 3 (Grandchild)" -msgstr "سطح ۳ (نوه)" - -#: apps/hadis/models/category.py:22 -msgid "Category Content Type" -msgstr "نوع محتوای دسته‌بندی" - -#: apps/hadis/models/category.py:23 -msgid "name" -msgstr "نام" - -#: apps/hadis/models/category.py:24 apps/library/models.py:23 -#: apps/podcast/models.py:10 apps/video/models.py:11 -msgid "order" -msgstr "ترتیب" - -#: apps/hadis/models/category.py:34 -msgid "Hadis Category" -msgstr "دسته‌بندی حدیث" - -#: apps/hadis/models/category.py:35 -msgid "Hadis Categories" -msgstr "دسته‌بندی‌های حدیث" - -#: apps/hadis/models/category.py:54 -msgid "Level 1 cannot have content type" -msgstr "سطح ۱ نمی‌تواند نوع محتوا داشته باشد" - -#: apps/hadis/models/category.py:57 -msgid "Level 2 must have content type" -msgstr "سطح ۲ باید نوع محتوا داشته باشد" - -#: apps/hadis/models/category.py:60 -msgid "Level 3 cannot have source/content type" -msgstr "سطح ۳ نمی‌تواند نوع منبع/محتوا داشته باشد" - -#: apps/hadis/models/hadis.py:11 apps/hadis/models/hadis.py:45 -#: apps/hadis/models/transmitter.py:15 apps/library/models.py:22 -#: apps/library/models.py:67 apps/library/models.py:100 -#: apps/podcast/models.py:9 apps/podcast/models.py:76 apps/video/models.py:10 -#: apps/video/models.py:26 apps/video/models.py:83 -msgid "status" -msgstr "وضعیت" - -#: apps/hadis/models/hadis.py:20 -msgid "number" -msgstr "شماره" - -#: apps/hadis/models/hadis.py:23 -msgid "translation" -msgstr "ترجمه" - -#: apps/hadis/models/hadis.py:25 -msgid "category" -msgstr "دسته‌بندی" - -#: apps/hadis/models/hadis.py:27 -msgid "visibility" -msgstr "قابلیت مشاهده" - -#: apps/hadis/models/hadis.py:39 apps/hadis/models/hadis.py:61 -#: apps/hadis/models/transmitter.py:29 -msgid "hadis" -msgstr "حدیث" - -#: apps/hadis/models/hadis.py:40 -msgid "hadises" -msgstr "احادیث" - -#: apps/hadis/models/hadis.py:46 apps/hadis/models/transmitter.py:16 -msgid "Display Status Color" -msgstr "رنگ نمایش وضعیت" - -#: apps/hadis/models/hadis.py:47 -msgid "Status Text" -msgstr "متن وضعیت" - -#: apps/hadis/models/hadis.py:48 -msgid "address" -msgstr "آدرس" - -#: apps/hadis/models/hadis.py:50 -msgid "tags" -msgstr "برچسب‌ها" - -#: apps/hadis/models/hadis.py:51 -msgid "share link" -msgstr "پیوند اشتراک‌گذاری" - -#: apps/hadis/models/hadis.py:52 -msgid "explanation" -msgstr "توضیح" - -#: apps/hadis/models/hadis.py:64 -msgid "book" -msgstr "کتاب" - -#: apps/hadis/models/hadis.py:65 apps/hadis/models/transmitter.py:38 -msgid "description" -msgstr "توضیحات" - -#: apps/hadis/models/hadis.py:69 -msgid "Hadis Reference" -msgstr "مرجع حدیث" - -#: apps/hadis/models/hadis.py:70 -msgid "Hadis References" -msgstr "مراجع حدیث" - -#: apps/hadis/models/hadis.py:80 -msgid "thumbnail" -msgstr "تصویر بندانگشتی" - -#: apps/hadis/models/hadis.py:84 -msgid "Priority" -msgstr "اولویت" - -#: apps/hadis/models/hadis.py:85 -msgid "Priority of the image, lower values mean higher priority." -msgstr "اولویت تصویر، مقادیر کمتر به معنای اولویت بالاتر است." - -#: apps/hadis/models/hadis.py:90 -msgid "Reference Image" -msgstr "تصویر مرجع" - - -#: apps/hadis/models/transmitter.py:18 apps/library/models.py:97 -#: apps/podcast/models.py:66 apps/video/models.py:68 -msgid "image allowed" -msgstr "" - -#: apps/hadis/models/transmitter.py:35 -msgid "transmitter" -msgstr "" - -#: apps/hadis/models/transmitter.py:41 -msgid "Order" -msgstr "" - -#: apps/hadis/models/transmitter.py:42 -msgid "Order in the chain of transmission" -msgstr "" - -#: apps/hadis/models/transmitter.py:47 -msgid "Hadis Transmitter" -msgstr "" - -#: apps/hadis/models/transmitter.py:48 -msgid "Hadis Transmitters" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:11 -msgid "Category Tree Editor" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:15 -msgid "" -"Make your category and sort it by drag and drop . and try to edit items by " -"double click." -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:62 -msgid "Parent: " -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:70 -msgid "Category Level:" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:77 -msgid "L1" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:83 -msgid "L2" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:89 -msgid "L3" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:99 -msgid "Level 1 categories represent source types: Shia or Sunni" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:106 -msgid "" -"Level 2 categories are children of Shia/Sunni with content type: Quran or " -"Hadith" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:113 -msgid "Level 3 categories are children of Quran or Hadith categories" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:127 -msgid "Parent Category:" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:130 -msgid "-- Select Parent Category --" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:134 -msgid "Select a parent category or leave empty for top-level category" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:916 -msgid "Search for a category..." -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:925 -msgid "No categories found" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:928 -msgid "Searching..." -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:931 -msgid "Type to search..." -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1021 -#: apps/hadis/templates/admin/category_index.html:1190 -msgid "Level 1 Categories" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1028 -#: apps/hadis/templates/admin/category_index.html:1197 -msgid "Level 2 Categories" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1035 -#: apps/hadis/templates/admin/category_index.html:1204 -msgid "Level 3 Categories" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1344 -msgid "Level 1 must have a source type" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1347 -msgid "Level 2 must have a category type" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1423 -#: apps/hadis/templates/admin/category_index.html:1498 -#: apps/hadis/templates/admin/category_index.html:1719 -#: apps/hadis/templates/admin/category_index.html:2119 -msgid "Add Child Category" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:1992 -msgid "No Items Found" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:2206 -#: apps/hadis/templates/admin/category_index.html:2214 -msgid "No Quran categories" -msgstr "" - -#: apps/hadis/templates/admin/category_index.html:2210 -#: apps/hadis/templates/admin/category_index.html:2215 -msgid "No Hadith categories" -msgstr "" - -#: apps/hadis/templates/admin/hadiscategory/change_form.html:28 -msgid "Add Category" -msgstr "" - -#: apps/hadis/templates/admin/hadisowerview_change_form.html:8 -msgid "Save And Edit Next Hadis" -msgstr "" - -#: apps/hadis/templates/admin/hadisowerview_change_form.html:12 -msgid "Save And Edit Previus Hadis" -msgstr "" - -#: apps/hadis/templates/admin/hadisowerview_change_form.html:16 -msgid "Save And Edit Random" -msgstr "" - -#: apps/library/admin.py:23 -msgid "File Information" -msgstr "" - -#: apps/library/admin.py:26 -msgid "Relations" -msgstr "" - -#: apps/library/admin.py:29 apps/video/admin.py:81 -msgid "Statistics" -msgstr "" - -#: apps/library/admin.py:48 apps/library/models.py:24 -#: apps/library/models.py:128 -msgid "Books" -msgstr "" - -#: apps/library/admin.py:57 utils/keyval_field.py:39 utils/keyval_field.py:59 -#: utils/keyval_field.py:76 utils/keyval_field.py:139 utils/keyval_field.py:167 -#: utils/schema.py:49 -msgid "Title" -msgstr "" - -#: apps/library/admin.py:60 apps/library/admin.py:185 -msgid "Number of Books" -msgstr "" - -#: apps/library/apps.py:8 -msgid "Library" -msgstr "" - -#: apps/library/models.py:10 -msgid "Pinned" -msgstr "" - -#: apps/library/models.py:11 -msgid "Middle Section" -msgstr "" - -#: apps/library/models.py:12 -msgid "Bottom Section" -msgstr "" - -#: apps/library/models.py:15 apps/library/models.py:95 -#: apps/library/models.py:96 -msgid "could be null" -msgstr "" - -#: apps/library/models.py:20 -msgid "Display Position" -msgstr "" - -#: apps/library/models.py:30 -msgid "Book Collection" -msgstr "" - -#: apps/library/models.py:31 -msgid "Book Collections" -msgstr "" - -#: apps/library/models.py:40 -msgid "Pinned Book Collection" -msgstr "" - -#: apps/library/models.py:41 -msgid "Pinned Book Collections" -msgstr "" - -#: apps/library/models.py:50 -msgid "Middle Section Book Collection" -msgstr "" - -#: apps/library/models.py:51 -msgid "Middle Section Book Collections" -msgstr "" - -#: apps/library/models.py:60 -msgid "Bottom Section Book Collection" -msgstr "" - -#: apps/library/models.py:61 -msgid "Bottom Section Book Collections" -msgstr "" - -#: apps/library/models.py:82 -msgid "Category" -msgstr "" - -#: apps/library/models.py:83 config/settings/base.py:552 -msgid "Categories" -msgstr "" - -#: apps/library/models.py:99 -msgid "Number of Pages" -msgstr "" - -#: apps/library/models.py:99 -msgid "eg. 34" -msgstr "" - -#: apps/library/models.py:101 -msgid "Pin to top" -msgstr "" - -#: apps/library/models.py:103 apps/podcast/models.py:68 apps/video/models.py:73 -msgid "categories" -msgstr "" - -#: apps/library/models.py:104 -msgid "collections" -msgstr "" - -#: apps/library/models.py:107 apps/library/models.py:108 -#: apps/podcast/models.py:73 apps/podcast/models.py:74 apps/video/models.py:81 -msgid "view count" -msgstr "" - -#: apps/library/models.py:111 -msgid "File Type" -msgstr "" - -#: apps/library/models.py:127 -msgid "Book" -msgstr "" - -#: apps/podcast/models.py:7 apps/video/models.py:8 -msgid "slug" -msgstr "" - -#: apps/podcast/models.py:18 apps/video/models.py:19 -msgid "Video Category" -msgstr "" - -#: apps/podcast/models.py:19 apps/video/models.py:20 -msgid "Video Categories" -msgstr "" - -#: apps/podcast/models.py:32 apps/podcast/models.py:48 -msgid "podcasts" -msgstr "" - -#: apps/podcast/models.py:39 -msgid "Podcast Collection" -msgstr "" - -#: apps/podcast/models.py:40 -msgid "Podcasts Collections" -msgstr "" - -#: apps/podcast/models.py:45 -msgid "podcast collection" -msgstr "" - -#: apps/podcast/models.py:50 apps/video/models.py:50 -msgid "priority" -msgstr "" - -#: apps/podcast/models.py:56 -msgid "Podcast in Collection" -msgstr "" - -#: apps/podcast/models.py:57 -msgid "Podcasts in Collection" -msgstr "" - -#: apps/podcast/models.py:85 -msgid "Podcast" -msgstr "" - -#: apps/podcast/models.py:86 -msgid "Podcasts" -msgstr "" - -#: apps/quiz/admin/participant.py:35 -msgid "User Email" -msgstr "" - -#: apps/quiz/models/quiz.py:8 -msgid "lesson" -msgstr "" - -#: apps/transaction/admin.py:43 -msgid "Payment Status" -msgstr "" - -#: apps/transaction/models.py:21 -msgid "Updated at" -msgstr "" - -#: apps/transaction/models.py:39 -msgid "phone" -msgstr "" - -#: apps/video/admin.py:31 apps/video/admin.py:55 -msgid "Number of Videos" -msgstr "" - -#: apps/video/admin.py:75 -msgid "Video Information" -msgstr "" - -#: apps/video/models.py:33 -msgid "videos" -msgstr "" - -#: apps/video/models.py:39 -msgid "Video Collection" -msgstr "" - -#: apps/video/models.py:40 -msgid "Video Collections" -msgstr "" - -#: apps/video/models.py:45 -msgid "video collection" -msgstr "" - -#: apps/video/models.py:48 -msgid "video" -msgstr "" - -#: apps/video/models.py:56 -msgid "Video in Collection" -msgstr "" - -#: apps/video/models.py:57 -msgid "Videos in Collection" -msgstr "" - -#: apps/video/models.py:99 -msgid "Video" -msgstr "" - -#: apps/video/models.py:100 -msgid "Videos" -msgstr "" - -#: config/settings/base.py:198 -msgid "English" -msgstr "" - -#: config/settings/base.py:199 -msgid "Persian" -msgstr "" - -#: config/settings/base.py:200 -msgid "Russia" -msgstr "" - -#: config/settings/base.py:323 config/settings/base.py:324 -msgid "Imam Jawad Admin" -msgstr "" - -#: config/settings/base.py:325 -msgid "Imam Jawad Online School" -msgstr "" - -#: config/settings/base.py:329 -msgid "Imam Javad Site" -msgstr "" - -#: config/settings/base.py:409 config/settings/base.py:510 -msgid "Users" -msgstr "" - -#: config/settings/base.py:417 -msgid "Guest Users" -msgstr "" - -#: config/settings/base.py:429 -msgid "Groups" -msgstr "" - -#: config/settings/base.py:453 -msgid "Lessons" -msgstr "" - -#: config/settings/base.py:459 -msgid "Attachments" -msgstr "" - -#: config/settings/base.py:465 -msgid "Glossary" -msgstr "" - -#: config/settings/base.py:471 -msgid "Quizzes" -msgstr "" - -#: config/settings/base.py:489 templates/admin/index.html:8 utils/admin.py:105 -msgid "Dashboard" -msgstr "" - -#: config/settings/base.py:499 -msgid "Authentication" -msgstr "" - -#: config/settings/base.py:521 -msgid "Students" -msgstr "" - -#: config/settings/base.py:533 -msgid "Professors" -msgstr "" - -#: config/settings/base.py:557 -msgid "Certificates" -msgstr "" - -#: config/settings/base.py:579 config/settings/base.py:584 -msgid "Transactions" -msgstr "" - -#: templates/admin/auth/user/change_password.html:10 -msgid "Home" -msgstr "" - -#: templates/admin/auth/user/change_password.html:14 -#: templates/admin/auth/user/change_password.html:52 -msgid "Change password" -msgstr "" - -#: templates/admin/auth/user/change_password.html:25 -msgid "Please correct the error below." -msgstr "" - -#: templates/admin/auth/user/change_password.html:25 -msgid "Please correct the errors below." -msgstr "" - -#: templates/admin/auth/user/change_password.html:29 -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -#: templates/admin/base_site.html:3 templates/admin/index.html:8 -msgid "Django site admin" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:4 -#: templates/admin/filer/folder/directory_table.html:160 -msgid "Unsorted Uploads" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:13 -#: utils/keyval_field.py:118 -msgid "Name" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:14 -msgid "Owner" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:15 -msgid "Size" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:16 -msgid "Action" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:25 -#: templates/admin/filer/folder/directory_table.html:32 -#: templates/admin/filer/folder/directory_table.html:55 -#: templates/admin/filer/folder/directory_table.html:62 -#, python-format -msgid "Change '%(item_label)s' folder details" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:26 -#: templates/admin/filer/folder/directory_table.html:56 -#: templates/admin/filer/folder/directory_table.html:167 -msgid "Folder Icon" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:73 -#, python-format -msgid "%(counter)s folder" -msgid_plural "%(counter)s folders" -msgstr[0] "" -msgstr[1] "" - -#: templates/admin/filer/folder/directory_table.html:74 -#, python-format -msgid "%(counter)s file" -msgid_plural "%(counter)s files" -msgstr[0] "" -msgstr[1] "" - -#: templates/admin/filer/folder/directory_table.html:80 -msgid "Change folder details" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:81 -msgid "Remove folder" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:93 -#: templates/admin/filer/folder/directory_table.html:102 -#: templates/admin/filer/folder/directory_table.html:117 -msgid "Select this file" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:105 -#: templates/admin/filer/folder/directory_table.html:120 -#: templates/admin/filer/folder/directory_table.html:146 -#, python-format -msgid "Change '%(item_label)s' details" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:129 -msgid "disabled" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:129 -msgid "enabled" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:142 -#, python-format -msgid "Canonical url '%(item_label)s'" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:144 -#, python-format -msgid "Download '%(item_label)s'" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:147 -msgid "Remove file" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:154 -msgid "Drop files here or use the \"Upload Files\" button" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:164 -msgid "Drop your file to upload into:" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:174 -msgid "Upload" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:186 -msgid "cancel" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:190 -msgid "Upload success!" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:194 -msgid "Upload canceled!" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:201 -msgid "previous" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:206 -#, python-format -msgid "Page %(number)s of %(num_pages)s." -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:211 -msgid "next" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:221 -msgid "Click here to select the objects across all pages" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:221 -#, python-format -msgid "Select all %(total_count)s" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:223 -msgid "Clear selection" -msgstr "" - -#: templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "" - -#: templates/docs.html:4 -msgid "Django site adminssss" -msgstr "" - -#: utils/__init__.py:75 -msgid "Development" -msgstr "" - -#: utils/__init__.py:77 -msgid "Production" -msgstr "" - -#: utils/admin.py:106 -msgid "Analytics" -msgstr "" - -#: utils/admin.py:107 -msgid "Settings" -msgstr "" - -#: utils/admin.py:110 -msgid "All" -msgstr "" - -#: utils/admin.py:112 -msgid "New" -msgstr "" - -#: utils/admin.py:222 -msgid "Last week revenue" -msgstr "" - -#: utils/admin.py:240 -msgid "Last week expenses" -msgstr "" - -#: utils/keyval_field.py:16 utils/keyval_field.py:37 utils/keyval_field.py:74 -#: utils/keyval_field.py:94 utils/keyval_field.py:116 utils/keyval_field.py:137 -msgid "Translation" -msgstr "" - -#: utils/keyval_field.py:18 utils/keyval_field.py:96 -msgid "Detail" -msgstr "" - -#: utils/keyval_field.py:23 utils/keyval_field.py:44 utils/keyval_field.py:81 -#: utils/keyval_field.py:101 utils/keyval_field.py:123 -#: utils/keyval_field.py:144 -msgid "Language Code" -msgstr "" - -#: utils/keyval_field.py:57 -msgid "Tour Features" -msgstr "" - -#: utils/keyval_field.py:162 utils/keyval_field.py:172 -msgid "Description" -msgstr "" - - -msgid "Shia" -msgstr "شیعه" - -msgid "Sunni" -msgstr "سنی" - -msgid "Hanafi" -msgstr "حنفی" - -msgid "Maliki" -msgstr "مالکی" - -msgid "Shafi'i" -msgstr "شافعی" - -msgid "Hanbali" -msgstr "حنبلی" - -msgid "Other" -msgstr "سایر" \ No newline at end of file diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po index c9d15d8..a9f3a04 100644 --- a/locale/ru/LC_MESSAGES/django.po +++ b/locale/ru/LC_MESSAGES/django.po @@ -3,19 +3,17 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#: config/settings/base.py:485 config/settings/base.py:496 -#: config/settings/base.py:507 config/settings/base.py:518 -#: config/settings/base.py:530 -#, fuzzy +#: .\config\settings\base.py:580 .\config\settings\base.py:599 +#: .\config\settings\base.py:665 .\utils\schema.py:64 msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-04-04 06:07+0330\n" +"POT-Creation-Date: 2026-05-03 16:36+0330\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" +"Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,1307 +21,3845 @@ msgstr "" "n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " "(n%100>=11 && n%100<=14)? 2 : 3);\n" -#: apps/account/admin/professor.py:59 apps/account/admin/student.py:46 +#: .\apps\account\admin\location.py:21 .\apps\account\admin\location.py:22 +msgid "Location History" +msgstr "История местоположений" + +#: .\apps\account\admin\location.py:42 .\apps\hadis\admin\hadis.py:683 +#: .\apps\hadis\admin\hadis.py:939 .\apps\hadis\admin\transmitter.py:481 +#: .\apps\hadis\admin\transmitter.py:671 +msgid "Additional Information" +msgstr "Дополнительная информация" + +#: .\apps\account\admin\location.py:48 .\apps\account\admin\user.py:83 +#: .\apps\account\admin\user.py:246 +msgid "Location" +msgstr "Местоположение" + +#: .\apps\account\admin\location.py:52 +msgid "Date & Time" +msgstr "Дата и время" + +#: .\apps\account\admin\professor.py:59 .\apps\account\admin\student.py:45 msgid "Personal info" -msgstr "" +msgstr "Личная информация" -#: apps/account/admin/professor.py:60 apps/account/admin/student.py:47 -#: apps/account/admin/user.py:72 apps/account/admin/user.py:99 -#: apps/account/admin/user.py:288 apps/account/admin/user.py:291 -#: templates/admin/filer/folder/directory_table.html:129 +#: .\apps\account\admin\professor.py:60 .\apps\account\admin\student.py:46 +#: .\apps\account\admin\user.py:91 .\apps\account\admin\user.py:115 +#: .\apps\account\admin\user.py:138 .\apps\account\admin\user.py:401 +#: .\apps\account\admin\user.py:463 .\apps\account\admin\user.py:466 +#: .\templates\admin\filer\folder\directory_table.html:129 msgid "Permissions" -msgstr "" +msgstr "Права доступа" -#: apps/account/admin/professor.py:63 apps/account/admin/student.py:50 -#: apps/account/admin/user.py:105 +#: .\apps\account\admin\professor.py:63 .\apps\account\admin\student.py:49 +#: .\apps\account\admin\user.py:119 msgid "Important dates" -msgstr "" +msgstr "Важные даты" -#: apps/account/admin/user.py:64 apps/account/admin/user.py:166 -msgid "Location" -msgstr "" +#: .\apps\account\admin\student.py:55 +msgid "Enrolled Courses" +msgstr "Записанные курсы" + +#: .\apps\account\admin\user.py:47 +msgid "A user with this email already exists." +msgstr "Пользователь с таким email уже существует." -#: apps/account/admin/user.py:68 +#: .\apps\account\admin\user.py:87 msgid "Password" -msgstr "" +msgstr "Пароль" -#: apps/account/admin/user.py:80 +#: .\apps\account\admin\user.py:99 .\apps\account\admin\user.py:143 +#: .\apps\blog\admin.py:67 .\apps\blog\admin.py:109 msgid "Basic Information" -msgstr "" +msgstr "Основная информация" -#: apps/account/admin/user.py:87 +#: .\apps\account\admin\user.py:103 msgid "Country & City" -msgstr "" +msgstr "Страна и город" -#: apps/account/admin/user.py:93 +#: .\apps\account\admin\user.py:107 msgid "Device Information" -msgstr "" +msgstr "Информация об устройстве" -#: apps/account/admin/user.py:122 apps/account/admin/user.py:147 +#: .\apps\account\admin\user.py:111 .\config\settings\base.py:603 +msgid "Authentication" +msgstr "Аутентификация" + +#: .\apps\account\admin\user.py:159 .\apps\account\admin\user.py:196 msgid "Date Joined" -msgstr "" +msgstr "Дата регистрации" -#: apps/account/admin/user.py:126 +#: .\apps\account\admin\user.py:163 msgid "Last Login" -msgstr "" +msgstr "Последний вход" + +#: .\apps\account\admin\user.py:167 +msgid "Authentication Token" +msgstr "Токен аутентификации" + +#: .\apps\account\admin\user.py:207 +msgid "Course Participation" +msgstr "Участие в курсе" + +#: .\apps\account\admin\user.py:208 +msgid "Course Participations" +msgstr "Участия в курсах" + +#: .\apps\account\admin\user.py:216 .\apps\course\models\course.py:95 +#: .\templates\course\course_stats.html:106 +msgid "Course Status" +msgstr "Статус курса" -#: apps/account/admin/user.py:170 +#: .\apps\account\admin\user.py:222 .\apps\account\admin\user.py:407 +#: .\apps\course\admin\course.py:287 +msgid "Professor" +msgstr "Профессор" + +#: .\apps\account\admin\user.py:250 msgid "password" -msgstr "" +msgstr "пароль" -#: apps/account/admin/user.py:177 apps/course/admin/course.py:159 +#: .\apps\account\admin\user.py:257 .\apps\course\admin\course.py:485 +#: .\apps\course\models\lesson.py:125 .\apps\course\models\participant.py:13 +#: .\templates\course\course_analytics.html:186 msgid "Student" -msgstr "" +msgstr "Студент" -#: apps/account/admin/user.py:197 +#: .\apps\account\admin\user.py:272 msgid "Age" -msgstr "" +msgstr "Возраст" -#: apps/account/admin/user.py:217 apps/account/admin/user.py:349 -#: apps/course/admin/course.py:79 config/settings/base.py:447 -#: config/settings/base.py:542 config/settings/base.py:547 +#: .\apps\account\admin\user.py:283 .\apps\account\admin\user.py:423 +#: .\apps\course\admin\course.py:64 .\apps\course\models\course.py:154 +#: .\config\settings\base.py:480 .\config\settings\base.py:630 +#: .\config\settings\base.py:642 msgid "Courses" -msgstr "" +msgstr "Курсы" -#: apps/account/admin/user.py:298 apps/course/admin/course.py:45 +#: .\apps\account\admin\user.py:307 .\apps\account\admin\user.py:446 +msgid "courses" +msgstr "курсы" + +#: .\apps\account\admin\user.py:320 .\apps\course\admin\course.py:35 msgid "Course Categories" -msgstr "" +msgstr "Категории курсов" -#: apps/account/admin/user.py:317 apps/course/admin/course.py:64 +#: .\apps\account\admin\user.py:332 .\apps\course\admin\course.py:51 msgid "Edit" -msgstr "" +msgstr "Редактировать" -#: apps/account/admin/user.py:329 apps/course/admin/course.py:312 -msgid "Professor" -msgstr "" +#: .\apps\account\admin\user.py:338 +msgid "Select Existing User" +msgstr "Выбрать существующего пользователя" + +#: .\apps\account\admin\user.py:339 +msgid "Choose an existing user to upgrade to Professor." +msgstr "Выберите существующего пользователя, чтобы назначить его профессором." -#: apps/account/models/notification.py:10 apps/hadis/models/hadis.py:10 -#: apps/hadis/models/hadis.py:21 apps/hadis/models/hadis.py:49 -#: apps/podcast/models.py:6 apps/quiz/models/quiz.py:9 apps/video/models.py:7 +#: .\apps\account\admin\user.py:469 +msgid "permissions" +msgstr "права доступа" + +#: .\apps\account\middleware\admin_access.py:107 +msgid "You have limited access as a professor." +msgstr "У вас ограниченный доступ как у профессора." + +#: .\apps\account\middleware\admin_access.py:115 +msgid "You do not have permission to access this page." +msgstr "У вас нет прав для доступа к этой странице." + +#: .\apps\account\models\notification.py:10 .\apps\article\models.py:9 +#: .\apps\article\models.py:184 .\apps\dobodbi_calendar\models.py:20 +#: .\apps\podcast\models.py:9 .\apps\podcast\models.py:128 +#: .\apps\video\models.py:11 .\apps\video\models.py:144 msgid "title" -msgstr "" +msgstr "название" -#: apps/account/models/notification.py:11 +#: .\apps\account\models\notification.py:11 msgid "message" -msgstr "" +msgstr "сообщение" -#: apps/account/models/notification.py:12 +#: .\apps\account\models\notification.py:12 .\apps\library\models.py:171 +#: .\apps\podcast\models.py:255 msgid "user" -msgstr "" +msgstr "пользователь" -#: apps/account/models/notification.py:13 +#: .\apps\account\models\notification.py:13 msgid "is read" -msgstr "" +msgstr "прочитано" -#: apps/account/models/notification.py:18 +#: .\apps\account\models\notification.py:18 msgid "service" -msgstr "" - -#: apps/account/models/notification.py:20 apps/hadis/models/hadis.py:28 -#: apps/hadis/models/hadis.py:54 apps/hadis/models/hadis.py:66 -#: apps/hadis/models/transmitter.py:44 apps/library/models.py:70 -#: apps/library/models.py:114 apps/podcast/models.py:11 -#: apps/podcast/models.py:26 apps/podcast/models.py:78 apps/video/models.py:12 -#: apps/video/models.py:27 apps/video/models.py:85 +msgstr "сервис" + +#: .\apps\account\models\notification.py:20 .\apps\article\models.py:14 +#: .\apps\article\models.py:50 .\apps\article\models.py:109 +#: .\apps\article\models.py:161 .\apps\article\models.py:189 +#: .\apps\article\models.py:213 .\apps\article\models.py:239 +#: .\apps\dobodbi_calendar\models.py:39 .\apps\hadis\models\hadis.py:20 +#: .\apps\hadis\models\hadis.py:128 .\apps\hadis\models\hadis.py:143 +#: .\apps\hadis\models\hadis.py:285 .\apps\hadis\models\hadis.py:424 +#: .\apps\hadis\models\hadis.py:493 .\apps\hadis\models\reference.py:9 +#: .\apps\hadis\models\reference.py:35 .\apps\hadis\models\reference.py:83 +#: .\apps\hadis\models\reference.py:217 .\apps\hadis\models\reference.py:261 +#: .\apps\hadis\models\reference.py:304 .\apps\hadis\models\transmitter.py:24 +#: .\apps\hadis\models\transmitter.py:280 +#: .\apps\hadis\models\transmitter.py:450 +#: .\apps\hadis\models\transmitter.py:580 .\apps\library\models.py:75 +#: .\apps\library\models.py:138 .\apps\library\models.py:174 +#: .\apps\podcast\models.py:14 .\apps\podcast\models.py:50 +#: .\apps\podcast\models.py:98 .\apps\podcast\models.py:153 +#: .\apps\podcast\models.py:202 .\apps\podcast\models.py:230 +#: .\apps\podcast\models.py:264 .\apps\video\models.py:16 +#: .\apps\video\models.py:52 .\apps\video\models.py:107 +#: .\apps\video\models.py:169 .\apps\video\models.py:218 +#: .\apps\video\models.py:246 msgid "created at" -msgstr "" - -#: apps/account/models/notification.py:21 apps/hadis/models/hadis.py:29 -#: apps/library/models.py:71 apps/library/models.py:115 -#: apps/podcast/models.py:12 apps/podcast/models.py:27 -#: apps/podcast/models.py:79 apps/video/models.py:13 apps/video/models.py:28 -#: apps/video/models.py:86 +msgstr "создано" + +#: .\apps\account\models\notification.py:21 .\apps\article\models.py:15 +#: .\apps\article\models.py:51 .\apps\article\models.py:110 +#: .\apps\article\models.py:162 .\apps\article\models.py:190 +#: .\apps\article\models.py:214 .\apps\article\models.py:240 +#: .\apps\dobodbi_calendar\models.py:38 .\apps\hadis\models\hadis.py:21 +#: .\apps\hadis\models\hadis.py:144 .\apps\hadis\models\hadis.py:286 +#: .\apps\hadis\models\hadis.py:494 .\apps\hadis\models\reference.py:10 +#: .\apps\hadis\models\reference.py:36 .\apps\hadis\models\reference.py:84 +#: .\apps\hadis\models\reference.py:262 .\apps\hadis\models\reference.py:305 +#: .\apps\hadis\models\transmitter.py:25 .\apps\hadis\models\transmitter.py:281 +#: .\apps\hadis\models\transmitter.py:581 .\apps\library\models.py:76 +#: .\apps\library\models.py:139 .\apps\library\models.py:175 +#: .\apps\podcast\models.py:15 .\apps\podcast\models.py:51 +#: .\apps\podcast\models.py:99 .\apps\podcast\models.py:154 +#: .\apps\podcast\models.py:203 .\apps\podcast\models.py:231 +#: .\apps\podcast\models.py:265 .\apps\video\models.py:17 +#: .\apps\video\models.py:53 .\apps\video\models.py:108 +#: .\apps\video\models.py:170 .\apps\video\models.py:219 +#: .\apps\video\models.py:247 msgid "updated at" -msgstr "" +msgstr "обновлено" -#: apps/account/models/user.py:34 apps/transaction/models.py:43 +#: .\apps\account\models\user.py:35 +msgid "Username" +msgstr "Имя пользователя" + +#: .\apps\account\models\user.py:36 +msgid "A user with that username already exists." +msgstr "Пользователь с таким именем уже существует." + +#: .\apps\account\models\user.py:37 .\apps\transaction\models.py:76 +msgid "Email Address" +msgstr "Email адрес" + +#: .\apps\account\models\user.py:38 .\apps\transaction\models.py:76 +msgid "Enter the user's email address." +msgstr "Введите email адрес пользователя." + +#: .\apps\account\models\user.py:40 +msgid "A user with that email already exists." +msgstr "Пользователь с таким email уже существует." + +#: .\apps\account\models\user.py:41 .\apps\hadis\admin\transmitter.py:490 +#: .\apps\hadis\models\transmitter.py:233 .\apps\transaction\models.py:75 +msgid "Full Name" +msgstr "Полное имя" + +#: .\apps\account\models\user.py:42 .\apps\transaction\models.py:75 +msgid "Enter the full name of the user." +msgstr "Введите полное имя пользователя." + +#: .\apps\account\models\user.py:44 .\apps\transaction\models.py:81 msgid "birthdate" -msgstr "" +msgstr "дата рождения" -#: apps/account/models/user.py:41 +#: .\apps\account\models\user.py:51 msgid "Phone Number" -msgstr "" +msgstr "Номер телефона" -#: apps/account/models/user.py:46 apps/transaction/models.py:41 +#: .\apps\account\models\user.py:56 .\apps\transaction\models.py:79 msgid "Gender" -msgstr "" +msgstr "Пол" -#: apps/account/models/user.py:50 +#: .\apps\account\models\user.py:60 msgid "City" -msgstr "" +msgstr "Город" -#: apps/account/models/user.py:51 apps/account/models/user.py:121 +#: .\apps\account\models\user.py:61 .\apps\account\models\user.py:301 +#: .\apps\account\models\user.py:314 msgid "country" -msgstr "" +msgstr "страна" -#: apps/account/models/user.py:53 +#: .\apps\account\models\user.py:63 msgid "device id" -msgstr "" +msgstr "id устройства" + +#: .\apps\account\models\user.py:65 .\apps\account\models\user.py:305 +msgid "user agent" +msgstr "user agent" + +#: .\apps\account\models\user.py:66 +msgid "client ip" +msgstr "ip клиента" + +#: .\apps\account\models\user.py:70 +msgid "Experience years" +msgstr "Годы опыта" -#: apps/account/models/user.py:119 +#: .\apps\account\models\user.py:118 +msgid "Email is required for all regular users." +msgstr "Email обязателен для всех обычных пользователей." + +#: .\apps\account\models\user.py:299 .\apps\account\models\user.py:312 msgid "lat" -msgstr "" +msgstr "широта" -#: apps/account/models/user.py:120 +#: .\apps\account\models\user.py:300 .\apps\account\models\user.py:313 msgid "lon" -msgstr "" +msgstr "долгота" -#: apps/account/models/user.py:122 +#: .\apps\account\models\user.py:302 .\apps\account\models\user.py:315 msgid "city" -msgstr "" +msgstr "город" -#: apps/account/templates/account/group_help_text.html:5 +#: .\apps\account\templates\account\group_help_text.html:5 msgid "Driver before template" -msgstr "" +msgstr "Водитель до шаблона" -#: apps/account/templates/account/group_help_text.html:11 +#: .\apps\account\templates\account\group_help_text.html:11 msgid "Active drivers" -msgstr "" +msgstr "Активные водители" -#: apps/account/templates/account/group_help_text.html:19 +#: .\apps\account\templates\account\group_help_text.html:19 msgid "Inactive drivers" -msgstr "" +msgstr "Неактивные водители" -#: apps/account/templates/account/group_help_text.html:27 +#: .\apps\account\templates\account\group_help_text.html:27 msgid "Total points" -msgstr "" +msgstr "Общее количество баллов" -#: apps/account/templates/account/group_help_text.html:35 +#: .\apps\account\templates\account\group_help_text.html:35 msgid "Total races" -msgstr "" +msgstr "Всего гонок" -#: apps/account/templates/account/user_list_section.html:8 +#: .\apps\account\templates\account\user_list_section.html:8 msgid "Total Actice Users" -msgstr "" +msgstr "Всего активных пользователей" -#: apps/account/templates/account/user_list_section.html:16 +#: .\apps\account\templates\account\user_list_section.html:16 msgid "Total Guest Users" -msgstr "" +msgstr "Всего гостевых пользователей" -#: apps/account/templates/account/user_list_section.html:22 +#: .\apps\account\templates\account\user_list_section.html:22 msgid "Total Students" -msgstr "" +msgstr "Всего студентов" -#: apps/account/templates/account/user_list_section.html:28 +#: .\apps\account\templates\account\user_list_section.html:28 msgid "Total Professors" -msgstr "" +msgstr "Всего преподавателей" -#: apps/api/admin.py:27 +#: .\apps\api\admin.py:30 msgid "Dimensions" -msgstr "" +msgstr "Размеры" -#: apps/api/admin.py:31 +#: .\apps\api\admin.py:34 msgid "Preview" -msgstr "" +msgstr "Предпросмотр" -#: apps/certificate/admin.py:23 apps/transaction/admin.py:37 -msgid "Timestamps" -msgstr "" +#: .\apps\api\models.py:16 +msgid "User Avatar" +msgstr "Аватар пользователя" -#: apps/certificate/admin.py:29 apps/course/admin/course.py:273 -#: apps/library/admin.py:20 apps/video/admin.py:78 -msgid "Status" -msgstr "" +#: .\apps\api\models.py:20 +msgid "User Full Name" +msgstr "Полное имя пользователя" -#: apps/certificate/models.py:12 -msgid "pending" -msgstr "" +#: .\apps\api\models.py:21 +msgid "Full name of the user who made the comment" +msgstr "Полное имя пользователя, оставившего комментарий" -#: apps/certificate/models.py:13 -msgid "approved" -msgstr "" +#: .\apps\api\models.py:27 +msgid "User Slogan" +msgstr "Слоган пользователя" -#: apps/certificate/models.py:14 -msgid "canceled" -msgstr "" +#: .\apps\api\models.py:28 +msgid "User slogan or bio" +msgstr "Слоган или биография пользователя" -#: apps/certificate/models.py:20 -msgid "certificate_file" -msgstr "" +#: .\apps\api\models.py:33 +msgid "Comment Text" +msgstr "Текст комментария" -#: apps/course/admin/course.py:97 -msgid "Course Weekly Schedule" -msgstr "" +#: .\apps\api\models.py:34 +msgid "The actual comment content" +msgstr "Фактическое содержимое комментария" -#: apps/course/admin/course.py:101 utils/schema.py:47 -msgid "Course Features" -msgstr "" +#: .\apps\api\models.py:40 .\apps\blog\models.py:149 +#: .\apps\hadis\models\transmitter.py:446 +msgid "Order" +msgstr "Порядок" + +#: .\apps\api\models.py:41 +msgid "Order for sorting comments" +msgstr "Порядок для сортировки комментариев" + +#: .\apps\api\models.py:45 .\apps\api\models.py:117 .\apps\blog\models.py:34 +#: .\apps\blog\models.py:155 .\apps\chat\models.py:47 +#: .\apps\course\models\live_session.py:46 +#: .\apps\course\models\live_session.py:108 +#: .\apps\course\models\live_session.py:170 .\apps\quiz\models\quiz.py:43 +msgid "Created At" +msgstr "Дата создания" + +#: .\apps\api\models.py:50 +msgid "Comment" +msgstr "Комментарий" + +#: .\apps\api\models.py:51 +msgid "Comments" +msgstr "Комментарии" + +#: .\apps\api\models.py:62 +msgid "Google Play" +msgstr "Google Play" + +#: .\apps\api\models.py:63 +msgid "App Store" +msgstr "App Store" + +#: .\apps\api\models.py:73 +msgid "Version" +msgstr "Версия" + +#: .\apps\api\models.py:74 +msgid "Application version in format X.Y.Z (e.g., 1.0.0)" +msgstr "Версия приложения в формате X.Y.Z (например, 1.0.0)" + +#: .\apps\api\models.py:79 +msgid "APK File" +msgstr "APK файл" + +#: .\apps\api\models.py:80 +msgid "Application APK file" +msgstr "APK файл приложения" + +#: .\apps\api\models.py:84 .\apps\blog\models.py:195 .\apps\chat\models.py:28 +#: .\apps\course\admin\course.py:397 .\apps\course\models\course.py:172 +#: .\apps\hadis\admin\hadis.py:649 .\apps\hadis\models\category.py:16 +#: .\apps\hadis\models\category.py:78 .\apps\hadis\models\hadis.py:173 +#: .\apps\hadis\models\hadis.py:268 .\apps\hadis\models\hadis.py:426 +#: .\apps\hadis\models\hadis.py:491 .\apps\hadis\models\reference.py:64 +#: .\apps\hadis\models\reference.py:215 .\apps\hadis\models\transmitter.py:21 +#: .\apps\hadis\models\transmitter.py:277 .\apps\quiz\models\quiz.py:11 +#: .\apps\transaction\admin.py:158 .\apps\transaction\models.py:110 +#: .\utils\keyval_field.py:162 .\utils\keyval_field.py:172 +msgid "Description" +msgstr "Описание" + +#: .\apps\api\models.py:85 +msgid "Release notes and changes for this version" +msgstr "Примечания к выпуску и изменения для этой версии" + +#: .\apps\api\models.py:93 +msgid "App Type" +msgstr "Тип приложения" + +#: .\apps\api\models.py:94 +msgid "App distribution platform" +msgstr "Платформа распространения приложения" + +#: .\apps\api\models.py:99 +msgid "App Store Downloads" +msgstr "Загрузки из App Store" + +#: .\apps\api\models.py:100 +msgid "Total number of downloads on Apple App Store" +msgstr "Общее количество загрузок в Apple App Store" + +#: .\apps\api\models.py:105 +msgid "Google Play Downloads" +msgstr "Загрузки из Google Play" + +#: .\apps\api\models.py:106 +msgid "Total number of downloads on Google Play" +msgstr "Общее количество загрузок в Google Play" + +#: .\apps\api\models.py:111 .\apps\chat\admin.py:315 +#: .\apps\hadis\models\version.py:10 .\apps\library\admin.py:212 +#: .\apps\quiz\admin\quiz.py:68 +msgid "Active" +msgstr "Активно" + +#: .\apps\api\models.py:112 +msgid "Is this version active?" +msgstr "Эта версия активна?" + +#: .\apps\api\models.py:122 .\apps\blog\models.py:38 .\apps\blog\models.py:159 +#: .\apps\chat\models.py:50 .\apps\chat\models.py:126 +#: .\apps\course\models\course.py:116 .\apps\course\models\course.py:174 +#: .\apps\course\models\course.py:192 .\apps\course\models\course.py:223 +#: .\apps\course\models\course.py:247 .\apps\course\models\lesson.py:36 +#: .\apps\course\models\lesson.py:62 .\apps\course\models\live_session.py:47 +#: .\apps\course\models\live_session.py:109 +#: .\apps\course\models\live_session.py:171 +msgid "Updated At" +msgstr "Дата обновления" + +#: .\apps\api\models.py:126 +msgid "App Version" +msgstr "Версия приложения" + +#: .\apps\api\models.py:127 .\config\settings\base.py:899 +msgid "App Versions" +msgstr "Версии приложения" + +#: .\apps\article\admin.py:38 .\apps\article\admin.py:236 +#: .\apps\article\models.py:141 +msgid "Article" +msgstr "Статья" + +#: .\apps\article\admin.py:39 .\apps\article\models.py:142 +#: .\config\settings\base.py:755 .\config\settings\base.py:761 +msgid "Articles" +msgstr "Статьи" + +#: .\apps\article\admin.py:48 .\apps\article\models.py:243 +msgid "Text Section" +msgstr "Текстовый раздел" + +#: .\apps\article\admin.py:49 .\apps\article\models.py:244 +msgid "Text Sections" +msgstr "Текстовые разделы" + +#: .\apps\article\admin.py:56 .\apps\article\models.py:217 +msgid "Content Part" +msgstr "Часть контента" + +#: .\apps\article\admin.py:57 .\apps\article\models.py:218 +msgid "Content Parts" +msgstr "Части контента" + +#: .\apps\article\admin.py:66 .\apps\article\models.py:193 +msgid "Article Content" +msgstr "Содержимое статьи" + +#: .\apps\article\admin.py:67 .\apps\article\models.py:194 +#: .\config\settings\base.py:785 +msgid "Article Contents" +msgstr "Содержимое статей" + +#: .\apps\article\admin.py:90 .\apps\article\admin.py:131 +#: .\apps\blog\admin.py:85 .\apps\blog\admin.py:124 .\apps\blog\models.py:12 +#: .\apps\course\admin\course.py:393 .\apps\course\admin\course.py:454 +#: .\apps\course\models\live_session.py:143 .\apps\hadis\admin\category.py:181 +#: .\apps\hadis\admin\category.py:216 .\apps\hadis\admin\hadis.py:617 +#: .\apps\hadis\admin\hadis.py:645 .\apps\hadis\admin\hadis.py:693 +#: .\apps\hadis\admin\hadis.py:768 .\apps\hadis\admin\hadis.py:949 +#: .\apps\hadis\admin\reference.py:470 .\apps\hadis\admin\reference.py:559 +#: .\apps\hadis\admin\transmitter.py:577 .\apps\hadis\admin\transmitter.py:604 +#: .\apps\hadis\admin\transmitter.py:677 .\apps\hadis\models\category.py:15 +#: .\apps\hadis\models\category.py:77 .\apps\hadis\models\hadis.py:13 +#: .\apps\hadis\models\hadis.py:141 .\apps\hadis\models\hadis.py:169 +#: .\apps\hadis\models\hadis.py:267 .\apps\hadis\models\hadis.py:489 +#: .\apps\hadis\models\reference.py:8 .\apps\hadis\models\reference.py:34 +#: .\apps\hadis\models\reference.py:63 .\apps\hadis\models\reference.py:294 +#: .\apps\hadis\models\transmitter.py:127 +#: .\apps\hadis\models\transmitter.py:470 +#: .\apps\hadis\models\transmitter.py:638 .\apps\library\admin.py:105 +#: .\apps\podcast\admin.py:49 .\apps\podcast\admin.py:94 +#: .\apps\quiz\models\quiz.py:10 .\apps\video\admin.py:49 +#: .\apps\video\admin.py:83 .\utils\keyval_field.py:39 +#: .\utils\keyval_field.py:59 .\utils\keyval_field.py:76 +#: .\utils\keyval_field.py:139 .\utils\keyval_field.py:167 .\utils\schema.py:51 +msgid "Title" +msgstr "Название" -#: apps/course/admin/course.py:154 -msgid "Enrollment Details" -msgstr "" +#: .\apps\article\admin.py:94 .\apps\article\models.py:47 +#: .\apps\library\models.py:27 .\apps\podcast\admin.py:53 +#: .\apps\podcast\models.py:47 .\apps\video\models.py:50 +msgid "Display Position" +msgstr "Позиция отображения" + +#: .\apps\article\admin.py:101 .\apps\article\admin.py:173 +msgid "Number of Articles" +msgstr "Количество статей" + +#: .\apps\article\admin.py:196 +msgid "Search by title, slug, description or content" +msgstr "Поиск по названию, ярлыку (slug), описанию или содержимому" + +#: .\apps\article\admin.py:197 +msgid "Search articles" +msgstr "Поиск статей" + +#: .\apps\article\admin.py:207 .\apps\chat\admin.py:301 +#: .\apps\chat\admin.py:352 .\apps\chat\models.py:79 +#: .\apps\course\admin\course.py:458 +msgid "File" +msgstr "Файл" + +#: .\apps\article\admin.py:210 .\apps\bookmark\admin.py:42 +#: .\apps\bookmark\admin.py:112 .\apps\certificate\admin.py:30 +#: .\apps\chat\admin.py:257 .\apps\chat\admin.py:311 +#: .\apps\course\admin\live_session.py:158 .\apps\library\admin.py:68 +#: .\apps\library\admin.py:207 .\apps\podcast\admin.py:160 +#: .\apps\quiz\admin\quiz.py:65 .\apps\quiz\models\quiz.py:13 +#: .\apps\video\admin.py:169 +msgid "Status" +msgstr "Статус" -#: apps/course/admin/course.py:179 apps/course/admin/course.py:293 -msgid "Course" -msgstr "" +#: .\apps\article\admin.py:213 .\apps\blog\admin.py:73 +#: .\apps\library\admin.py:77 .\apps\podcast\admin.py:163 +#: .\apps\podcast\admin.py:244 .\apps\video\admin.py:172 +#: .\apps\video\admin.py:256 +msgid "Statistics" +msgstr "Статистика" + +#: .\apps\article\admin.py:228 +msgid "Contents" +msgstr "Содержимое" + +#: .\apps\article\admin.py:280 +msgid "Parts" +msgstr "Части" + +#: .\apps\article\models.py:10 .\apps\hadis\models\hadis.py:14 +#: .\apps\hadis\models\hadis.py:170 .\apps\hadis\models\hadis.py:265 +#: .\apps\hadis\models\hadis.py:490 .\apps\hadis\models\reference.py:70 +#: .\apps\hadis\models\transmitter.py:22 .\apps\hadis\models\transmitter.py:128 +#: .\apps\hadis\models\transmitter.py:237 +#: .\apps\hadis\models\transmitter.py:471 +#: .\apps\hadis\models\transmitter.py:637 .\apps\podcast\models.py:10 +#: .\apps\podcast\models.py:129 .\apps\video\models.py:12 +#: .\apps\video\models.py:145 +msgid "slug" +msgstr "ярлык (slug)" + +#: .\apps\article\models.py:12 .\apps\article\models.py:42 +#: .\apps\article\models.py:107 .\apps\article\models.py:188 +#: .\apps\hadis\models\hadis.py:16 .\apps\hadis\models\hadis.py:142 +#: .\apps\library\models.py:29 .\apps\library\models.py:72 +#: .\apps\library\models.py:124 .\apps\library\models.py:173 +#: .\apps\podcast\models.py:12 .\apps\podcast\models.py:42 +#: .\apps\podcast\models.py:96 .\apps\podcast\models.py:149 +#: .\apps\podcast\models.py:263 .\apps\video\models.py:14 +#: .\apps\video\models.py:45 .\apps\video\models.py:105 +#: .\apps\video\models.py:165 +msgid "status" +msgstr "статус" + +#: .\apps\article\models.py:13 .\apps\article\models.py:41 +#: .\apps\article\models.py:159 .\apps\article\models.py:211 +#: .\apps\article\models.py:237 .\apps\hadis\models\category.py:18 +#: .\apps\hadis\models\category.py:79 .\apps\hadis\models\hadis.py:18 +#: .\apps\hadis\models\hadis.py:127 .\apps\hadis\models\hadis.py:172 +#: .\apps\hadis\models\reference.py:214 .\apps\library\models.py:30 +#: .\apps\podcast\models.py:13 .\apps\podcast\models.py:41 +#: .\apps\podcast\models.py:148 .\apps\podcast\models.py:200 +#: .\apps\video\models.py:15 .\apps\video\models.py:43 +#: .\apps\video\models.py:164 .\apps\video\models.py:216 +msgid "order" +msgstr "порядок" -#: apps/course/admin/course.py:191 -msgid "Participant" -msgstr "" +#: .\apps\article\models.py:26 +msgid "Article Category" +msgstr "Категория статьи" -#: apps/course/admin/course.py:192 -msgid "Participants" -msgstr "" +#: .\apps\article\models.py:27 +msgid "Article Categories" +msgstr "Категории статей" -#: apps/course/admin/course.py:222 -msgid "Select Student" -msgstr "" +#: .\apps\article\models.py:33 .\apps\library\models.py:15 +#: .\apps\podcast\models.py:33 .\apps\video\models.py:35 +msgid "Pinned" +msgstr "Закреплено" -#: apps/course/admin/course.py:276 -msgid "Course Details" -msgstr "" +#: .\apps\article\models.py:34 .\apps\library\models.py:16 +#: .\apps\podcast\models.py:34 .\apps\video\models.py:36 +msgid "Middle Section" +msgstr "Средний раздел" -#: apps/course/admin/course.py:280 -msgid "Media" -msgstr "" +#: .\apps\article\models.py:38 .\apps\library\models.py:21 +#: .\apps\library\models.py:109 .\apps\podcast\models.py:38 +#: .\apps\video\models.py:40 +msgid "could be null" +msgstr "может быть пустым" + +#: .\apps\article\models.py:39 .\apps\hadis\models\hadis.py:17 +#: .\apps\library\models.py:22 .\apps\podcast\models.py:39 +#: .\apps\video\models.py:41 +msgid "pin top" +msgstr "закрепить наверху" + +#: .\apps\article\models.py:40 .\apps\article\models.py:90 +#: .\apps\hadis\models\hadis.py:19 .\apps\hadis\models\transmitter.py:278 +#: .\apps\library\models.py:110 .\apps\podcast\models.py:40 +#: .\apps\podcast\models.py:85 .\apps\video\models.py:42 +#: .\apps\video\models.py:91 +msgid "image allowed" +msgstr "изображение разрешено" -#: apps/course/admin/course.py:283 -msgid "Pricing" -msgstr "" +#: .\apps\article\models.py:56 +msgid "articles" +msgstr "статьи" -#: apps/course/admin/course.py:286 -msgid "Timing & Features" -msgstr "" +#: .\apps\article\models.py:68 +msgid "Article Collection" +msgstr "Коллекция статей" -#: apps/course/admin/course.py:301 -msgid "No description" -msgstr "" +#: .\apps\article\models.py:69 +msgid "Articles Collections" +msgstr "Коллекции статей" -#: apps/course/admin/course.py:316 apps/transaction/admin.py:49 -msgid "Price" -msgstr "" +#: .\apps\article\models.py:75 .\apps\podcast\models.py:69 +msgid "Pinned Collection (Top Section)" +msgstr "Закрепленная коллекция (Верхний раздел)" -#: apps/course/admin/course.py:319 -msgid "Free" -msgstr "" +#: .\apps\article\models.py:76 .\apps\podcast\models.py:70 +msgid "Pinned Collections (Top Section)" +msgstr "Закрепленные коллекции (Верхний раздел)" -#: apps/course/admin/course.py:340 -msgid "View Lessons" -msgstr "" +#: .\apps\article\models.py:82 .\apps\podcast\models.py:76 +msgid "Regular Collection (Middle Section)" +msgstr "Обычная коллекция (Средний раздел)" -#: apps/course/admin/course.py:351 apps/course/admin/course.py:386 -msgid "Course not found" -msgstr "" +#: .\apps\article\models.py:83 .\apps\podcast\models.py:77 +msgid "Regular Collections (Middle Section)" +msgstr "Обычные коллекции (Средний раздел)" -#: apps/course/admin/course.py:376 -msgid "Add Student to Course" -msgstr "" +#: .\apps\article\models.py:93 +msgid "PDF or other document files" +msgstr "PDF или другие файлы документов" -#: apps/course/admin/course.py:396 -#, python-brace-format -msgid "Student {student.fullname} is already enrolled in this course" -msgstr "" +#: .\apps\article\models.py:95 .\apps\library\models.py:127 +#: .\apps\podcast\models.py:88 .\apps\podcast\models.py:137 +#: .\apps\video\models.py:153 +msgid "categories" +msgstr "категории" -#: apps/course/admin/course.py:405 -#, python-brace-format -msgid "" -"Student {student.fullname} has been successfully added to {course.title}" -msgstr "" +#: .\apps\article\models.py:100 .\apps\library\models.py:128 +#: .\apps\podcast\models.py:144 .\apps\video\models.py:160 +msgid "collections" +msgstr "коллекции" -#: apps/course/admin/course.py:418 -msgid "Change detail action for {}" -msgstr "" +#: .\apps\article\models.py:103 .\apps\article\models.py:105 +#: .\apps\library\models.py:131 .\apps\library\models.py:132 +#: .\apps\podcast\models.py:93 .\apps\podcast\models.py:150 +#: .\apps\video\models.py:103 .\apps\video\models.py:166 +msgid "view count" +msgstr "количество просмотров" -#: apps/course/admin/lesson.py:59 apps/hadis/admin/hadis.py:148 -msgid "Content" -msgstr "" +#: .\apps\article\models.py:151 .\apps\hadis\models\hadis.py:126 +#: .\apps\podcast\models.py:192 .\apps\video\models.py:208 +msgid "collection" +msgstr "коллекция" -#: apps/course/admin/lesson.py:82 -msgid "Duration" -msgstr "" +#: .\apps\article\models.py:157 .\apps\article\models.py:182 +msgid "article" +msgstr "статья" -#: apps/course/models/course.py:69 -msgid "Thumbnail" -msgstr "" +#: .\apps\article\models.py:168 +msgid "Article in Collection" +msgstr "Статья в коллекции" -#: apps/course/models/course.py:95 -msgid "Course Final Price" -msgstr "" +#: .\apps\article\models.py:169 +msgid "Articles in Collections" +msgstr "Статьи в коллекциях" -#: apps/course/models/course.py:96 -msgid "" -"This field is automatically calculated based on the discount percentage." -msgstr "" +#: .\apps\article\models.py:185 +msgid "content" +msgstr "содержимое" -#: apps/course/models/course.py:99 -msgid "Timing" -msgstr "" +#: .\apps\article\models.py:186 .\apps\podcast\models.py:228 +#: .\apps\video\models.py:244 +msgid "priority" +msgstr "приоритет" -#: apps/course/models/course.py:100 -msgid "Course features" -msgstr "" +#: .\apps\article\models.py:209 +msgid "article content" +msgstr "содержимое статьи" -#: apps/course/models/course.py:101 apps/course/models/lesson.py:35 -#: apps/course/models/lesson.py:98 apps/transaction/models.py:20 -msgid "Created at" -msgstr "" +#: .\apps\article\models.py:233 +msgid "content part" +msgstr "часть контента" -#: apps/course/models/course.py:102 apps/course/models/lesson.py:36 -msgid "Updated At" -msgstr "" +#: .\apps\article\models.py:235 +msgid "Arabic text" +msgstr "Арабский текст" -#: apps/course/models/lesson.py:25 -msgid "Is Active" -msgstr "" +#: .\apps\article\models.py:236 .\utils\keyval_field.py:16 +#: .\utils\keyval_field.py:37 .\utils\keyval_field.py:74 +#: .\utils\keyval_field.py:94 .\utils\keyval_field.py:116 +#: .\utils\keyval_field.py:137 +msgid "Translation" +msgstr "Перевод" -#: apps/course/templates/course/add_student_form.html:25 -msgid "Submit form" -msgstr "" +#: .\apps\blog\admin.py:70 .\apps\blog\admin.py:112 .\apps\blog\models.py:137 +#: .\apps\course\admin\lesson.py:53 .\apps\hadis\admin\hadis.py:677 +#: .\apps\hadis\admin\hadis.py:936 .\apps\hadis\admin\transmitter.py:541 +#: .\apps\hadis\admin\transmitter.py:631 .\apps\hadis\admin\transmitter.py:668 +msgid "Content" +msgstr "Содержимое" + +#: .\apps\blog\admin.py:77 .\apps\blog\admin.py:115 .\apps\bookmark\admin.py:45 +#: .\apps\bookmark\admin.py:115 .\apps\certificate\admin.py:24 +#: .\apps\chat\admin.py:150 .\apps\chat\admin.py:261 +#: .\apps\course\admin\live_session.py:108 +#: .\apps\course\admin\live_session.py:131 +#: .\apps\course\admin\live_session.py:159 .\apps\hadis\admin\hadis.py:611 +#: .\apps\hadis\admin\hadis.py:687 .\apps\hadis\admin\hadis.py:719 +#: .\apps\hadis\admin\hadis.py:762 .\apps\hadis\admin\hadis.py:814 +#: .\apps\hadis\admin\hadis.py:943 .\apps\hadis\admin\reference.py:512 +#: .\apps\hadis\admin\transmitter.py:485 .\apps\hadis\admin\transmitter.py:520 +#: .\apps\hadis\admin\transmitter.py:544 .\apps\hadis\admin\transmitter.py:634 +#: .\apps\hadis\admin\version.py:21 .\apps\library\admin.py:199 +#: .\apps\transaction\admin.py:51 .\apps\transaction\admin.py:152 +msgid "Timestamps" +msgstr "Метки времени" -#: apps/hadis/admin/category.py:38 apps/hadis/models/category.py:21 -msgid "Source Type" -msgstr "" +#: .\apps\blog\models.py:16 .\apps\course\models\course.py:74 +#: .\apps\course\models\live_session.py:165 +msgid "Thumbnail" +msgstr "Миниатюра" -#: apps/hadis/admin/category.py:69 -msgid "This item can not be modified" -msgstr "" +#: .\apps\blog\models.py:17 +msgid "Blog thumbnail image" +msgstr "Миниатюра блога" -#: apps/hadis/admin/category.py:198 -msgid "Category saved successfully. Tree will be reloaded." -msgstr "" +#: .\apps\blog\models.py:19 +msgid "Slogan" +msgstr "Слоган" -#: apps/hadis/admin/hadis.py:17 -msgid "Red" -msgstr "" +#: .\apps\blog\models.py:21 .\apps\hadis\models\hadis.py:15 +#: .\apps\library\models.py:107 +#: .\templates\admin\includes\object_delete_summary.html:2 +msgid "Summary" +msgstr "Сводка" -#: apps/hadis/admin/hadis.py:18 -msgid "Blue" -msgstr "" +#: .\apps\blog\models.py:25 +msgid "Views Count" +msgstr "Количество просмотров" -#: apps/hadis/admin/hadis.py:19 -msgid "Green" -msgstr "" +#: .\apps\blog\models.py:26 +msgid "Number of times this blog was viewed" +msgstr "Количество просмотров этого блога" -#: apps/hadis/admin/hadis.py:20 -msgid "Yellow" -msgstr "" +#: .\apps\blog\models.py:29 .\apps\blog\models.py:138 +msgid "Slug" +msgstr "Ярлык (slug)" -#: apps/hadis/admin/hadis.py:21 -msgid "Orange" -msgstr "" +#: .\apps\blog\models.py:29 +msgid "URL slug for the blog" +msgstr "URL ярлык (slug) для блога" -#: apps/hadis/admin/hadis.py:22 -msgid "Purple" -msgstr "" +#: .\apps\blog\models.py:43 .\apps\blog\models.py:134 .\apps\blog\models.py:184 +msgid "Blog" +msgstr "Блог" -#: apps/hadis/admin/hadis.py:23 -msgid "Pink" -msgstr "" +#: .\apps\blog\models.py:44 .\config\settings\base.py:688 +msgid "Blogs" +msgstr "Блоги" -#: apps/hadis/admin/hadis.py:24 -msgid "Brown" -msgstr "" +#: .\apps\blog\models.py:136 +msgid "Content Title" +msgstr "Название контента" -#: apps/hadis/admin/hadis.py:25 -msgid "Gray" -msgstr "" +#: .\apps\blog\models.py:136 +msgid "Title of this content section" +msgstr "Название этого раздела контента" -#: apps/hadis/admin/hadis.py:26 -msgid "Black" -msgstr "" +#: .\apps\blog\models.py:137 +msgid "The main content text" +msgstr "Основной текст контента" -#: apps/hadis/admin/hadis.py:41 -msgid "Link" -msgstr "" +#: .\apps\blog\models.py:138 +msgid "URL slug for this content (optional)" +msgstr "URL ярлык (slug) для этого контента (необязательно)" -#: apps/hadis/admin/hadis.py:43 apps/hadis/models/hadis.py:22 -msgid "text" -msgstr "" +#: .\apps\blog\models.py:144 .\apps\chat\admin.py:303 .\apps\chat\admin.py:343 +#: .\apps\chat\models.py:81 +msgid "Image" +msgstr "Изображение" -#: apps/hadis/admin/hadis.py:44 -msgid "link" -msgstr "" +#: .\apps\blog\models.py:145 +msgid "Optional image for this content section" +msgstr "Необязательное изображение для этого раздела контента" -#: apps/hadis/admin/hadis.py:76 apps/hadis/models/hadis.py:91 -msgid "Reference Images" -msgstr "" +#: .\apps\blog\models.py:150 +msgid "Order of this content within the blog" +msgstr "Порядок этого контента в блоге" -#: apps/hadis/admin/hadis.py:109 -msgid "Reference Information" -msgstr "" +#: .\apps\blog\models.py:164 +msgid "Blog Content" +msgstr "Содержимое блога" -#: apps/hadis/admin/hadis.py:112 -msgid "Additional Information" -msgstr "" +#: .\apps\blog\models.py:165 +msgid "Blog Contents" +msgstr "Содержимое блогов" -#: apps/hadis/admin/hadis.py:125 -msgid "Hadis Overview" -msgstr "" +#: .\apps\blog\models.py:186 +msgid "SEO Title" +msgstr "SEO название" -#: apps/hadis/models/category.py:9 -#: apps/hadis/templates/admin/category_index.html:25 -msgid "Shia" -msgstr "" +#: .\apps\blog\models.py:187 +msgid "maximum length of page title is 70 characters and minimum length is 30" +msgstr "максимальная длина заголовка страницы - 70 символов, минимальная - 30" -#: apps/hadis/models/category.py:10 -#: apps/hadis/templates/admin/category_index.html:31 -msgid "Sunni" -msgstr "" +#: .\apps\blog\models.py:190 +msgid "Keywords" +msgstr "Ключевые слова" -#: apps/hadis/models/category.py:13 -#: apps/hadis/templates/admin/category_index.html:158 -msgid "Quran" +#: .\apps\blog\models.py:192 +msgid "" +"keywords in the content that make it possible for people to find the site " +"via search engines" msgstr "" +"ключевые слова в контенте, позволяющие находить сайт через поисковые системы" -#: apps/hadis/models/category.py:14 -#: apps/hadis/templates/admin/category_index.html:161 -msgid "Hadith" +#: .\apps\blog\models.py:197 +msgid "" +"describes and summarizes the contents of the page for the benefit of users " +"and search engines" msgstr "" +"описывает и резюмирует содержимое страницы для пользователей и поисковых " +"систем" -#: apps/hadis/models/category.py:17 -msgid "Level 1 (Root)" -msgstr "" +#: .\apps\blog\models.py:199 .\apps\hadis\models\reference.py:65 +#: .\apps\library\models.py:119 +msgid "Language" +msgstr "Язык" -#: apps/hadis/models/category.py:18 -msgid "Level 2 (Child)" -msgstr "" +#: .\apps\blog\models.py:203 +msgid "Blog SEO" +msgstr "SEO блога" -#: apps/hadis/models/category.py:19 -msgid "Level 3 (Grandchild)" -msgstr "" +#: .\apps\blog\models.py:204 +msgid "Blog SEOs" +msgstr "SEO блогов" -#: apps/hadis/models/category.py:22 -msgid "Category Content Type" -msgstr "" +#: .\apps\bookmark\admin.py:23 .\apps\bookmark\admin.py:82 +msgid "Service" +msgstr "Сервис" -#: apps/hadis/models/category.py:23 -msgid "name" -msgstr "" +#: .\apps\bookmark\admin.py:50 .\apps\bookmark\admin.py:120 +msgid "View Content" +msgstr "Просмотр содержимого" -#: apps/hadis/models/category.py:24 apps/library/models.py:23 -#: apps/podcast/models.py:10 apps/video/models.py:11 -msgid "order" -msgstr "" +#: .\apps\bookmark\admin.py:97 +msgid "Rate" +msgstr "Оценка" -#: apps/hadis/models/category.py:34 -msgid "Hadis Category" -msgstr "" +#: .\apps\certificate\models.py:12 +msgid "pending" +msgstr "в ожидании" -#: apps/hadis/models/category.py:35 -msgid "Hadis Categories" -msgstr "" +#: .\apps\certificate\models.py:13 +msgid "approved" +msgstr "одобрено" -#: apps/hadis/models/category.py:54 -msgid "Level 1 cannot have content type" -msgstr "" +#: .\apps\certificate\models.py:14 +msgid "canceled" +msgstr "отменено" -#: apps/hadis/models/category.py:57 -msgid "Level 2 must have content type" -msgstr "" +#: .\apps\certificate\models.py:20 +msgid "certificate_file" +msgstr "файл_сертификата" -#: apps/hadis/models/category.py:60 -msgid "Level 3 cannot have source/content type" -msgstr "" +#: .\apps\chat\admin.py:77 +msgid "Recent Message" +msgstr "Последнее сообщение" -#: apps/hadis/models/hadis.py:11 apps/hadis/models/hadis.py:45 -#: apps/hadis/models/transmitter.py:15 apps/library/models.py:22 -#: apps/library/models.py:67 apps/library/models.py:100 -#: apps/podcast/models.py:9 apps/podcast/models.py:76 apps/video/models.py:10 -#: apps/video/models.py:26 apps/video/models.py:83 -msgid "status" -msgstr "" +#: .\apps\chat\admin.py:78 +msgid "Recent Messages (Latest 50)" +msgstr "Недавние сообщения (последние 50)" -#: apps/hadis/models/hadis.py:20 -msgid "number" -msgstr "" +#: .\apps\chat\admin.py:116 .\apps\chat\admin.py:208 +msgid "Read Status" +msgstr "Статус прочтения" -#: apps/hadis/models/hadis.py:23 -msgid "translation" -msgstr "" +#: .\apps\chat\admin.py:119 +msgid "Read" +msgstr "Прочитано" -#: apps/hadis/models/hadis.py:25 -msgid "category" -msgstr "" +#: .\apps\chat\admin.py:120 +msgid "Unread" +msgstr "Непрочитано" -#: apps/hadis/models/hadis.py:27 -msgid "visibility" -msgstr "" +#: .\apps\chat\admin.py:142 +msgid "Room Information" +msgstr "Информация о комнате" -#: apps/hadis/models/hadis.py:39 apps/hadis/models/hadis.py:61 -#: apps/hadis/models/transmitter.py:29 -msgid "hadis" -msgstr "" +#: .\apps\chat\admin.py:146 .\apps\library\admin.py:74 +msgid "Relations" +msgstr "Связи" -#: apps/hadis/models/hadis.py:40 -msgid "hadises" -msgstr "" +#: .\apps\chat\admin.py:162 +msgid "Messages Count" +msgstr "Количество сообщений" -#: apps/hadis/models/hadis.py:46 apps/hadis/models/transmitter.py:16 -msgid "Display Status Color" -msgstr "" +#: .\apps\chat\admin.py:170 .\apps\chat\models.py:62 +msgid "Room Type" +msgstr "Тип комнаты" -#: apps/hadis/models/hadis.py:47 -msgid "Status Text" -msgstr "" +#: .\apps\chat\admin.py:173 .\apps\chat\models.py:20 +#: .\utils\unfold_translations.py:37 +msgid "Group" +msgstr "Группа" -#: apps/hadis/models/hadis.py:48 -msgid "address" -msgstr "" +#: .\apps\chat\admin.py:174 .\apps\chat\models.py:21 +#: .\utils\unfold_translations.py:38 +msgid "Private" +msgstr "Личный" -#: apps/hadis/models/hadis.py:50 -msgid "tags" -msgstr "" +#: .\apps\chat\admin.py:184 .\utils\unfold_translations.py:31 +msgid "Manage All Messages" +msgstr "Управление всеми сообщениями" -#: apps/hadis/models/hadis.py:51 -msgid "share link" -msgstr "" +#: .\apps\chat\admin.py:191 +msgid "Room not found" +msgstr "Комната не найдена" -#: apps/hadis/models/hadis.py:52 -msgid "explanation" -msgstr "" +#: .\apps\chat\admin.py:209 +msgid "Read Statuses" +msgstr "Статусы прочтения" -#: apps/hadis/models/hadis.py:64 -msgid "book" -msgstr "" +#: .\apps\chat\admin.py:245 +msgid "Message Information" +msgstr "Информация о сообщении" -#: apps/hadis/models/hadis.py:65 apps/hadis/models/transmitter.py:38 -msgid "description" +#: .\apps\chat\admin.py:249 .\apps\course\models\course.py:236 +msgid "Attachments" +msgstr "Вложения" + +#: .\apps\chat\admin.py:253 +msgid "Additional Info" +msgstr "Дополнительная инфо" + +#: .\apps\chat\admin.py:283 +msgid "Back to Chat Rooms" +msgstr "Вернуться в чаты" + +#: .\apps\chat\admin.py:290 +msgid "Content Preview" +msgstr "Предпросмотр контента" + +#: .\apps\chat\admin.py:295 +msgid "%(type)s content" +msgstr "Содержимое (%(type)s)" + +#: .\apps\chat\admin.py:297 +msgid "Type" +msgstr "Тип" + +#: .\apps\chat\admin.py:300 .\apps\chat\models.py:78 +#: .\apps\hadis\models\transmitter.py:639 +msgid "Text" +msgstr "Текст" + +#: .\apps\chat\admin.py:302 .\apps\chat\models.py:80 +msgid "Audio" +msgstr "Аудио" + +#: .\apps\chat\admin.py:314 +msgid "Deleted" +msgstr "Удалено" + +#: .\apps\chat\admin.py:317 +#: .\templates\admin\filer\folder\directory_table.html:15 +msgid "Size" +msgstr "Размер" + +#: .\apps\chat\admin.py:323 +#, python-brace-format +msgid "{} bytes" +msgstr "{} байт" + +#: .\apps\chat\admin.py:326 .\apps\course\models\course.py:235 +#: .\apps\course\models\course.py:245 +msgid "Attachment" +msgstr "Вложение" + +#: .\apps\chat\admin.py:329 +msgid "📷 Image" +msgstr "📷 Изображение" + +#: .\apps\chat\admin.py:331 +msgid "📎 File" +msgstr "📎 Файл" + +#: .\apps\chat\admin.py:333 +msgid "🔗 Legacy" +msgstr "🔗 Устаревший" + +#: .\apps\chat\admin.py:336 +msgid "Attachment Preview" +msgstr "Предпросмотр вложения" + +#: .\apps\chat\admin.py:346 +msgid "Open in new tab" +msgstr "Открыть в новой вкладке" + +#: .\apps\chat\admin.py:354 +msgid "📥 Download File" +msgstr "📥 Скачать файл" + +#: .\apps\chat\admin.py:359 +msgid "Legacy URL" +msgstr "Устаревший URL" + +#: .\apps\chat\management\commands\clear_chat_data.py:16 +#: .\apps\course\management\commands\clear_course_data.py:23 +msgid "Force deletion without confirmation" +msgstr "Принудительное удаление без подтверждения" + +#: .\apps\chat\management\commands\clear_chat_data.py:22 +msgid "Delete ALL rooms including course-related rooms" +msgstr "Удалить ВСЕ комнаты, включая комнаты курсов" + +#: .\apps\chat\management\commands\clear_chat_data.py:31 +msgid "" +"This will delete ALL chat data including course rooms. Are you sure? (yes/" +"no): " +msgstr "" +"Это удалит ВСЕ данные чатов, включая комнаты курсов. Вы уверены? (yes/no): " + +#: .\apps\chat\management\commands\clear_chat_data.py:33 +msgid "" +"This will delete all messages and read statuses, and non-course rooms. " +"Course rooms will be preserved but their messages will be deleted. Are you " +"sure? (yes/no): " +msgstr "" +"Это удалит все сообщения и статусы прочтения, а также комнаты, не " +"относящиеся к курсам. Комнаты курсов будут сохранены, но их сообщения будут " +"удалены. Вы уверены? (yes/no): " + +#: .\apps\chat\management\commands\clear_chat_data.py:36 +#: .\apps\course\management\commands\clear_course_data.py:61 +msgid "Operation cancelled." +msgstr "Операция отменена." + +#: .\apps\chat\management\commands\clear_chat_data.py:75 +msgid "Chat data clearing completed successfully!" +msgstr "Очистка данных чата успешно завершена!" + +#: .\apps\chat\models.py:25 +msgid "Room Name" +msgstr "Название комнаты" + +#: .\apps\chat\models.py:32 .\apps\course\admin\course.py:271 +#: .\apps\course\admin\course.py:503 .\apps\course\models\course.py:153 +#: .\apps\course\models\course.py:189 .\apps\course\models\course.py:244 +#: .\apps\course\models\lesson.py:55 .\apps\course\models\live_session.py:13 +#: .\apps\course\models\participant.py:19 .\apps\transaction\models.py:31 +msgid "Course" +msgstr "Курс" + +#: .\apps\chat\models.py:37 .\utils\unfold_translations.py:29 +msgid "Initiator" +msgstr "Инициатор" + +#: .\apps\chat\models.py:43 .\utils\unfold_translations.py:30 +msgid "Recipient" +msgstr "Получатель" + +#: .\apps\chat\models.py:55 .\utils\unfold_translations.py:28 +msgid "Is Locked" +msgstr "Заблокировано" + +#: .\apps\chat\models.py:56 +msgid "If True, only the professor and admins can send new messages." +msgstr "" +"Если включено, только профессор и администраторы могут отправлять новые " +"сообщения." + +#: .\apps\chat\models.py:64 .\apps\course\models\participant.py:23 +msgid "Unread Messages Count" +msgstr "Количество непрочитанных сообщений" + +#: .\apps\chat\models.py:72 +msgid "Room Message" +msgstr "Сообщение комнаты" + +#: .\apps\chat\models.py:73 +msgid "Room Messages" +msgstr "Сообщения комнаты" + +#: .\apps\chat\models.py:87 +msgid "Room" +msgstr "Комната" + +#: .\apps\chat\models.py:93 .\utils\unfold_translations.py:32 +msgid "Sender" +msgstr "Отправитель" + +#: .\apps\chat\models.py:95 .\utils\unfold_translations.py:33 +msgid "Message Content" +msgstr "Содержимое сообщения" + +#: .\apps\chat\models.py:100 .\utils\unfold_translations.py:34 +msgid "Chat Type" +msgstr "Тип чата" + +#: .\apps\chat\models.py:103 +msgid "Content Size (bytes)" +msgstr "Размер контента (в байтах)" + +#: .\apps\chat\models.py:112 +msgid "File Attachment" +msgstr "Вложение файла" + +#: .\apps\chat\models.py:113 +msgid "For file and audio messages" +msgstr "Для файлов и аудиосообщений" + +#: .\apps\chat\models.py:120 +msgid "Image Attachment" +msgstr "Вложение изображения" + +#: .\apps\chat\models.py:121 +msgid "For image messages" +msgstr "Для изображений" + +#: .\apps\chat\models.py:123 .\apps\chat\models.py:174 +msgid "Is Read" +msgstr "Прочитано" + +#: .\apps\chat\models.py:124 +msgid "Message Metadata" +msgstr "Метаданные сообщения" + +#: .\apps\chat\models.py:125 .\utils\unfold_translations.py:35 +msgid "Sent At" +msgstr "Отправлено в" + +#: .\apps\chat\models.py:127 +msgid "Deleted At" +msgstr "Удалено в" + +#: .\apps\chat\models.py:128 .\utils\unfold_translations.py:36 +msgid "Is deleted" +msgstr "Удалено" + +#: .\apps\chat\models.py:157 +msgid "Chat Message" +msgstr "Сообщение чата" + +#: .\apps\chat\models.py:158 +msgid "Chat Messages" +msgstr "Сообщения чата" + +#: .\apps\chat\models.py:166 .\apps\course\models\live_session.py:83 +#: .\apps\quiz\models\participant.py:11 .\apps\transaction\models.py:30 +msgid "User" +msgstr "Пользователь" + +#: .\apps\chat\models.py:172 +msgid "Message" +msgstr "Сообщение" + +#: .\apps\chat\models.py:175 +msgid "Read At" +msgstr "Прочитано в" + +#: .\apps\chat\models.py:179 +msgid "Message Read Status" +msgstr "Статус прочтения сообщения" + +#: .\apps\chat\models.py:180 +msgid "Message Read Statuses" +msgstr "Статусы прочтения сообщений" + +#: .\apps\course\admin\course.py:78 +msgid "Course Weekly Schedule" +msgstr "Еженедельное расписание курса" + +#: .\apps\course\admin\course.py:82 .\utils\schema.py:49 +msgid "Course Features" +msgstr "Особенности курса" + +#: .\apps\course\admin\course.py:86 +msgid "If set to inactive, the course will not be displayed." +msgstr "Если курс неактивен, он не будет отображаться." + +#: .\apps\course\admin\course.py:101 +msgid "This field is required and cannot be cleared." +msgstr "Это поле обязательно для заполнения и не может быть очищено." + +#: .\apps\course\admin\course.py:105 +msgid "This field is required." +msgstr "Это поле обязательно." + +#: .\apps\course\admin\course.py:125 .\apps\course\admin\live_session.py:43 +msgid "Select a value" +msgstr "Выберите значение" + +#: .\apps\course\admin\course.py:135 .\apps\course\models\course.py:266 +msgid "Course Attachment" +msgstr "Вложение курса" + +#: .\apps\course\admin\course.py:136 .\apps\course\models\course.py:267 +#: .\config\settings\base.py:492 +msgid "Course Attachments" +msgstr "Вложения курсов" + +#: .\apps\course\admin\course.py:170 .\apps\quiz\admin\participant.py:36 +msgid "Recent Participant" +msgstr "Недавний участник" + +#: .\apps\course\admin\course.py:171 .\apps\quiz\admin\participant.py:37 +msgid "Recent Participants (Latest 10)" +msgstr "Недавние участники (последние 10)" + +#: .\apps\course\admin\course.py:195 +msgid "Select Student" +msgstr "Выберите студента" + +#: .\apps\course\admin\course.py:242 +msgid "Settings & Status" +msgstr "Настройки и статус" + +#: .\apps\course\admin\course.py:251 .\apps\course\admin\live_session.py:82 +msgid "Media" +msgstr "Медиа" + +#: .\apps\course\admin\course.py:257 +msgid "Pricing" +msgstr "Цены" + +#: .\apps\course\admin\course.py:264 +msgid "Advanced Configuration" +msgstr "Расширенные настройки" + +#: .\apps\course\admin\course.py:291 .\apps\transaction\admin.py:75 +#: .\templates\course\course_stats.html:142 +msgid "Price" +msgstr "Цена" + +#: .\apps\course\admin\course.py:294 .\apps\transaction\models.py:27 +#: .\templates\course\course_stats.html:145 +msgid "Free" +msgstr "Бесплатно" + +#: .\apps\course\admin\course.py:319 +msgid "Add Student" +msgstr "Добавить студента" + +#: .\apps\course\admin\course.py:326 .\apps\course\admin\course.py:363 +msgid "Course not found" +msgstr "Курс не найден" + +#: .\apps\course\admin\course.py:334 +#, python-brace-format +msgid "Student {} is already enrolled in this course" +msgstr "Студент {} уже зачислен на этот курс." + +#: .\apps\course\admin\course.py:339 +#, python-brace-format +msgid "Student {} has been successfully added to {}" +msgstr "Студент {} был успешно добавлен в {}." + +#: .\apps\course\admin\course.py:350 +#, python-brace-format +msgid "Add Student to {}" +msgstr "Добавить студента в {}" + +#: .\apps\course\admin\course.py:356 +msgid "Manage All Students" +msgstr "Управление всеми студентами" + +#: .\apps\course\admin\course.py:462 +msgid "File Size" +msgstr "Размер файла" + +#: .\apps\course\admin\course.py:480 +msgid "Enrollment Details" +msgstr "Детали зачисления" + +#: .\apps\course\admin\lesson.py:72 .\apps\course\admin\lesson.py:99 +#: .\templates\course\course_stats.html:118 +msgid "Duration" +msgstr "Продолжительность" + +#: .\apps\course\admin\lesson.py:74 .\apps\course\admin\lesson.py:101 +msgid "min" +msgstr "мин" + +#: .\apps\course\admin\live_session.py:56 .\apps\course\models\course.py:113 +msgid "Timing" +msgstr "Расписание" + +#: .\apps\course\admin\live_session.py:62 +msgid "Session User" +msgstr "Пользователь сессии" + +#: .\apps\course\admin\live_session.py:63 .\config\settings\base.py:521 +msgid "Session Users" +msgstr "Пользователи сессии" + +#: .\apps\course\admin\live_session.py:88 +msgid "Session Recording" +msgstr "Запись сессии" + +#: .\apps\course\admin\live_session.py:89 .\config\settings\base.py:527 +msgid "Session Recordings" +msgstr "Записи сессий" + +#: .\apps\course\admin\live_session.py:130 +msgid "Session Timing" +msgstr "Время сессии" + +#: .\apps\course\admin\live_session.py:157 .\apps\hadis\admin\category.py:198 +msgid "Files" +msgstr "Файлы" + +#: .\apps\course\management\commands\clear_course_data.py:16 +msgid "Clear all course-related data from the database" +msgstr "Очистить все данные, связанные с курсами, из базы данных" + +#: .\apps\course\management\commands\clear_course_data.py:29 +msgid "Specify a single model to clear (e.g., \"Course\", \"Lesson\", etc.)" +msgstr "" +"Укажите отдельную модель для очистки (например, \"Course\", \"Lesson\" и " +"т.д.)" + +#: .\apps\course\management\commands\clear_course_data.py:35 +msgid "Clear only legacy models (before migration to new structure)" +msgstr "Очистить только устаревшие модели (до миграции на новую структуру)" + +#: .\apps\course\management\commands\clear_course_data.py:59 +msgid "This will delete ALL course-related data. Are you sure? (yes/no): " +msgstr "Это удалит ВСЕ данные, связанные с курсами. Вы уверены? (yes/no): " + +#: .\apps\course\management\commands\clear_course_data.py:95 +msgid ", " +msgstr ", " + +#: .\apps\course\management\commands\clear_course_data.py:134 +msgid "Course data clearing completed" +msgstr "Очистка данных курсов завершена" + +#: .\apps\course\models\course.py:29 +msgid "Category Name" +msgstr "Название категории" + +#: .\apps\course\models\course.py:48 +msgid "Beginner" +msgstr "Начинающий" + +#: .\apps\course\models\course.py:49 +msgid "Mid Level" +msgstr "Средний уровень" + +#: .\apps\course\models\course.py:50 +msgid "Advanced" +msgstr "Продвинутый" + +#: .\apps\course\models\course.py:53 .\apps\library\admin.py:216 +#: .\apps\quiz\admin\quiz.py:69 +msgid "Inactive" +msgstr "Неактивно" + +#: .\apps\course\models\course.py:54 +msgid "Upcoming" +msgstr "Предстоящий" + +#: .\apps\course\models\course.py:55 +msgid "Registering" +msgstr "Идет регистрация" + +#: .\apps\course\models\course.py:56 +msgid "Ongoing" +msgstr "Текущий" + +#: .\apps\course\models\course.py:57 +msgid "Finished" +msgstr "Завершен" + +#: .\apps\course\models\course.py:60 .\apps\course\models\lesson.py:21 +msgid "Youtube Link" +msgstr "Ссылка на YouTube" + +#: .\apps\course\models\course.py:61 .\apps\course\models\lesson.py:22 +msgid "Video File" +msgstr "Видеофайл" + +#: .\apps\course\models\course.py:65 +msgid "Course Title" +msgstr "Название курса" + +#: .\apps\course\models\course.py:67 .\apps\library\models.py:92 +msgid "Category" +msgstr "Категория" + +#: .\apps\course\models\course.py:78 +msgid "Preview Video Type (YouTube Link or File Upload)" +msgstr "Тип превью-видео (ссылка на YouTube или загрузка файла)" + +#: .\apps\course\models\course.py:87 +msgid "Is Online Course" +msgstr "Это онлайн-курс" + +#: .\apps\course\models\course.py:88 +msgid "Online Class Link" +msgstr "Ссылка на онлайн-занятие" + +#: .\apps\course\models\course.py:89 +msgid "Course Level" +msgstr "Уровень курса" + +#: .\apps\course\models\course.py:90 +msgid "Duration (in hours)" +msgstr "Продолжительность (в часах)" + +#: .\apps\course\models\course.py:91 +msgid "Number of Lessons" +msgstr "Количество уроков" + +#: .\apps\course\models\course.py:93 +msgid "Course Description" +msgstr "Описание курса" + +#: .\apps\course\models\course.py:94 +msgid "Short Description" +msgstr "Краткое описание" + +#: .\apps\course\models\course.py:96 +msgid "Is Free" +msgstr "Бесплатный" + +#: .\apps\course\models\course.py:97 +msgid "Course Price" +msgstr "Цена курса" + +#: .\apps\course\models\course.py:98 +msgid "Discount Percentage" +msgstr "Процент скидки" + +#: .\apps\course\models\course.py:100 +msgid "Course Final Price" +msgstr "Итоговая цена курса" + +#: .\apps\course\models\course.py:101 +msgid "" +"This field is automatically calculated based on the discount percentage." +msgstr "Это поле рассчитывается автоматически на основе процента скидки." + +#: .\apps\course\models\course.py:106 +msgid "Lock Group Chat" +msgstr "Заблокировать групповой чат" + +#: .\apps\course\models\course.py:110 +msgid "Lock Private Chats with Professor" +msgstr "Заблокировать личные чаты с профессором" + +#: .\apps\course\models\course.py:114 +msgid "Course features" +msgstr "Особенности курса" + +#: .\apps\course\models\course.py:115 .\apps\course\models\course.py:173 +#: .\apps\course\models\course.py:191 .\apps\course\models\course.py:222 +#: .\apps\course\models\course.py:246 .\apps\course\models\lesson.py:35 +#: .\apps\course\models\lesson.py:61 .\apps\course\models\lesson.py:135 +#: .\apps\transaction\models.py:36 +msgid "Created at" +msgstr "Дата создания" + +#: .\apps\course\models\course.py:171 +msgid "Glossary Title" +msgstr "Название глоссария" + +#: .\apps\course\models\course.py:180 .\apps\course\models\course.py:190 +msgid "Glossary" +msgstr "Глоссарий" + +#: .\apps\course\models\course.py:181 +msgid "Glossaries" +msgstr "Глоссарии" + +#: .\apps\course\models\course.py:207 .\config\settings\base.py:498 +msgid "Course Glossary" +msgstr "Глоссарий курса" + +#: .\apps\course\models\course.py:208 +msgid "Course Glossaries" +msgstr "Глоссарии курсов" + +#: .\apps\course\models\course.py:216 +msgid "Attachment Title" +msgstr "Название вложения" + +#: .\apps\course\models\course.py:219 +msgid "Attachment File" +msgstr "Файл вложения" + +#: .\apps\course\models\course.py:221 +msgid "File Size (in bytes)" +msgstr "Размер файла (в байтах)" + +#: .\apps\course\models\lesson.py:24 +msgid "Lesson Title" +msgstr "Название урока" + +#: .\apps\course\models\lesson.py:25 +msgid "Content Type" +msgstr "Тип контента" + +#: .\apps\course\models\lesson.py:32 +msgid "Link" +msgstr "Ссылка" + +#: .\apps\course\models\lesson.py:33 +msgid "Duration (in minutes)" +msgstr "Продолжительность (в минутах)" + +#: .\apps\course\models\lesson.py:42 .\apps\course\models\lesson.py:56 +#: .\apps\quiz\models\quiz.py:8 +msgid "Lesson" +msgstr "Урок" + +#: .\apps\course\models\lesson.py:43 +msgid "Lessons" +msgstr "Уроки" + +#: .\apps\course\models\lesson.py:57 +msgid "Course Lesson Title" +msgstr "Название урока курса" + +#: .\apps\course\models\lesson.py:58 .\apps\hadis\models\hadis.py:462 +#: .\apps\quiz\models\quiz.py:44 +msgid "Priority" +msgstr "Приоритет" + +#: .\apps\course\models\lesson.py:60 .\apps\course\models\live_session.py:174 +#: .\apps\course\models\participant.py:21 .\apps\hadis\models\category.py:17 +msgid "Is Active" +msgstr "Активен" + +#: .\apps\course\models\lesson.py:107 .\apps\course\models\lesson.py:131 +msgid "Course Lesson" +msgstr "Урок курса" + +#: .\apps\course\models\lesson.py:108 .\config\settings\base.py:486 +msgid "Course Lessons" +msgstr "Уроки курса" + +#: .\apps\course\models\lesson.py:139 +msgid "Lesson Completion" +msgstr "Завершение урока" + +#: .\apps\course\models\lesson.py:140 +msgid "Lesson Completions" +msgstr "Завершения уроков" + +#: .\apps\course\models\live_session.py:14 +msgid "Course that this live session belongs to." +msgstr "Курс, к которому относится эта онлайн-сессия." + +#: .\apps\course\models\live_session.py:18 +msgid "Room ID" +msgstr "ID комнаты" + +#: .\apps\course\models\live_session.py:19 +msgid "Identifier of the PlugNMeet room." +msgstr "Идентификатор комнаты PlugNMeet." + +#: .\apps\course\models\live_session.py:26 +msgid "Subject" +msgstr "Тема" + +#: .\apps\course\models\live_session.py:27 +msgid "Topic of the live session." +msgstr "Тема онлайн-сессии." + +#: .\apps\course\models\live_session.py:30 .\apps\quiz\models\participant.py:12 +msgid "Started At" +msgstr "Начато в" + +#: .\apps\course\models\live_session.py:31 +msgid "Start time of the live session." +msgstr "Время начала онлайн-сессии." + +#: .\apps\course\models\live_session.py:34 .\apps\quiz\models\participant.py:13 +msgid "Ended At" +msgstr "Завершено в" + +#: .\apps\course\models\live_session.py:35 +msgid "End time of the live session." +msgstr "Время окончания онлайн-сессии." + +#: .\apps\course\models\live_session.py:41 +msgid "Recorded File" +msgstr "Записанный файл" + +#: .\apps\course\models\live_session.py:42 +msgid "Recorded file of the live session." +msgstr "Записанный файл онлайн-сессии." + +#: .\apps\course\models\live_session.py:54 +msgid "Course Live Session" +msgstr "Онлайн-сессия курса" + +#: .\apps\course\models\live_session.py:55 +msgid "Course Live Sessions" +msgstr "Онлайн-сессии курса" + +#: .\apps\course\models\live_session.py:64 +#: .\apps\course\models\participant.py:27 .\apps\quiz\models\participant.py:21 +#: .\apps\quiz\models\participant.py:50 +msgid "Participant" +msgstr "Участник" + +#: .\apps\course\models\live_session.py:65 +msgid "Moderator" +msgstr "Модератор" + +#: .\apps\course\models\live_session.py:66 +msgid "Observer" +msgstr "Наблюдатель" + +#: .\apps\course\models\live_session.py:76 +#: .\apps\course\models\live_session.py:138 +msgid "Live Session" +msgstr "Онлайн-сессия" + +#: .\apps\course\models\live_session.py:77 +msgid "Live session that the user joined." +msgstr "Онлайн-сессия, к которой присоединился пользователь." + +#: .\apps\course\models\live_session.py:84 +msgid "User participating in the live session." +msgstr "Пользователь, участвующий в онлайн-сессии." + +#: .\apps\course\models\live_session.py:89 +msgid "Role" +msgstr "Роль" + +#: .\apps\course\models\live_session.py:90 +msgid "Role of the user in the session" +msgstr "Роль пользователя в сессии" + +#: .\apps\course\models\live_session.py:93 +msgid "Entered At" +msgstr "Вошел в" + +#: .\apps\course\models\live_session.py:94 +msgid "Time the user entered the session" +msgstr "Время входа пользователя в сессию" + +#: .\apps\course\models\live_session.py:97 +msgid "Exited At" +msgstr "Вышел из" + +#: .\apps\course\models\live_session.py:98 +msgid "Time the user exited the session" +msgstr "Время выхода пользователя из сессии" + +#: .\apps\course\models\live_session.py:105 +msgid "Is online" +msgstr "В сети" + +#: .\apps\course\models\live_session.py:106 +msgid "Is the user currently online?" +msgstr "Находится ли пользователь в сети?" + +#: .\apps\course\models\live_session.py:115 +msgid "User Session" +msgstr "Сессия пользователя" + +#: .\apps\course\models\live_session.py:116 +msgid "User Sessions" +msgstr "Сессии пользователей" + +#: .\apps\course\models\live_session.py:127 +msgid "Voice" +msgstr "Аудио" + +#: .\apps\course\models\live_session.py:128 +msgid "Video" +msgstr "Видео" + +#: .\apps\course\models\live_session.py:139 +msgid "Live session that this recording belongs to." +msgstr "Онлайн-сессия, к которой относится эта запись." + +#: .\apps\course\models\live_session.py:144 +msgid "Title of the recording" +msgstr "Название записи" + +#: .\apps\course\models\live_session.py:148 +msgid "Recording File" +msgstr "Файл записи" + +#: .\apps\course\models\live_session.py:149 +msgid "File of the recorded session" +msgstr "Файл записанной сессии" + +#: .\apps\course\models\live_session.py:152 +msgid "File Duration" +msgstr "Продолжительность файла" + +#: .\apps\course\models\live_session.py:153 +msgid "Duration of the recording file" +msgstr "Продолжительность файла записи" + +#: .\apps\course\models\live_session.py:160 +msgid "Recording Type" +msgstr "Тип записи" + +#: .\apps\course\models\live_session.py:161 +msgid "Type of the recording (voice or video)" +msgstr "Тип записи (аудио или видео)" + +#: .\apps\course\models\live_session.py:166 +msgid "Thumbnail image for video recordings" +msgstr "Миниатюра для видеозаписей" + +#: .\apps\course\models\live_session.py:170 +msgid "Time the recording was created" +msgstr "Время создания записи" + +#: .\apps\course\models\live_session.py:171 +msgid "The datetime when the recording was last updated" +msgstr "Дата и время последнего обновления записи" + +#: .\apps\course\models\live_session.py:175 +msgid "Whether this recording is active or not" +msgstr "Является ли эта запись активной" + +#: .\apps\course\models\live_session.py:183 +msgid "Live Session Recording" +msgstr "Запись онлайн-сессии" + +#: .\apps\course\models\live_session.py:184 +msgid "Live Session Recordings" +msgstr "Записи онлайн-сессий" + +#: .\apps\course\models\participant.py:22 +msgid "Joined Date" +msgstr "Дата присоединения" + +#: .\apps\course\models\participant.py:28 .\apps\quiz\models\participant.py:22 +msgid "Participants" +msgstr "Участники" + +#: .\apps\course\templates\course\add_student_form.html:25 +msgid "Submit form" +msgstr "Отправить форму" + +#: .\apps\dobodbi_calendar\admin.py:38 +msgid "Dates" +msgstr "Даты" + +#: .\apps\dobodbi_calendar\models.py:12 +msgid "georgian" +msgstr "григорианский" + +#: .\apps\dobodbi_calendar\models.py:13 +msgid "lunar" +msgstr "лунный" + +#: .\apps\dobodbi_calendar\models.py:16 +msgid "National" +msgstr "Национальный" + +#: .\apps\dobodbi_calendar\models.py:17 +msgid "International" +msgstr "Международный" + +#: .\apps\dobodbi_calendar\models.py:18 +msgid "Religious" +msgstr "Религиозный" + +#: .\apps\dobodbi_calendar\models.py:22 +msgid "is global" +msgstr "является глобальным" + +#: .\apps\dobodbi_calendar\models.py:23 +msgid "check this field if event is global" +msgstr "отметьте это поле, если событие является глобальным" + +#: .\apps\dobodbi_calendar\models.py:30 +msgid "Choose between georgian or lunar. default to georgian" +msgstr "Выберите между григорианским или лунным. По умолчанию григорианский" + +#: .\apps\dobodbi_calendar\models.py:31 +msgid "occasion type" +msgstr "тип события" + +#: .\apps\dobodbi_calendar\models.py:33 +msgid "dates" +msgstr "даты" + +#: .\apps\dobodbi_calendar\models.py:35 +msgid "is yearly" +msgstr "ежегодное" + +#: .\apps\dobodbi_calendar\models.py:36 +msgid "check this field if event is annually" +msgstr "отметьте это поле, если событие происходит ежегодно" + +#: .\apps\dobodbi_calendar\models.py:40 +msgid "event type" +msgstr "тип события" + +#: .\apps\hadis\admin\hadis.py:680 +msgid "Status & Classification" +msgstr "Статус и классификация" + +#: .\apps\hadis\admin\hadis.py:780 .\apps\podcast\admin.py:219 +#: .\apps\video\admin.py:231 +msgid "Collection" +msgstr "Коллекция" + +#: .\apps\hadis\admin\reference.py:457 .\apps\hadis\admin\reference.py:500 +msgid "Basic Info" +msgstr "Основная информация" + +#: .\apps\hadis\admin\reference.py:460 +msgid "Publication Info" +msgstr "Информация об издании" + +#: .\apps\hadis\admin\reference.py:463 +msgid "Rating & Stats" +msgstr "Рейтинг и статистика" + +#: .\apps\hadis\admin\reference.py:474 .\apps\hadis\models\reference.py:71 +msgid "Publisher" +msgstr "Издатель" + +#: .\apps\hadis\admin\reference.py:503 +msgid "Dates (Hijri)" +msgstr "Даты (по Хиджре)" + +#: .\apps\hadis\admin\reference.py:506 +msgid "Dates (Miladi)" +msgstr "Даты (Милади)" + +#: .\apps\hadis\admin\reference.py:509 +msgid "References" +msgstr "Источники" + +#: .\apps\hadis\admin\reference.py:518 .\apps\hadis\admin\transmitter.py:550 +#: .\apps\hadis\models\reference.py:249 .\apps\hadis\models\transmitter.py:19 +#: .\templates\admin\filer\folder\directory_table.html:13 +#: .\utils\keyval_field.py:118 +msgid "Name" +msgstr "Название" + +#: .\apps\hadis\admin\reference.py:563 .\apps\hadis\models\reference.py:295 +msgid "Value" +msgstr "Значение" + +#: .\apps\hadis\admin\reference.py:567 .\apps\hadis\models\reference.py:90 +msgid "Book Reference" +msgstr "Ссылка на книгу" + +#: .\apps\hadis\admin\transmitter.py:502 .\apps\hadis\models\transmitter.py:288 +msgid "Transmitter" +msgstr "Передатчик" + +#: .\apps\hadis\admin\transmitter.py:640 .\apps\hadis\models\transmitter.py:569 +msgid "Scholar Name" +msgstr "Имя ученого" + +#: .\apps\hadis\models\category.py:11 .\apps\hadis\models\transmitter.py:223 +#: .\apps\hadis\templates\admin\category_index.html:25 +msgid "Shia" +msgstr "Шииты" + +#: .\apps\hadis\models\category.py:12 .\apps\hadis\models\transmitter.py:224 +#: .\apps\hadis\templates\admin\category_index.html:31 +msgid "Sunni" +msgstr "Сунниты" + +#: .\apps\hadis\models\category.py:14 +msgid "Sect Name" +msgstr "Название течения" + +#: .\apps\hadis\models\category.py:61 +msgid "Hadis Sect" +msgstr "Течение хадисов" + +#: .\apps\hadis\models\category.py:62 .\config\settings\base.py:843 +msgid "Hadis Sects" +msgstr "Течения хадисов" + +#: .\apps\hadis\models\category.py:68 +#: .\apps\hadis\templates\admin\category_index.html:158 +msgid "Quran" +msgstr "Коран" + +#: .\apps\hadis\models\category.py:69 +#: .\apps\hadis\templates\admin\category_index.html:161 +msgid "Hadith" +msgstr "Хадис" + +#: .\apps\hadis\models\category.py:70 +msgid "History" +msgstr "История" + +#: .\apps\hadis\models\category.py:71 +msgid "Fatwa" +msgstr "Фетва" + +#: .\apps\hadis\models\category.py:72 +msgid "Quote" +msgstr "Цитата" + +#: .\apps\hadis\models\category.py:75 +msgid "Sect" +msgstr "Течение" + +#: .\apps\hadis\models\category.py:76 +msgid "Source Type" +msgstr "Тип источника" + +#: .\apps\hadis\models\category.py:80 +msgid "xmind file" +msgstr "Файл xmind" + +#: .\apps\hadis\models\category.py:90 +msgid "Child category must have the same sect_type as its parent. " msgstr "" +"Дочерняя категория должна иметь тот же тип течения, что и родительская." + +#: .\apps\hadis\models\category.py:173 +msgid "Hadis Category" +msgstr "Категория хадисов" + +#: .\apps\hadis\models\category.py:174 .\config\settings\base.py:849 +msgid "Hadis Categories" +msgstr "Категории хадисов" + +#: .\apps\hadis\models\hadis.py:119 +msgid "hadis collection" +msgstr "коллекция хадисов" + +#: .\apps\hadis\models\hadis.py:120 +msgid "hadis collections" +msgstr "коллекции хадисов" + +#: .\apps\hadis\models\hadis.py:125 .\apps\hadis\models\hadis.py:402 +#: .\apps\hadis\models\hadis.py:412 .\apps\hadis\models\transmitter.py:417 +msgid "hadis" +msgstr "хадис" + +#: .\apps\hadis\models\hadis.py:131 +msgid "hadis in collection" +msgstr "хадис в коллекции" + +#: .\apps\hadis\models\hadis.py:132 +msgid "hadis in collections" +msgstr "хадисы в коллекциях" + +#: .\apps\hadis\models\hadis.py:255 .\apps\hadis\models\hadis.py:274 +msgid "hadis status" +msgstr "статус хадиса" + +#: .\apps\hadis\models\hadis.py:256 +msgid "hadis statuses" +msgstr "статусы хадисов" + +#: .\apps\hadis\models\hadis.py:263 +msgid "category" +msgstr "категория" + +#: .\apps\hadis\models\hadis.py:264 +msgid "number" +msgstr "номер" + +#: .\apps\hadis\models\hadis.py:266 +msgid "Title Narrator" +msgstr "Имя рассказчика" + +#: .\apps\hadis\models\hadis.py:270 +msgid "text" +msgstr "текст" + +#: .\apps\hadis\models\hadis.py:271 .\apps\hadis\models\hadis.py:492 +#: .\apps\hadis\models\transmitter.py:640 +msgid "translation" +msgstr "перевод" + +#: .\apps\hadis\models\hadis.py:272 +msgid "visibility" +msgstr "видимость" + +#: .\apps\hadis\models\hadis.py:275 +msgid "Status text" +msgstr "Текст статуса" + +#: .\apps\hadis\models\hadis.py:276 +msgid "Address" +msgstr "Адрес" + +#: .\apps\hadis\models\hadis.py:277 +msgid "links" +msgstr "ссылки" + +#: .\apps\hadis\models\hadis.py:278 +msgid "tags" +msgstr "теги" + +#: .\apps\hadis\models\hadis.py:280 .\apps\hadis\models\hadis.py:495 +#: .\apps\hadis\models\transmitter.py:641 +msgid "share link" +msgstr "ссылка поделиться" + +#: .\apps\hadis\models\hadis.py:281 +msgid "Explanation" +msgstr "Пояснение" + +#: .\apps\hadis\models\hadis.py:403 +msgid "hadises" +msgstr "хадисы" -#: apps/hadis/models/hadis.py:69 +#: .\apps\hadis\models\hadis.py:420 .\apps\hadis\models\reference.py:211 +msgid "book reference" +msgstr "ссылка на книгу" + +#: .\apps\hadis\models\hadis.py:433 msgid "Hadis Reference" -msgstr "" +msgstr "Источник хадиса" -#: apps/hadis/models/hadis.py:70 +#: .\apps\hadis\models\hadis.py:434 .\config\settings\base.py:861 msgid "Hadis References" -msgstr "" +msgstr "Источники хадисов" -#: apps/hadis/models/hadis.py:80 +#: .\apps\hadis\models\hadis.py:459 .\apps\podcast\models.py:132 +#: .\apps\video\models.py:148 msgid "thumbnail" -msgstr "" +msgstr "миниатюра" -#: apps/hadis/models/hadis.py:84 -msgid "Priority" -msgstr "" - -#: apps/hadis/models/hadis.py:85 +#: .\apps\hadis\models\hadis.py:463 msgid "Priority of the image, lower values mean higher priority." msgstr "" +"Приоритет изображения, меньшие значения означают более высокий приоритет." -#: apps/hadis/models/hadis.py:90 +#: .\apps\hadis\models\hadis.py:472 msgid "Reference Image" -msgstr "" +msgstr "Изображение источника" -#: apps/hadis/models/transmitter.py:18 apps/library/models.py:97 -#: apps/podcast/models.py:66 apps/video/models.py:68 -msgid "image allowed" -msgstr "" +#: .\apps\hadis\models\hadis.py:473 +msgid "Reference Images" +msgstr "Справочные изображения" + +#: .\apps\hadis\models\hadis.py:488 +msgid "hadis correction" +msgstr "исправление хадиса" + +#: .\apps\hadis\models\hadis.py:499 +msgid "Hadis Correction" +msgstr "Исправление хадиса" + +#: .\apps\hadis\models\hadis.py:500 +msgid "Hadis Corrections" +msgstr "Исправления хадисов" + +#: .\apps\hadis\models\reference.py:66 +msgid "ISBN" +msgstr "ISBN" + +#: .\apps\hadis\models\reference.py:67 +msgid "volume" +msgstr "том" + +#: .\apps\hadis\models\reference.py:68 +msgid "year of publication" +msgstr "год издания" + +#: .\apps\hadis\models\reference.py:69 +msgid "number of pages" +msgstr "количество страниц" + +#: .\apps\hadis\models\reference.py:72 +msgid "subject area" +msgstr "предметная область" + +#: .\apps\hadis\models\reference.py:73 +msgid "type" +msgstr "тип" + +#: .\apps\hadis\models\reference.py:77 +msgid "rate" +msgstr "оценка" + +#: .\apps\hadis\models\reference.py:80 +msgid "Rating from 0 to 5" +msgstr "Оценка от 0 до 5" + +#: .\apps\hadis\models\reference.py:91 +msgid "Book References" +msgstr "Ссылки на книги" + +#: .\apps\hadis\models\reference.py:213 +msgid "image" +msgstr "изображение" + +#: .\apps\hadis\models\reference.py:220 +msgid "Book Reference Image" +msgstr "Изображение источника книги" + +#: .\apps\hadis\models\reference.py:221 +msgid "Book Reference Images" +msgstr "Изображения источников книг" + +#: .\apps\hadis\models\reference.py:250 .\apps\hadis\models\transmitter.py:245 +msgid "Birth Year (Hijri)" +msgstr "Год рождения (по Хиджре)" + +#: .\apps\hadis\models\reference.py:251 .\apps\hadis\models\transmitter.py:246 +msgid "Death Year (Hijri)" +msgstr "Год смерти (по Хиджре)" + +#: .\apps\hadis\models\reference.py:252 +msgid "Birth Year (Miladi)" +msgstr "Год рождения (Милади)" + +#: .\apps\hadis\models\reference.py:253 +msgid "Death Year (Miladi)" +msgstr "Год смерти (Милади)" + +#: .\apps\hadis\models\reference.py:257 +msgid "book references" +msgstr "ссылки на книги" + +#: .\apps\hadis\models\reference.py:265 +msgid "Book Author" +msgstr "Автор книги" -#: apps/hadis/models/transmitter.py:35 +#: .\apps\hadis\models\reference.py:266 +msgid "Book Authors" +msgstr "Авторы книг" + +#: .\apps\hadis\models\reference.py:300 +msgid "book attribute" +msgstr "атрибут книги" + +#: .\apps\hadis\models\reference.py:308 +msgid "Book Attribute" +msgstr "Атрибут книги" + +#: .\apps\hadis\models\reference.py:309 +msgid "Book Attributes" +msgstr "Атрибуты книги" + +#: .\apps\hadis\models\transmitter.py:20 +msgid "layer number" +msgstr "номер уровня" + +#: .\apps\hadis\models\transmitter.py:28 +msgid "Narrator Layer" +msgstr "Уровень передатчика" + +#: .\apps\hadis\models\transmitter.py:29 +msgid "Narrator Layers" +msgstr "Уровни передатчиков" + +#: .\apps\hadis\models\transmitter.py:34 +msgid "Layer" +msgstr "Уровень" + +#: .\apps\hadis\models\transmitter.py:208 +msgid "Transmitter Reliability" +msgstr "Достоверность передатчика" + +#: .\apps\hadis\models\transmitter.py:209 +msgid "Transmitter Reliabilities" +msgstr "Достоверности передатчиков" + +#: .\apps\hadis\models\transmitter.py:229 +msgid "Other" +msgstr "Другой" + +#: .\apps\hadis\models\transmitter.py:230 +msgid "Unknown" +msgstr "Неизвестно" + +#: .\apps\hadis\models\transmitter.py:234 +msgid "Kunya" +msgstr "Кунья" + +#: .\apps\hadis\models\transmitter.py:235 +msgid "Known as" +msgstr "Известен как" + +#: .\apps\hadis\models\transmitter.py:236 +msgid "Nick Name" +msgstr "Прозвище" + +#: .\apps\hadis\models\transmitter.py:240 +msgid "Origin" +msgstr "Происхождение" + +#: .\apps\hadis\models\transmitter.py:241 +msgid "Lived in" +msgstr "Жил в" + +#: .\apps\hadis\models\transmitter.py:242 +msgid "Died in" +msgstr "Умер в" + +#: .\apps\hadis\models\transmitter.py:247 +msgid "Age at Death" +msgstr "Возраст на момент смерти" + +#: .\apps\hadis\models\transmitter.py:248 +msgid "Generation" +msgstr "Поколение" + +#: .\apps\hadis\models\transmitter.py:253 +msgid "reliability" +msgstr "достоверность" + +#: .\apps\hadis\models\transmitter.py:261 +msgid "Madhhab/School of Thought" +msgstr "Мазхаб / Религиозная школа" + +#: .\apps\hadis\models\transmitter.py:267 +msgid "In Sahih Muslim" +msgstr "В Сахихе Муслима" + +#: .\apps\hadis\models\transmitter.py:268 +msgid "Is this narrator present in Sahih Muslim?" +msgstr "Присутствует ли этот передатчик в Сахихе Муслима?" + +#: .\apps\hadis\models\transmitter.py:272 +msgid "In Sahih Bukhari" +msgstr "В Сахихе аль-Бухари" + +#: .\apps\hadis\models\transmitter.py:273 +msgid "Is this narrator present in Sahih Bukhari?" +msgstr "Присутствует ли этот передатчик в Сахихе аль-Бухари?" + +#: .\apps\hadis\models\transmitter.py:289 .\config\settings\base.py:879 +msgid "Transmitters" +msgstr "Передатчики" + +#: .\apps\hadis\models\transmitter.py:423 +#: .\apps\hadis\models\transmitter.py:566 +#: .\apps\hadis\models\transmitter.py:634 msgid "transmitter" -msgstr "" +msgstr "передатчик" -#: apps/hadis/models/transmitter.py:41 -msgid "Order" -msgstr "" +#: .\apps\hadis\models\transmitter.py:429 +msgid "narrator layer" +msgstr "уровень передатчика" -#: apps/hadis/models/transmitter.py:42 +#: .\apps\hadis\models\transmitter.py:433 +msgid "The layer/class (Tabaqah) this narrator belongs to" +msgstr "Уровень/класс (Табака), к которому принадлежит этот передатчик" + +#: .\apps\hadis\models\transmitter.py:438 +msgid "reliability status" +msgstr "статус достоверности" + +#: .\apps\hadis\models\transmitter.py:442 +msgid "Reliability status of the narrator" +msgstr "Статус достоверности передатчика" + +#: .\apps\hadis\models\transmitter.py:447 msgid "Order in the chain of transmission" -msgstr "" +msgstr "Порядок в цепочке передачи" -#: apps/hadis/models/transmitter.py:47 +#: .\apps\hadis\models\transmitter.py:449 +msgid "is gap" +msgstr "является разрывом" + +#: .\apps\hadis\models\transmitter.py:458 msgid "Hadis Transmitter" -msgstr "" +msgstr "Передатчик хадиса" -#: apps/hadis/models/transmitter.py:48 +#: .\apps\hadis\models\transmitter.py:459 .\config\settings\base.py:885 msgid "Hadis Transmitters" -msgstr "" +msgstr "Передатчики хадисов" + +#: .\apps\hadis\models\transmitter.py:550 +msgid "Opinion Status" +msgstr "Статус мнения" + +#: .\apps\hadis\models\transmitter.py:551 +msgid "Opinion Statuses" +msgstr "Статусы мнений" + +#: .\apps\hadis\models\transmitter.py:570 +msgid "Opinion Text" +msgstr "Текст мнения" + +#: .\apps\hadis\models\transmitter.py:574 +msgid "opinion status" +msgstr "статус мнения" + +#: .\apps\hadis\models\transmitter.py:588 +msgid "Transmitter Opinion" +msgstr "Мнение о передатчике" + +#: .\apps\hadis\models\transmitter.py:589 +msgid "Transmitter Opinions" +msgstr "Мнения о передатчиках" + +#: .\apps\hadis\models\transmitter.py:649 +#: .\apps\hadis\models\transmitter.py:650 +msgid "Transmitter Original Text" +msgstr "Оригинальный текст о передатчике" + +#: .\apps\hadis\models\version.py:5 +msgid "Version Name" +msgstr "Название версии" + +#: .\apps\hadis\models\version.py:6 +msgid "Published Date" +msgstr "Дата публикации" -#: apps/hadis/templates/admin/category_index.html:11 +#: .\apps\hadis\models\version.py:7 +msgid "Release Description" +msgstr "Описание релиза" + +#: .\apps\hadis\templates\admin\category_index.html:11 msgid "Category Tree Editor" -msgstr "" +msgstr "Редактор дерева категорий" -#: apps/hadis/templates/admin/category_index.html:15 +#: .\apps\hadis\templates\admin\category_index.html:15 msgid "" "Make your category and sort it by drag and drop . and try to edit items by " "double click." msgstr "" +"Создайте свою категорию и отсортируйте ее перетаскиванием, а также " +"попробуйте редактировать элементы двойным щелчком." -#: apps/hadis/templates/admin/category_index.html:62 +#: .\apps\hadis\templates\admin\category_index.html:62 msgid "Parent: " -msgstr "" +msgstr "Родитель: " -#: apps/hadis/templates/admin/category_index.html:70 +#: .\apps\hadis\templates\admin\category_index.html:70 msgid "Category Level:" -msgstr "" +msgstr "Уровень категории:" -#: apps/hadis/templates/admin/category_index.html:77 +#: .\apps\hadis\templates\admin\category_index.html:77 msgid "L1" -msgstr "" +msgstr "Ур. 1" -#: apps/hadis/templates/admin/category_index.html:83 +#: .\apps\hadis\templates\admin\category_index.html:83 msgid "L2" -msgstr "" +msgstr "Ур. 2" -#: apps/hadis/templates/admin/category_index.html:89 +#: .\apps\hadis\templates\admin\category_index.html:89 msgid "L3" -msgstr "" +msgstr "Ур. 3" -#: apps/hadis/templates/admin/category_index.html:99 +#: .\apps\hadis\templates\admin\category_index.html:99 msgid "Level 1 categories represent source types: Shia or Sunni" -msgstr "" +msgstr "Категории 1 уровня представляют типы источников: Шииты или Сунниты" -#: apps/hadis/templates/admin/category_index.html:106 +#: .\apps\hadis\templates\admin\category_index.html:106 msgid "" "Level 2 categories are children of Shia/Sunni with content type: Quran or " "Hadith" msgstr "" +"Категории 2 уровня являются дочерними для Шиитов/Суннитов с типом контента: " +"Коран или Хадис" -#: apps/hadis/templates/admin/category_index.html:113 +#: .\apps\hadis\templates\admin\category_index.html:113 msgid "Level 3 categories are children of Quran or Hadith categories" -msgstr "" +msgstr "Категории 3 уровня являются дочерними для категорий Корана или Хадисов" -#: apps/hadis/templates/admin/category_index.html:127 +#: .\apps\hadis\templates\admin\category_index.html:127 msgid "Parent Category:" -msgstr "" +msgstr "Родительская категория:" -#: apps/hadis/templates/admin/category_index.html:130 +#: .\apps\hadis\templates\admin\category_index.html:130 msgid "-- Select Parent Category --" -msgstr "" +msgstr "-- Выберите родительскую категорию --" -#: apps/hadis/templates/admin/category_index.html:134 +#: .\apps\hadis\templates\admin\category_index.html:134 msgid "Select a parent category or leave empty for top-level category" msgstr "" +"Выберите родительскую категорию или оставьте пустым для категории верхнего " +"уровня" -#: apps/hadis/templates/admin/category_index.html:916 +#: .\apps\hadis\templates\admin\category_index.html:916 msgid "Search for a category..." -msgstr "" +msgstr "Поиск категории..." -#: apps/hadis/templates/admin/category_index.html:925 +#: .\apps\hadis\templates\admin\category_index.html:925 msgid "No categories found" -msgstr "" +msgstr "Категории не найдены" -#: apps/hadis/templates/admin/category_index.html:928 +#: .\apps\hadis\templates\admin\category_index.html:928 msgid "Searching..." -msgstr "" +msgstr "Поиск..." -#: apps/hadis/templates/admin/category_index.html:931 +#: .\apps\hadis\templates\admin\category_index.html:931 msgid "Type to search..." -msgstr "" +msgstr "Введите для поиска..." -#: apps/hadis/templates/admin/category_index.html:1021 -#: apps/hadis/templates/admin/category_index.html:1190 +#: .\apps\hadis\templates\admin\category_index.html:1021 +#: .\apps\hadis\templates\admin\category_index.html:1190 msgid "Level 1 Categories" -msgstr "" +msgstr "Категории 1 уровня" -#: apps/hadis/templates/admin/category_index.html:1028 -#: apps/hadis/templates/admin/category_index.html:1197 +#: .\apps\hadis\templates\admin\category_index.html:1028 +#: .\apps\hadis\templates\admin\category_index.html:1197 msgid "Level 2 Categories" -msgstr "" +msgstr "Категории 2 уровня" -#: apps/hadis/templates/admin/category_index.html:1035 -#: apps/hadis/templates/admin/category_index.html:1204 +#: .\apps\hadis\templates\admin\category_index.html:1035 +#: .\apps\hadis\templates\admin\category_index.html:1204 msgid "Level 3 Categories" -msgstr "" +msgstr "Категории 3 уровня" -#: apps/hadis/templates/admin/category_index.html:1344 +#: .\apps\hadis\templates\admin\category_index.html:1344 msgid "Level 1 must have a source type" -msgstr "" +msgstr "Уровень 1 должен иметь тип источника" -#: apps/hadis/templates/admin/category_index.html:1347 +#: .\apps\hadis\templates\admin\category_index.html:1347 msgid "Level 2 must have a category type" -msgstr "" +msgstr "Уровень 2 должен иметь тип категории" -#: apps/hadis/templates/admin/category_index.html:1423 -#: apps/hadis/templates/admin/category_index.html:1498 -#: apps/hadis/templates/admin/category_index.html:1719 -#: apps/hadis/templates/admin/category_index.html:2119 +#: .\apps\hadis\templates\admin\category_index.html:1423 +#: .\apps\hadis\templates\admin\category_index.html:1498 +#: .\apps\hadis\templates\admin\category_index.html:1719 +#: .\apps\hadis\templates\admin\category_index.html:2119 msgid "Add Child Category" -msgstr "" +msgstr "Добавить дочернюю категорию" -#: apps/hadis/templates/admin/category_index.html:1992 +#: .\apps\hadis\templates\admin\category_index.html:1992 msgid "No Items Found" -msgstr "" +msgstr "Элементы не найдены" -#: apps/hadis/templates/admin/category_index.html:2206 -#: apps/hadis/templates/admin/category_index.html:2214 +#: .\apps\hadis\templates\admin\category_index.html:2206 +#: .\apps\hadis\templates\admin\category_index.html:2214 msgid "No Quran categories" -msgstr "" +msgstr "Нет категорий Корана" -#: apps/hadis/templates/admin/category_index.html:2210 -#: apps/hadis/templates/admin/category_index.html:2215 +#: .\apps\hadis\templates\admin\category_index.html:2210 +#: .\apps\hadis\templates\admin\category_index.html:2215 msgid "No Hadith categories" -msgstr "" +msgstr "Нет категорий хадисов" -#: apps/hadis/templates/admin/hadiscategory/change_form.html:28 +#: .\apps\hadis\templates\admin\hadiscategory\change_form.html:28 msgid "Add Category" -msgstr "" +msgstr "Добавить категорию" -#: apps/hadis/templates/admin/hadisowerview_change_form.html:8 +#: .\apps\hadis\templates\admin\hadisowerview_change_form.html:8 msgid "Save And Edit Next Hadis" -msgstr "" +msgstr "Сохранить и редактировать следующий хадис" -#: apps/hadis/templates/admin/hadisowerview_change_form.html:12 +#: .\apps\hadis\templates\admin\hadisowerview_change_form.html:12 msgid "Save And Edit Previus Hadis" -msgstr "" +msgstr "Сохранить и редактировать предыдущий хадис" -#: apps/hadis/templates/admin/hadisowerview_change_form.html:16 +#: .\apps\hadis\templates\admin\hadisowerview_change_form.html:16 msgid "Save And Edit Random" -msgstr "" +msgstr "Сохранить и редактировать случайный" -#: apps/library/admin.py:23 -msgid "File Information" -msgstr "" +#: .\apps\library\admin.py:44 .\apps\library\models.py:93 +#: .\apps\podcast\admin.py:238 .\apps\video\admin.py:250 +#: .\config\settings\base.py:636 .\config\settings\base.py:709 +#: .\config\settings\base.py:735 .\config\settings\base.py:767 +#: .\config\settings\base.py:805 +msgid "Categories" +msgstr "Категории" -#: apps/library/admin.py:26 -msgid "Relations" -msgstr "" +#: .\apps\library\admin.py:51 .\apps\podcast\admin.py:220 +#: .\apps\video\admin.py:232 .\config\settings\base.py:389 +#: .\config\settings\base.py:407 .\config\settings\base.py:715 +#: .\config\settings\base.py:741 +msgid "Collections" +msgstr "Коллекции" -#: apps/library/admin.py:29 apps/video/admin.py:81 -msgid "Statistics" -msgstr "" +#: .\apps\library\admin.py:71 +msgid "File Information" +msgstr "Информация о файле" -#: apps/library/admin.py:48 apps/library/models.py:24 -#: apps/library/models.py:128 +#: .\apps\library\admin.py:98 .\apps\library\admin.py:143 +#: .\apps\library\models.py:31 .\apps\library\models.py:164 +#: .\config\settings\base.py:703 msgid "Books" -msgstr "" - -#: apps/library/admin.py:57 utils/keyval_field.py:39 utils/keyval_field.py:59 -#: utils/keyval_field.py:76 utils/keyval_field.py:139 utils/keyval_field.py:167 -#: utils/schema.py:49 -msgid "Title" -msgstr "" +msgstr "Книги" -#: apps/library/admin.py:60 apps/library/admin.py:185 +#: .\apps\library\admin.py:121 .\apps\library\admin.py:219 msgid "Number of Books" -msgstr "" +msgstr "Количество книг" -#: apps/library/apps.py:8 -msgid "Library" -msgstr "" +#: .\apps\library\admin.py:227 +msgid "Mark selected categories as active" +msgstr "Отметить выбранные категории как активные" -#: apps/library/models.py:10 -msgid "Pinned" -msgstr "" +#: .\apps\library\admin.py:230 +#, python-format +msgid "%(count)d categories were successfully marked as active." +msgstr "%(count)d категорий было успешно отмечено как активные." -#: apps/library/models.py:11 -msgid "Middle Section" -msgstr "" +#: .\apps\library\admin.py:232 +msgid "Mark selected categories as inactive" +msgstr "Отметить выбранные категории как неактивные" -#: apps/library/models.py:12 -msgid "Bottom Section" -msgstr "" +#: .\apps\library\admin.py:235 +#, python-format +msgid "%(count)d categories were successfully marked as inactive." +msgstr "%(count)d категорий было успешно отмечено как неактивные." -#: apps/library/models.py:15 apps/library/models.py:95 -#: apps/library/models.py:96 -msgid "could be null" -msgstr "" +#: .\apps\library\admin.py:237 +msgid "Toggle status" +msgstr "Переключить статус" -#: apps/library/models.py:20 -msgid "Display Position" -msgstr "" +#: .\apps\library\admin.py:241 +msgid "active" +msgstr "активный" + +#: .\apps\library\admin.py:241 +msgid "inactive" +msgstr "неактивный" + +#: .\apps\library\admin.py:242 +#, python-format +msgid "Category '%(title)s' is now %(status)s." +msgstr "Категория '%(title)s' теперь %(status)s." + +#: .\apps\library\apps.py:8 +msgid "Library" +msgstr "Библиотека" -#: apps/library/models.py:30 +#: .\apps\library\models.py:37 msgid "Book Collection" -msgstr "" +msgstr "Коллекция книг" -#: apps/library/models.py:31 +#: .\apps\library\models.py:38 msgid "Book Collections" +msgstr "Коллекции книг" + +#: .\apps\library\models.py:53 +msgid "Pinned Book Collection" +msgstr "Закрепленная коллекция книг" + +#: .\apps\library\models.py:54 +msgid "Pinned Book Collections" +msgstr "Закрепленные коллекции книг" + +#: .\apps\library\models.py:63 +msgid "Middle Section Book Collection" +msgstr "Коллекция книг среднего раздела" + +#: .\apps\library\models.py:64 +msgid "Middle Section Book Collections" +msgstr "Коллекции книг среднего раздела" + +#: .\apps\library\models.py:106 +msgid "Summary Title" +msgstr "Заголовок сводки" + +#: .\apps\library\models.py:120 +msgid "Main Themes" +msgstr "Главные темы" + +#: .\apps\library\models.py:120 +msgid "List of main themes" +msgstr "Список главных тем" + +#: .\apps\library\models.py:121 +msgid "Notable Works" +msgstr "Известные труды" + +#: .\apps\library\models.py:121 +msgid "List of notable works" +msgstr "Список известных трудов" + +#: .\apps\library\models.py:123 +msgid "Number of Pages" +msgstr "Количество страниц" + +#: .\apps\library\models.py:123 +msgid "eg. 34" +msgstr "напр. 34" + +#: .\apps\library\models.py:125 +msgid "Pin to top" +msgstr "Закрепить наверху" + +#: .\apps\library\models.py:135 +msgid "File Type" +msgstr "Тип файла" + +#: .\apps\library\models.py:163 +msgid "Book" +msgstr "Книга" + +#: .\apps\library\models.py:172 +msgid "book" +msgstr "книга" + +#: .\apps\library\models.py:178 +msgid "Book Download" +msgstr "Скачивание книги" + +#: .\apps\library\models.py:179 +msgid "Book Downloads" +msgstr "Скачивания книг" + +#: .\apps\podcast\admin.py:25 .\apps\video\admin.py:26 +msgid "Playlist" +msgstr "Плейлист" + +#: .\apps\podcast\admin.py:26 .\apps\video\admin.py:27 +#: .\config\settings\base.py:747 .\config\settings\base.py:823 +msgid "Playlists" +msgstr "Плейлисты" + +#: .\apps\podcast\admin.py:60 .\apps\podcast\admin.py:129 +#: .\apps\video\admin.py:53 +msgid "Number of Playlists" +msgstr "Количество плейлистов" + +#: .\apps\podcast\admin.py:126 +msgid "Search by title or slug" +msgstr "Поиск по названию или ярлыку (slug)" + +#: .\apps\podcast\admin.py:127 +msgid "Search categories" +msgstr "Поиск категорий" + +#: .\apps\podcast\admin.py:150 .\apps\video\admin.py:159 +msgid "Search by title, slug, or description" +msgstr "Поиск по названию, ярлыку (slug) или описанию" + +#: .\apps\podcast\admin.py:151 +msgid "Search podcasts" +msgstr "Поиск подкастов" + +#: .\apps\podcast\admin.py:157 +msgid "Audio Information" +msgstr "Аудио информация" + +#: .\apps\podcast\admin.py:197 +#, python-brace-format +msgid "" +"This podcast is already used in playlist \"{}\". Each podcast can only be in " +"one playlist." +msgstr "" +"Этот подкаст уже используется в плейлисте \"{}\". Каждый подкаст может " +"находиться только в одном плейлисте." + +#: .\apps\podcast\admin.py:209 .\apps\podcast\models.py:237 +#: .\apps\video\admin.py:221 .\apps\video\models.py:253 +msgid "Playlist Item" +msgstr "Элемент плейлиста" + +#: .\apps\podcast\admin.py:210 .\apps\podcast\models.py:238 +#: .\apps\video\admin.py:222 .\apps\video\models.py:254 +msgid "Playlist Items" +msgstr "Элементы плейлиста" + +#: .\apps\podcast\admin.py:241 .\apps\video\admin.py:253 +msgid "Display Settings" +msgstr "Настройки отображения" + +#: .\apps\podcast\admin.py:257 +msgid "Will be auto-calculated from podcasts" +msgstr "Будет рассчитано автоматически из подкастов" + +#: .\apps\podcast\admin.py:261 +msgid "Number of Podcasts" +msgstr "Количество подкастов" + +#: .\apps\podcast\admin.py:295 +msgid "A podcast cannot be used multiple times in the same playlist." +msgstr "Подкаст не может быть использован несколько раз в одном плейлисте." + +#: .\apps\podcast\admin.py:318 +#, python-brace-format +msgid "" +"Podcast \"{}\" is already used in playlist \"{}\". Each podcast can only be " +"in one playlist." msgstr "" +"Подкаст \"{}\" уже используется в плейлисте \"{}\". Каждый подкаст может " +"быть только в одном плейлисте." + +#: .\apps\podcast\models.py:26 +msgid "Podcast Category" +msgstr "Категория подкастов" + +#: .\apps\podcast\models.py:27 +msgid "Podcast Categories" +msgstr "Категории подкастов" + +#: .\apps\podcast\models.py:62 +msgid "Podcast Collection" +msgstr "Коллекция подкастов" + +#: .\apps\podcast\models.py:63 +msgid "Podcasts Collections" +msgstr "Коллекции подкастов" + +#: .\apps\podcast\models.py:94 +msgid "download_count view count" +msgstr "количество скачиваний и просмотров" + +#: .\apps\podcast\models.py:123 +msgid "Podcast" +msgstr "Подкаст" + +#: .\apps\podcast\models.py:124 .\config\settings\base.py:793 +#: .\config\settings\base.py:799 +msgid "Podcasts" +msgstr "Подкасты" + +#: .\apps\podcast\models.py:130 .\apps\video\models.py:146 +msgid "slogan" +msgstr "слоган" + +#: .\apps\podcast\models.py:131 .\apps\video\models.py:147 +msgid "description" +msgstr "описание" + +#: .\apps\podcast\models.py:151 .\apps\video\models.py:167 +msgid "total time" +msgstr "общее время" + +#: .\apps\podcast\models.py:182 +msgid "Podcast Playlist" +msgstr "Плейлист подкастов" + +#: .\apps\podcast\models.py:183 +msgid "Podcast Playlists" +msgstr "Плейлисты подкастов" + +#: .\apps\podcast\models.py:198 .\apps\podcast\models.py:220 +#: .\apps\video\models.py:214 .\apps\video\models.py:236 +msgid "playlist" +msgstr "плейлист" + +#: .\apps\podcast\models.py:209 +msgid "Podcast Playlist in Collection" +msgstr "Плейлист подкастов в коллекции" + +#: .\apps\podcast\models.py:210 +msgid "Podcast Playlists in Collections" +msgstr "Плейлисты подкастов в коллекциях" + +#: .\apps\podcast\models.py:226 .\apps\podcast\models.py:261 +msgid "podcast" +msgstr "подкаст" + +#: .\apps\podcast\models.py:268 +msgid "User Playlist" +msgstr "Плейлист пользователя" + +#: .\apps\podcast\models.py:269 .\config\settings\base.py:829 +msgid "User Playlists" +msgstr "Плейлисты пользователей" + +#: .\apps\quiz\admin\participant.py:61 .\apps\quiz\models\quiz.py:42 +#: .\utils\unfold_translations.py:24 +msgid "Correct Answer" +msgstr "Правильный ответ" + +#: .\apps\quiz\admin\participant.py:77 +msgid "User Email" +msgstr "Email пользователя" + +#: .\apps\quiz\admin\quiz.py:71 .\apps\quiz\admin\quiz.py:74 +#: .\apps\quiz\models\quiz.py:49 +msgid "Questions" +msgstr "Вопросы" + +#: .\apps\quiz\admin\quiz.py:78 +msgid "Manage All Participants" +msgstr "Управление всеми участниками" + +#: .\apps\quiz\admin\quiz.py:85 +msgid "Quiz not found" +msgstr "Тест не найден" + +#: .\apps\quiz\models\participant.py:10 .\apps\quiz\models\quiz.py:17 +#: .\apps\quiz\models\quiz.py:36 +msgid "Quiz" +msgstr "Тест" + +#: .\apps\quiz\models\participant.py:14 +msgid "Total Timing" +msgstr "Общее время" + +#: .\apps\quiz\models\participant.py:14 +msgid "Seconds take to finish the quiz" +msgstr "Секунд затрачено на прохождение теста" + +#: .\apps\quiz\models\participant.py:16 +msgid "Question Score" +msgstr "Балл за вопрос" + +#: .\apps\quiz\models\participant.py:17 +msgid "Timing Score" +msgstr "Балл за время" + +#: .\apps\quiz\models\participant.py:18 +msgid "Total Score" +msgstr "Общий балл" + +#: .\apps\quiz\models\participant.py:44 .\apps\quiz\models\quiz.py:30 +#: .\apps\quiz\models\quiz.py:38 +msgid "Option 1" +msgstr "Вариант 1" + +#: .\apps\quiz\models\participant.py:45 .\apps\quiz\models\quiz.py:31 +#: .\apps\quiz\models\quiz.py:39 +msgid "Option 2" +msgstr "Вариант 2" + +#: .\apps\quiz\models\participant.py:46 .\apps\quiz\models\quiz.py:32 +#: .\apps\quiz\models\quiz.py:40 +msgid "Option 3" +msgstr "Вариант 3" + +#: .\apps\quiz\models\participant.py:47 .\apps\quiz\models\quiz.py:33 +#: .\apps\quiz\models\quiz.py:41 +msgid "Option 4" +msgstr "Вариант 4" + +#: .\apps\quiz\models\participant.py:51 .\apps\quiz\models\quiz.py:37 +#: .\apps\quiz\models\quiz.py:48 +msgid "Question" +msgstr "Вопрос" + +#: .\apps\quiz\models\participant.py:52 +msgid "Selected Option" +msgstr "Выбранный вариант" + +#: .\apps\quiz\models\participant.py:53 +msgid "At Time" +msgstr "Во время" + +#: .\apps\quiz\models\participant.py:54 +msgid "Seconds Take to Answer" +msgstr "Секунд затрачено на ответ" + +#: .\apps\quiz\models\participant.py:58 +msgid "User Quiz Answer" +msgstr "Ответ пользователя на тест" + +#: .\apps\quiz\models\participant.py:59 +msgid "User Quiz Answers" +msgstr "Ответы пользователя на тест" + +#: .\apps\quiz\models\quiz.py:10 +msgid "Quiz Title" +msgstr "Название теста" + +#: .\apps\quiz\models\quiz.py:12 +msgid "Each Question Timing" +msgstr "Время на каждый вопрос" + +#: .\apps\quiz\models\quiz.py:18 .\config\settings\base.py:560 +#: .\config\settings\base.py:670 +msgid "Quizzes" +msgstr "Тесты" + +#: .\apps\quiz\models\quiz.py:62 +msgid "Rank Quiz" +msgstr "Рейтинговый тест" + +#: .\apps\quiz\models\quiz.py:63 +msgid "Rank Quizzes" +msgstr "Рейтинговые тесты" + +#: .\apps\transaction\admin.py:32 +msgid "Payment Receipt" +msgstr "Квитанция об оплате" + +#: .\apps\transaction\admin.py:33 +msgid "Payment Receipts" +msgstr "Квитанции об оплате" + +#: .\apps\transaction\admin.py:57 +msgid "Payment Status" +msgstr "Статус платежа" + +#: .\apps\transaction\admin.py:60 +msgid "Paid" +msgstr "Оплачено" + +#: .\apps\transaction\admin.py:62 .\apps\transaction\models.py:23 +msgid "Failed" +msgstr "Неуспешно" + +#: .\apps\transaction\admin.py:64 +msgid "Waiting Approval" +msgstr "Ожидает одобрения" -#: apps/library/models.py:40 -msgid "Pinned Book Collection" -msgstr "" +#: .\apps\transaction\admin.py:65 .\apps\transaction\models.py:20 +msgid "Pending" +msgstr "В ожидании" -#: apps/library/models.py:41 -msgid "Pinned Book Collections" -msgstr "" +#: .\apps\transaction\admin.py:67 +msgid "Receipts Count" +msgstr "Количество квитанций" -#: apps/library/models.py:50 -msgid "Middle Section Book Collection" -msgstr "" +#: .\apps\transaction\admin.py:72 +msgid "receipts" +msgstr "квитанции" -#: apps/library/models.py:51 -msgid "Middle Section Book Collections" -msgstr "" +#: .\apps\transaction\admin.py:73 +msgid "No receipts" +msgstr "Нет квитанций" -#: apps/library/models.py:60 -msgid "Bottom Section Book Collection" -msgstr "" +#: .\apps\transaction\admin.py:79 +msgid "Course Participant Status" +msgstr "Статус участника курса" -#: apps/library/models.py:61 -msgid "Bottom Section Book Collections" -msgstr "" +#: .\apps\transaction\admin.py:88 +msgid "Enrolled" +msgstr "Зачислен" -#: apps/library/models.py:82 -msgid "Category" -msgstr "" +#: .\apps\transaction\admin.py:90 +msgid "Not Enrolled" +msgstr "Не зачислен" -#: apps/library/models.py:83 config/settings/base.py:552 -msgid "Categories" -msgstr "" +#: .\apps\transaction\admin.py:92 +msgid "Not Applicable" +msgstr "Неприменимо" -#: apps/library/models.py:99 -msgid "Number of Pages" +#: .\apps\transaction\admin.py:116 +#, python-brace-format +msgid "" +"Transaction status updated to SUCCESS. User {user_email} is now enrolled in " +"course '{course_title}'." msgstr "" +"Статус транзакции обновлен на УСПЕШНО. Пользователь {user_email} теперь " +"зачислен на курс '{course_title}'." -#: apps/library/models.py:99 -msgid "eg. 34" +#: .\apps\transaction\admin.py:124 +#, python-brace-format +msgid "" +"Transaction status updated to SUCCESS, but there was an issue enrolling user " +"{user_email} in course '{course_title}'. Please check the logs." msgstr "" +"Статус транзакции обновлен на УСПЕШНО, но возникла проблема с зачислением " +"пользователя {user_email} на курс '{course_title}'. Пожалуйста, проверьте " +"логи." -#: apps/library/models.py:101 -msgid "Pin to top" -msgstr "" +#: .\apps\transaction\models.py:21 +msgid "Waiting for Approval" +msgstr "Ожидает одобрения" -#: apps/library/models.py:103 apps/podcast/models.py:68 apps/video/models.py:73 -msgid "categories" -msgstr "" +#: .\apps\transaction\models.py:22 +msgid "Success" +msgstr "Успешно" -#: apps/library/models.py:104 -msgid "collections" -msgstr "" +#: .\apps\transaction\models.py:26 +msgid "Receipt" +msgstr "Квитанция" -#: apps/library/models.py:107 apps/library/models.py:108 -#: apps/podcast/models.py:73 apps/podcast/models.py:74 apps/video/models.py:81 -msgid "view count" -msgstr "" +#: .\apps\transaction\models.py:28 +msgid "Payment Gateway" +msgstr "Платежный шлюз" -#: apps/library/models.py:111 -msgid "File Type" -msgstr "" +#: .\apps\transaction\models.py:32 +msgid "Transaction Payment Method" +msgstr "Метод оплаты транзакции" -#: apps/library/models.py:127 -msgid "Book" -msgstr "" +#: .\apps\transaction\models.py:34 +msgid "Transaction Price" +msgstr "Цена транзакции" -#: apps/podcast/models.py:7 apps/video/models.py:8 -msgid "slug" -msgstr "" +#: .\apps\transaction\models.py:35 +msgid "Transaction Status" +msgstr "Статус транзакции" -#: apps/podcast/models.py:18 apps/video/models.py:19 -msgid "Video Category" -msgstr "" +#: .\apps\transaction\models.py:37 +msgid "Updated at" +msgstr "Дата обновления" -#: apps/podcast/models.py:19 apps/video/models.py:20 -msgid "Video Categories" -msgstr "" +#: .\apps\transaction\models.py:38 +msgid "Is Deleted" +msgstr "Удалено" -#: apps/podcast/models.py:32 apps/podcast/models.py:48 -msgid "podcasts" -msgstr "" +#: .\apps\transaction\models.py:60 .\apps\transaction\models.py:73 +msgid "Transaction Participant" +msgstr "Участник транзакции" -#: apps/podcast/models.py:39 -msgid "Podcast Collection" -msgstr "" +#: .\apps\transaction\models.py:61 +msgid "Transaction Participants" +msgstr "Участники транзакции" -#: apps/podcast/models.py:40 -msgid "Podcasts Collections" -msgstr "" +#: .\apps\transaction\models.py:66 +msgid "Male" +msgstr "Мужской" -#: apps/podcast/models.py:45 -msgid "podcast collection" -msgstr "" +#: .\apps\transaction\models.py:67 +msgid "Female" +msgstr "Женский" -#: apps/podcast/models.py:50 apps/video/models.py:50 -msgid "priority" -msgstr "" +#: .\apps\transaction\models.py:77 +msgid "phone" +msgstr "телефон" -#: apps/podcast/models.py:56 -msgid "Podcast in Collection" -msgstr "" +#: .\apps\transaction\models.py:79 +msgid "Select the user's gender." +msgstr "Выберите пол пользователя." -#: apps/podcast/models.py:57 -msgid "Podcasts in Collection" -msgstr "" +#: .\apps\transaction\models.py:87 +msgid "Participant Info" +msgstr "Информация об участнике" -#: apps/podcast/models.py:85 -msgid "Podcast" -msgstr "" +#: .\apps\transaction\models.py:88 +msgid "Participant Infos" +msgstr "Информация об участниках" -#: apps/podcast/models.py:86 -msgid "Podcasts" -msgstr "" +#: .\apps\transaction\models.py:99 +msgid "Transaction" +msgstr "Транзакция" -#: apps/quiz/admin/participant.py:35 -msgid "User Email" -msgstr "" +#: .\apps\transaction\models.py:103 +msgid "Receipt File" +msgstr "Файл квитанции" -#: apps/quiz/models/quiz.py:8 -msgid "lesson" -msgstr "" +#: .\apps\transaction\models.py:104 +msgid "Upload payment receipt image or document" +msgstr "Загрузите изображение или документ квитанции об оплате" -#: apps/transaction/admin.py:43 -msgid "Payment Status" -msgstr "" +#: .\apps\transaction\models.py:106 +msgid "Uploaded At" +msgstr "Загружено в" -#: apps/transaction/models.py:21 -msgid "Updated at" -msgstr "" +#: .\apps\transaction\models.py:111 +msgid "Optional description or notes about the receipt" +msgstr "Необязательное описание или заметки о квитанции" -#: apps/transaction/models.py:39 -msgid "phone" -msgstr "" +#: .\apps\transaction\models.py:115 +msgid "Transaction Receipt" +msgstr "Квитанция транзакции" + +#: .\apps\transaction\models.py:116 +msgid "Transaction Receipts" +msgstr "Квитанции транзакций" -#: apps/video/admin.py:31 apps/video/admin.py:55 +#: .\apps\video\admin.py:126 .\apps\video\admin.py:272 msgid "Number of Videos" -msgstr "" +msgstr "Количество видео" + +#: .\apps\video\admin.py:160 +msgid "Search videos" +msgstr "Поиск видео" -#: apps/video/admin.py:75 +#: .\apps\video\admin.py:166 msgid "Video Information" +msgstr "Информация о видео" + +#: .\apps\video\admin.py:209 +#, python-brace-format +msgid "" +"This video is already used in playlist \"{}\". Each video can only be in one " +"playlist." msgstr "" +"Это видео уже используется в плейлисте \"{}\". Каждое видео может находиться " +"только в одном плейлисте." + +#: .\apps\video\admin.py:269 +msgid "Will be auto-calculated from videos" +msgstr "Будет рассчитано автоматически из видео" -#: apps/video/models.py:33 -msgid "videos" +#: .\apps\video\admin.py:306 +msgid "A video cannot be used multiple times in the same playlist." +msgstr "Видео не может быть использовано несколько раз в одном плейлисте." + +#: .\apps\video\admin.py:329 +#, python-brace-format +msgid "" +"Video \"{}\" is already used in playlist \"{}\". Each video can only be in " +"one playlist." msgstr "" +"Видео \"{}\" уже используется в плейлисте \"{}\". Каждое видео может быть " +"только в одном плейлисте." + +#: .\apps\video\models.py:28 +msgid "Video Category" +msgstr "Категория видео" + +#: .\apps\video\models.py:29 +msgid "Video Categories" +msgstr "Категории видео" -#: apps/video/models.py:39 +#: .\apps\video\models.py:65 msgid "Video Collection" -msgstr "" +msgstr "Коллекция видео" -#: apps/video/models.py:40 +#: .\apps\video\models.py:66 msgid "Video Collections" -msgstr "" +msgstr "Коллекции видео" -#: apps/video/models.py:45 -msgid "video collection" -msgstr "" +#: .\apps\video\models.py:71 +msgid "Pinned Video Collection" +msgstr "Закрепленная коллекция видео" -#: apps/video/models.py:48 -msgid "video" -msgstr "" +#: .\apps\video\models.py:72 +msgid "Pinned Video Collections" +msgstr "Закрепленные коллекции видео" -#: apps/video/models.py:56 -msgid "Video in Collection" -msgstr "" +#: .\apps\video\models.py:78 +msgid "Middle Section Video Collection" +msgstr "Коллекция видео среднего раздела" -#: apps/video/models.py:57 -msgid "Videos in Collection" -msgstr "" +#: .\apps\video\models.py:79 +msgid "Middle Section Video Collections" +msgstr "Коллекции видео среднего раздела" -#: apps/video/models.py:99 -msgid "Video" -msgstr "" +#: .\apps\video\models.py:129 +msgid "This field is required when video type is Link." +msgstr "Это поле обязательно, когда тип видео - Ссылка." -#: apps/video/models.py:100 -msgid "Videos" -msgstr "" +#: .\apps\video\models.py:133 +msgid "This field is required when video type is File." +msgstr "Это поле обязательно, когда тип видео - Файл." -#: config/settings/base.py:198 -msgid "English" -msgstr "" +#: .\apps\video\models.py:198 +msgid "Video Playlist" +msgstr "Плейлист видео" -#: config/settings/base.py:199 -msgid "Persian" -msgstr "" +#: .\apps\video\models.py:199 +msgid "Video Playlists" +msgstr "Плейлисты видео" + +#: .\apps\video\models.py:225 +msgid "Video Playlist in Collection" +msgstr "Плейлист видео в коллекции" + +#: .\apps\video\models.py:226 +msgid "Video Playlists in Collections" +msgstr "Плейлисты видео в коллекциях" + +#: .\apps\video\models.py:242 +msgid "video" +msgstr "видео" + +#: .\config\settings\base.py:207 +msgid "English" +msgstr "Английский" -#: config/settings/base.py:200 +#: .\config\settings\base.py:208 msgid "Russia" -msgstr "" +msgstr "Русский" -#: config/settings/base.py:323 config/settings/base.py:324 -msgid "Imam Jawad Admin" -msgstr "" +#: .\config\settings\base.py:395 .\config\settings\base.py:413 +msgid "Middle Collections" +msgstr "Средние коллекции" -#: config/settings/base.py:325 -msgid "Imam Jawad Online School" -msgstr "" +#: .\config\settings\base.py:426 .\config\settings\base.py:539 +#: .\config\settings\base.py:773 .\config\settings\base.py:811 +msgid "Pinned Collections" +msgstr "Закрепленные коллекции" -#: config/settings/base.py:329 -msgid "Imam Javad Site" -msgstr "" +#: .\config\settings\base.py:432 .\config\settings\base.py:545 +#: .\config\settings\base.py:779 .\config\settings\base.py:817 +msgid "Regular Collections" +msgstr "Обычные коллекции" -#: config/settings/base.py:409 config/settings/base.py:510 +#: .\config\settings\base.py:444 msgid "Users" -msgstr "" +msgstr "Пользователи" -#: config/settings/base.py:417 +#: .\config\settings\base.py:452 msgid "Guest Users" -msgstr "" +msgstr "Гостевые пользователи" -#: config/settings/base.py:429 +#: .\config\settings\base.py:464 msgid "Groups" -msgstr "" - -#: config/settings/base.py:453 -msgid "Lessons" -msgstr "" +msgstr "Группы" -#: config/settings/base.py:459 -msgid "Attachments" -msgstr "" - -#: config/settings/base.py:465 -msgid "Glossary" -msgstr "" +#: .\config\settings\base.py:515 .\config\settings\base.py:648 +msgid "Live Sessions" +msgstr "Онлайн-сессии" -#: config/settings/base.py:471 -msgid "Quizzes" -msgstr "" +#: .\config\settings\base.py:566 +msgid "Quiz Participants" +msgstr "Участники теста" -#: config/settings/base.py:489 templates/admin/index.html:8 utils/admin.py:105 +#: .\config\settings\base.py:584 .\templates\admin\index.html:7 +#: .\utils\admin.py:462 msgid "Dashboard" -msgstr "" +msgstr "Панель управления" -#: config/settings/base.py:499 -msgid "Authentication" -msgstr "" +#: .\config\settings\base.py:589 +msgid "Calender" +msgstr "Календарь" -#: config/settings/base.py:521 +#: .\config\settings\base.py:609 .\utils\unfold_translations.py:40 +msgid "All Users" +msgstr "Все пользователи" + +#: .\config\settings\base.py:615 msgid "Students" -msgstr "" +msgstr "Студенты" -#: config/settings/base.py:533 +#: .\config\settings\base.py:621 msgid "Professors" -msgstr "" +msgstr "Профессора" -#: config/settings/base.py:557 +#: .\config\settings\base.py:654 msgid "Certificates" -msgstr "" +msgstr "Сертификаты" -#: config/settings/base.py:579 config/settings/base.py:584 +#: .\config\settings\base.py:676 msgid "Transactions" -msgstr "" +msgstr "Транзакции" + +#: .\config\settings\base.py:682 +msgid "Chat Rooms" +msgstr "Комнаты чатов" + +#: .\config\settings\base.py:697 +msgid "Libraries" +msgstr "Библиотеки" + +#: .\config\settings\base.py:723 .\config\settings\base.py:729 +msgid "Videos" +msgstr "Видео" + +#: .\config\settings\base.py:837 .\config\settings\base.py:855 +msgid "Hadis" +msgstr "Хадис" -#: templates/admin/auth/user/change_password.html:10 +#: .\config\settings\base.py:867 +msgid "Hadis Tags" +msgstr "Теги хадисов" + +#: .\config\settings\base.py:873 +msgid "Hadis Status" +msgstr "Статус хадиса" + +#: .\config\settings\base.py:895 +msgid "System Settings" +msgstr "Системные настройки" + +#: .\config\settings\base.py:904 +msgid "Global Preferences" +msgstr "Глобальные настройки" + +#: .\templates\admin\auth\user\change_password.html:10 msgid "Home" -msgstr "" +msgstr "Главная" -#: templates/admin/auth/user/change_password.html:14 -#: templates/admin/auth/user/change_password.html:52 +#: .\templates\admin\auth\user\change_password.html:14 +#: .\templates\admin\auth\user\change_password.html:52 msgid "Change password" -msgstr "" +msgstr "Изменить пароль" -#: templates/admin/auth/user/change_password.html:25 +#: .\templates\admin\auth\user\change_password.html:25 msgid "Please correct the error below." -msgstr "" +msgstr "Пожалуйста, исправьте ошибку ниже." -#: templates/admin/auth/user/change_password.html:25 +#: .\templates\admin\auth\user\change_password.html:25 msgid "Please correct the errors below." -msgstr "" +msgstr "Пожалуйста, исправьте ошибки ниже." -#: templates/admin/auth/user/change_password.html:29 +#: .\templates\admin\auth\user\change_password.html:29 #, python-format msgid "Enter a new password for the user %(username)s." -msgstr "" +msgstr "Введите новый пароль для пользователя %(username)s." -#: templates/admin/base_site.html:3 templates/admin/index.html:8 +#: .\templates\admin\base_site.html:3 .\templates\admin\index.html:7 msgid "Django site admin" -msgstr "" +msgstr "Администрирование сайта Django" -#: templates/admin/filer/folder/directory_table.html:4 -#: templates/admin/filer/folder/directory_table.html:160 +#: .\templates\admin\filer\folder\directory_table.html:4 +#: .\templates\admin\filer\folder\directory_table.html:160 msgid "Unsorted Uploads" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:13 -#: utils/keyval_field.py:118 -msgid "Name" -msgstr "" +msgstr "Несортированные загрузки" -#: templates/admin/filer/folder/directory_table.html:14 +#: .\templates\admin\filer\folder\directory_table.html:14 msgid "Owner" -msgstr "" - -#: templates/admin/filer/folder/directory_table.html:15 -msgid "Size" -msgstr "" +msgstr "Владелец" -#: templates/admin/filer/folder/directory_table.html:16 +#: .\templates\admin\filer\folder\directory_table.html:16 msgid "Action" -msgstr "" +msgstr "Действие" -#: templates/admin/filer/folder/directory_table.html:25 -#: templates/admin/filer/folder/directory_table.html:32 -#: templates/admin/filer/folder/directory_table.html:55 -#: templates/admin/filer/folder/directory_table.html:62 +#: .\templates\admin\filer\folder\directory_table.html:25 +#: .\templates\admin\filer\folder\directory_table.html:32 +#: .\templates\admin\filer\folder\directory_table.html:55 +#: .\templates\admin\filer\folder\directory_table.html:62 #, python-format msgid "Change '%(item_label)s' folder details" -msgstr "" +msgstr "Изменить детали папки '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:26 -#: templates/admin/filer/folder/directory_table.html:56 -#: templates/admin/filer/folder/directory_table.html:167 +#: .\templates\admin\filer\folder\directory_table.html:26 +#: .\templates\admin\filer\folder\directory_table.html:56 +#: .\templates\admin\filer\folder\directory_table.html:167 msgid "Folder Icon" -msgstr "" +msgstr "Иконка папки" -#: templates/admin/filer/folder/directory_table.html:73 +#: .\templates\admin\filer\folder\directory_table.html:73 #, python-format msgid "%(counter)s folder" msgid_plural "%(counter)s folders" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(counter)s папка" +msgstr[1] "%(counter)s папки" +msgstr[2] "%(counter)s папок" +msgstr[3] "%(counter)s папок" -#: templates/admin/filer/folder/directory_table.html:74 +#: .\templates\admin\filer\folder\directory_table.html:74 #, python-format msgid "%(counter)s file" msgid_plural "%(counter)s files" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(counter)s файл" +msgstr[1] "%(counter)s файла" +msgstr[2] "%(counter)s файлов" +msgstr[3] "%(counter)s файлов" -#: templates/admin/filer/folder/directory_table.html:80 +#: .\templates\admin\filer\folder\directory_table.html:80 msgid "Change folder details" -msgstr "" +msgstr "Изменить детали папки" -#: templates/admin/filer/folder/directory_table.html:81 +#: .\templates\admin\filer\folder\directory_table.html:81 msgid "Remove folder" -msgstr "" +msgstr "Удалить папку" -#: templates/admin/filer/folder/directory_table.html:93 -#: templates/admin/filer/folder/directory_table.html:102 -#: templates/admin/filer/folder/directory_table.html:117 +#: .\templates\admin\filer\folder\directory_table.html:93 +#: .\templates\admin\filer\folder\directory_table.html:102 +#: .\templates\admin\filer\folder\directory_table.html:117 msgid "Select this file" -msgstr "" +msgstr "Выбрать этот файл" -#: templates/admin/filer/folder/directory_table.html:105 -#: templates/admin/filer/folder/directory_table.html:120 -#: templates/admin/filer/folder/directory_table.html:146 +#: .\templates\admin\filer\folder\directory_table.html:105 +#: .\templates\admin\filer\folder\directory_table.html:120 +#: .\templates\admin\filer\folder\directory_table.html:146 #, python-format msgid "Change '%(item_label)s' details" -msgstr "" +msgstr "Изменить детали '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:129 +#: .\templates\admin\filer\folder\directory_table.html:129 msgid "disabled" -msgstr "" +msgstr "отключено" -#: templates/admin/filer/folder/directory_table.html:129 +#: .\templates\admin\filer\folder\directory_table.html:129 msgid "enabled" -msgstr "" +msgstr "включено" -#: templates/admin/filer/folder/directory_table.html:142 +#: .\templates\admin\filer\folder\directory_table.html:142 #, python-format msgid "Canonical url '%(item_label)s'" -msgstr "" +msgstr "Канонический url '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:144 +#: .\templates\admin\filer\folder\directory_table.html:144 #, python-format msgid "Download '%(item_label)s'" -msgstr "" +msgstr "Скачать '%(item_label)s'" -#: templates/admin/filer/folder/directory_table.html:147 +#: .\templates\admin\filer\folder\directory_table.html:147 msgid "Remove file" -msgstr "" +msgstr "Удалить файл" -#: templates/admin/filer/folder/directory_table.html:154 +#: .\templates\admin\filer\folder\directory_table.html:154 msgid "Drop files here or use the \"Upload Files\" button" -msgstr "" +msgstr "Перетащите файлы сюда или используйте кнопку \"Загрузить файлы\"" -#: templates/admin/filer/folder/directory_table.html:164 +#: .\templates\admin\filer\folder\directory_table.html:164 msgid "Drop your file to upload into:" -msgstr "" +msgstr "Перетащите файл для загрузки в:" -#: templates/admin/filer/folder/directory_table.html:174 +#: .\templates\admin\filer\folder\directory_table.html:174 msgid "Upload" -msgstr "" +msgstr "Загрузить" -#: templates/admin/filer/folder/directory_table.html:186 +#: .\templates\admin\filer\folder\directory_table.html:186 msgid "cancel" -msgstr "" +msgstr "отмена" -#: templates/admin/filer/folder/directory_table.html:190 +#: .\templates\admin\filer\folder\directory_table.html:190 msgid "Upload success!" -msgstr "" +msgstr "Успешная загрузка!" -#: templates/admin/filer/folder/directory_table.html:194 +#: .\templates\admin\filer\folder\directory_table.html:194 msgid "Upload canceled!" -msgstr "" +msgstr "Загрузка отменена!" -#: templates/admin/filer/folder/directory_table.html:201 +#: .\templates\admin\filer\folder\directory_table.html:201 msgid "previous" -msgstr "" +msgstr "предыдущий" -#: templates/admin/filer/folder/directory_table.html:206 +#: .\templates\admin\filer\folder\directory_table.html:206 #, python-format msgid "Page %(number)s of %(num_pages)s." -msgstr "" +msgstr "Страница %(number)s из %(num_pages)s." -#: templates/admin/filer/folder/directory_table.html:211 +#: .\templates\admin\filer\folder\directory_table.html:211 msgid "next" -msgstr "" +msgstr "следующий" -#: templates/admin/filer/folder/directory_table.html:221 +#: .\templates\admin\filer\folder\directory_table.html:221 msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах" -#: templates/admin/filer/folder/directory_table.html:221 +#: .\templates\admin\filer\folder\directory_table.html:221 #, python-format msgid "Select all %(total_count)s" -msgstr "" +msgstr "Выбрать все %(total_count)s" -#: templates/admin/filer/folder/directory_table.html:223 +#: .\templates\admin\filer\folder\directory_table.html:223 msgid "Clear selection" -msgstr "" +msgstr "Очистить выбор" -#: templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "" +#: .\templates\admin\index.html:19 +msgid "System Overview" +msgstr "Обзор системы" + +#: .\templates\admin\index.html:42 +msgid "No statistics available for this panel." +msgstr "Статистика для этой панели недоступна." + +#: .\templates\course\course_analytics.html:9 +msgid "Course Analytics Dashboard" +msgstr "Панель аналитики курса" + +#: .\templates\course\course_analytics.html:12 +msgid "Comprehensive analytics and insights for your course" +msgstr "Всесторонняя аналитика и инсайты по вашему курсу" + +#: .\templates\course\course_analytics.html:20 +msgid "Export" +msgstr "Экспорт" + +#: .\templates\course\course_analytics.html:26 +msgid "Refresh Data" +msgstr "Обновить данные" + +#: .\templates\course\course_analytics.html:46 +#: .\templates\course\course_stats.html:44 +msgid "Total Lessons" +msgstr "Всего уроков" + +#: .\templates\course\course_analytics.html:65 +#: .\templates\course\course_stats.html:64 +msgid "Total Quizzes" +msgstr "Всего тестов" + +#: .\templates\course\course_analytics.html:84 +#: .\templates\course\course_stats.html:83 +msgid "Active Participants" +msgstr "Активные участники" + +#: .\templates\course\course_analytics.html:97 +msgid "Lesson Completion Distribution" +msgstr "Распределение завершения уроков" + +#: .\templates\course\course_analytics.html:100 +msgid "Percentage of course completion by participants" +msgstr "Процент завершения курса участниками" + +#: .\templates\course\course_analytics.html:113 +msgid "Quiz Scores Distribution" +msgstr "Распределение оценок за тесты" + +#: .\templates\course\course_analytics.html:116 +msgid "Distribution of scores across all quizzes" +msgstr "Распределение оценок по всем тестам" + +#: .\templates\course\course_analytics.html:131 +msgid "Course Engagement Metrics" +msgstr "Метрики вовлеченности в курс" + +#: .\templates\course\course_analytics.html:138 +msgid "Lesson Completion Rate" +msgstr "Коэффициент завершения уроков" + +#: .\templates\course\course_analytics.html:143 +msgid "Average percentage of lessons completed by participants" +msgstr "Средний процент уроков, пройденных участниками" + +#: .\templates\course\course_analytics.html:149 +msgid "Quiz Participation Rate" +msgstr "Коэффициент участия в тестах" + +#: .\templates\course\course_analytics.html:154 +msgid "Percentage of participants who attempted at least one quiz" +msgstr "Процент участников, прошедших хотя бы один тест" + +#: .\templates\course\course_analytics.html:160 +msgid "Average Quiz Score" +msgstr "Средняя оценка за тест" + +#: .\templates\course\course_analytics.html:165 +msgid "Average score across all quizzes" +msgstr "Средняя оценка по всем тестам" + +#: .\templates\course\course_analytics.html:178 +msgid "Top Performing Students" +msgstr "Лучшие студенты" -#: templates/docs.html:4 +#: .\templates\course\course_analytics.html:189 +msgid "Completion" +msgstr "Завершение" + +#: .\templates\course\course_analytics.html:192 +msgid "Avg. Score" +msgstr "Ср. оценка" + +#: .\templates\course\course_analytics.html:229 +msgid "Recent Activity" +msgstr "Недавняя активность" + +#: .\templates\course\course_stats.html:10 +msgid "Course Overview" +msgstr "Обзор курса" + +#: .\templates\course\course_stats.html:13 +msgid "Key metrics and statistics for this course" +msgstr "Ключевые метрики и статистика для этого курса" + +#: .\templates\course\course_stats.html:21 +msgid "View Detailed Analytics" +msgstr "Смотреть подробную аналитику" + +#: .\templates\course\course_stats.html:95 +msgid "Course Summary" +msgstr "Сводка по курсу" + +#: .\templates\course\course_stats.html:119 +msgid "hours" +msgstr "часов" + +#: .\templates\course\course_stats.html:130 +msgid "Level" +msgstr "Уровень" + +#: .\templates\docs.html:4 msgid "Django site adminssss" -msgstr "" +msgstr "Администрирование сайта Django" -#: utils/__init__.py:75 +#: .\templates\utils\widgets\multilang_json_widget.html:34 +msgid "Click a language code to add or edit its title." +msgstr "Нажмите на код языка, чтобы добавить или отредактировать его название." + +#: .\utils\__init__.py:78 msgid "Development" -msgstr "" +msgstr "Разработка" -#: utils/__init__.py:77 +#: .\utils\__init__.py:80 msgid "Production" -msgstr "" +msgstr "Продакшн" -#: utils/admin.py:106 -msgid "Analytics" -msgstr "" +#: .\utils\admin.py:139 .\utils\admin.py:242 +msgid "Imam Javad Site" +msgstr "Сайт Имам Джавад" -#: utils/admin.py:107 -msgid "Settings" -msgstr "" +#: .\utils\admin.py:144 .\utils\admin.py:237 +msgid "Dovoodi Site" +msgstr "Сайт Довуди" -#: utils/admin.py:110 -msgid "All" -msgstr "" +#: .\utils\admin.py:149 +msgid "Dovoodi Admin" +msgstr "Админ Довуди" -#: utils/admin.py:112 -msgid "New" -msgstr "" +#: .\utils\admin.py:247 +msgid "Imam Javad Admin" +msgstr "Админ Имам Джавад" -#: utils/admin.py:222 -msgid "Last week revenue" -msgstr "" +#: .\utils\admin.py:489 +msgid "Active Students" +msgstr "Активные студенты" -#: utils/admin.py:240 -msgid "Last week expenses" -msgstr "" +#: .\utils\admin.py:494 +msgid "Published Courses" +msgstr "Опубликованные курсы" -#: utils/keyval_field.py:16 utils/keyval_field.py:37 utils/keyval_field.py:74 -#: utils/keyval_field.py:94 utils/keyval_field.py:116 utils/keyval_field.py:137 -msgid "Translation" -msgstr "" +#: .\utils\admin.py:499 +msgid "Pending Certificates" +msgstr "Сертификаты в ожидании" + +#: .\utils\admin.py:524 +msgid "Hadith Database" +msgstr "База данных хадисов" + +#: .\utils\admin.py:529 +msgid "Books & Articles" +msgstr "Книги и статьи" -#: utils/keyval_field.py:18 utils/keyval_field.py:96 +#: .\utils\admin.py:534 +msgid "Multimedia" +msgstr "Мультимедиа" + +#: .\utils\keyval_field.py:18 .\utils\keyval_field.py:96 msgid "Detail" -msgstr "" +msgstr "Детали" -#: utils/keyval_field.py:23 utils/keyval_field.py:44 utils/keyval_field.py:81 -#: utils/keyval_field.py:101 utils/keyval_field.py:123 -#: utils/keyval_field.py:144 +#: .\utils\keyval_field.py:23 .\utils\keyval_field.py:44 +#: .\utils\keyval_field.py:81 .\utils\keyval_field.py:101 +#: .\utils\keyval_field.py:123 .\utils\keyval_field.py:144 msgid "Language Code" -msgstr "" +msgstr "Код языка" -#: utils/keyval_field.py:57 +#: .\utils\keyval_field.py:57 msgid "Tour Features" -msgstr "" +msgstr "Особенности тура" -#: utils/keyval_field.py:162 utils/keyval_field.py:172 -msgid "Description" -msgstr "" +#: .\utils\mixins.py:6 +msgid "Red" +msgstr "Красный" + +#: .\utils\mixins.py:7 +msgid "Green" +msgstr "Зеленый" +#: .\utils\mixins.py:8 +msgid "Blue" +msgstr "Синий" -msgid "Shia" -msgstr "Шиит" +#: .\utils\mixins.py:9 +msgid "Yellow" +msgstr "Желтый" -msgid "Sunni" -msgstr "Суннит" +#: .\utils\mixins.py:10 +msgid "Orange" +msgstr "Оранжевый" + +#: .\utils\mixins.py:11 +msgid "Purple" +msgstr "Фиолетовый" -msgid "Hanafi" -msgstr "Ханафит" +#: .\utils\mixins.py:12 +msgid "Gray" +msgstr "Серый" -msgid "Maliki" -msgstr "Маликит" +#: .\utils\mixins.py:33 +msgid "color" +msgstr "цвет" -msgid "Shafi'i" -msgstr "Шафиит" +#: .\utils\schema.py:25 +msgid "Weekly Timing" +msgstr "Еженедельное расписание" -msgid "Hanbali" -msgstr "Ханбалит" +#: .\utils\schema.py:31 .\utils\unfold_translations.py:41 +msgid "Monday" +msgstr "Понедельник" -msgid "Other" -msgstr "Другой" +#: .\utils\schema.py:31 .\utils\unfold_translations.py:42 +msgid "Tuesday" +msgstr "Вторник" + +#: .\utils\schema.py:31 .\utils\unfold_translations.py:43 +msgid "Wednesday" +msgstr "Среда" + +#: .\utils\schema.py:31 .\utils\unfold_translations.py:44 +msgid "Thursday" +msgstr "Четверг" + +#: .\utils\schema.py:31 .\utils\unfold_translations.py:45 +msgid "Friday" +msgstr "Пятница" + +#: .\utils\schema.py:31 .\utils\unfold_translations.py:46 +msgid "Saturday" +msgstr "Суббота" + +#: .\utils\schema.py:31 .\utils\unfold_translations.py:47 +msgid "Sunday" +msgstr "Воскресенье" + +#: .\utils\schema.py:33 +msgid "Day" +msgstr "День" + +#: .\utils\schema.py:36 +msgid "Time" +msgstr "Время" + +#: .\utils\schema.py:66 +msgid "year" +msgstr "год" + +#: .\utils\schema.py:67 +msgid "month" +msgstr "месяц" + +#: .\utils\schema.py:68 +msgid "day" +msgstr "день" + +# --- Unfold Internal Strings Override --- +#: .\utils\unfold_translations.py:6 +msgid "Search" +msgstr "Поиск" + +#: .\utils\unfold_translations.py:7 +msgid "Search apps and models" +msgstr "Поиск приложений и моделей" + +#: .\utils\unfold_translations.py:8 +msgid "View site" +msgstr "Просмотр сайта" + +#: .\utils\unfold_translations.py:9 +msgid "Log out" +msgstr "Выйти" + +#: .\utils\unfold_translations.py:10 +msgid "general" +msgstr "Общее" + +#: .\utils\unfold_translations.py:11 +msgid "manage all Participants" +msgstr "Управление всеми участниками" + +#: .\utils\unfold_translations.py:12 +msgid "questions" +msgstr "Вопросы" + +#: .\utils\unfold_translations.py:13 +msgid "question" +msgstr "Вопрос" + +#: .\utils\unfold_translations.py:14 +msgid "option" +msgstr "Вариант" + +#: .\utils\unfold_translations.py:15 +msgid "correct answer" +msgstr "Правильный ответ" + +#: .\utils\unfold_translations.py:16 +msgid "Total score" +msgstr "Общий балл" + +#: .\utils\unfold_translations.py:17 +msgid "Timing score" +msgstr "Балл за время" + +#: .\utils\unfold_translations.py:18 +msgid "Question score" +msgstr "Балл за вопрос" + +#: .\utils\unfold_translations.py:19 +msgid "Total timing" +msgstr "Общее время" + +#: .\utils\unfold_translations.py:20 +msgid "Ended at" +msgstr "Завершено в" + +#: .\utils\unfold_translations.py:21 +msgid "Started at" +msgstr "Начато в" + +#: .\utils\unfold_translations.py:22 +msgid "Participant Answer" +msgstr "Ответ участника" + +#: .\utils\unfold_translations.py:23 +msgid "Selected option" +msgstr "Выбранный вариант" + +#: .\utils\unfold_translations.py:25 +msgid "Seconds take to answer" +msgstr "Секунд затрачено на ответ" + +#: .\utils\unfold_translations.py:26 +msgid "Recent Messages Latest" +msgstr "Последние сообщения" + +#: .\utils\unfold_translations.py:27 +msgid "Room name" +msgstr "Название комнаты" + +#: .\utils\unfold_translations.py:39 +msgid "System Administration" +msgstr "Системное Администрирование" diff --git a/utils/unfold_translations.py b/utils/unfold_translations.py new file mode 100644 index 0000000..3a699ee --- /dev/null +++ b/utils/unfold_translations.py @@ -0,0 +1,48 @@ +# backend/utils/unfold_translations.py +from django.utils.translation import gettext_lazy as _ + +# Dummy list to trick makemessages into keeping our Unfold overrides safe! +UNFOLD_CUSTOM_STRINGS = [ + _("Search"), + _("Search apps and models"), + _("View site"), + _("Log out"), + _("general"), + _("manage all Participants"), + _("questions"), + _("question"), + _("option"), + _("correct answer"), + _("Total score"), + _("Timing score"), + _("Question score"), + _("Total timing"), + _("Ended at"), + _("Started at"), + _("Participant Answer"), + _("Selected option"), + _("Correct Answer"), + _("Seconds take to answer"), + _("Recent Messages Latest"), + _("Room name"), + _("Is Locked"), + _("Initiator"), + _("Recipient"), + _("Manage All Messages"), + _("Sender"), + _("Message Content"), + _("Chat Type"), + _("Sent At"), + _("Is deleted"), + _("Group"), + _("Private"), + _("System Administration"), + _("All Users"), + _("Monday"), + _("Tuesday"), + _("Wednesday"), + _("Thursday"), + _("Friday"), + _("Saturday"), + _("Sunday"), +] \ No newline at end of file