mirror of
https://github.com/mediacms-io/mediacms.git
synced 2026-06-13 19:39:32 -04:00
feat: LTI support and Moodle plugin
This commit is contained in:
+17
-4
@@ -65,6 +65,7 @@ class CategoryAdminForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = Category
|
||||
# LTI fields will be shown as read-only when USE_LTI is enabled
|
||||
fields = '__all__'
|
||||
|
||||
def clean(self):
|
||||
@@ -135,7 +136,7 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||
list_display = ["title", "user", "add_date", "media_count"]
|
||||
list_filter = []
|
||||
ordering = ("-add_date",)
|
||||
readonly_fields = ("user", "media_count")
|
||||
readonly_fields = ("user", "media_count", "lti_platform", "lti_context_id")
|
||||
change_form_template = 'admin/files/category/change_form.html'
|
||||
|
||||
def get_list_filter(self, request):
|
||||
@@ -145,6 +146,8 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||
list_filter.insert(0, "is_rbac_category")
|
||||
if getattr(settings, 'USE_IDENTITY_PROVIDERS', False):
|
||||
list_filter.insert(-1, "identity_provider")
|
||||
if getattr(settings, 'USE_LTI', False):
|
||||
list_filter.append("is_lms_course")
|
||||
|
||||
return list_filter
|
||||
|
||||
@@ -154,6 +157,8 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||
list_display.insert(-1, "is_rbac_category")
|
||||
if getattr(settings, 'USE_IDENTITY_PROVIDERS', False):
|
||||
list_display.insert(-1, "identity_provider")
|
||||
if getattr(settings, 'USE_LTI', False):
|
||||
list_display.insert(-1, "is_lms_course")
|
||||
|
||||
return list_display
|
||||
|
||||
@@ -167,6 +172,14 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||
),
|
||||
]
|
||||
|
||||
additional_fieldsets = []
|
||||
|
||||
if getattr(settings, 'USE_LTI', False):
|
||||
lti_fieldset = [
|
||||
('LTI Integration', {'fields': ['lti_platform', 'lti_context_id'], 'classes': ['tab'], 'description': 'LTI/LMS integration settings (automatically managed by LTI provisioning)'}),
|
||||
]
|
||||
additional_fieldsets.extend(lti_fieldset)
|
||||
|
||||
if getattr(settings, 'USE_RBAC', False):
|
||||
rbac_fieldset = [
|
||||
('RBAC Settings', {'fields': ['is_rbac_category'], 'classes': ['tab'], 'description': 'Role-Based Access Control settings'}),
|
||||
@@ -177,9 +190,9 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||
('RBAC Settings', {'fields': ['is_rbac_category', 'identity_provider'], 'classes': ['tab'], 'description': 'Role-Based Access Control settings'}),
|
||||
('Group Access', {'fields': ['rbac_groups'], 'description': 'Select the Groups that have access to category'}),
|
||||
]
|
||||
return basic_fieldset + rbac_fieldset
|
||||
else:
|
||||
return basic_fieldset
|
||||
additional_fieldsets.extend(rbac_fieldset)
|
||||
|
||||
return basic_fieldset + additional_fieldsets
|
||||
|
||||
|
||||
class TagAdmin(admin.ModelAdmin):
|
||||
|
||||
@@ -64,4 +64,10 @@ def stuff(request):
|
||||
if request.user.is_superuser:
|
||||
ret["DJANGO_ADMIN_URL"] = settings.DJANGO_ADMIN_URL
|
||||
|
||||
if getattr(settings, 'USE_LTI', False):
|
||||
lti_session = request.session.get('lti_session')
|
||||
|
||||
if lti_session and request.user.is_authenticated:
|
||||
ret['lti_session'] = lti_session
|
||||
|
||||
return ret
|
||||
|
||||
+56
-76
@@ -1,3 +1,5 @@
|
||||
from pathlib import Path
|
||||
|
||||
from crispy_forms.bootstrap import FormActions
|
||||
from crispy_forms.helper import FormHelper
|
||||
from crispy_forms.layout import HTML, Field, Layout, Submit
|
||||
@@ -5,9 +7,11 @@ from django import forms
|
||||
from django.conf import settings
|
||||
|
||||
from .methods import get_next_state, is_mediacms_editor
|
||||
from .models import MEDIA_STATES, Category, Media, Subtitle
|
||||
from .models import MEDIA_STATES, Category, Media, MediaPermission, Subtitle
|
||||
from .widgets import CategoryModalWidget
|
||||
|
||||
_PUBLISH_STATE_HTML = (Path(__file__).parent.parent / 'templates/cms/partials/media_publish_state.html').read_text()
|
||||
|
||||
|
||||
class CustomField(Field):
|
||||
template = 'cms/crispy_custom_field.html'
|
||||
@@ -116,6 +120,7 @@ class MediaMetadataForm(forms.ModelForm):
|
||||
|
||||
class MediaPublishForm(forms.ModelForm):
|
||||
confirm_state = forms.BooleanField(required=False, initial=False, label="Acknowledge sharing status", help_text="")
|
||||
shared = forms.BooleanField(required=False, initial=False, label="Shared")
|
||||
|
||||
class Meta:
|
||||
model = Media
|
||||
@@ -123,16 +128,20 @@ class MediaPublishForm(forms.ModelForm):
|
||||
|
||||
widgets = {
|
||||
"category": CategoryModalWidget(),
|
||||
"state": forms.RadioSelect(),
|
||||
}
|
||||
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
self.user = user
|
||||
self.request = kwargs.pop('request', None)
|
||||
super(MediaPublishForm, self).__init__(*args, **kwargs)
|
||||
|
||||
self.has_custom_permissions = self.instance.permissions.exists() if self.instance.pk else False
|
||||
self.has_rbac_categories = self.instance.category.filter(is_rbac_category=True).exists() if self.instance.pk else False
|
||||
self.is_shared = self.has_custom_permissions or self.has_rbac_categories
|
||||
self.actual_state = self.instance.state if self.instance.pk else None
|
||||
self.was_shared = self.instance.is_shared if self.instance.pk else False
|
||||
self.had_explicit_permission = self.instance.permissions.exists() if self.instance.pk else False
|
||||
is_embed_mode = self._check_embed_mode()
|
||||
|
||||
self.fields["shared"].initial = self.was_shared
|
||||
self.initial["shared"] = self.was_shared
|
||||
|
||||
if not is_mediacms_editor(user):
|
||||
for field in ["featured", "reported_times", "is_reviewed"]:
|
||||
@@ -146,13 +155,6 @@ class MediaPublishForm(forms.ModelForm):
|
||||
valid_states.append(self.instance.state)
|
||||
self.fields["state"].choices = [(state, dict(MEDIA_STATES).get(state, state)) for state in valid_states]
|
||||
|
||||
if self.is_shared:
|
||||
current_choices = list(self.fields["state"].choices)
|
||||
current_choices.insert(0, ("shared", "Shared"))
|
||||
self.fields["state"].choices = current_choices
|
||||
self.fields["state"].initial = "shared"
|
||||
self.initial["state"] = "shared"
|
||||
|
||||
if getattr(settings, 'USE_RBAC', False) and 'category' in self.fields:
|
||||
if is_mediacms_editor(user):
|
||||
pass
|
||||
@@ -169,6 +171,14 @@ class MediaPublishForm(forms.ModelForm):
|
||||
|
||||
self.fields['category'].queryset = Category.objects.filter(id__in=combined_category_ids).order_by('title')
|
||||
|
||||
# Filter for LMS courses only when in embed mode
|
||||
if is_embed_mode and 'category' in self.fields:
|
||||
current_queryset = self.fields['category'].queryset
|
||||
self.fields['category'].queryset = current_queryset.filter(is_lms_course=True)
|
||||
self.fields['category'].label = 'Course'
|
||||
self.fields['category'].help_text = 'Media can be shared with one or more courses'
|
||||
self.fields['category'].widget.is_lms_mode = True
|
||||
|
||||
self.helper = FormHelper()
|
||||
self.helper.form_tag = True
|
||||
self.helper.form_class = 'post-form'
|
||||
@@ -177,7 +187,7 @@ class MediaPublishForm(forms.ModelForm):
|
||||
self.helper.form_show_errors = False
|
||||
self.helper.layout = Layout(
|
||||
CustomField('category'),
|
||||
CustomField('state'),
|
||||
HTML(_PUBLISH_STATE_HTML),
|
||||
CustomField('featured'),
|
||||
CustomField('reported_times'),
|
||||
CustomField('is_reviewed'),
|
||||
@@ -186,83 +196,53 @@ class MediaPublishForm(forms.ModelForm):
|
||||
|
||||
self.helper.layout.append(FormActions(Submit('submit', 'Publish Media', css_class='primaryAction')))
|
||||
|
||||
def _check_embed_mode(self):
|
||||
"""Check if the current request is in embed mode"""
|
||||
if not self.request:
|
||||
return False
|
||||
|
||||
# Check query parameter
|
||||
mode = self.request.GET.get('mode', '')
|
||||
if mode == 'lms_embed_mode':
|
||||
return True
|
||||
|
||||
# Check session storage
|
||||
if self.request.session.get('lms_embed_mode') == 'true':
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
state = cleaned_data.get("state")
|
||||
categories = cleaned_data.get("category")
|
||||
shared = cleaned_data.get("shared")
|
||||
|
||||
if self.is_shared and state != "shared":
|
||||
self.fields['confirm_state'].widget = forms.CheckboxInput()
|
||||
state_index = None
|
||||
for i, layout_item in enumerate(self.helper.layout):
|
||||
if isinstance(layout_item, CustomField) and layout_item.fields[0] == 'state':
|
||||
state_index = i
|
||||
break
|
||||
|
||||
if state_index is not None:
|
||||
layout_items = list(self.helper.layout)
|
||||
layout_items.insert(state_index + 1, CustomField('confirm_state'))
|
||||
self.helper.layout = Layout(*layout_items)
|
||||
|
||||
if not cleaned_data.get('confirm_state'):
|
||||
if state == 'private':
|
||||
error_parts = []
|
||||
if self.has_rbac_categories:
|
||||
rbac_cat_titles = self.instance.category.filter(is_rbac_category=True).values_list('title', flat=True)
|
||||
error_parts.append(f"shared with users that have access to categories: {', '.join(rbac_cat_titles)}")
|
||||
if self.has_custom_permissions:
|
||||
error_parts.append("shared by me with other users (visible in 'Shared by me' page)")
|
||||
|
||||
error_message = f"I understand that changing to Private will remove all sharing. Currently this media is {' and '.join(error_parts)}. All this sharing will be removed."
|
||||
self.add_error('confirm_state', error_message)
|
||||
else:
|
||||
error_message = f"I understand that changing to {state.title()} will maintain existing sharing settings."
|
||||
self.add_error('confirm_state', error_message)
|
||||
|
||||
elif state in ['private', 'unlisted']:
|
||||
custom_permissions = self.instance.permissions.exists()
|
||||
rbac_categories = categories.filter(is_rbac_category=True).values_list('title', flat=True)
|
||||
if rbac_categories or custom_permissions:
|
||||
self.fields['confirm_state'].widget = forms.CheckboxInput()
|
||||
state_index = None
|
||||
for i, layout_item in enumerate(self.helper.layout):
|
||||
if isinstance(layout_item, CustomField) and layout_item.fields[0] == 'state':
|
||||
state_index = i
|
||||
break
|
||||
|
||||
if state_index is not None:
|
||||
layout_items = list(self.helper.layout)
|
||||
layout_items.insert(state_index + 1, CustomField('confirm_state'))
|
||||
self.helper.layout = Layout(*layout_items)
|
||||
|
||||
if not cleaned_data.get('confirm_state'):
|
||||
if rbac_categories:
|
||||
error_message = f"I understand that although media state is {state}, the media is also shared with users that have access to categories: {', '.join(rbac_categories)}"
|
||||
self.add_error('confirm_state', error_message)
|
||||
if custom_permissions:
|
||||
error_message = f"I understand that although media state is {state}, the media is also shared by me with other users, that I can see in the 'Shared by me' page"
|
||||
self.add_error('confirm_state', error_message)
|
||||
|
||||
# Convert "shared" state to actual underlying state for saving. we dont keep shared state in DB
|
||||
if state == "shared":
|
||||
cleaned_data["state"] = self.actual_state
|
||||
if self.was_shared and not shared and not cleaned_data.get('confirm_state'):
|
||||
self.add_error('confirm_state', "I understand that unchecking Shared will remove all existing sharing for this media.")
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
data = self.cleaned_data
|
||||
state = data.get("state")
|
||||
shared = data.get("shared")
|
||||
|
||||
# If transitioning from shared to private, remove all sharing
|
||||
if self.is_shared and state == 'private' and data.get('confirm_state'):
|
||||
# Remove all custom permissions
|
||||
if shared:
|
||||
if self.request:
|
||||
submitted_categories = self.cleaned_data.get('category', [])
|
||||
submitted_has_rbac = any(cat.is_rbac_category for cat in submitted_categories)
|
||||
if self.had_explicit_permission or (not self.was_shared and not submitted_has_rbac):
|
||||
MediaPermission.objects.get_or_create(
|
||||
media=self.instance,
|
||||
user=self.request.user,
|
||||
defaults={'owner_user': self.request.user, 'permission': 'owner'},
|
||||
)
|
||||
elif not shared:
|
||||
self.instance.permissions.all().delete()
|
||||
# Remove RBAC categories
|
||||
rbac_cats = self.instance.category.filter(is_rbac_category=True)
|
||||
self.instance.category.remove(*rbac_cats)
|
||||
|
||||
if state != self.initial["state"]:
|
||||
self.instance.state = get_next_state(self.user, self.initial["state"], self.instance.state)
|
||||
if state != self.initial.get("state"):
|
||||
self.instance.state = get_next_state(self.user, self.initial.get("state"), self.instance.state)
|
||||
|
||||
media = super(MediaPublishForm, self).save(*args, **kwargs)
|
||||
|
||||
|
||||
@@ -57,4 +57,4 @@ def translate_string(language_code, string):
|
||||
if not check_language_code(language_code):
|
||||
return string
|
||||
|
||||
return translation_strings[language_code].get(string, string)
|
||||
return translation_strings[language_code].get(string) or string
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "حذف الوسائط",
|
||||
"DOWNLOAD": "تحميل",
|
||||
"DURATION": "المدة",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "حذف الوسائط",
|
||||
"Delete media": "حذف الوسائط",
|
||||
"Disable Comments": "تعطيل التعليقات",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "فشل تغيير المالك. يرجى المحاولة مرة أخرى.",
|
||||
"Failed to copy media.": "فشل نسخ الوسائط.",
|
||||
"Failed to create playlist": "فشل إنشاء قائمة التشغيل",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "فشل حذف الوسائط. يرجى المحاولة مرة أخرى.",
|
||||
"Failed to disable comments.": "فشل تعطيل التعليقات.",
|
||||
"Failed to disable download.": "فشل تعطيل التنزيل.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "تصفية المستخدمين الموجودين...",
|
||||
"Filter playlists...": "تصفية قوائم التشغيل...",
|
||||
"Filters": "الفلاتر",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "اذهب",
|
||||
"History": "التاريخ",
|
||||
"Home": "الرئيسية",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "إدارة التعليقات",
|
||||
"Manage media": "إدارة الوسائط",
|
||||
"Manage users": "إدارة المستخدمين",
|
||||
"Management": "",
|
||||
"Media": "وسائط",
|
||||
"Media I own": "الوسائط التي أمتلكها",
|
||||
"Media was edited": "تم تعديل الوسائط",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "لا توجد نتائج لـ",
|
||||
"No tags": "لا توجد علامات",
|
||||
"No users to add": "لا يوجد مستخدمون لإضافتهم",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "قوائم التشغيل",
|
||||
"PUBLISH STATE": "حالة النشر",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "نشر في",
|
||||
"Recent uploads": "التحميلات الأخيرة",
|
||||
"Recommended": "موصى به",
|
||||
"Record": "",
|
||||
"Record Screen": "تسجيل الشاشة",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "تسجيل",
|
||||
"Remove category": "إزالة الفئة",
|
||||
"Remove from list": "إزالة من القائمة",
|
||||
"Remove tag": "إزالة العلامة",
|
||||
"Remove user": "إزالة المستخدم",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "حفظ",
|
||||
"SEARCH": "بحث",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "تحديد جميع الوسائط",
|
||||
"Select publish state:": "اختر حالة النشر:",
|
||||
"Selected": "محدد",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "مشاركة مني",
|
||||
"Shared with me": "مشاركة معي",
|
||||
"Sharing": "",
|
||||
"Sign in": "تسجيل الدخول",
|
||||
"Sign out": "تسجيل الخروج",
|
||||
"Sort By": "ترتيب حسب",
|
||||
"Start Recording": "بدء التسجيل",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "ابدأ في تحميل الوسائط ومشاركة عملك. ستظهر الوسائط التي تحملها هنا.",
|
||||
"Stop Recording": "إيقاف التسجيل",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "إرسال",
|
||||
"Subtitle was added": "تمت إضافة الترجمة",
|
||||
"Subtitles": "ترجمات",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "تم تفعيل التعليقات بنجاح",
|
||||
"Successfully changed owner": "تم تغيير المالك بنجاح",
|
||||
"Successfully deleted": "تم الحذف بنجاح",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "تم التحديث بنجاح",
|
||||
"Successfully updated categories": "تم تحديث الفئات بنجاح",
|
||||
"Successfully updated playlist membership": "تم تحديث عضوية قائمة التشغيل بنجاح",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "رفع الوسائط",
|
||||
"Uploads": "التحميلات",
|
||||
"Users": "المستخدمون",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "عرض الكل",
|
||||
"Video": "فيديو",
|
||||
"View all": "عرض الكل",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "مرحباً",
|
||||
"You are going to copy": "سوف تقوم بالنسخ",
|
||||
"You are going to delete": "سوف تقوم بالحذف",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "سوف تقوم بتعطيل التعليقات لـ",
|
||||
"You are going to disable download for": "سوف تقوم بتعطيل التنزيل لـ",
|
||||
"You are going to enable comments to": "سوف تقوم بتفعيل التعليقات لـ",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "মিডিয়া মুছুন",
|
||||
"DOWNLOAD": "ডাউনলোড",
|
||||
"DURATION": "সময়কাল",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "",
|
||||
"Delete media": "মিডিয়া মুছুন",
|
||||
"Disable Comments": "",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "",
|
||||
"Failed to copy media.": "মিডিয়া কপি করতে ব্যর্থ হয়েছে।",
|
||||
"Failed to create playlist": "",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "মিডিয়া মুছতে ব্যর্থ হয়েছে। দয়া করে আবার চেষ্টা করুন।",
|
||||
"Failed to disable comments.": "মন্তব্য নিষ্ক্রিয় করতে ব্যর্থ হয়েছে।",
|
||||
"Failed to disable download.": "ডাউনলোড নিষ্ক্রিয় করতে ব্যর্থ হয়েছে।",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "",
|
||||
"Filter playlists...": "",
|
||||
"Filters": "ফিল্টার",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "যাও",
|
||||
"History": "ইতিহাস",
|
||||
"Home": "বাড়ি",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "মন্তব্য পরিচালনা করুন",
|
||||
"Manage media": "মিডিয়া পরিচালনা করুন",
|
||||
"Manage users": "ব্যবহারকারীদের পরিচালনা করুন",
|
||||
"Management": "",
|
||||
"Media": "মিডিয়া",
|
||||
"Media I own": "",
|
||||
"Media was edited": "মিডিয়া সম্পাদিত হয়েছে",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "এর জন্য কোন ফলাফল নেই",
|
||||
"No tags": "",
|
||||
"No users to add": "",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "প্লেলিস্ট",
|
||||
"PUBLISH STATE": "প্রকাশের অবস্থা",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "প্রকাশিত",
|
||||
"Recent uploads": "সাম্প্রতিক আপলোড",
|
||||
"Recommended": "প্রস্তাবিত",
|
||||
"Record": "",
|
||||
"Record Screen": "স্ক্রিন রেকর্ড করুন",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "নিবন্ধন করুন",
|
||||
"Remove category": "",
|
||||
"Remove from list": "",
|
||||
"Remove tag": "",
|
||||
"Remove user": "",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "সংরক্ষণ করুন",
|
||||
"SEARCH": "অনুসন্ধান",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "",
|
||||
"Select publish state:": "",
|
||||
"Selected": "",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "আমার দ্বারা শেয়ার করা",
|
||||
"Shared with me": "আমার সাথে শেয়ার করা",
|
||||
"Sharing": "",
|
||||
"Sign in": "সাইন ইন করুন",
|
||||
"Sign out": "সাইন আউট করুন",
|
||||
"Sort By": "সাজান",
|
||||
"Start Recording": "রেকর্ডিং শুরু করুন",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "মিডিয়া আপলোড করা এবং আপনার কাজ শেয়ার করা শুরু করুন। আপনি যে মিডিয়া আপলোড করবেন তা এখানে প্রদর্শিত হবে।",
|
||||
"Stop Recording": "রেকর্ডিং বন্ধ করুন",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "",
|
||||
"Subtitle was added": "সাবটাইটেল যোগ করা হয়েছে",
|
||||
"Subtitles": "সাবটাইটেল",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "মন্তব্য সফলভাবে সক্রিয় হয়েছে",
|
||||
"Successfully changed owner": "",
|
||||
"Successfully deleted": "সফলভাবে মুছে ফেলা হয়েছে",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "",
|
||||
"Successfully updated categories": "",
|
||||
"Successfully updated playlist membership": "",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "মিডিয়া আপলোড করুন",
|
||||
"Uploads": "আপলোডসমূহ",
|
||||
"Users": "",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "সব দেখুন",
|
||||
"Video": "ভিডিও",
|
||||
"View all": "সব দেখুন",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "স্বাগতম",
|
||||
"You are going to copy": "আপনি কপি করতে চলেছেন",
|
||||
"You are going to delete": "আপনি মুছে ফেলতে চলেছেন",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "আপনি মন্তব্য নিষ্ক্রিয় করতে চলেছেন",
|
||||
"You are going to disable download for": "আপনি ডাউনলোড নিষ্ক্রিয় করতে চলেছেন",
|
||||
"You are going to enable comments to": "আপনি মন্তব্য সক্রিয় করতে চলেছেন",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "SLET MEDIE",
|
||||
"DOWNLOAD": "HENT",
|
||||
"DURATION": "VARIGHED",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Slet Medie",
|
||||
"Delete media": "Slet medie",
|
||||
"Disable Comments": "Deaktiver Kommentarer",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Ændring af ejer mislykkedes. Prøv venligst igen.",
|
||||
"Failed to copy media.": "Kopiering af medie mislykkedes.",
|
||||
"Failed to create playlist": "Oprettelse af playliste mislykkedes",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Sletning af medie mislykkedes. Prøv venligst igen.",
|
||||
"Failed to disable comments.": "Deaktivering af kommentarer mislykkedes.",
|
||||
"Failed to disable download.": "Deaktivering af download mislykkedes.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtrer eksisterende brugere...",
|
||||
"Filter playlists...": "Filtrer playlister...",
|
||||
"Filters": "Filtre",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Vælg",
|
||||
"History": "Historik",
|
||||
"Home": "Hjem",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Administrer kommentarer",
|
||||
"Manage media": "Administrer medier",
|
||||
"Manage users": "Administrer brugere",
|
||||
"Management": "",
|
||||
"Media": "Medier",
|
||||
"Media I own": "Medier jeg ejer",
|
||||
"Media was edited": "Mediet er blevet redigeret",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Ingen resultater for",
|
||||
"No tags": "Ingen tags",
|
||||
"No users to add": "Ingen brugere at tilføje",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "PLAYLISTER",
|
||||
"PUBLISH STATE": "PUBLICERINGSSTATUS",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Udgivet på",
|
||||
"Recent uploads": "Nylige uploads",
|
||||
"Recommended": "Anbefalet",
|
||||
"Record": "",
|
||||
"Record Screen": "Optag skærm",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registrer",
|
||||
"Remove category": "Fjern kategori",
|
||||
"Remove from list": "Fjern fra liste",
|
||||
"Remove tag": "Fjern tag",
|
||||
"Remove user": "Fjern bruger",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "GEM",
|
||||
"SEARCH": "SØG",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Vælg alle medier",
|
||||
"Select publish state:": "Vælg publiceringsstatus:",
|
||||
"Selected": "Valgt",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Delt af mig",
|
||||
"Shared with me": "Delt med mig",
|
||||
"Sharing": "",
|
||||
"Sign in": "Log ind",
|
||||
"Sign out": "Log ud",
|
||||
"Sort By": "Sorter efter",
|
||||
"Start Recording": "Start optagelse",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Begynd at uploade medier og dele dit arbejde. Medier, du uploader, vil blive vist her.",
|
||||
"Stop Recording": "Stop optagelse",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Indsend",
|
||||
"Subtitle was added": "Undertekster tilføjet",
|
||||
"Subtitles": "Undertekster",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Kommentarer aktiveret med succes",
|
||||
"Successfully changed owner": "Ejer ændret med succes",
|
||||
"Successfully deleted": "Slettet med succes",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Opdateret med succes",
|
||||
"Successfully updated categories": "Kategorier opdateret med succes",
|
||||
"Successfully updated playlist membership": "Playlistemedlemskab opdateret med succes",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Upload medie",
|
||||
"Uploads": "Uploads",
|
||||
"Users": "Brugere",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "SE ALLE",
|
||||
"Video": "Video",
|
||||
"View all": "Se alle",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Velkommen",
|
||||
"You are going to copy": "Du er ved at kopiere",
|
||||
"You are going to delete": "Du er ved at slette",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Du er ved at deaktivere kommentarer til",
|
||||
"You are going to disable download for": "Du er ved at deaktivere download for",
|
||||
"You are going to enable comments to": "Du er ved at aktivere kommentarer til",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "MEDIEN LÖSCHEN",
|
||||
"DOWNLOAD": "HERUNTERLADEN",
|
||||
"DURATION": "DAUER",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Medien löschen",
|
||||
"Delete media": "Medien löschen",
|
||||
"Disable Comments": "Kommentare deaktivieren",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Fehler beim Ändern des Eigentümers. Bitte versuchen Sie es erneut.",
|
||||
"Failed to copy media.": "Fehler beim Kopieren der Medien.",
|
||||
"Failed to create playlist": "Fehler beim Erstellen der Playlist",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Fehler beim Löschen der Medien. Bitte versuchen Sie es erneut.",
|
||||
"Failed to disable comments.": "Fehler beim Deaktivieren der Kommentare.",
|
||||
"Failed to disable download.": "Fehler beim Deaktivieren des Downloads.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Vorhandene Benutzer filtern...",
|
||||
"Filter playlists...": "Playlists filtern...",
|
||||
"Filters": "Filter",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Los",
|
||||
"History": "Verlauf",
|
||||
"Home": "Startseite",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Kommentare verwalten",
|
||||
"Manage media": "Medien verwalten",
|
||||
"Manage users": "Benutzer verwalten",
|
||||
"Management": "",
|
||||
"Media": "Medien",
|
||||
"Media I own": "Medien, die mir gehören",
|
||||
"Media was edited": "Medien wurden bearbeitet",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Keine Ergebnisse für",
|
||||
"No tags": "Keine Tags",
|
||||
"No users to add": "Keine Benutzer hinzuzufügen",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "PLAYLISTS",
|
||||
"PUBLISH STATE": "VERÖFFENTLICHUNGSSTATUS",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Veröffentlicht am",
|
||||
"Recent uploads": "Neue Uploads",
|
||||
"Recommended": "Empfohlen",
|
||||
"Record": "",
|
||||
"Record Screen": "Bildschirm aufnehmen",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registrieren",
|
||||
"Remove category": "Kategorie entfernen",
|
||||
"Remove from list": "Aus Liste entfernen",
|
||||
"Remove tag": "Tag entfernen",
|
||||
"Remove user": "Benutzer entfernen",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "SPEICHERN",
|
||||
"SEARCH": "SUCHE",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Alle Medien auswählen",
|
||||
"Select publish state:": "Veröffentlichungsstatus auswählen:",
|
||||
"Selected": "Ausgewählt",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Von mir geteilt",
|
||||
"Shared with me": "Mit mir geteilt",
|
||||
"Sharing": "",
|
||||
"Sign in": "Anmelden",
|
||||
"Sign out": "Abmelden",
|
||||
"Sort By": "Sortieren nach",
|
||||
"Start Recording": "Aufnahme starten",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Beginnen Sie mit dem Hochladen von Medien und dem Teilen Ihrer Arbeit. Hochgeladene Medien werden hier angezeigt.",
|
||||
"Stop Recording": "Aufnahme stoppen",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Absenden",
|
||||
"Subtitle was added": "Untertitel wurde hinzugefügt",
|
||||
"Subtitles": "Untertitel",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Kommentare erfolgreich aktiviert",
|
||||
"Successfully changed owner": "Eigentümer erfolgreich geändert",
|
||||
"Successfully deleted": "Erfolgreich gelöscht",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Erfolgreich aktualisiert",
|
||||
"Successfully updated categories": "Kategorien erfolgreich aktualisiert",
|
||||
"Successfully updated playlist membership": "Playlist-Mitgliedschaft erfolgreich aktualisiert",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Medien hochladen",
|
||||
"Uploads": "Uploads",
|
||||
"Users": "Benutzer",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "ALLE ANZEIGEN",
|
||||
"Video": "Video",
|
||||
"View all": "Alle anzeigen",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Willkommen",
|
||||
"You are going to copy": "Sie werden kopieren",
|
||||
"You are going to delete": "Sie werden löschen",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Sie werden Kommentare deaktivieren für",
|
||||
"You are going to disable download for": "Sie werden Download deaktivieren für",
|
||||
"You are going to enable comments to": "Sie werden Kommentare aktivieren für",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "ΔΙΑΓΡΑΦΗ ΑΡΧΕΙΟΥ",
|
||||
"DOWNLOAD": "ΚΑΤΕΒΑΣΜΑ",
|
||||
"DURATION": "ΔΙΑΡΚΕΙΑ",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Διαγραφή Αρχείου",
|
||||
"Delete media": "Διαγραφή αρχείου",
|
||||
"Disable Comments": "Απενεργοποίηση Σχολίων",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Αποτυχία αλλαγής ιδιοκτήτη. Παρακαλώ δοκιμάστε ξανά.",
|
||||
"Failed to copy media.": "Αποτυχία αντιγραφής αρχείου.",
|
||||
"Failed to create playlist": "Αποτυχία δημιουργίας λίστας",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Αποτυχία διαγραφής αρχείου. Παρακαλώ δοκιμάστε ξανά.",
|
||||
"Failed to disable comments.": "Αποτυχία απενεργοποίησης σχολίων.",
|
||||
"Failed to disable download.": "Αποτυχία απενεργοποίησης λήψης.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Φιλτράρισμα υπαρχόντων χρηστών...",
|
||||
"Filter playlists...": "Φιλτράρισμα λιστών...",
|
||||
"Filters": "Φίλτρα",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Μετάβαση",
|
||||
"History": "Ιστορικό",
|
||||
"Home": "Αρχική",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Διαχείριση σχολίων",
|
||||
"Manage media": "Διαχείριση αρχείων",
|
||||
"Manage users": "Διαχείριση χρηστών",
|
||||
"Management": "",
|
||||
"Media": "Αρχεία",
|
||||
"Media I own": "Δικά μου αρχεία",
|
||||
"Media was edited": "Το αρχείο επεξεργάστηκε",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Δεν υπάρχουν αποτελέσματα για",
|
||||
"No tags": "Δεν υπάρχουν ετικέτες",
|
||||
"No users to add": "Δεν υπάρχουν χρήστες για προσθήκη",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "ΛΙΣΤΕΣ",
|
||||
"PUBLISH STATE": "ΚΑΤΑΣΤΑΣΗ ΔΗΜΟΣΙΕΥΣΗΣ",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Δημοσιεύτηκε στις",
|
||||
"Recent uploads": "Πρόσφατα ανεβάσματα",
|
||||
"Recommended": "Προτεινόμενα",
|
||||
"Record": "",
|
||||
"Record Screen": "Καταγραφή οθόνης",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Εγγραφή",
|
||||
"Remove category": "Αφαίρεση κατηγορίας",
|
||||
"Remove from list": "Αφαίρεση από λίστα",
|
||||
"Remove tag": "Αφαίρεση ετικέτας",
|
||||
"Remove user": "Αφαίρεση χρήστη",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "ΑΠΟΘΗΚΕΥΣΗ",
|
||||
"SEARCH": "ΑΝΑΖΗΤΗΣΗ",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Επιλογή όλων των αρχείων",
|
||||
"Select publish state:": "Επιλέξτε κατάσταση δημοσίευσης:",
|
||||
"Selected": "Επιλεγμένα",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Κοινοποιήθηκαν από εμένα",
|
||||
"Shared with me": "Κοινοποιήθηκαν σε εμένα",
|
||||
"Sharing": "",
|
||||
"Sign in": "Σύνδεση",
|
||||
"Sign out": "Αποσύνδεση",
|
||||
"Sort By": "Ταξινόμηση",
|
||||
"Start Recording": "Έναρξη εγγραφής",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Ξεκινήστε να ανεβάζετε αρχεία και να κοινοποιείτε τη δουλειά σας. Τα αρχεία που ανεβάζετε θα εμφανίζονται εδώ.",
|
||||
"Stop Recording": "Διακοπή εγγραφής",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Υποβολή",
|
||||
"Subtitle was added": "Οι υπότιτλοι προστέθηκαν",
|
||||
"Subtitles": "Υπότιτλοι",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Τα σχόλια ενεργοποιήθηκαν με επιτυχία",
|
||||
"Successfully changed owner": "Ο ιδιοκτήτης άλλαξε με επιτυχία",
|
||||
"Successfully deleted": "Διαγράφηκε με επιτυχία",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Ενημερώθηκε με επιτυχία",
|
||||
"Successfully updated categories": "Οι κατηγορίες ενημερώθηκαν με επιτυχία",
|
||||
"Successfully updated playlist membership": "Η συμμετοχή στη λίστα ενημερώθηκε με επιτυχία",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Ανέβασμα αρχείων",
|
||||
"Uploads": "Ανεβάσματα",
|
||||
"Users": "Χρήστες",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "ΔΕΣ ΤΑ ΟΛΑ",
|
||||
"Video": "Βίντεο",
|
||||
"View all": "Δες τα όλα",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Καλώς ήρθατε",
|
||||
"You are going to copy": "Πρόκειται να αντιγράψετε",
|
||||
"You are going to delete": "Πρόκειται να διαγράψετε",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Πρόκειται να απενεργοποιήσετε τα σχόλια για",
|
||||
"You are going to disable download for": "Πρόκειται να απενεργοποιήσετε τη λήψη για",
|
||||
"You are going to enable comments to": "Πρόκειται να ενεργοποιήσετε τα σχόλια για",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE": "",
|
||||
"DELETE MEDIA": "",
|
||||
"Delete media": "",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "",
|
||||
"Disable Comments": "",
|
||||
"Disable Download": "",
|
||||
@@ -71,6 +72,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "",
|
||||
"Failed to copy media.": "",
|
||||
"Failed to create playlist": "",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "",
|
||||
"Failed to disable comments.": "",
|
||||
"Failed to disable download.": "",
|
||||
@@ -102,6 +104,9 @@ translation_strings = {
|
||||
"Filter existing users...": "",
|
||||
"Filter playlists...": "",
|
||||
"Filters": "",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "",
|
||||
"History": "",
|
||||
"Home": "",
|
||||
@@ -117,6 +122,7 @@ translation_strings = {
|
||||
"Loading existing users...": "",
|
||||
"Loading playlists...": "",
|
||||
"Loading tags...": "",
|
||||
"Management": "",
|
||||
"Manage": "",
|
||||
"Manage comments": "",
|
||||
"Manage media": "",
|
||||
@@ -143,6 +149,7 @@ translation_strings = {
|
||||
"No results for": "",
|
||||
"No tags": "",
|
||||
"No users to add": "",
|
||||
"Organization": "",
|
||||
"or": "",
|
||||
"Pdf": "",
|
||||
"PLAYLISTS": "",
|
||||
@@ -162,8 +169,13 @@ translation_strings = {
|
||||
"Published": "",
|
||||
"Published on": "",
|
||||
"Recent uploads": "",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Recommended": "",
|
||||
"Record": "",
|
||||
"Record Screen": "",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "",
|
||||
"Replace": "",
|
||||
"Remove category": "",
|
||||
@@ -171,6 +183,7 @@ translation_strings = {
|
||||
"Remove tag": "",
|
||||
"Remove user": "",
|
||||
"results for": "",
|
||||
"Settings": "",
|
||||
"SAVE": "",
|
||||
"SEARCH": "",
|
||||
"Search": "",
|
||||
@@ -184,6 +197,12 @@ translation_strings = {
|
||||
"Selected": "",
|
||||
"selected": "",
|
||||
"SHARE": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Sharing": "",
|
||||
"Share with": "",
|
||||
"Shared by me": "",
|
||||
"Shared with me": "",
|
||||
"SHOW MORE": "",
|
||||
@@ -194,6 +213,7 @@ translation_strings = {
|
||||
"Start Recording": "",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "",
|
||||
"Stop Recording": "",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"SUBMIT": "",
|
||||
"Submit": "",
|
||||
"Subtitle was added": "",
|
||||
@@ -201,6 +221,7 @@ translation_strings = {
|
||||
"Successfully changed owner": "",
|
||||
"Successfully Copied": "",
|
||||
"Successfully deleted": "",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully Disabled comments": "",
|
||||
"Successfully Disabled Download": "",
|
||||
"Successfully Enabled comments": "",
|
||||
@@ -240,6 +261,9 @@ translation_strings = {
|
||||
"UPLOAD MEDIA": "",
|
||||
"Upload media": "",
|
||||
"Uploads": "",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users": "",
|
||||
"Video": "",
|
||||
"view": "",
|
||||
@@ -252,6 +276,7 @@ translation_strings = {
|
||||
"yet": "",
|
||||
"You are going to copy": "",
|
||||
"You are going to delete": "",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "",
|
||||
"You are going to disable download for": "",
|
||||
"You are going to enable comments to": "",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "ELIMINAR MEDIOS",
|
||||
"DOWNLOAD": "DESCARGAR",
|
||||
"DURATION": "DURACIÓN",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Eliminar Medio",
|
||||
"Delete media": "Eliminar medios",
|
||||
"Disable Comments": "Deshabilitar Comentarios",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Error al cambiar propietario. Por favor, inténtelo de nuevo.",
|
||||
"Failed to copy media.": "Error al copiar medios.",
|
||||
"Failed to create playlist": "Error al crear lista de reproducción",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Error al eliminar medios. Por favor, inténtelo de nuevo.",
|
||||
"Failed to disable comments.": "Error al deshabilitar comentarios.",
|
||||
"Failed to disable download.": "Error al deshabilitar descarga.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtrar usuarios existentes...",
|
||||
"Filter playlists...": "Filtrar listas de reproducción...",
|
||||
"Filters": "Filtros",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Ir",
|
||||
"History": "Historial",
|
||||
"Home": "Inicio",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Gestionar comentarios",
|
||||
"Manage media": "Gestionar medios",
|
||||
"Manage users": "Gestionar usuarios",
|
||||
"Management": "",
|
||||
"Media": "Medios",
|
||||
"Media I own": "Medios que poseo",
|
||||
"Media was edited": "El medio fue editado",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "No hay resultados para",
|
||||
"No tags": "Sin etiquetas",
|
||||
"No users to add": "No hay usuarios para agregar",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "LISTAS DE REPRODUCCIÓN",
|
||||
"PUBLISH STATE": "ESTADO DE PUBLICACIÓN",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Publicado en",
|
||||
"Recent uploads": "Subidas recientes",
|
||||
"Recommended": "Recomendado",
|
||||
"Record": "",
|
||||
"Record Screen": "Grabar pantalla",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registrarse",
|
||||
"Remove category": "Eliminar categoría",
|
||||
"Remove from list": "Eliminar de la lista",
|
||||
"Remove tag": "Eliminar etiqueta",
|
||||
"Remove user": "Eliminar usuario",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "GUARDAR",
|
||||
"SEARCH": "BUSCAR",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Seleccionar todos los medios",
|
||||
"Select publish state:": "Seleccionar estado de publicación:",
|
||||
"Selected": "Seleccionado",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Compartido por mí",
|
||||
"Shared with me": "Compartido conmigo",
|
||||
"Sharing": "",
|
||||
"Sign in": "Iniciar sesión",
|
||||
"Sign out": "Cerrar sesión",
|
||||
"Sort By": "Ordenar por",
|
||||
"Start Recording": "Iniciar grabación",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Comience a subir medios y compartir su trabajo. Los medios que suba aparecerán aquí.",
|
||||
"Stop Recording": "Detener grabación",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Enviar",
|
||||
"Subtitle was added": "El subtítulo fue agregado",
|
||||
"Subtitles": "Subtítulos",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Comentarios habilitados exitosamente",
|
||||
"Successfully changed owner": "Propietario cambiado exitosamente",
|
||||
"Successfully deleted": "Eliminado exitosamente",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Actualizado exitosamente",
|
||||
"Successfully updated categories": "Categorías actualizadas exitosamente",
|
||||
"Successfully updated playlist membership": "Membresía de lista de reproducción actualizada exitosamente",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Subir medios",
|
||||
"Uploads": "Subidas",
|
||||
"Users": "Usuarios",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "VER TODO",
|
||||
"Video": "Video",
|
||||
"View all": "Ver todo",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Bienvenido",
|
||||
"You are going to copy": "Vas a copiar",
|
||||
"You are going to delete": "Vas a eliminar",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Vas a deshabilitar comentarios de",
|
||||
"You are going to disable download for": "Vas a deshabilitar descarga de",
|
||||
"You are going to enable comments to": "Vas a habilitar comentarios de",
|
||||
|
||||
@@ -49,6 +49,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "SUPPRIMER LE MÉDIA",
|
||||
"DOWNLOAD": "TÉLÉCHARGER",
|
||||
"DURATION": "DURÉE",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Supprimer le média",
|
||||
"Delete media": "Supprimer le média",
|
||||
"Disable Comments": "Désactiver les commentaires",
|
||||
@@ -71,6 +72,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Échec du changement de propriétaire. Veuillez réessayer.",
|
||||
"Failed to copy media.": "Échec de la copie du média.",
|
||||
"Failed to create playlist": "Échec de la création de la playlist",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Échec de la suppression du média. Veuillez réessayer.",
|
||||
"Failed to disable comments.": "Échec de la désactivation des commentaires.",
|
||||
"Failed to disable download.": "Échec de la désactivation du téléchargement.",
|
||||
@@ -102,6 +104,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtrer les utilisateurs existants...",
|
||||
"Filter playlists...": "Filtrer les playlists...",
|
||||
"Filters": "Filtres",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Aller",
|
||||
"History": "Historique",
|
||||
"Home": "Accueil",
|
||||
@@ -122,6 +127,7 @@ translation_strings = {
|
||||
"Manage comments": "Gérer les commentaires",
|
||||
"Manage media": "Gérer les médias",
|
||||
"Manage users": "Gérer les utilisateurs",
|
||||
"Management": "",
|
||||
"Media": "Média",
|
||||
"Media I own": "Médias que je possède",
|
||||
"Media was edited": "Le média a été modifié",
|
||||
@@ -138,6 +144,7 @@ translation_strings = {
|
||||
"No results for": "Aucun résultat pour",
|
||||
"No tags": "Aucun tag",
|
||||
"No users to add": "Aucun utilisateur à ajouter",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "PLAYLISTS",
|
||||
"PUBLISH STATE": "ÉTAT DE PUBLICATION",
|
||||
"Pdf": "PDF",
|
||||
@@ -157,12 +164,17 @@ translation_strings = {
|
||||
"Published on": "Publié le",
|
||||
"Recent uploads": "Téléchargements récents",
|
||||
"Recommended": "Recommandé",
|
||||
"Record": "",
|
||||
"Record Screen": "Enregistrer l'écran",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "S'inscrire",
|
||||
"Remove category": "Supprimer la catégorie",
|
||||
"Remove from list": "Supprimer de la liste",
|
||||
"Remove tag": "Supprimer le tag",
|
||||
"Remove user": "Supprimer l'utilisateur",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "ENREGISTRER",
|
||||
"SEARCH": "RECHERCHER",
|
||||
@@ -179,14 +191,22 @@ translation_strings = {
|
||||
"Select all media": "Sélectionner tous les médias",
|
||||
"Select publish state:": "Sélectionner l'état de publication:",
|
||||
"Selected": "Sélectionné",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Partagé par moi",
|
||||
"Shared with me": "Partagé avec moi",
|
||||
"Sharing": "",
|
||||
"Sign in": "Se connecter",
|
||||
"Sign out": "Se déconnecter",
|
||||
"Sort By": "Trier par",
|
||||
"Start Recording": "Commencer l'enregistrement",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Commencez à télécharger des médias et à partager votre travail. Les médias que vous téléchargez apparaîtront ici.",
|
||||
"Stop Recording": "Arrêter l'enregistrement",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Soumettre",
|
||||
"Subtitle was added": "Le sous-titre a été ajouté",
|
||||
"Subtitles": "Sous-titres",
|
||||
@@ -197,6 +217,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Commentaires activés avec succès",
|
||||
"Successfully changed owner": "Propriétaire changé avec succès",
|
||||
"Successfully deleted": "Supprimé avec succès",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Mis à jour avec succès",
|
||||
"Successfully updated categories": "Catégories mises à jour avec succès",
|
||||
"Successfully updated playlist membership": "Adhésion à la playlist mise à jour avec succès",
|
||||
@@ -233,6 +254,9 @@ translation_strings = {
|
||||
"Upload media": "Télécharger des médias",
|
||||
"Uploads": "Téléchargements",
|
||||
"Users": "Utilisateurs",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "VOIR TOUT",
|
||||
"Video": "Vidéo",
|
||||
"View all": "Voir tout",
|
||||
@@ -241,6 +265,7 @@ translation_strings = {
|
||||
"Welcome": "Bienvenue",
|
||||
"You are going to copy": "Vous allez copier",
|
||||
"You are going to delete": "Vous allez supprimer",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Vous allez désactiver les commentaires de",
|
||||
"You are going to disable download for": "Vous allez désactiver le téléchargement de",
|
||||
"You are going to enable comments to": "Vous allez activer les commentaires de",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "מחק מדיה",
|
||||
"DOWNLOAD": "הורד",
|
||||
"DURATION": "משך",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "",
|
||||
"Delete media": "מחק מדיה",
|
||||
"Disable Comments": "",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "",
|
||||
"Failed to copy media.": "העתקת המדיה נכשלה.",
|
||||
"Failed to create playlist": "",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "מחיקת המדיה נכשלה. אנא נסה שוב.",
|
||||
"Failed to disable comments.": "ביטול התגובות נכשל.",
|
||||
"Failed to disable download.": "ביטול ההורדה נכשל.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "",
|
||||
"Filter playlists...": "",
|
||||
"Filters": "מסננים",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "בצע",
|
||||
"History": "היסטוריה",
|
||||
"Home": "דף הבית",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "ניהול תגובות",
|
||||
"Manage media": "ניהול מדיה",
|
||||
"Manage users": "ניהול משתמשים",
|
||||
"Management": "",
|
||||
"Media": "מדיה",
|
||||
"Media I own": "",
|
||||
"Media was edited": "המדיה נערכה",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "אין תוצאות עבור",
|
||||
"No tags": "",
|
||||
"No users to add": "",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "פלייליסטים",
|
||||
"PUBLISH STATE": "מצב פרסום",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "פורסם בתאריך",
|
||||
"Recent uploads": "העלאות אחרונות",
|
||||
"Recommended": "מומלץ",
|
||||
"Record": "",
|
||||
"Record Screen": "הקלטת מסך",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "הרשמה",
|
||||
"Remove category": "",
|
||||
"Remove from list": "",
|
||||
"Remove tag": "",
|
||||
"Remove user": "",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "שמור",
|
||||
"SEARCH": "חפש",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "",
|
||||
"Select publish state:": "",
|
||||
"Selected": "",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "שותף על ידי",
|
||||
"Shared with me": "שותף איתי",
|
||||
"Sharing": "",
|
||||
"Sign in": "התחבר",
|
||||
"Sign out": "התנתק",
|
||||
"Sort By": "מיין לפי",
|
||||
"Start Recording": "התחל הקלטה",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "התחל להעלות מדיה ולשתף את עבודתך. המדיה שתעלה תופיע כאן.",
|
||||
"Stop Recording": "עצור הקלטה",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "",
|
||||
"Subtitle was added": "הכתובית נוספה",
|
||||
"Subtitles": "כתוביות",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "התגובות הופעלו בהצלחה",
|
||||
"Successfully changed owner": "",
|
||||
"Successfully deleted": "נמחק בהצלחה",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "",
|
||||
"Successfully updated categories": "",
|
||||
"Successfully updated playlist membership": "",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "העלה מדיה",
|
||||
"Uploads": "העלאות",
|
||||
"Users": "",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "הצג הכל",
|
||||
"Video": "וידאו",
|
||||
"View all": "הצג הכל",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "ברוך הבא",
|
||||
"You are going to copy": "אתה עומד להעתיק",
|
||||
"You are going to delete": "אתה עומד למחוק",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "אתה עומד לבטל תגובות ל",
|
||||
"You are going to disable download for": "אתה עומד לבטל הורדה עבור",
|
||||
"You are going to enable comments to": "אתה עומד להפעיל תגובות ל",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "मीडिया हटाएं",
|
||||
"DOWNLOAD": "डाउनलोड करें",
|
||||
"DURATION": "अवधि",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "मीडिया हटाएं",
|
||||
"Delete media": "मीडिया हटाएं",
|
||||
"Disable Comments": "टिप्पणियां अक्षम करें",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "स्वामी बदलने में विफल। कृपया पुनः प्रयास करें।",
|
||||
"Failed to copy media.": "मीडिया कॉपी करने में विफल।",
|
||||
"Failed to create playlist": "प्लेलिस्ट बनाने में विफल",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "मीडिया हटाने में विफल। कृपया पुनः प्रयास करें।",
|
||||
"Failed to disable comments.": "टिप्पणियों को अक्षम करने में विफल।",
|
||||
"Failed to disable download.": "डाउनलोड अक्षम करने में विफल।",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "मौजूदा उपयोगकर्ताओं को फ़िल्टर करें...",
|
||||
"Filter playlists...": "प्लेलिस्ट फ़िल्टर करें...",
|
||||
"Filters": "फ़िल्टर",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "जाएं",
|
||||
"History": "इतिहास",
|
||||
"Home": "मुख्य पृष्ठ",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "टिप्पणियाँ प्रबंधित करें",
|
||||
"Manage media": "मीडिया प्रबंधित करें",
|
||||
"Manage users": "उपयोगकर्ताओं को प्रबंधित करें",
|
||||
"Management": "",
|
||||
"Media": "मीडिया",
|
||||
"Media I own": "मेरे स्वामित्व वाली मीडिया",
|
||||
"Media was edited": "मीडिया संपादित किया गया था",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "के लिए कोई परिणाम नहीं",
|
||||
"No tags": "कोई टैग नहीं",
|
||||
"No users to add": "जोड़ने के लिए कोई उपयोगकर्ता नहीं",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "प्लेलिस्ट",
|
||||
"PUBLISH STATE": "प्रकाशन स्थिति",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "पर प्रकाशित",
|
||||
"Recent uploads": "हाल के अपलोड",
|
||||
"Recommended": "अनुशंसित",
|
||||
"Record": "",
|
||||
"Record Screen": "स्क्रीन रिकॉर्ड करें",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "पंजीकरण करें",
|
||||
"Remove category": "श्रेणी हटाएं",
|
||||
"Remove from list": "सूची से हटाएं",
|
||||
"Remove tag": "टैग हटाएं",
|
||||
"Remove user": "उपयोगकर्ता हटाएं",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "सहेजें",
|
||||
"SEARCH": "खोजें",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "सभी मीडिया चुनें",
|
||||
"Select publish state:": "प्रकाशन स्थिति चुनें:",
|
||||
"Selected": "चयनित",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "मेरे द्वारा साझा किया गया",
|
||||
"Shared with me": "मेरे साथ साझा किया गया",
|
||||
"Sharing": "",
|
||||
"Sign in": "साइन इन करें",
|
||||
"Sign out": "साइन आउट करें",
|
||||
"Sort By": "इसके अनुसार क्रमबद्ध करें",
|
||||
"Start Recording": "रिकॉर्डिंग प्रारंभ करें",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "मीडिया अपलोड करना और अपना काम साझा करना शुरू करें। आपके द्वारा अपलोड किया गया मीडिया यहां दिखाई देगा।",
|
||||
"Stop Recording": "रिकॉर्डिंग रोकें",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "प्रस्तुत करें",
|
||||
"Subtitle was added": "उपशीर्षक जोड़ा गया",
|
||||
"Subtitles": "उपशीर्षक",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "टिप्पणियां सफलतापूर्वक सक्षम की गईं",
|
||||
"Successfully changed owner": "स्वामी सफलतापूर्वक बदला गया",
|
||||
"Successfully deleted": "सफलतापूर्वक हटाया गया",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "सफलतापूर्वक अपडेट किया गया",
|
||||
"Successfully updated categories": "श्रेणियां सफलतापूर्वक अपडेट की गईं",
|
||||
"Successfully updated playlist membership": "प्लेलिस्ट सदस्यता सफलतापूर्वक अपडेट की गई",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "मीडिया अपलोड करें",
|
||||
"Uploads": "अपलोड",
|
||||
"Users": "उपयोगकर्ता",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "सभी देखें",
|
||||
"Video": "वीडियो",
|
||||
"View all": "सभी देखें",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "स्वागत है",
|
||||
"You are going to copy": "आप कॉपी करने जा रहे हैं",
|
||||
"You are going to delete": "आप हटाने जा रहे हैं",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "आप टिप्पणियों को अक्षम करने जा रहे हैं",
|
||||
"You are going to disable download for": "आप डाउनलोड को अक्षम करने जा रहे हैं",
|
||||
"You are going to enable comments to": "आप टिप्पणियों को सक्षम करने जा रहे हैं",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "HAPUS MEDIA",
|
||||
"DOWNLOAD": "UNDUH",
|
||||
"DURATION": "DURASI",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Hapus Media",
|
||||
"Delete media": "Hapus media",
|
||||
"Disable Comments": "Nonaktifkan Komentar",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Gagal mengganti pemilik. Silakan coba lagi.",
|
||||
"Failed to copy media.": "Gagal menyalin media.",
|
||||
"Failed to create playlist": "Gagal membuat daftar putar",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Gagal menghapus media. Silakan coba lagi.",
|
||||
"Failed to disable comments.": "Gagal menonaktifkan komentar.",
|
||||
"Failed to disable download.": "Gagal menonaktifkan unduhan.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filter pengguna yang ada...",
|
||||
"Filter playlists...": "Filter daftar putar...",
|
||||
"Filters": "Filter",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Pergi",
|
||||
"History": "Riwayat",
|
||||
"Home": "Beranda",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Kelola komentar",
|
||||
"Manage media": "Kelola media",
|
||||
"Manage users": "Kelola pengguna",
|
||||
"Management": "",
|
||||
"Media": "Media",
|
||||
"Media I own": "Media yang saya miliki",
|
||||
"Media was edited": "Media telah diedit",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Tidak ada hasil untuk",
|
||||
"No tags": "Tidak ada tag",
|
||||
"No users to add": "Tidak ada pengguna untuk ditambahkan",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "DAFTAR PUTAR",
|
||||
"PUBLISH STATE": "STATUS PUBLIKASI",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Diterbitkan pada",
|
||||
"Recent uploads": "Unggahan terbaru",
|
||||
"Recommended": "Direkomendasikan",
|
||||
"Record": "",
|
||||
"Record Screen": "Rekam Layar",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Daftar",
|
||||
"Remove category": "Hapus kategori",
|
||||
"Remove from list": "Hapus dari daftar",
|
||||
"Remove tag": "Hapus tag",
|
||||
"Remove user": "Hapus pengguna",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "SIMPAN",
|
||||
"SEARCH": "CARI",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Pilih semua media",
|
||||
"Select publish state:": "Pilih status publikasi:",
|
||||
"Selected": "Dipilih",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Dibagikan oleh saya",
|
||||
"Shared with me": "Dibagikan dengan saya",
|
||||
"Sharing": "",
|
||||
"Sign in": "Masuk",
|
||||
"Sign out": "Keluar",
|
||||
"Sort By": "Urutkan Berdasarkan",
|
||||
"Start Recording": "Mulai Merekam",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Mulai mengunggah media dan berbagi karya Anda. Media yang Anda unggah akan muncul di sini.",
|
||||
"Stop Recording": "Hentikan Perekaman",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Kirim",
|
||||
"Subtitle was added": "Subtitle telah ditambahkan",
|
||||
"Subtitles": "Subtitel",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Komentar berhasil diaktifkan",
|
||||
"Successfully changed owner": "Berhasil mengganti pemilik",
|
||||
"Successfully deleted": "Berhasil dihapus",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Berhasil diperbarui",
|
||||
"Successfully updated categories": "Kategori berhasil diperbarui",
|
||||
"Successfully updated playlist membership": "Keanggotaan daftar putar berhasil diperbarui",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Unggah media",
|
||||
"Uploads": "Unggahan",
|
||||
"Users": "Pengguna",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "LIHAT SEMUA",
|
||||
"Video": "Video",
|
||||
"View all": "Lihat semua",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Selamat datang",
|
||||
"You are going to copy": "Anda akan menyalin",
|
||||
"You are going to delete": "Anda akan menghapus",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Anda akan menonaktifkan komentar untuk",
|
||||
"You are going to disable download for": "Anda akan menonaktifkan unduhan untuk",
|
||||
"You are going to enable comments to": "Anda akan mengaktifkan komentar untuk",
|
||||
|
||||
@@ -49,6 +49,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "ELIMINA MEDIA",
|
||||
"DOWNLOAD": "SCARICA",
|
||||
"DURATION": "DURATA",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Elimina Media",
|
||||
"Delete media": "Elimina media",
|
||||
"Disable Comments": "Disabilita Commenti",
|
||||
@@ -71,6 +72,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Impossibile cambiare proprietario. Riprova.",
|
||||
"Failed to copy media.": "Impossibile copiare il media.",
|
||||
"Failed to create playlist": "Impossibile creare playlist",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Impossibile eliminare il media. Riprova.",
|
||||
"Failed to disable comments.": "Impossibile disabilitare i commenti.",
|
||||
"Failed to disable download.": "Impossibile disabilitare il download.",
|
||||
@@ -102,6 +104,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtra utenti esistenti...",
|
||||
"Filter playlists...": "Filtra playlist...",
|
||||
"Filters": "Filtri",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Vai",
|
||||
"History": "Cronologia",
|
||||
"Home": "Home",
|
||||
@@ -122,6 +127,7 @@ translation_strings = {
|
||||
"Manage comments": "Gestisci i commenti",
|
||||
"Manage media": "Gestisci i media",
|
||||
"Manage users": "Gestisci gli utenti",
|
||||
"Management": "",
|
||||
"Media": "Media",
|
||||
"Media I own": "Media di mia proprietà",
|
||||
"Media was edited": "Il media è stato modificato",
|
||||
@@ -138,6 +144,7 @@ translation_strings = {
|
||||
"No results for": "Nessun risultato per",
|
||||
"No tags": "Nessun tag",
|
||||
"No users to add": "Nessun utente da aggiungere",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "PLAYLIST",
|
||||
"PUBLISH STATE": "STATO DI PUBBLICAZIONE",
|
||||
"Pdf": "PDF",
|
||||
@@ -157,12 +164,17 @@ translation_strings = {
|
||||
"Published on": "Pubblicato il",
|
||||
"Recent uploads": "Caricamenti recenti",
|
||||
"Recommended": "Raccomandati",
|
||||
"Record": "",
|
||||
"Record Screen": "Registra schermo",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registrati",
|
||||
"Remove category": "Rimuovi categoria",
|
||||
"Remove from list": "Rimuovi dalla lista",
|
||||
"Remove tag": "Rimuovi tag",
|
||||
"Remove user": "Rimuovi utente",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "SALVA",
|
||||
"SEARCH": "CERCA",
|
||||
@@ -179,14 +191,22 @@ translation_strings = {
|
||||
"Select all media": "Seleziona tutti i media",
|
||||
"Select publish state:": "Seleziona stato di pubblicazione:",
|
||||
"Selected": "Selezionato",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Condiviso da me",
|
||||
"Shared with me": "Condiviso con me",
|
||||
"Sharing": "",
|
||||
"Sign in": "Login",
|
||||
"Sign out": "Logout",
|
||||
"Sort By": "Ordina per",
|
||||
"Start Recording": "Inizia registrazione",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Inizia a caricare media e condividere il tuo lavoro. I media caricati appariranno qui.",
|
||||
"Stop Recording": "Interrompi registrazione",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Invia",
|
||||
"Subtitle was added": "I sottotitoli sono stati aggiunti",
|
||||
"Subtitles": "Sottotitoli",
|
||||
@@ -197,6 +217,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Commenti abilitati con successo",
|
||||
"Successfully changed owner": "Proprietario cambiato con successo",
|
||||
"Successfully deleted": "Eliminato con successo",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Aggiornato con successo",
|
||||
"Successfully updated categories": "Categorie aggiornate con successo",
|
||||
"Successfully updated playlist membership": "Appartenenza alla playlist aggiornata con successo",
|
||||
@@ -233,6 +254,9 @@ translation_strings = {
|
||||
"Upload media": "Carica i media",
|
||||
"Uploads": "Caricamenti",
|
||||
"Users": "Utenti",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "MOSTRA TUTTI",
|
||||
"Video": "Video",
|
||||
"View all": "Mostra tutti",
|
||||
@@ -241,6 +265,7 @@ translation_strings = {
|
||||
"Welcome": "Benvenuto",
|
||||
"You are going to copy": "Stai per copiare",
|
||||
"You are going to delete": "Stai per eliminare",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Stai per disabilitare i commenti di",
|
||||
"You are going to disable download for": "Stai per disabilitare il download di",
|
||||
"You are going to enable comments to": "Stai per abilitare i commenti di",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "メディアを削除",
|
||||
"DOWNLOAD": "ダウンロード",
|
||||
"DURATION": "期間",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "メディアを削除",
|
||||
"Delete media": "メディアを削除",
|
||||
"Disable Comments": "コメントを無効化",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "所有者の変更に失敗しました。もう一度お試しください。",
|
||||
"Failed to copy media.": "メディアのコピーに失敗しました。",
|
||||
"Failed to create playlist": "プレイリストの作成に失敗しました",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "メディアの削除に失敗しました。もう一度お試しください。",
|
||||
"Failed to disable comments.": "コメントの無効化に失敗しました。",
|
||||
"Failed to disable download.": "ダウンロードの無効化に失敗しました。",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "既存ユーザーをフィルター...",
|
||||
"Filter playlists...": "プレイリストをフィルター...",
|
||||
"Filters": "フィルター",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "行く",
|
||||
"History": "履歴",
|
||||
"Home": "ホーム",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "コメントを管理",
|
||||
"Manage media": "メディアを管理",
|
||||
"Manage users": "ユーザーを管理",
|
||||
"Management": "",
|
||||
"Media": "メディア",
|
||||
"Media I own": "自分が所有するメディア",
|
||||
"Media was edited": "メディアが編集されました",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "の結果はありません",
|
||||
"No tags": "タグなし",
|
||||
"No users to add": "追加するユーザーなし",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "プレイリスト",
|
||||
"PUBLISH STATE": "公開状態",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "公開日",
|
||||
"Recent uploads": "最近のアップロード",
|
||||
"Recommended": "おすすめ",
|
||||
"Record": "",
|
||||
"Record Screen": "画面を録画",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "登録",
|
||||
"Remove category": "カテゴリーを削除",
|
||||
"Remove from list": "リストから削除",
|
||||
"Remove tag": "タグを削除",
|
||||
"Remove user": "ユーザーを削除",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "保存",
|
||||
"SEARCH": "検索",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "すべてのメディアを選択",
|
||||
"Select publish state:": "公開状態を選択:",
|
||||
"Selected": "選択済み",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "自分が共有",
|
||||
"Shared with me": "共有されたもの",
|
||||
"Sharing": "",
|
||||
"Sign in": "サインイン",
|
||||
"Sign out": "サインアウト",
|
||||
"Sort By": "並び替え",
|
||||
"Start Recording": "録画開始",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "メディアをアップロードして作品を共有しましょう。アップロードしたメディアはここに表示されます。",
|
||||
"Stop Recording": "録画停止",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "送信",
|
||||
"Subtitle was added": "字幕が追加されました",
|
||||
"Subtitles": "字幕",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "コメントが正常に有効化されました",
|
||||
"Successfully changed owner": "所有者が正常に変更されました",
|
||||
"Successfully deleted": "正常に削除されました",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "正常に更新されました",
|
||||
"Successfully updated categories": "カテゴリーが正常に更新されました",
|
||||
"Successfully updated playlist membership": "プレイリストメンバーシップが正常に更新されました",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "メディアをアップロード",
|
||||
"Uploads": "アップロード",
|
||||
"Users": "ユーザー",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "すべて表示",
|
||||
"Video": "ビデオ",
|
||||
"View all": "すべて表示",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "ようこそ",
|
||||
"You are going to copy": "コピーします",
|
||||
"You are going to delete": "削除します",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "コメントを無効化します",
|
||||
"You are going to disable download for": "ダウンロードを無効化します",
|
||||
"You are going to enable comments to": "コメントを有効化します",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "미디어 삭제",
|
||||
"DOWNLOAD": "다운로드",
|
||||
"DURATION": "재생 시간",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "미디어 삭제",
|
||||
"Delete media": "미디어 삭제",
|
||||
"Disable Comments": "댓글 비활성화",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "소유자 변경에 실패했습니다. 다시 시도해주세요.",
|
||||
"Failed to copy media.": "미디어 복사에 실패했습니다.",
|
||||
"Failed to create playlist": "재생 목록 만들기 실패",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "미디어 삭제에 실패했습니다. 다시 시도해주세요.",
|
||||
"Failed to disable comments.": "댓글 비활성화에 실패했습니다.",
|
||||
"Failed to disable download.": "다운로드 비활성화에 실패했습니다.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "기존 사용자 필터링...",
|
||||
"Filter playlists...": "재생 목록 필터링...",
|
||||
"Filters": "필터",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "이동",
|
||||
"History": "기록",
|
||||
"Home": "홈",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "댓글 관리",
|
||||
"Manage media": "미디어 관리",
|
||||
"Manage users": "사용자 관리",
|
||||
"Management": "",
|
||||
"Media": "미디어",
|
||||
"Media I own": "내가 소유한 미디어",
|
||||
"Media was edited": "미디어가 편집되었습니다",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "결과 없음",
|
||||
"No tags": "태그 없음",
|
||||
"No users to add": "추가할 사용자 없음",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "재생 목록",
|
||||
"PUBLISH STATE": "게시 상태",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "게시일",
|
||||
"Recent uploads": "최근 업로드",
|
||||
"Recommended": "추천",
|
||||
"Record": "",
|
||||
"Record Screen": "화면 녹화",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "등록",
|
||||
"Remove category": "카테고리 제거",
|
||||
"Remove from list": "목록에서 제거",
|
||||
"Remove tag": "태그 제거",
|
||||
"Remove user": "사용자 제거",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "저장",
|
||||
"SEARCH": "검색",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "모든 미디어 선택",
|
||||
"Select publish state:": "게시 상태 선택:",
|
||||
"Selected": "선택됨",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "내가 공유함",
|
||||
"Shared with me": "나와 공유됨",
|
||||
"Sharing": "",
|
||||
"Sign in": "로그인",
|
||||
"Sign out": "로그아웃",
|
||||
"Sort By": "정렬",
|
||||
"Start Recording": "녹화 시작",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "미디어를 업로드하고 작업을 공유하세요. 업로드한 미디어가 여기에 표시됩니다.",
|
||||
"Stop Recording": "녹화 중지",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "제출",
|
||||
"Subtitle was added": "자막이 추가되었습니다",
|
||||
"Subtitles": "자막",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "댓글이 활성화되었습니다",
|
||||
"Successfully changed owner": "소유자가 변경되었습니다",
|
||||
"Successfully deleted": "삭제 성공",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "업데이트 성공",
|
||||
"Successfully updated categories": "카테고리가 업데이트되었습니다",
|
||||
"Successfully updated playlist membership": "재생 목록 멤버십이 업데이트되었습니다",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "미디어 업로드",
|
||||
"Uploads": "업로드",
|
||||
"Users": "사용자",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "모두 보기",
|
||||
"Video": "비디오",
|
||||
"View all": "모두 보기",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "환영합니다",
|
||||
"You are going to copy": "복사하려고 합니다",
|
||||
"You are going to delete": "삭제하려고 합니다",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "댓글을 비활성화하려고 합니다",
|
||||
"You are going to disable download for": "다운로드를 비활성화하려고 합니다",
|
||||
"You are going to enable comments to": "댓글을 활성화하려고 합니다",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "MEDIA VERWIJDEREN",
|
||||
"DOWNLOAD": "DOWNLOADEN",
|
||||
"DURATION": "DUUR",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Media verwijderen",
|
||||
"Delete media": "Media verwijderen",
|
||||
"Disable Comments": "Reacties uitschakelen",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Eigenaar wijzigen mislukt. Probeer het opnieuw.",
|
||||
"Failed to copy media.": "Media kopiëren mislukt.",
|
||||
"Failed to create playlist": "Afspeellijst maken mislukt",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Media verwijderen mislukt. Probeer het opnieuw.",
|
||||
"Failed to disable comments.": "Reacties uitschakelen mislukt.",
|
||||
"Failed to disable download.": "Download uitschakelen mislukt.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filter bestaande gebruikers...",
|
||||
"Filter playlists...": "Filter afspeellijsten...",
|
||||
"Filters": "Filters",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Ga",
|
||||
"History": "Geschiedenis",
|
||||
"Home": "Home",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Reacties beheren",
|
||||
"Manage media": "Media beheren",
|
||||
"Manage users": "Gebruikers beheren",
|
||||
"Management": "",
|
||||
"Media": "Media",
|
||||
"Media I own": "Media die ik bezit",
|
||||
"Media was edited": "Media is bewerkt",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Geen resultaten voor",
|
||||
"No tags": "Geen tags",
|
||||
"No users to add": "Geen gebruikers om toe te voegen",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "AFSPEELLIJSTEN",
|
||||
"PUBLISH STATE": "PUBLICATIESTATUS",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Gepubliceerd op",
|
||||
"Recent uploads": "Recente uploads",
|
||||
"Recommended": "Aanbevolen",
|
||||
"Record": "",
|
||||
"Record Screen": "Scherm opnemen",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registreren",
|
||||
"Remove category": "Categorie verwijderen",
|
||||
"Remove from list": "Verwijderen uit lijst",
|
||||
"Remove tag": "Tag verwijderen",
|
||||
"Remove user": "Gebruiker verwijderen",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "OPSLAAN",
|
||||
"SEARCH": "ZOEKEN",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Alle media selecteren",
|
||||
"Select publish state:": "Selecteer publicatiestatus:",
|
||||
"Selected": "Geselecteerd",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Gedeeld door mij",
|
||||
"Shared with me": "Gedeeld met mij",
|
||||
"Sharing": "",
|
||||
"Sign in": "Inloggen",
|
||||
"Sign out": "Uitloggen",
|
||||
"Sort By": "Sorteer op",
|
||||
"Start Recording": "Opname starten",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Begin met het uploaden van media en het delen van uw werk. Media die u uploadt, verschijnt hier.",
|
||||
"Stop Recording": "Opname stoppen",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Indienen",
|
||||
"Subtitle was added": "Ondertitel is toegevoegd",
|
||||
"Subtitles": "Ondertitels",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Reacties succesvol ingeschakeld",
|
||||
"Successfully changed owner": "Eigenaar succesvol gewijzigd",
|
||||
"Successfully deleted": "Succesvol verwijderd",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Succesvol bijgewerkt",
|
||||
"Successfully updated categories": "Categorieën succesvol bijgewerkt",
|
||||
"Successfully updated playlist membership": "Afspeellijstlidmaatschap succesvol bijgewerkt",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Media uploaden",
|
||||
"Uploads": "Uploads",
|
||||
"Users": "Gebruikers",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "BEKIJK ALLES",
|
||||
"Video": "Video",
|
||||
"View all": "Bekijk alles",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Welkom",
|
||||
"You are going to copy": "Je gaat kopiëren",
|
||||
"You are going to delete": "Je gaat verwijderen",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Je gaat reacties uitschakelen voor",
|
||||
"You are going to disable download for": "Je gaat download uitschakelen voor",
|
||||
"You are going to enable comments to": "Je gaat reacties inschakelen voor",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "EXCLUIR MÍDIA",
|
||||
"DOWNLOAD": "BAIXAR",
|
||||
"DURATION": "DURAÇÃO",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Excluir mídia",
|
||||
"Delete media": "Excluir mídia",
|
||||
"Disable Comments": "Desativar comentários",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Falha ao mudar proprietário. Por favor, tente novamente.",
|
||||
"Failed to copy media.": "Falha ao copiar mídia.",
|
||||
"Failed to create playlist": "Falha ao criar playlist",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Falha ao excluir mídia. Por favor, tente novamente.",
|
||||
"Failed to disable comments.": "Falha ao desativar comentários.",
|
||||
"Failed to disable download.": "Falha ao desativar download.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtrar usuários existentes...",
|
||||
"Filter playlists...": "Filtrar playlists...",
|
||||
"Filters": "Filtros",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Ir",
|
||||
"History": "Histórico",
|
||||
"Home": "Início",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Gerenciar comentários",
|
||||
"Manage media": "Gerenciar mídia",
|
||||
"Manage users": "Gerenciar usuários",
|
||||
"Management": "",
|
||||
"Media": "Mídia",
|
||||
"Media I own": "Mídia que possuo",
|
||||
"Media was edited": "Mídia foi editada",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Nenhum resultado para",
|
||||
"No tags": "Nenhuma tag",
|
||||
"No users to add": "Nenhum usuário para adicionar",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "PLAYLISTS",
|
||||
"PUBLISH STATE": "ESTADO DE PUBLICAÇÃO",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Publicado em",
|
||||
"Recent uploads": "Uploads recentes",
|
||||
"Recommended": "Recomendado",
|
||||
"Record": "",
|
||||
"Record Screen": "Gravar tela",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registrar",
|
||||
"Remove category": "Remover categoria",
|
||||
"Remove from list": "Remover da lista",
|
||||
"Remove tag": "Remover tag",
|
||||
"Remove user": "Remover usuário",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "SALVAR",
|
||||
"SEARCH": "PESQUISAR",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Selecionar todas as mídias",
|
||||
"Select publish state:": "Selecionar estado de publicação:",
|
||||
"Selected": "Selecionado",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Compartilhado por mim",
|
||||
"Shared with me": "Compartilhado comigo",
|
||||
"Sharing": "",
|
||||
"Sign in": "Entrar",
|
||||
"Sign out": "Sair",
|
||||
"Sort By": "Ordenar por",
|
||||
"Start Recording": "Iniciar gravação",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Comece a fazer upload de mídia e compartilhar seu trabalho. A mídia que você fizer upload aparecerá aqui.",
|
||||
"Stop Recording": "Parar gravação",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Enviar",
|
||||
"Subtitle was added": "Legenda foi adicionada",
|
||||
"Subtitles": "Legendas",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Comentários ativados com sucesso",
|
||||
"Successfully changed owner": "Proprietário alterado com sucesso",
|
||||
"Successfully deleted": "Excluído com sucesso",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Atualizado com sucesso",
|
||||
"Successfully updated categories": "Categorias atualizadas com sucesso",
|
||||
"Successfully updated playlist membership": "Associação da playlist atualizada com sucesso",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Carregar mídia",
|
||||
"Uploads": "Uploads",
|
||||
"Users": "Usuários",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "VER TODOS",
|
||||
"Video": "Vídeo",
|
||||
"View all": "Ver todos",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Bem-vindo",
|
||||
"You are going to copy": "Você vai copiar",
|
||||
"You are going to delete": "Você vai excluir",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Você vai desativar comentários de",
|
||||
"You are going to disable download for": "Você vai desativar download de",
|
||||
"You are going to enable comments to": "Você vai ativar comentários de",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "УДАЛИТЬ МЕДИА",
|
||||
"DOWNLOAD": "СКАЧАТЬ",
|
||||
"DURATION": "ДЛИТЕЛЬНОСТЬ",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Удалить медиа",
|
||||
"Delete media": "Удалить медиа",
|
||||
"Disable Comments": "Отключить комментарии",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Не удалось изменить владельца. Пожалуйста, попробуйте снова.",
|
||||
"Failed to copy media.": "Не удалось скопировать медиа.",
|
||||
"Failed to create playlist": "Не удалось создать плейлист",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Не удалось удалить медиа. Пожалуйста, попробуйте снова.",
|
||||
"Failed to disable comments.": "Не удалось отключить комментарии.",
|
||||
"Failed to disable download.": "Не удалось отключить загрузку.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Фильтровать существующих пользователей...",
|
||||
"Filter playlists...": "Фильтровать плейлисты...",
|
||||
"Filters": "Фильтры",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Перейти",
|
||||
"History": "История",
|
||||
"Home": "Главная",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Управление комментариями",
|
||||
"Manage media": "Управление медиа",
|
||||
"Manage users": "Управление пользователями",
|
||||
"Management": "",
|
||||
"Media": "Медиа",
|
||||
"Media I own": "Медиа, которыми я владею",
|
||||
"Media was edited": "Медиа было отредактировано",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Нет результатов для",
|
||||
"No tags": "Нет тегов",
|
||||
"No users to add": "Нет пользователей для добавления",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "ПЛЕЙЛИСТЫ",
|
||||
"PUBLISH STATE": "СОСТОЯНИЕ ПУБЛИКАЦИИ",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Опубликовано",
|
||||
"Recent uploads": "Недавние загрузки",
|
||||
"Recommended": "Рекомендуемое",
|
||||
"Record": "",
|
||||
"Record Screen": "Запись экрана",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Регистрация",
|
||||
"Remove category": "Удалить категорию",
|
||||
"Remove from list": "Удалить из списка",
|
||||
"Remove tag": "Удалить тег",
|
||||
"Remove user": "Удалить пользователя",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "СОХРАНИТЬ",
|
||||
"SEARCH": "ПОИСК",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Выбрать все медиа",
|
||||
"Select publish state:": "Выберите состояние публикации:",
|
||||
"Selected": "Выбрано",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Мной поделено",
|
||||
"Shared with me": "Поделено со мной",
|
||||
"Sharing": "",
|
||||
"Sign in": "Войти",
|
||||
"Sign out": "Выйти",
|
||||
"Sort By": "Сортировать по",
|
||||
"Start Recording": "Начать запись",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Начните загружать медиа и делиться своей работой. Загруженные медиа появятся здесь.",
|
||||
"Stop Recording": "Остановить запись",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Отправить",
|
||||
"Subtitle was added": "Субтитры были добавлены",
|
||||
"Subtitles": "Субтитры",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Комментарии успешно включены",
|
||||
"Successfully changed owner": "Владелец успешно изменен",
|
||||
"Successfully deleted": "Успешно удалено",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Успешно обновлено",
|
||||
"Successfully updated categories": "Категории успешно обновлены",
|
||||
"Successfully updated playlist membership": "Членство в плейлисте успешно обновлено",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Загрузить медиа",
|
||||
"Uploads": "Загрузки",
|
||||
"Users": "Пользователи",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "ПОКАЗАТЬ ВСЕ",
|
||||
"Video": "Видео",
|
||||
"View all": "Показать все",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Добро пожаловать",
|
||||
"You are going to copy": "Вы собираетесь скопировать",
|
||||
"You are going to delete": "Вы собираетесь удалить",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Вы собираетесь отключить комментарии для",
|
||||
"You are going to disable download for": "Вы собираетесь отключить загрузку для",
|
||||
"You are going to enable comments to": "Вы собираетесь включить комментарии для",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "IZBRIŠI MEDIJ",
|
||||
"DOWNLOAD": "PRENESI",
|
||||
"DURATION": "TRAJANJE",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Izbriši Medij",
|
||||
"Delete media": "Izbriši medij",
|
||||
"Disable Comments": "Onemogoči Komentarje",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Spreminjanje lastnika ni uspelo. Prosim poskusite ponovno.",
|
||||
"Failed to copy media.": "Kopiranje medija ni uspelo.",
|
||||
"Failed to create playlist": "Ustvarjanje seznama predvajanja ni uspelo",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Brisanje medija ni uspelo. Prosim poskusite ponovno.",
|
||||
"Failed to disable comments.": "Onemogočanje komentarjev ni uspelo.",
|
||||
"Failed to disable download.": "Onemogočanje prenosa ni uspelo.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Filtriraj obstoječe uporabnike...",
|
||||
"Filter playlists...": "Filtriraj sezname predvajanja...",
|
||||
"Filters": "Filtri",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Pojdi",
|
||||
"History": "Zgodovina",
|
||||
"Home": "Domov",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Upravljaj komentarje",
|
||||
"Manage media": "Upravljaj medije",
|
||||
"Manage users": "Upravljaj uporabnike",
|
||||
"Management": "",
|
||||
"Media": "Mediji",
|
||||
"Media I own": "Mediji, ki jih posedujam",
|
||||
"Media was edited": "Medij je bil urejen",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Ni rezultatov za",
|
||||
"No tags": "Brez oznak",
|
||||
"No users to add": "Ni uporabnikov za dodajanje",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "SEZNAMI PREDVAJANJA",
|
||||
"PUBLISH STATE": "STANJE OBJAVE",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Objavljeno",
|
||||
"Recent uploads": "Nedavne naložitve",
|
||||
"Recommended": "Priporočeno",
|
||||
"Record": "",
|
||||
"Record Screen": "Snemanje zaslona",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Registracija",
|
||||
"Remove category": "Odstrani kategorijo",
|
||||
"Remove from list": "Odstrani s seznama",
|
||||
"Remove tag": "Odstrani oznako",
|
||||
"Remove user": "Odstrani uporabnika",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "SHRANI",
|
||||
"SEARCH": "ISKANJE",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Izberi vse medije",
|
||||
"Select publish state:": "Izberi stanje objave:",
|
||||
"Selected": "Izbrano",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Deljeno z moje strani",
|
||||
"Shared with me": "Deljeno z mano",
|
||||
"Sharing": "",
|
||||
"Sign in": "Prijava",
|
||||
"Sign out": "Odjava",
|
||||
"Sort By": "Razvrsti po",
|
||||
"Start Recording": "Začni snemanje",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Začnite nalagati medije in deliti svoje delo. Mediji, ki jih naložite, bodo prikazani tukaj.",
|
||||
"Stop Recording": "Ustavi snemanje",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Pošlji",
|
||||
"Subtitle was added": "Podnapisi so bili dodani",
|
||||
"Subtitles": "Podnapisi",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Komentarji uspešno omogočeni",
|
||||
"Successfully changed owner": "Lastnik uspešno spremenjen",
|
||||
"Successfully deleted": "Uspešno izbrisano",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Uspešno posodobljeno",
|
||||
"Successfully updated categories": "Kategorije uspešno posodobljene",
|
||||
"Successfully updated playlist membership": "Članstvo seznama predvajanja uspešno posodobljeno",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Naloži medij",
|
||||
"Uploads": "Naloženi",
|
||||
"Users": "Uporabniki",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "PRIKAŽI VSE",
|
||||
"Video": "Video",
|
||||
"View all": "Prikaži vse",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Dobrodošli",
|
||||
"You are going to copy": "Kopirate",
|
||||
"You are going to delete": "Brišete",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Onemogočate komentarje za",
|
||||
"You are going to disable download for": "Onemogočate prenos za",
|
||||
"You are going to enable comments to": "Omogočate komentarje za",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "MEDYAYI SİL",
|
||||
"DOWNLOAD": "İNDİR",
|
||||
"DURATION": "SÜRE",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "Medyayı Sil",
|
||||
"Delete media": "Medyayı sil",
|
||||
"Disable Comments": "Yorumları Devre Dışı Bırak",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "Sahip değiştirilemedi. Lütfen tekrar deneyin.",
|
||||
"Failed to copy media.": "Medya kopyalanamadı.",
|
||||
"Failed to create playlist": "Çalma listesi oluşturulamadı",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "Medya silinemedi. Lütfen tekrar deneyin.",
|
||||
"Failed to disable comments.": "Yorumlar devre dışı bırakılamadı.",
|
||||
"Failed to disable download.": "İndirme devre dışı bırakılamadı.",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "Mevcut kullanıcıları filtrele...",
|
||||
"Filter playlists...": "Çalma listelerini filtrele...",
|
||||
"Filters": "Filtreler",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "Git",
|
||||
"History": "Geçmiş",
|
||||
"Home": "Ana Sayfa",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "Yorumları yönet",
|
||||
"Manage media": "Medyayı yönet",
|
||||
"Manage users": "Kullanıcıları yönet",
|
||||
"Management": "",
|
||||
"Media": "Medya",
|
||||
"Media I own": "Sahip olduğum medya",
|
||||
"Media was edited": "Medya düzenlendi",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "Sonuç bulunamadı",
|
||||
"No tags": "Etiket yok",
|
||||
"No users to add": "Eklenecek kullanıcı yok",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "ÇALMA LİSTELERİ",
|
||||
"PUBLISH STATE": "YAYINLANMA DURUMU",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "Yayınlanma tarihi",
|
||||
"Recent uploads": "Son yüklemeler",
|
||||
"Recommended": "Önerilen",
|
||||
"Record": "",
|
||||
"Record Screen": "Ekranı Kaydet",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "Kayıt Ol",
|
||||
"Remove category": "Kategoriyi kaldır",
|
||||
"Remove from list": "Listeden kaldır",
|
||||
"Remove tag": "Etiketi kaldır",
|
||||
"Remove user": "Kullanıcıyı kaldır",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "KAYDET",
|
||||
"SEARCH": "ARA",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "Tüm medyayı seç",
|
||||
"Select publish state:": "Yayınlanma durumunu seç:",
|
||||
"Selected": "Seçildi",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "Paylaştıklarım",
|
||||
"Shared with me": "Benimle paylaşılanlar",
|
||||
"Sharing": "",
|
||||
"Sign in": "Giriş Yap",
|
||||
"Sign out": "Çıkış Yap",
|
||||
"Sort By": "Sırala",
|
||||
"Start Recording": "Kaydı Başlat",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "Medya yüklemeye ve çalışmanızı paylaşmaya başlayın. Yüklediğiniz medya burada görünecektir.",
|
||||
"Stop Recording": "Kaydı Durdur",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "Gönder",
|
||||
"Subtitle was added": "Alt yazı eklendi",
|
||||
"Subtitles": "Altyazılar",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "Yorumlar başarıyla etkinleştirildi",
|
||||
"Successfully changed owner": "Sahip başarıyla değiştirildi",
|
||||
"Successfully deleted": "Başarıyla silindi",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "Başarıyla güncellendi",
|
||||
"Successfully updated categories": "Kategoriler başarıyla güncellendi",
|
||||
"Successfully updated playlist membership": "Çalma listesi üyeliği başarıyla güncellendi",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "Medya yükle",
|
||||
"Uploads": "Yüklemeler",
|
||||
"Users": "Kullanıcılar",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "HEPSİNİ GÖR",
|
||||
"Video": "Video",
|
||||
"View all": "Hepsini gör",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "Hoş geldiniz",
|
||||
"You are going to copy": "Kopyalayacaksınız",
|
||||
"You are going to delete": "Sileceksiniz",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "Yorumları devre dışı bırakacaksınız",
|
||||
"You are going to disable download for": "İndirmeyi devre dışı bırakacaksınız",
|
||||
"You are going to enable comments to": "Yorumları etkinleştireceksiniz",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "میڈیا حذف کریں",
|
||||
"DOWNLOAD": "ڈاؤن لوڈ",
|
||||
"DURATION": "دورانیہ",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "میڈیا حذف کریں",
|
||||
"Delete media": "میڈیا حذف کریں",
|
||||
"Disable Comments": "تبصرے غیر فعال کریں",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "مالک تبدیل کرنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔",
|
||||
"Failed to copy media.": "میڈیا کاپی کرنے میں ناکام۔",
|
||||
"Failed to create playlist": "پلے لسٹ بنانے میں ناکام",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "میڈیا حذف کرنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔",
|
||||
"Failed to disable comments.": "تبصرے غیر فعال کرنے میں ناکام۔",
|
||||
"Failed to disable download.": "ڈاؤن لوڈ غیر فعال کرنے میں ناکام۔",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "موجودہ صارفین فلٹر کریں...",
|
||||
"Filter playlists...": "پلے لسٹس فلٹر کریں...",
|
||||
"Filters": "فلٹرز",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "جائیں",
|
||||
"History": "تاریخ",
|
||||
"Home": "ہوم",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "تبصرے منظم کریں",
|
||||
"Manage media": "میڈیا منظم کریں",
|
||||
"Manage users": "صارفین منظم کریں",
|
||||
"Management": "",
|
||||
"Media": "میڈیا",
|
||||
"Media I own": "",
|
||||
"Media was edited": "میڈیا ترمیم کیا گیا",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "کے لئے کوئی نتائج نہیں",
|
||||
"No tags": "کوئی ٹیگز نہیں",
|
||||
"No users to add": "شامل کرنے کے لیے کوئی صارف نہیں",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "پلے لسٹس",
|
||||
"PUBLISH STATE": "اشاعت کی حالت",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "پر شائع ہوا",
|
||||
"Recent uploads": "حالیہ اپ لوڈز",
|
||||
"Recommended": "تجویز کردہ",
|
||||
"Record": "",
|
||||
"Record Screen": "اسکرین ریکارڈ کریں",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "رجسٹر کریں",
|
||||
"Remove category": "قسم ہٹائیں",
|
||||
"Remove from list": "فہرست سے ہٹائیں",
|
||||
"Remove tag": "ٹیگ ہٹائیں",
|
||||
"Remove user": "صارف ہٹائیں",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "محفوظ کریں",
|
||||
"SEARCH": "تلاش کریں",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "تمام میڈیا منتخب کریں",
|
||||
"Select publish state:": "اشاعت کی حالت منتخب کریں:",
|
||||
"Selected": "منتخب شدہ",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "میری طرف سے شیئر کیا گیا",
|
||||
"Shared with me": "میرے ساتھ شیئر کیا گیا",
|
||||
"Sharing": "",
|
||||
"Sign in": "سائن ان کریں",
|
||||
"Sign out": "سائن آؤٹ کریں",
|
||||
"Sort By": "ترتیب دیں",
|
||||
"Start Recording": "ریکارڈنگ شروع کریں",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "میڈیا اپ لوڈ کرنا اور اپنا کام شیئر کرنا شروع کریں۔ آپ جو میڈیا اپ لوڈ کرتے ہیں وہ یہاں ظاہر ہوگا۔",
|
||||
"Stop Recording": "ریکارڈنگ روکیں",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "جمع کرائیں",
|
||||
"Subtitle was added": "سب ٹائٹل شامل کیا گیا",
|
||||
"Subtitles": "سب ٹائٹلز",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "تبصرے کامیابی سے فعال ہو گئے",
|
||||
"Successfully changed owner": "مالک کامیابی سے تبدیل ہو گیا",
|
||||
"Successfully deleted": "کامیابی سے حذف ہو گیا",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "کامیابی سے اپ ڈیٹ ہو گیا",
|
||||
"Successfully updated categories": "اقسام کامیابی سے اپ ڈیٹ ہو گئیں",
|
||||
"Successfully updated playlist membership": "پلے لسٹ ممبرشپ کامیابی سے اپ ڈیٹ ہو گئی",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "میڈیا اپ لوڈ کریں",
|
||||
"Uploads": "اپ لوڈز",
|
||||
"Users": "صارفین",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "سب دیکھیں",
|
||||
"Video": "ویڈیو",
|
||||
"View all": "سب دیکھیں",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "خوش آمدید",
|
||||
"You are going to copy": "آپ کاپی کرنے جا رہے ہیں",
|
||||
"You are going to delete": "آپ حذف کرنے جا رہے ہیں",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "آپ تبصرے غیر فعال کرنے جا رہے ہیں",
|
||||
"You are going to disable download for": "آپ ڈاؤن لوڈ غیر فعال کرنے جا رہے ہیں",
|
||||
"You are going to enable comments to": "آپ تبصرے فعال کرنے جا رہے ہیں",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "删除媒体",
|
||||
"DOWNLOAD": "下载",
|
||||
"DURATION": "时长",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "",
|
||||
"Delete media": "删除媒体",
|
||||
"Disable Comments": "",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "",
|
||||
"Failed to copy media.": "复制媒体失败。",
|
||||
"Failed to create playlist": "",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "删除媒体失败。请重试。",
|
||||
"Failed to disable comments.": "禁用评论失败。",
|
||||
"Failed to disable download.": "禁用下载失败。",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "",
|
||||
"Filter playlists...": "",
|
||||
"Filters": "筛选",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "去",
|
||||
"History": "历史",
|
||||
"Home": "主页",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "管理评论",
|
||||
"Manage media": "管理媒体",
|
||||
"Manage users": "管理用户",
|
||||
"Management": "",
|
||||
"Media": "媒体",
|
||||
"Media I own": "",
|
||||
"Media was edited": "媒体已编辑",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "没有结果",
|
||||
"No tags": "",
|
||||
"No users to add": "",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "播放列表",
|
||||
"PUBLISH STATE": "发布状态",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "发布于",
|
||||
"Recent uploads": "最近上传",
|
||||
"Recommended": "推荐",
|
||||
"Record": "",
|
||||
"Record Screen": "录制屏幕",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "注册",
|
||||
"Remove category": "",
|
||||
"Remove from list": "",
|
||||
"Remove tag": "",
|
||||
"Remove user": "",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "保存",
|
||||
"SEARCH": "搜索",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "",
|
||||
"Select publish state:": "",
|
||||
"Selected": "",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "我分享的",
|
||||
"Shared with me": "分享给我的",
|
||||
"Sharing": "",
|
||||
"Sign in": "登录",
|
||||
"Sign out": "登出",
|
||||
"Sort By": "排序方式",
|
||||
"Start Recording": "开始录制",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "开始上传媒体并分享您的作品。您上传的媒体将显示在这里。",
|
||||
"Stop Recording": "停止录制",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "",
|
||||
"Subtitle was added": "字幕已添加",
|
||||
"Subtitles": "字幕",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "评论已成功启用",
|
||||
"Successfully changed owner": "",
|
||||
"Successfully deleted": "删除成功",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "",
|
||||
"Successfully updated categories": "",
|
||||
"Successfully updated playlist membership": "",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "上传媒体",
|
||||
"Uploads": "上传",
|
||||
"Users": "",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "查看全部",
|
||||
"Video": "视频",
|
||||
"View all": "查看全部",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "欢迎",
|
||||
"You are going to copy": "您将复制",
|
||||
"You are going to delete": "您将删除",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "您将禁用评论",
|
||||
"You are going to disable download for": "您将禁用下载",
|
||||
"You are going to enable comments to": "您将启用评论",
|
||||
|
||||
@@ -48,6 +48,7 @@ translation_strings = {
|
||||
"DELETE MEDIA": "刪除影片",
|
||||
"DOWNLOAD": "下載",
|
||||
"DURATION": "時長",
|
||||
"Delete Comments": "",
|
||||
"Delete Media": "",
|
||||
"Delete media": "刪除媒體",
|
||||
"Disable Comments": "",
|
||||
@@ -70,6 +71,7 @@ translation_strings = {
|
||||
"Failed to change owner. Please try again.": "",
|
||||
"Failed to copy media.": "複製媒體失敗。",
|
||||
"Failed to create playlist": "",
|
||||
"Failed to delete comments.": "",
|
||||
"Failed to delete media. Please try again.": "刪除媒體失敗。請再試一次。",
|
||||
"Failed to disable comments.": "停用留言失敗。",
|
||||
"Failed to disable download.": "停用下載失敗。",
|
||||
@@ -101,6 +103,9 @@ translation_strings = {
|
||||
"Filter existing users...": "",
|
||||
"Filter playlists...": "",
|
||||
"Filters": "篩選器",
|
||||
"Give users editor permissions to your media by adding them to the below list.": "",
|
||||
"Give users owner permissions to your media, except for deleting the media, by adding them to the below list.": "",
|
||||
"Give users viewer permissions to your media by adding them to the below list.": "",
|
||||
"Go": "執行",
|
||||
"History": "觀看紀錄",
|
||||
"Home": "首頁",
|
||||
@@ -121,6 +126,7 @@ translation_strings = {
|
||||
"Manage comments": "留言管理",
|
||||
"Manage media": "媒體管理",
|
||||
"Manage users": "使用者管理",
|
||||
"Management": "",
|
||||
"Media": "媒體",
|
||||
"Media I own": "",
|
||||
"Media was edited": "媒體已更新",
|
||||
@@ -137,6 +143,7 @@ translation_strings = {
|
||||
"No results for": "查無相關結果:",
|
||||
"No tags": "",
|
||||
"No users to add": "",
|
||||
"Organization": "",
|
||||
"PLAYLISTS": "播放清單",
|
||||
"PUBLISH STATE": "發布狀態",
|
||||
"Pdf": "PDF",
|
||||
@@ -156,12 +163,17 @@ translation_strings = {
|
||||
"Published on": "發布日期為",
|
||||
"Recent uploads": "最近上傳",
|
||||
"Recommended": "推薦內容",
|
||||
"Record": "",
|
||||
"Record Screen": "螢幕錄製",
|
||||
"Record Screen with Audio": "",
|
||||
"Register": "註冊",
|
||||
"Remove category": "",
|
||||
"Remove from list": "",
|
||||
"Remove tag": "",
|
||||
"Remove user": "",
|
||||
"Remove users from the list to remove editor permissions": "",
|
||||
"Remove users from the list to remove owner permissions": "",
|
||||
"Remove users from the list to remove viewer permissions": "",
|
||||
"Replace": "",
|
||||
"SAVE": "儲存",
|
||||
"SEARCH": "搜尋",
|
||||
@@ -178,14 +190,22 @@ translation_strings = {
|
||||
"Select all media": "",
|
||||
"Select publish state:": "",
|
||||
"Selected": "",
|
||||
"Settings": "",
|
||||
"Share with": "",
|
||||
"Share with Co-Editors": "",
|
||||
"Share with Co-Owners": "",
|
||||
"Share with Co-Viewers": "",
|
||||
"Share with Course Members": "",
|
||||
"Shared by me": "我分享的",
|
||||
"Shared with me": "與我分享",
|
||||
"Sharing": "",
|
||||
"Sign in": "登入",
|
||||
"Sign out": "登出",
|
||||
"Sort By": "排序方式",
|
||||
"Start Recording": "開始錄製",
|
||||
"Start uploading media and sharing your work. Media that you upload will show up here.": "開始上傳媒體並分享您的作品。您上傳的媒體將顯示在此處。",
|
||||
"Stop Recording": "停止錄製",
|
||||
"Students will get viewer permissions, while lecturers will get co-owner permissions (same as owner, but cannot delete the media)": "",
|
||||
"Submit": "",
|
||||
"Subtitle was added": "字幕已新增",
|
||||
"Subtitles": "字幕",
|
||||
@@ -196,6 +216,7 @@ translation_strings = {
|
||||
"Successfully Enabled comments": "成功啟用留言",
|
||||
"Successfully changed owner": "",
|
||||
"Successfully deleted": "成功刪除",
|
||||
"Successfully deleted comments": "",
|
||||
"Successfully updated": "",
|
||||
"Successfully updated categories": "",
|
||||
"Successfully updated playlist membership": "",
|
||||
@@ -232,6 +253,9 @@ translation_strings = {
|
||||
"Upload media": "上傳媒體",
|
||||
"Uploads": "上傳內容",
|
||||
"Users": "",
|
||||
"Users can edit your media via: My Media > Shared with Me > particular media > Edit...": "",
|
||||
"Users can manage your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"Users can view your media via: My Media > Shared with Me > particular media > ...": "",
|
||||
"VIEW ALL": "查看全部",
|
||||
"Video": "影片",
|
||||
"View all": "瀏覽全部",
|
||||
@@ -240,6 +264,7 @@ translation_strings = {
|
||||
"Welcome": "歡迎",
|
||||
"You are going to copy": "您即將複製",
|
||||
"You are going to delete": "您即將刪除",
|
||||
"You are going to delete all comments from": "",
|
||||
"You are going to disable comments to": "您即將停用留言",
|
||||
"You are going to disable download for": "您即將停用下載",
|
||||
"You are going to enable comments to": "您即將啟用留言",
|
||||
|
||||
@@ -965,3 +965,13 @@ def get_alphanumeric_only(string):
|
||||
"""
|
||||
string = "".join([char for char in string if char.isalnum()])
|
||||
return string.lower()
|
||||
|
||||
|
||||
def get_alphanumeric_and_spaces(string):
|
||||
"""Returns a query that contains only alphanumeric characters and spaces
|
||||
This include characters other than the English alphabet too
|
||||
"""
|
||||
string = "".join([char for char in string if char.isalnum() or char.isspace()])
|
||||
# Replace multiple spaces with single space and strip
|
||||
string = " ".join(string.split())
|
||||
return string
|
||||
|
||||
@@ -238,6 +238,8 @@ def show_related_media(media, request=None, limit=100):
|
||||
return show_related_media_calculated(media, request, limit)
|
||||
elif settings.RELATED_MEDIA_STRATEGY == "author":
|
||||
return show_related_media_author(media, request, limit)
|
||||
elif settings.RELATED_MEDIA_STRATEGY == "no_related":
|
||||
return []
|
||||
|
||||
return show_related_media_content(media, request, limit)
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 5.2.6 on 2025-12-29 16:15
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
('files', '0014_alter_subtitle_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='category',
|
||||
name='is_lms_course',
|
||||
field=models.BooleanField(db_index=True, default=False, help_text='Whether this category represents an LMS course'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='category',
|
||||
name='lti_context_id',
|
||||
field=models.CharField(blank=True, db_index=True, help_text='LTI context ID from platform', max_length=255),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,21 @@
|
||||
# Generated by Django 5.2.6 on 2025-12-29 16:15
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
('files', '0015_category_is_lms_course_category_lti_context_id'),
|
||||
('lti', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='category',
|
||||
name='lti_platform',
|
||||
field=models.ForeignKey(
|
||||
blank=True, help_text='LTI Platform if this is an LTI course', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='categories', to='lti.ltiplatform'
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.6 on 2026-04-21 15:54
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('files', '0016_category_lti_platform'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='mediapermission',
|
||||
name='source',
|
||||
field=models.CharField(choices=[('lti_embed', 'LTI Embed'), ('explicit', 'Explicit')], default='explicit', max_length=32),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,26 @@
|
||||
# Generated by Django 5.2.6 on 2026-04-27 17:43
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('files', '0017_mediapermission_source'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='EmbedMediaCourse',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='embedded_media', to='files.category')),
|
||||
('media', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='embed_courses', to='files.media')),
|
||||
],
|
||||
options={
|
||||
'unique_together': {('media', 'category')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -3,7 +3,7 @@ from .category import Category, Tag # noqa: F401
|
||||
from .comment import Comment # noqa: F401
|
||||
from .encoding import EncodeProfile, Encoding # noqa: F401
|
||||
from .license import License # noqa: F401
|
||||
from .media import Media, MediaPermission # noqa: F401
|
||||
from .media import EmbedMediaCourse, Media, MediaPermission # noqa: F401
|
||||
from .page import Page, TinyMCEMedia # noqa: F401
|
||||
from .playlist import Playlist, PlaylistMedia # noqa: F401
|
||||
from .rating import Rating, RatingCategory # noqa: F401
|
||||
|
||||
@@ -47,6 +47,13 @@ class Category(models.Model):
|
||||
verbose_name='IDP Config Name',
|
||||
)
|
||||
|
||||
# LTI/LMS integration fields
|
||||
is_lms_course = models.BooleanField(default=False, db_index=True, help_text='Whether this category represents an LMS course')
|
||||
|
||||
lti_platform = models.ForeignKey('lti.LTIPlatform', blank=True, null=True, on_delete=models.SET_NULL, related_name='categories', help_text='LTI Platform if this is an LTI course')
|
||||
|
||||
lti_context_id = models.CharField(max_length=255, blank=True, db_index=True, help_text='LTI context ID from platform')
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
@@ -137,7 +144,7 @@ class Tag(models.Model):
|
||||
return True
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.title = helpers.get_alphanumeric_only(self.title)
|
||||
self.title = helpers.get_alphanumeric_and_spaces(self.title)
|
||||
self.title = self.title[:100]
|
||||
super(Tag, self).save(*args, **kwargs)
|
||||
|
||||
|
||||
+39
-20
@@ -352,20 +352,11 @@ class Media(models.Model):
|
||||
# first get anything interesting out of the media
|
||||
# that needs to be search able
|
||||
|
||||
a_tags = b_tags = ""
|
||||
a_tags = ""
|
||||
if self.id:
|
||||
a_tags = " ".join([tag.title for tag in self.tags.all()])
|
||||
b_tags = " ".join([tag.title.replace("-", " ") for tag in self.tags.all()])
|
||||
|
||||
items = [
|
||||
self.title,
|
||||
self.user.username,
|
||||
self.user.email,
|
||||
self.user.name,
|
||||
self.description,
|
||||
a_tags,
|
||||
b_tags,
|
||||
]
|
||||
items = [self.friendly_token, self.title, self.user.username, self.user.email, self.user.name, self.description, a_tags]
|
||||
|
||||
for subtitle in self.subtitles.all():
|
||||
items.append(subtitle.subtitle_text)
|
||||
@@ -739,15 +730,6 @@ class Media(models.Model):
|
||||
ep["updated_time"] = encoding.update_date
|
||||
return ep
|
||||
|
||||
@property
|
||||
def categories_info(self):
|
||||
"""Property used on serializers"""
|
||||
|
||||
ret = []
|
||||
for cat in self.category.all():
|
||||
ret.append({"title": cat.title, "url": cat.get_absolute_url()})
|
||||
return ret
|
||||
|
||||
@property
|
||||
def tags_info(self):
|
||||
"""Property used on serializers"""
|
||||
@@ -974,6 +956,12 @@ class Media(models.Model):
|
||||
return chapter_data.chapter_data
|
||||
return data
|
||||
|
||||
@property
|
||||
def is_shared(self):
|
||||
if not self.pk:
|
||||
return False
|
||||
return self.permissions.exists() or self.category.filter(is_rbac_category=True).exists()
|
||||
|
||||
|
||||
class MediaPermission(models.Model):
|
||||
"""Model to store user permissions for media"""
|
||||
@@ -984,10 +972,18 @@ class MediaPermission(models.Model):
|
||||
("owner", "Owner"),
|
||||
)
|
||||
|
||||
SOURCE_LTI_EMBED = 'lti_embed'
|
||||
SOURCE_EXPLICIT = 'explicit'
|
||||
SOURCE_CHOICES = (
|
||||
(SOURCE_LTI_EMBED, 'LTI Embed'),
|
||||
(SOURCE_EXPLICIT, 'Explicit'),
|
||||
)
|
||||
|
||||
owner_user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='granted_permissions')
|
||||
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
|
||||
media = models.ForeignKey('Media', on_delete=models.CASCADE, related_name='permissions')
|
||||
permission = models.CharField(max_length=20, choices=PERMISSION_CHOICES)
|
||||
source = models.CharField(max_length=32, choices=SOURCE_CHOICES, default=SOURCE_EXPLICIT)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
@@ -997,6 +993,29 @@ class MediaPermission(models.Model):
|
||||
return f"{self.user.username} - {self.media.title} ({self.permission})"
|
||||
|
||||
|
||||
class EmbedMediaCourse(models.Model):
|
||||
"""
|
||||
Records that a user shared a media item into a course during an LTI session.
|
||||
|
||||
This is a pure audit/tracking table used by the course cleanup bulk action to
|
||||
identify which MediaPermission records were created via LTI embedding and should
|
||||
be removed when the course is cleaned up.
|
||||
|
||||
It does NOT add the media to the category (Media.category M2M is untouched),
|
||||
so no m2m_changed signals fire and no category counts are affected.
|
||||
"""
|
||||
|
||||
media = models.ForeignKey('Media', on_delete=models.CASCADE, related_name='embed_courses')
|
||||
category = models.ForeignKey('Category', on_delete=models.CASCADE, related_name='embedded_media')
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('media', 'category')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.media.title} in {self.category.title}"
|
||||
|
||||
|
||||
@receiver(post_save, sender=Media)
|
||||
def media_save(sender, instance, created, **kwargs):
|
||||
# media_file path is not set correctly until mode is saved
|
||||
|
||||
@@ -18,13 +18,22 @@ class VideoChapterData(models.Model):
|
||||
data = []
|
||||
if self.data and isinstance(self.data, list):
|
||||
for item in self.data:
|
||||
if item.get("startTime") and item.get("endTime") and item.get("chapterTitle"):
|
||||
chapter_item = {
|
||||
'startTime': item.get("startTime"),
|
||||
'endTime': item.get("endTime"),
|
||||
'chapterTitle': item.get("chapterTitle"),
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
start_time = item.get("startTime")
|
||||
end_time = item.get("endTime")
|
||||
chapter_title = item.get("chapterTitle")
|
||||
if start_time is None or end_time is None or not chapter_title:
|
||||
continue
|
||||
if not isinstance(start_time, (int, float, str)) or not isinstance(end_time, (int, float, str)):
|
||||
continue
|
||||
data.append(
|
||||
{
|
||||
'startTime': start_time,
|
||||
'endTime': end_time,
|
||||
'chapterTitle': chapter_title,
|
||||
}
|
||||
data.append(chapter_item)
|
||||
)
|
||||
return data
|
||||
|
||||
|
||||
|
||||
+23
-2
@@ -98,7 +98,27 @@ class MediaSerializer(serializers.ModelSerializer):
|
||||
self.fields['category'].queryset = non_rbac_categories.union(rbac_categories)
|
||||
|
||||
|
||||
class SingleMediaSerializer(serializers.ModelSerializer):
|
||||
class CategoriesInfoMixin(serializers.Serializer):
|
||||
categories_info = serializers.SerializerMethodField()
|
||||
|
||||
def get_categories_info(self, obj):
|
||||
request = self.context.get("request")
|
||||
user = getattr(request, "user", None)
|
||||
|
||||
if user and user.is_authenticated:
|
||||
accessible_rbac = set(user.get_rbac_categories_as_member().values_list("pk", flat=True))
|
||||
else:
|
||||
accessible_rbac = set()
|
||||
|
||||
ret = []
|
||||
for cat in obj.category.all():
|
||||
if cat.is_rbac_category and cat.pk not in accessible_rbac:
|
||||
continue
|
||||
ret.append({"title": cat.title, "url": cat.get_absolute_url(), "is_lms_course": cat.is_lms_course})
|
||||
return ret
|
||||
|
||||
|
||||
class SingleMediaSerializer(CategoriesInfoMixin, serializers.ModelSerializer):
|
||||
user = serializers.ReadOnlyField(source="user.username")
|
||||
url = serializers.SerializerMethodField()
|
||||
is_shared = serializers.SerializerMethodField()
|
||||
@@ -177,7 +197,7 @@ class SingleMediaSerializer(serializers.ModelSerializer):
|
||||
)
|
||||
|
||||
|
||||
class MediaSearchSerializer(serializers.ModelSerializer):
|
||||
class MediaSearchSerializer(CategoriesInfoMixin, serializers.ModelSerializer):
|
||||
url = serializers.SerializerMethodField()
|
||||
api_url = serializers.SerializerMethodField()
|
||||
|
||||
@@ -226,6 +246,7 @@ class CategorySerializer(serializers.ModelSerializer):
|
||||
"media_count",
|
||||
"user",
|
||||
"thumbnail_url",
|
||||
"is_lms_course",
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -67,6 +67,10 @@ urlpatterns = [
|
||||
name="api_get_encoding",
|
||||
),
|
||||
re_path(r"^api/v1/search$", views.MediaSearch.as_view()),
|
||||
re_path(
|
||||
rf"^api/v1/media/{friendly_token}/share$",
|
||||
views.media_share,
|
||||
),
|
||||
re_path(
|
||||
rf"^api/v1/media/{friendly_token}/actions$",
|
||||
views.MediaActions.as_view(),
|
||||
@@ -80,6 +84,7 @@ urlpatterns = [
|
||||
views.trim_video,
|
||||
),
|
||||
re_path(r"^api/v1/categories$", views.CategoryList.as_view()),
|
||||
re_path(r"^api/v1/categories/contributor$", views.CategoryListContributor.as_view()),
|
||||
re_path(r"^api/v1/tags$", views.TagList.as_view()),
|
||||
re_path(r"^api/v1/comments$", views.CommentList.as_view()),
|
||||
re_path(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Import all views for backward compatibility
|
||||
|
||||
from .auth import custom_login_view, saml_metadata # noqa: F401
|
||||
from .categories import CategoryList, TagList # noqa: F401
|
||||
from .categories import CategoryList, CategoryListContributor, TagList # noqa: F401
|
||||
from .comments import CommentDetail, CommentList # noqa: F401
|
||||
from .encoding import EncodeProfileList, EncodingDetail # noqa: F401
|
||||
from .media import MediaActions # noqa: F401
|
||||
@@ -9,6 +9,7 @@ from .media import MediaBulkUserActions # noqa: F401
|
||||
from .media import MediaDetail # noqa: F401
|
||||
from .media import MediaList # noqa: F401
|
||||
from .media import MediaSearch # noqa: F401
|
||||
from .media import media_share # noqa: F401
|
||||
from .pages import about # noqa: F401
|
||||
from .pages import add_subtitle # noqa: F401
|
||||
from .pages import approval_required # noqa: F401
|
||||
|
||||
@@ -23,17 +23,18 @@ class CategoryList(APIView):
|
||||
},
|
||||
)
|
||||
def get(self, request, format=None):
|
||||
base_filters = {}
|
||||
|
||||
if not is_mediacms_editor(request.user):
|
||||
base_filters = {"is_rbac_category": False}
|
||||
|
||||
base_queryset = Category.objects.prefetch_related("user")
|
||||
categories = base_queryset.filter(**base_filters)
|
||||
show_lms = getattr(settings, 'SHOW_LMS_COURSES_IN_CATEGORIES', True)
|
||||
categories = Category.objects.prefetch_related("user")
|
||||
|
||||
if not show_lms:
|
||||
categories = categories.filter(is_lms_course=False)
|
||||
|
||||
if not is_mediacms_editor(request.user):
|
||||
categories = categories.filter(is_rbac_category=False)
|
||||
if getattr(settings, 'USE_RBAC', False) and request.user.is_authenticated:
|
||||
rbac_categories = request.user.get_rbac_categories_as_member()
|
||||
if not show_lms:
|
||||
rbac_categories = rbac_categories.filter(is_lms_course=False)
|
||||
categories = categories.union(rbac_categories)
|
||||
|
||||
categories = categories.order_by("title")
|
||||
@@ -43,6 +44,27 @@ class CategoryList(APIView):
|
||||
return Response(ret)
|
||||
|
||||
|
||||
class CategoryListContributor(APIView):
|
||||
"""List LMS courses where the user has contributor access"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
tags=['Categories'],
|
||||
operation_summary='Lists LMS courses for Contributors',
|
||||
operation_description='Lists LMS courses where the user has contributor access',
|
||||
responses={
|
||||
200: openapi.Response('response description', CategorySerializer),
|
||||
},
|
||||
)
|
||||
def get(self, request, format=None):
|
||||
if not request.user.is_authenticated:
|
||||
return Response([])
|
||||
|
||||
categories = request.user.get_rbac_categories_as_contributor().filter(is_lms_course=True)
|
||||
|
||||
serializer = CategorySerializer(categories.order_by("title"), many=True, context={"request": request})
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class TagList(APIView):
|
||||
"""List tags"""
|
||||
|
||||
|
||||
@@ -75,8 +75,11 @@ class CommentDetail(APIView):
|
||||
try:
|
||||
media = Media.objects.select_related("user").get(friendly_token=friendly_token)
|
||||
self.check_object_permissions(self.request, media)
|
||||
if media.state == "private" and self.request.user != media.user:
|
||||
return Response({"detail": "media is private"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
if media.state == "private":
|
||||
user = self.request.user
|
||||
has_access = user.is_authenticated and (user.has_member_access_to_media(media) or is_mediacms_editor(user))
|
||||
if not has_access:
|
||||
return Response({"detail": "media is private"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
return media
|
||||
except PermissionDenied:
|
||||
return Response({"detail": "bad permissions"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
@@ -97,7 +100,7 @@ class CommentDetail(APIView):
|
||||
media = self.get_object(friendly_token)
|
||||
if isinstance(media, Response):
|
||||
return media
|
||||
comments = media.comments.filter().prefetch_related("user")
|
||||
comments = media.comments.filter().prefetch_related("user").order_by("-add_date")
|
||||
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
|
||||
paginator = pagination_class()
|
||||
page = paginator.paginate_queryset(comments, request)
|
||||
|
||||
+209
-21
@@ -2,8 +2,11 @@ from datetime import datetime, timedelta
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.postgres.search import SearchQuery
|
||||
from django.db.models import Count, Q
|
||||
from django.db.models import Count, F, Prefetch, Q, prefetch_related_objects
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.views.decorators.http import require_POST
|
||||
from drf_yasg import openapi
|
||||
from drf_yasg.utils import swagger_auto_schema
|
||||
from rest_framework import permissions, status
|
||||
@@ -35,6 +38,8 @@ from ..methods import (
|
||||
)
|
||||
from ..models import (
|
||||
Category,
|
||||
Comment,
|
||||
EmbedMediaCourse,
|
||||
EncodeProfile,
|
||||
Media,
|
||||
MediaPermission,
|
||||
@@ -112,6 +117,8 @@ class MediaList(APIView):
|
||||
upload_date = params.get('upload_date', '').strip()
|
||||
duration = params.get('duration', '').strip()
|
||||
publish_state = params.get('publish_state', '').strip()
|
||||
shared_user = params.get('shared_user', '').strip()
|
||||
shared_group = params.get('shared_group', '').strip()
|
||||
query = params.get("q", "").strip().lower()
|
||||
|
||||
parsed_combined = False
|
||||
@@ -152,6 +159,7 @@ class MediaList(APIView):
|
||||
gte = datetime(year, 1, 1)
|
||||
|
||||
already_sorted = False
|
||||
include_sharing_info = False
|
||||
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
|
||||
|
||||
if show_param == "recommended":
|
||||
@@ -164,26 +172,41 @@ class MediaList(APIView):
|
||||
if not self.request.user.is_authenticated:
|
||||
media = Media.objects.none()
|
||||
else:
|
||||
media = Media.objects.filter(permissions__owner_user=self.request.user).prefetch_related("user", "tags").distinct()
|
||||
base_queryset = Media.objects.prefetch_related("user", "tags")
|
||||
conditions = Q(permissions__owner_user=self.request.user)
|
||||
|
||||
if getattr(settings, 'USE_RBAC', False):
|
||||
rbac_categories = request.user.get_rbac_categories_as_contributor()
|
||||
conditions |= Q(category__in=rbac_categories, user=self.request.user)
|
||||
|
||||
media = base_queryset.filter(conditions).distinct()
|
||||
include_sharing_info = True
|
||||
elif show_param == "shared_with_me":
|
||||
if not self.request.user.is_authenticated:
|
||||
media = Media.objects.none()
|
||||
else:
|
||||
base_queryset = Media.objects.prefetch_related("user", "tags")
|
||||
|
||||
# Build OR conditions similar to _get_media_queryset
|
||||
conditions = Q(permissions__user=request.user)
|
||||
exclude_lti_embed = request.GET.get('exclude_lti_embed') == '1'
|
||||
# in LTI, if this is set, show only media that are shared explicitly with user
|
||||
if exclude_lti_embed:
|
||||
conditions = Q(permissions__user=request.user, permissions__source=MediaPermission.SOURCE_EXPLICIT)
|
||||
else:
|
||||
conditions = Q(permissions__user=request.user)
|
||||
|
||||
if getattr(settings, 'USE_RBAC', False):
|
||||
rbac_categories = request.user.get_rbac_categories_as_member()
|
||||
conditions |= Q(category__in=rbac_categories)
|
||||
|
||||
media = base_queryset.filter(conditions).distinct()
|
||||
media = base_queryset.filter(conditions).exclude(user=request.user).distinct()
|
||||
include_sharing_info = True
|
||||
elif author_param:
|
||||
user_queryset = User.objects.all()
|
||||
user = get_object_or_404(user_queryset, username=author_param)
|
||||
if self.request.user == user or is_mediacms_editor(self.request.user):
|
||||
media = Media.objects.filter(user=user).prefetch_related("user", "tags")
|
||||
if self.request.user == user:
|
||||
include_sharing_info = True
|
||||
else:
|
||||
media = self._get_media_queryset(request, user)
|
||||
already_sorted = True
|
||||
@@ -234,6 +257,12 @@ class MediaList(APIView):
|
||||
elif publish_state in ['private', 'public', 'unlisted']:
|
||||
media = media.filter(state=publish_state)
|
||||
|
||||
if shared_user and include_sharing_info:
|
||||
media = media.filter(permissions__user__username=shared_user).distinct()
|
||||
|
||||
if shared_group and include_sharing_info:
|
||||
media = media.filter(category__is_rbac_category=True, category__rbac_groups__name=shared_group).distinct()
|
||||
|
||||
if not already_sorted:
|
||||
media = media.order_by(f"{ordering}{sort_by}")
|
||||
|
||||
@@ -243,6 +272,16 @@ class MediaList(APIView):
|
||||
|
||||
page = paginator.paginate_queryset(media, request)
|
||||
|
||||
prefetch_related_objects(page, 'tags')
|
||||
|
||||
if include_sharing_info:
|
||||
# this is the data for the Shared with me/by me pages on 'my media'
|
||||
prefetch_related_objects(
|
||||
page,
|
||||
Prefetch('permissions', queryset=MediaPermission.objects.select_related('user').exclude(user=request.user)),
|
||||
Prefetch('category', queryset=Category.objects.filter(is_rbac_category=True).prefetch_related('rbac_groups'), to_attr='rbac_categories_prefetched'),
|
||||
)
|
||||
|
||||
serializer = MediaSerializer(page, many=True, context={"request": request})
|
||||
|
||||
tags_set = set()
|
||||
@@ -253,6 +292,19 @@ class MediaList(APIView):
|
||||
|
||||
response = paginator.get_paginated_response(serializer.data)
|
||||
response.data['tags'] = tags
|
||||
|
||||
if include_sharing_info:
|
||||
shared_users = {}
|
||||
shared_groups = {}
|
||||
for media_obj in page:
|
||||
for perm in media_obj.permissions.all():
|
||||
shared_users[perm.user.username] = {"username": perm.user.username, "name": perm.user.name or perm.user.username}
|
||||
for cat in getattr(media_obj, 'rbac_categories_prefetched', []):
|
||||
for group in cat.rbac_groups.all():
|
||||
shared_groups[group.name] = {"name": group.name}
|
||||
response.data['shared_users'] = list(shared_users.values())
|
||||
response.data['shared_groups'] = list(shared_groups.values())
|
||||
|
||||
return response
|
||||
|
||||
@swagger_auto_schema(
|
||||
@@ -295,6 +347,7 @@ class MediaBulkUserActions(APIView):
|
||||
enum=[
|
||||
"enable_comments",
|
||||
"disable_comments",
|
||||
"delete_comments",
|
||||
"delete_media",
|
||||
"enable_download",
|
||||
"disable_download",
|
||||
@@ -313,6 +366,7 @@ class MediaBulkUserActions(APIView):
|
||||
"remove_from_category",
|
||||
"add_tags",
|
||||
"remove_tags",
|
||||
"course_cleanup",
|
||||
],
|
||||
),
|
||||
'playlist_ids': openapi.Schema(
|
||||
@@ -360,12 +414,15 @@ class MediaBulkUserActions(APIView):
|
||||
media_ids = request.data.get('media_ids', [])
|
||||
action = request.data.get('action')
|
||||
|
||||
if not media_ids:
|
||||
return Response({"detail": "media_ids is required"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
if not action:
|
||||
return Response({"detail": "action is required"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
if action == "course_cleanup":
|
||||
return self._handle_course_cleanup(request, media_ids)
|
||||
|
||||
if not media_ids:
|
||||
return Response({"detail": "media_ids is required"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
media = Media.objects.filter(user=request.user, friendly_token__in=media_ids)
|
||||
|
||||
if not media:
|
||||
@@ -379,6 +436,10 @@ class MediaBulkUserActions(APIView):
|
||||
media.update(enable_comments=False)
|
||||
return Response({"detail": f"Comments disabled for {media.count()} media items"})
|
||||
|
||||
elif action == "delete_comments":
|
||||
deleted_count, _ = Comment.objects.filter(media__in=media).delete()
|
||||
return Response({"detail": f"{deleted_count} comments deleted"})
|
||||
|
||||
elif action == "delete_media":
|
||||
count = media.count()
|
||||
media.delete()
|
||||
@@ -454,7 +515,16 @@ class MediaBulkUserActions(APIView):
|
||||
|
||||
m.save(update_fields=["state", "listable"])
|
||||
|
||||
return Response({"detail": f"State updated to {state} for {media.count()} media items"})
|
||||
remove_sharing = request.data.get('remove_sharing', False)
|
||||
|
||||
if remove_sharing:
|
||||
MediaPermission.objects.filter(media__in=media).delete()
|
||||
for m in media:
|
||||
rbac_cats = m.category.filter(is_rbac_category=True)
|
||||
if rbac_cats.exists():
|
||||
m.category.remove(*rbac_cats)
|
||||
|
||||
return Response({"detail": f"State updated to {state}"})
|
||||
|
||||
elif action == "change_owner":
|
||||
owner = request.data.get('owner')
|
||||
@@ -492,8 +562,9 @@ class MediaBulkUserActions(APIView):
|
||||
|
||||
users = (
|
||||
MediaPermission.objects.filter(media__in=media, permission=ownership_type)
|
||||
.exclude(user=request.user)
|
||||
.values('user__name', 'user__username')
|
||||
.annotate(media_count=Count('media', distinct=True))
|
||||
.annotate(media_count=Count('media'))
|
||||
.filter(media_count=media_count)
|
||||
)
|
||||
|
||||
@@ -561,7 +632,13 @@ class MediaBulkUserActions(APIView):
|
||||
elif action == "category_membership":
|
||||
media_count = media.count()
|
||||
|
||||
results = list(Category.objects.filter(media__in=media).values('title', 'uid').annotate(media_count=Count('media', distinct=True)).filter(media_count=media_count))
|
||||
# Categories where ALL selected media are members via the M2M relation
|
||||
m2m_uids = set(Category.objects.filter(media__in=media).annotate(selected_count=Count('media', distinct=True)).filter(selected_count=media_count).values_list('uid', flat=True))
|
||||
|
||||
# Categories where ANY selected media has an EmbedMediaCourse record
|
||||
embed_uids = set(EmbedMediaCourse.objects.filter(media__in=media).values_list('category__uid', flat=True))
|
||||
|
||||
results = list(Category.objects.filter(uid__in=m2m_uids | embed_uids).values('title', 'uid'))
|
||||
|
||||
return Response({'results': results})
|
||||
|
||||
@@ -574,12 +651,31 @@ class MediaBulkUserActions(APIView):
|
||||
|
||||
elif action == "add_to_category":
|
||||
category_uids = request.data.get('category_uids', [])
|
||||
if not category_uids:
|
||||
return Response({"detail": "category_uids is required for add_to_category action"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
lti_context_id = request.data.get('lti_context_id')
|
||||
|
||||
if not category_uids and not lti_context_id:
|
||||
return Response({"detail": "category_uids or lti_context_id is required for add_to_category action"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
categories = Category.objects.none()
|
||||
|
||||
# Prioritize category_uids
|
||||
if category_uids:
|
||||
categories = Category.objects.filter(uid__in=category_uids)
|
||||
elif lti_context_id:
|
||||
# Filter categories by lti_context_id and ensure they ARE RBAC categories
|
||||
potential_categories = Category.objects.filter(lti_context_id=lti_context_id, is_rbac_category=True)
|
||||
|
||||
# Check user access (must have contributor access)
|
||||
valid_category_ids = []
|
||||
for cat in potential_categories:
|
||||
if request.user.has_contributor_access_to_category(cat):
|
||||
valid_category_ids.append(cat.id)
|
||||
|
||||
if valid_category_ids:
|
||||
categories = Category.objects.filter(id__in=valid_category_ids)
|
||||
|
||||
categories = Category.objects.filter(uid__in=category_uids)
|
||||
if not categories:
|
||||
return Response({"detail": "No matching categories found"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
return Response({"detail": "No matching categories found or access denied"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
added_count = 0
|
||||
for category in categories:
|
||||
@@ -605,6 +701,9 @@ class MediaBulkUserActions(APIView):
|
||||
if m.category.filter(uid=category.uid).exists():
|
||||
m.category.remove(category)
|
||||
removed_count += 1
|
||||
EmbedMediaCourse.objects.filter(media=m, category=category).delete()
|
||||
if not m.category.filter(is_rbac_category=True).exists() and not m.permissions.exclude(user=m.user).exists():
|
||||
m.permissions.filter(user=m.user).delete()
|
||||
|
||||
return Response({"detail": f"Removed {removed_count} media items from {categories.count()} categories"})
|
||||
|
||||
@@ -647,6 +746,72 @@ class MediaBulkUserActions(APIView):
|
||||
else:
|
||||
return Response({"detail": f"Unknown action: {action}"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
def _handle_course_cleanup(self, request, media_ids):
|
||||
category_uids = request.data.get('category_uids', [])
|
||||
remove_permissions = request.data.get('remove_permissions', False)
|
||||
remove_comments = request.data.get('remove_comments', False)
|
||||
apply_to_all = request.data.get('apply_to_all', False)
|
||||
|
||||
if not category_uids:
|
||||
return Response({"detail": "category_uids is required"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
categories = Category.objects.filter(uid__in=category_uids)
|
||||
if not categories.exists():
|
||||
return Response({"detail": "No matching categories found"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
valid_categories = [cat for cat in categories if request.user.has_contributor_access_to_category(cat)]
|
||||
if not valid_categories:
|
||||
return Response({"detail": "No contributor access to specified categories"}, status=status.HTTP_403_FORBIDDEN)
|
||||
|
||||
has_media = bool(media_ids)
|
||||
selected_media = Media.objects.filter(user=request.user, friendly_token__in=media_ids) if has_media else Media.objects.none()
|
||||
|
||||
for category in valid_categories:
|
||||
# All users who are members of any group linked to this category
|
||||
group_users = User.objects.filter(rbac_groups__in=category.rbac_groups.all()).distinct()
|
||||
|
||||
# Get media explicitly embedded into this course via LTI
|
||||
embed_qs = EmbedMediaCourse.objects.filter(category=category)
|
||||
embedded_media_ids = list(embed_qs.values_list('media_id', flat=True))
|
||||
|
||||
all_course_media = Media.objects.filter(category=category)
|
||||
|
||||
if has_media:
|
||||
selected_embedded = embed_qs.filter(media__in=selected_media)
|
||||
selected_embedded_media_ids = list(selected_embedded.values_list('media_id', flat=True))
|
||||
if remove_permissions:
|
||||
MediaPermission.objects.filter(media__in=selected_media, user__in=group_users).exclude(user=F('media__user')).delete()
|
||||
MediaPermission.objects.filter(media_id__in=selected_embedded_media_ids).exclude(user=F('media__user')).delete()
|
||||
if remove_comments:
|
||||
Comment.objects.filter(media__in=selected_media).delete()
|
||||
|
||||
if apply_to_all:
|
||||
other_course_media = all_course_media.exclude(friendly_token__in=media_ids)
|
||||
other_embedded = embed_qs.exclude(media__in=selected_media)
|
||||
other_embedded_media_ids = list(other_embedded.values_list('media_id', flat=True))
|
||||
if remove_permissions:
|
||||
MediaPermission.objects.filter(media__in=other_course_media, user__in=group_users).exclude(user=F('media__user')).delete()
|
||||
MediaPermission.objects.filter(media_id__in=other_embedded_media_ids).exclude(user=F('media__user')).delete()
|
||||
if remove_comments:
|
||||
Comment.objects.filter(media__in=other_course_media).delete()
|
||||
for m in other_course_media:
|
||||
m.category.remove(category)
|
||||
|
||||
for m in selected_media:
|
||||
m.category.remove(category)
|
||||
else:
|
||||
if remove_permissions:
|
||||
MediaPermission.objects.filter(media__in=all_course_media, user__in=group_users).exclude(user=F('media__user')).delete()
|
||||
MediaPermission.objects.filter(media_id__in=embedded_media_ids).exclude(user=F('media__user')).delete()
|
||||
if remove_comments:
|
||||
Comment.objects.filter(media__in=all_course_media).delete()
|
||||
if embedded_media_ids:
|
||||
Comment.objects.filter(media_id__in=embedded_media_ids).delete()
|
||||
for m in all_course_media:
|
||||
m.category.remove(category)
|
||||
|
||||
return Response({"detail": "Course cleanup completed successfully"})
|
||||
|
||||
|
||||
class MediaDetail(APIView):
|
||||
"""
|
||||
@@ -697,12 +862,9 @@ class MediaDetail(APIView):
|
||||
return media
|
||||
|
||||
serializer = SingleMediaSerializer(media, context={"request": request})
|
||||
if media.state == "private":
|
||||
related_media = []
|
||||
else:
|
||||
related_media = show_related_media(media, request=request, limit=100)
|
||||
related_media_serializer = MediaSerializer(related_media, many=True, context={"request": request})
|
||||
related_media = related_media_serializer.data
|
||||
related_media = show_related_media(media, request=request, limit=100)
|
||||
related_media_serializer = MediaSerializer(related_media, many=True, context={"request": request})
|
||||
related_media = related_media_serializer.data
|
||||
ret = serializer.data
|
||||
|
||||
# update rattings info with user specific ratings
|
||||
@@ -1073,3 +1235,29 @@ class MediaSearch(APIView):
|
||||
page = paginator.paginate_queryset(media, request)
|
||||
serializer = MediaSearchSerializer(page, many=True, context={"request": request})
|
||||
return paginator.get_paginated_response(serializer.data)
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
@require_POST
|
||||
def media_share(request, friendly_token):
|
||||
"""Mark a media item as shared when the owner embeds it via the LTI plugin."""
|
||||
if not request.user.is_authenticated:
|
||||
return HttpResponse(status=401)
|
||||
|
||||
media = get_object_or_404(Media, friendly_token=friendly_token)
|
||||
if media.user != request.user:
|
||||
return HttpResponse(status=403)
|
||||
|
||||
MediaPermission.objects.get_or_create(
|
||||
media=media,
|
||||
user=request.user,
|
||||
defaults={'owner_user': request.user, 'permission': 'owner'},
|
||||
)
|
||||
|
||||
courseid = request.POST.get('courseid')
|
||||
if courseid:
|
||||
category = Category.objects.filter(lti_context_id=str(courseid), is_rbac_category=True).first()
|
||||
if category:
|
||||
EmbedMediaCourse.objects.get_or_create(media=media, category=category)
|
||||
|
||||
return HttpResponse(status=200)
|
||||
|
||||
+72
-19
@@ -1,5 +1,6 @@
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
@@ -7,6 +8,7 @@ from django.contrib.auth.decorators import login_required
|
||||
from django.core.mail import EmailMessage
|
||||
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.utils.html import mark_safe, strip_tags
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from cms.version import VERSION
|
||||
@@ -24,7 +26,7 @@ from ..forms import (
|
||||
WhisperSubtitlesForm,
|
||||
)
|
||||
from ..frontend_translations import translate_string
|
||||
from ..helpers import get_alphanumeric_only
|
||||
from ..helpers import get_alphanumeric_and_spaces
|
||||
from ..methods import (
|
||||
can_transcribe_video,
|
||||
create_video_trim_request,
|
||||
@@ -243,6 +245,31 @@ def history(request):
|
||||
return render(request, "cms/history.html", context)
|
||||
|
||||
|
||||
_TIMESTAMP_RE = re.compile(r'^(?:(\d+):)?([0-5]?\d):([0-5]?\d)(?:\.(\d{1,3}))?$')
|
||||
|
||||
|
||||
def _timestamp_to_seconds(value):
|
||||
"""Parse 'HH:MM:SS.mmm', 'MM:SS.mmm', etc., or a numeric value, into float seconds.
|
||||
|
||||
Returns None if the value can't be parsed.
|
||||
"""
|
||||
if isinstance(value, bool):
|
||||
return None
|
||||
if isinstance(value, (int, float)):
|
||||
return float(value)
|
||||
if not isinstance(value, str):
|
||||
return None
|
||||
match = _TIMESTAMP_RE.match(value.strip())
|
||||
if not match:
|
||||
return None
|
||||
hours = int(match.group(1)) if match.group(1) else 0
|
||||
minutes = int(match.group(2))
|
||||
seconds = int(match.group(3))
|
||||
millis_str = match.group(4) or '0'
|
||||
millis = int(millis_str.ljust(3, '0'))
|
||||
return hours * 3600 + minutes * 60 + seconds + millis / 1000.0
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
@login_required
|
||||
def video_chapters(request, friendly_token):
|
||||
@@ -262,20 +289,39 @@ def video_chapters(request, friendly_token):
|
||||
data = request_data.get("chapters")
|
||||
if data is None:
|
||||
return JsonResponse({'success': False, 'error': 'Request must contain "chapters" array'}, status=400)
|
||||
if not isinstance(data, list):
|
||||
return JsonResponse({'success': False, 'error': '"chapters" must be an array'}, status=400)
|
||||
if len(data) > 200:
|
||||
return JsonResponse({'success': False, 'error': 'Too many chapters (max 200)'}, status=400)
|
||||
|
||||
chapters = []
|
||||
for _, chapter_data in enumerate(data):
|
||||
start_time = chapter_data.get('startTime')
|
||||
end_time = chapter_data.get('endTime')
|
||||
for chapter_data in data:
|
||||
if not isinstance(chapter_data, dict):
|
||||
continue
|
||||
raw_start = chapter_data.get('startTime')
|
||||
raw_end = chapter_data.get('endTime')
|
||||
chapter_title = chapter_data.get('chapterTitle')
|
||||
if start_time and end_time and chapter_title:
|
||||
chapters.append(
|
||||
{
|
||||
'startTime': start_time,
|
||||
'endTime': end_time,
|
||||
'chapterTitle': chapter_title,
|
||||
}
|
||||
)
|
||||
|
||||
start_seconds = _timestamp_to_seconds(raw_start)
|
||||
end_seconds = _timestamp_to_seconds(raw_end)
|
||||
if start_seconds is None or end_seconds is None:
|
||||
continue
|
||||
if start_seconds < 0 or end_seconds < 0 or start_seconds >= end_seconds:
|
||||
continue
|
||||
|
||||
if not isinstance(chapter_title, str) or not chapter_title.strip():
|
||||
continue
|
||||
chapter_title = strip_tags(chapter_title).strip()[:500]
|
||||
if not chapter_title:
|
||||
continue
|
||||
|
||||
chapters.append(
|
||||
{
|
||||
'startTime': raw_start if isinstance(raw_start, str) else start_seconds,
|
||||
'endTime': raw_end if isinstance(raw_end, str) else end_seconds,
|
||||
'chapterTitle': chapter_title,
|
||||
}
|
||||
)
|
||||
except Exception as e: # noqa
|
||||
return JsonResponse({'success': False, 'error': 'Request data must be a list of video chapters with startTime, endTime, chapterTitle'}, status=400)
|
||||
|
||||
@@ -310,8 +356,8 @@ def edit_media(request):
|
||||
media.tags.remove(tag)
|
||||
if form.cleaned_data.get("new_tags"):
|
||||
for tag in form.cleaned_data.get("new_tags").split(","):
|
||||
tag = get_alphanumeric_only(tag)
|
||||
tag = tag[:99]
|
||||
tag = get_alphanumeric_and_spaces(tag)
|
||||
tag = tag[:100]
|
||||
if tag:
|
||||
try:
|
||||
tag = Tag.objects.get(title=tag)
|
||||
@@ -350,13 +396,13 @@ def publish_media(request):
|
||||
return HttpResponseRedirect(media.get_absolute_url())
|
||||
|
||||
if request.method == "POST":
|
||||
form = MediaPublishForm(request.user, request.POST, request.FILES, instance=media)
|
||||
form = MediaPublishForm(request.user, request.POST, request.FILES, instance=media, request=request)
|
||||
if form.is_valid():
|
||||
media = form.save()
|
||||
messages.add_message(request, messages.INFO, translate_string(request.LANGUAGE_CODE, "Media was edited"))
|
||||
return HttpResponseRedirect(media.get_absolute_url())
|
||||
else:
|
||||
form = MediaPublishForm(request.user, instance=media)
|
||||
form = MediaPublishForm(request.user, instance=media, request=request)
|
||||
|
||||
return render(
|
||||
request,
|
||||
@@ -449,11 +495,18 @@ def edit_chapters(request):
|
||||
if not (is_mediacms_editor(request.user) or request.user.has_contributor_access_to_media(media)):
|
||||
return HttpResponseRedirect("/")
|
||||
|
||||
chapters = media.chapter_data
|
||||
_html_escapes = str.maketrans({'<': r'\u003C', '>': r'\u003E', '&': r'\u0026'})
|
||||
chapters_json = mark_safe(json.dumps(media.chapter_data).translate(_html_escapes))
|
||||
return render(
|
||||
request,
|
||||
"cms/edit_chapters.html",
|
||||
{"media_object": media, "add_subtitle_url": media.add_subtitle_url, "media_file_path": helpers.url_from_path(media.media_file.path), "media_id": media.friendly_token, "chapters": chapters},
|
||||
{
|
||||
"media_object": media,
|
||||
"add_subtitle_url": media.add_subtitle_url,
|
||||
"media_file_path": helpers.url_from_path(media.media_file.path),
|
||||
"media_id": media.friendly_token,
|
||||
"chapters": chapters_json,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -547,7 +600,7 @@ def embed_media(request):
|
||||
media = Media.objects.values("title").filter(friendly_token=friendly_token).first()
|
||||
|
||||
if not media:
|
||||
return HttpResponseRedirect("/")
|
||||
return HttpResponse('This media no longer exists', status=404, content_type='text/plain; charset=utf-8')
|
||||
|
||||
context = {}
|
||||
context["media"] = friendly_token
|
||||
|
||||
+20
-4
@@ -3,6 +3,8 @@ import json
|
||||
from django import forms
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from .models import Category
|
||||
|
||||
|
||||
class CategoryModalWidget(forms.SelectMultiple):
|
||||
"""Two-panel category selector with modal"""
|
||||
@@ -12,28 +14,42 @@ class CategoryModalWidget(forms.SelectMultiple):
|
||||
js = ('js/category_modal.js',)
|
||||
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
is_lms_mode = getattr(self, 'is_lms_mode', False)
|
||||
|
||||
# Get all categories as JSON
|
||||
categories = []
|
||||
for opt_value, opt_label in self.choices:
|
||||
if opt_value: # Skip empty choice
|
||||
categories.append({'id': str(opt_value), 'title': str(opt_label)})
|
||||
# Extract the actual ID value from ModelChoiceIteratorValue if needed
|
||||
category_id = opt_value.value if hasattr(opt_value, 'value') else opt_value
|
||||
|
||||
# Get is_lms_course info from the Category object
|
||||
try:
|
||||
cat_obj = Category.objects.get(id=category_id)
|
||||
categories.append({'id': str(category_id), 'title': str(opt_label), 'is_lms_course': cat_obj.is_lms_course})
|
||||
except Category.DoesNotExist:
|
||||
categories.append({'id': str(category_id), 'title': str(opt_label), 'is_lms_course': False})
|
||||
|
||||
all_categories_json = json.dumps(categories)
|
||||
selected_ids_json = json.dumps([str(v) for v in (value or [])])
|
||||
lms_mode_json = json.dumps(is_lms_mode)
|
||||
|
||||
search_placeholder = "Search courses..." if is_lms_mode else "Search categories..."
|
||||
selected_header = "Selected Courses" if is_lms_mode else "Selected Categories"
|
||||
|
||||
html = f'''<div class="category-widget" data-name="{name}">
|
||||
<div class="category-content">
|
||||
<div class="category-panel">
|
||||
<input type="text" class="category-search" placeholder="Search categories...">
|
||||
<input type="text" class="category-search" placeholder="{search_placeholder}">
|
||||
<div class="category-list scrollable" data-panel="left"></div>
|
||||
</div>
|
||||
<div class="category-panel">
|
||||
<h3>Selected Categories</h3>
|
||||
<h3>{selected_header}</h3>
|
||||
<div class="category-list scrollable" data-panel="right"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden-inputs"></div>
|
||||
<script type="application/json" class="category-data">{{"all":{all_categories_json},"selected":{selected_ids_json}}}</script>
|
||||
<script type="application/json" class="category-data">{{"all":{all_categories_json},"selected":{selected_ids_json},"lms_mode":{lms_mode_json}}}</script>
|
||||
</div>'''
|
||||
|
||||
return mark_safe(html)
|
||||
|
||||
Reference in New Issue
Block a user