mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-05 23:18:53 -05:00
feat: whisper STT and record screen (#1363)
This commit is contained in:
parent
8cbeb72dd2
commit
817e16ac60
50
.github/workflows/docker-build-push.yml
vendored
50
.github/workflows/docker-build-push.yml
vendored
@ -15,15 +15,18 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Docker meta
|
- name: Login to Docker Hub
|
||||||
id: meta
|
uses: docker/login-action@v2.2.0
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Docker meta for base image
|
||||||
|
id: meta-base
|
||||||
uses: docker/metadata-action@v4
|
uses: docker/metadata-action@v4
|
||||||
with:
|
with:
|
||||||
# List of Docker images to use as base name for tags
|
|
||||||
images: |
|
images: |
|
||||||
mediacms/mediacms
|
mediacms/mediacms
|
||||||
# Generate Docker tags based on the following events/attributes
|
|
||||||
# Set latest tag for default branch
|
|
||||||
tags: |
|
tags: |
|
||||||
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
|
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
@ -37,16 +40,39 @@ jobs:
|
|||||||
org.opencontainers.image.source=https://github.com/mediacms-io/mediacms
|
org.opencontainers.image.source=https://github.com/mediacms-io/mediacms
|
||||||
org.opencontainers.image.licenses=AGPL-3.0
|
org.opencontainers.image.licenses=AGPL-3.0
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Docker meta for full image
|
||||||
uses: docker/login-action@v2.2.0
|
id: meta-full
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
images: |
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
mediacms/mediacms
|
||||||
|
tags: |
|
||||||
|
type=raw,value=full,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
|
||||||
|
type=semver,pattern={{version}}-full
|
||||||
|
type=semver,pattern={{major}}.{{minor}}-full
|
||||||
|
type=semver,pattern={{major}}-full
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.title=MediaCMS Full
|
||||||
|
org.opencontainers.image.description=MediaCMS is a modern, fully featured open source video and media CMS, written in Python/Django and React, featuring a REST API. This is the full version with additional dependencies.
|
||||||
|
org.opencontainers.image.vendor=MediaCMS
|
||||||
|
org.opencontainers.image.url=https://mediacms.io/
|
||||||
|
org.opencontainers.image.source=https://github.com/mediacms-io/mediacms
|
||||||
|
org.opencontainers.image.licenses=AGPL-3.0
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push base image
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
target: base
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta-base.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta-base.outputs.labels }}
|
||||||
|
|
||||||
|
- name: Build and push full image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
target: full
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta-full.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta-full.outputs.labels }}
|
||||||
77
Dockerfile
77
Dockerfile
@ -1,4 +1,4 @@
|
|||||||
FROM python:3.13.5-bookworm AS build-image
|
FROM python:3.13.5-slim-bookworm AS build-image
|
||||||
|
|
||||||
# Install system dependencies needed for downloading and extracting
|
# Install system dependencies needed for downloading and extracting
|
||||||
RUN apt-get update -y && \
|
RUN apt-get update -y && \
|
||||||
@ -14,7 +14,7 @@ RUN mkdir -p ffmpeg-tmp && \
|
|||||||
cp -v ffmpeg-tmp/ffmpeg ffmpeg-tmp/ffprobe ffmpeg-tmp/qt-faststart /usr/local/bin && \
|
cp -v ffmpeg-tmp/ffmpeg ffmpeg-tmp/ffprobe ffmpeg-tmp/qt-faststart /usr/local/bin && \
|
||||||
rm -rf ffmpeg-tmp ffmpeg-release-amd64-static.tar.xz
|
rm -rf ffmpeg-tmp ffmpeg-release-amd64-static.tar.xz
|
||||||
|
|
||||||
# Install Bento4 in the specified location
|
# Install Bento4 in the specified location
|
||||||
RUN mkdir -p /home/mediacms.io/bento4 && \
|
RUN mkdir -p /home/mediacms.io/bento4 && \
|
||||||
wget -q http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip && \
|
wget -q http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip && \
|
||||||
unzip Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip -d /home/mediacms.io/bento4 && \
|
unzip Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip -d /home/mediacms.io/bento4 && \
|
||||||
@ -23,8 +23,8 @@ RUN mkdir -p /home/mediacms.io/bento4 && \
|
|||||||
rm -rf /home/mediacms.io/bento4/docs && \
|
rm -rf /home/mediacms.io/bento4/docs && \
|
||||||
rm Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
|
rm Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
|
||||||
|
|
||||||
############ RUNTIME IMAGE ############
|
############ BASE RUNTIME IMAGE ############
|
||||||
FROM python:3.13.5-bookworm AS runtime_image
|
FROM python:3.13.5-slim-bookworm AS base
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-c"]
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
|
||||||
@ -34,13 +34,47 @@ ENV CELERY_APP='cms'
|
|||||||
ENV VIRTUAL_ENV=/home/mediacms.io
|
ENV VIRTUAL_ENV=/home/mediacms.io
|
||||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
|
||||||
# Install runtime system dependencies
|
# Install system dependencies first
|
||||||
RUN apt-get update -y && \
|
RUN apt-get update -y && \
|
||||||
apt-get -y upgrade && \
|
apt-get -y upgrade && \
|
||||||
apt-get install --no-install-recommends supervisor nginx imagemagick procps pkg-config libxml2-dev libxmlsec1-dev libxmlsec1-openssl -y && \
|
apt-get install --no-install-recommends -y \
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
supervisor \
|
||||||
apt-get purge --auto-remove && \
|
nginx \
|
||||||
apt-get clean
|
imagemagick \
|
||||||
|
procps \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
zlib1g-dev \
|
||||||
|
zlib1g \
|
||||||
|
libxml2-dev \
|
||||||
|
libxmlsec1-dev \
|
||||||
|
libxmlsec1-openssl \
|
||||||
|
libpq-dev \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set up virtualenv first
|
||||||
|
RUN mkdir -p /home/mediacms.io/mediacms/{logs} && \
|
||||||
|
cd /home/mediacms.io && \
|
||||||
|
python3 -m venv $VIRTUAL_ENV
|
||||||
|
|
||||||
|
# Copy requirements files
|
||||||
|
COPY requirements.txt requirements-dev.txt ./
|
||||||
|
|
||||||
|
# Install Python dependencies using pip (within virtualenv)
|
||||||
|
ARG DEVELOPMENT_MODE=False
|
||||||
|
RUN pip install --no-cache-dir uv && \
|
||||||
|
uv pip install --no-binary lxml --no-binary xmlsec -r requirements.txt && \
|
||||||
|
if [ "$DEVELOPMENT_MODE" = "True" ]; then \
|
||||||
|
echo "Installing development dependencies..." && \
|
||||||
|
uv pip install -r requirements-dev.txt; \
|
||||||
|
fi && \
|
||||||
|
apt-get purge -y --auto-remove \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
libxml2-dev \
|
||||||
|
libxmlsec1-dev \
|
||||||
|
libpq-dev
|
||||||
|
|
||||||
# Copy ffmpeg and Bento4 from build image
|
# Copy ffmpeg and Bento4 from build image
|
||||||
COPY --from=build-image /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg
|
COPY --from=build-image /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg
|
||||||
@ -48,28 +82,11 @@ COPY --from=build-image /usr/local/bin/ffprobe /usr/local/bin/ffprobe
|
|||||||
COPY --from=build-image /usr/local/bin/qt-faststart /usr/local/bin/qt-faststart
|
COPY --from=build-image /usr/local/bin/qt-faststart /usr/local/bin/qt-faststart
|
||||||
COPY --from=build-image /home/mediacms.io/bento4 /home/mediacms.io/bento4
|
COPY --from=build-image /home/mediacms.io/bento4 /home/mediacms.io/bento4
|
||||||
|
|
||||||
# Set up virtualenv
|
|
||||||
RUN mkdir -p /home/mediacms.io/mediacms/{logs} && \
|
|
||||||
cd /home/mediacms.io && \
|
|
||||||
python3 -m venv $VIRTUAL_ENV
|
|
||||||
|
|
||||||
# Install Python dependencies
|
|
||||||
COPY requirements.txt requirements-dev.txt ./
|
|
||||||
|
|
||||||
ARG DEVELOPMENT_MODE=False
|
|
||||||
|
|
||||||
RUN pip install --no-cache-dir --no-binary lxml,xmlsec -r requirements.txt && \
|
|
||||||
if [ "$DEVELOPMENT_MODE" = "True" ]; then \
|
|
||||||
echo "Installing development dependencies..." && \
|
|
||||||
pip install --no-cache-dir -r requirements-dev.txt; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy application files
|
# Copy application files
|
||||||
COPY . /home/mediacms.io/mediacms
|
COPY . /home/mediacms.io/mediacms
|
||||||
WORKDIR /home/mediacms.io/mediacms
|
WORKDIR /home/mediacms.io/mediacms
|
||||||
|
|
||||||
# required for sprite thumbnail generation for large video files
|
# required for sprite thumbnail generation for large video files
|
||||||
|
|
||||||
COPY deploy/docker/policy.xml /etc/ImageMagick-6/policy.xml
|
COPY deploy/docker/policy.xml /etc/ImageMagick-6/policy.xml
|
||||||
|
|
||||||
# Set process control environment variables
|
# Set process control environment variables
|
||||||
@ -86,3 +103,11 @@ RUN chmod +x ./deploy/docker/entrypoint.sh
|
|||||||
|
|
||||||
ENTRYPOINT ["./deploy/docker/entrypoint.sh"]
|
ENTRYPOINT ["./deploy/docker/entrypoint.sh"]
|
||||||
CMD ["./deploy/docker/start.sh"]
|
CMD ["./deploy/docker/start.sh"]
|
||||||
|
|
||||||
|
############ FULL IMAGE ############
|
||||||
|
FROM base AS full
|
||||||
|
COPY requirements-full.txt ./
|
||||||
|
RUN mkdir -p /root/.cache/ && \
|
||||||
|
chmod go+rwx /root/ && \
|
||||||
|
chmod go+rwx /root/.cache/
|
||||||
|
RUN uv pip install -r requirements-full.txt
|
||||||
@ -470,7 +470,7 @@ LANGUAGE_CODE = 'en' # default language
|
|||||||
|
|
||||||
SPRITE_NUM_SECS = 10
|
SPRITE_NUM_SECS = 10
|
||||||
# number of seconds for sprite image.
|
# number of seconds for sprite image.
|
||||||
# If you plan to change this, you must also follow the instructions on admin_docs.md
|
# If you plan to change this, you must also follow the instructions on admins_docs.md
|
||||||
# to change the equivalent value in ./frontend/src/static/js/components/media-viewer/VideoViewer/index.js and then re-build frontend
|
# to change the equivalent value in ./frontend/src/static/js/components/media-viewer/VideoViewer/index.js and then re-build frontend
|
||||||
|
|
||||||
# how many images will be shown on the slideshow
|
# how many images will be shown on the slideshow
|
||||||
@ -507,8 +507,16 @@ NUMBER_OF_MEDIA_USER_CAN_UPLOAD = 100
|
|||||||
# ffmpeg options
|
# ffmpeg options
|
||||||
FFMPEG_DEFAULT_PRESET = "medium" # see https://trac.ffmpeg.org/wiki/Encode/H.264
|
FFMPEG_DEFAULT_PRESET = "medium" # see https://trac.ffmpeg.org/wiki/Encode/H.264
|
||||||
|
|
||||||
|
# If 'all' is in the list, no check is performed
|
||||||
ALLOWED_MEDIA_UPLOAD_TYPES = ["video", "audio", "image", "pdf"]
|
ALLOWED_MEDIA_UPLOAD_TYPES = ["video", "audio", "image", "pdf"]
|
||||||
|
|
||||||
|
# transcription options
|
||||||
|
# the full docker image needs to be used in order to be able to use transcription
|
||||||
|
USER_CAN_TRANSCRIBE_VIDEO = True
|
||||||
|
|
||||||
|
# Whisper transcribe options - https://github.com/openai/whisper
|
||||||
|
WHISPER_MODEL = "base"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# keep a local_settings.py file for local overrides
|
# keep a local_settings.py file for local overrides
|
||||||
from .local_settings import * # noqa
|
from .local_settings import * # noqa
|
||||||
|
|||||||
@ -5,6 +5,7 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ./Dockerfile
|
dockerfile: ./Dockerfile
|
||||||
|
target: base
|
||||||
args:
|
args:
|
||||||
- DEVELOPMENT_MODE=True
|
- DEVELOPMENT_MODE=True
|
||||||
image: mediacms/mediacms-dev:latest
|
image: mediacms/mediacms-dev:latest
|
||||||
@ -84,6 +85,5 @@ services:
|
|||||||
ENABLE_NGINX: 'no'
|
ENABLE_NGINX: 'no'
|
||||||
ENABLE_CELERY_BEAT: 'no'
|
ENABLE_CELERY_BEAT: 'no'
|
||||||
ENABLE_MIGRATIONS: 'no'
|
ENABLE_MIGRATIONS: 'no'
|
||||||
DEVELOPMENT_MODE: True
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- web
|
- web
|
||||||
|
|||||||
5
docker-compose.full.yaml
Normal file
5
docker-compose.full.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
celery_worker:
|
||||||
|
image: mediacms/mediacms:full
|
||||||
@ -124,6 +124,9 @@ migrations_1 | Created admin user with password: gwg1clfkwf
|
|||||||
|
|
||||||
or if you have set the ADMIN_PASSWORD variable on docker-compose file you have used (example `docker-compose.yaml`), that variable will be set as the admin user's password
|
or if you have set the ADMIN_PASSWORD variable on docker-compose file you have used (example `docker-compose.yaml`), that variable will be set as the admin user's password
|
||||||
|
|
||||||
|
`Note`: if you want to use the automatic transcriptions, run `docker-compose -f docker-compose.yaml -f docker-compose.full.yaml up` instead, as this is using a separate image.
|
||||||
|
|
||||||
|
|
||||||
### Update
|
### Update
|
||||||
|
|
||||||
Get latest MediaCMS image and stop/start containers
|
Get latest MediaCMS image and stop/start containers
|
||||||
@ -984,7 +987,7 @@ MediaCMS performs identification attempts on new file uploads and only allows ce
|
|||||||
|
|
||||||
When a file is not identified as one of these allowed types, the file gets removed from the system and there's an entry indicating that this is not a supported media type.
|
When a file is not identified as one of these allowed types, the file gets removed from the system and there's an entry indicating that this is not a supported media type.
|
||||||
|
|
||||||
If you want to change the allowed file types, edit the `ALLOWED_MEDIA_UPLOAD_TYPES` list in your `settings.py` or `local_settings.py` file.
|
If you want to change the allowed file types, edit the `ALLOWED_MEDIA_UPLOAD_TYPES` list in your `settings.py` or `local_settings.py` file. If 'all' is specified in this list, no check is performed and all files are allowed.
|
||||||
|
|
||||||
## 27. User upload limits
|
## 27. User upload limits
|
||||||
MediaCMS allows you to set a maximum number of media files that each user can upload. This is controlled by the `NUMBER_OF_MEDIA_USER_CAN_UPLOAD` setting in `settings.py` or `local_settings.py`. By default, this is set to 100 media items per user.
|
MediaCMS allows you to set a maximum number of media files that each user can upload. This is controlled by the `NUMBER_OF_MEDIA_USER_CAN_UPLOAD` setting in `settings.py` or `local_settings.py`. By default, this is set to 100 media items per user.
|
||||||
@ -996,3 +999,17 @@ To change the maximum number of uploads allowed per user, modify the `NUMBER_OF_
|
|||||||
```
|
```
|
||||||
NUMBER_OF_MEDIA_USER_CAN_UPLOAD = 5
|
NUMBER_OF_MEDIA_USER_CAN_UPLOAD = 5
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 28. Whisper Transcribe for Automatic Subtitles
|
||||||
|
MediaCMS can integrate with OpenAI's Whisper to automatically generate subtitles for your media files. This feature is useful for making your content more accessible.
|
||||||
|
|
||||||
|
### How it works
|
||||||
|
When the whisper transcribe task is triggered for a media file, MediaCMS runs the `whisper` command-line tool to process the audio and generate a subtitle file in VTT format. The generated subtitles are then associated with the media and are available under the "automatic" language option.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Transcription functionality is available only for the Docker installation. To enable this feature, you must use the `docker-compose.full.yaml` file, as it contains an image with the necessary requirements.
|
||||||
|
|
||||||
|
By default, all users have the ability to send a request for a video to be transcribed, as well as transcribed and translated to English. If you wish to change this behavior, you can edit the `settings.py` file and set `USER_CAN_TRANSCRIBE_VIDEO=False`.
|
||||||
|
|
||||||
|
The transcription uses the base model of Whisper speech-to-text by default. However, you can change the model by editing the `WHISPER_MODEL` setting in `settings.py`.
|
||||||
|
|||||||
@ -15,6 +15,7 @@ from .models import (
|
|||||||
Media,
|
Media,
|
||||||
Subtitle,
|
Subtitle,
|
||||||
Tag,
|
Tag,
|
||||||
|
TranscriptionRequest,
|
||||||
VideoTrimRequest,
|
VideoTrimRequest,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -219,6 +220,10 @@ class EncodingAdmin(admin.ModelAdmin):
|
|||||||
has_file.short_description = "Has file"
|
has_file.short_description = "Has file"
|
||||||
|
|
||||||
|
|
||||||
|
class TranscriptionRequestAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(EncodeProfile, EncodeProfileAdmin)
|
admin.site.register(EncodeProfile, EncodeProfileAdmin)
|
||||||
admin.site.register(Comment, CommentAdmin)
|
admin.site.register(Comment, CommentAdmin)
|
||||||
admin.site.register(Media, MediaAdmin)
|
admin.site.register(Media, MediaAdmin)
|
||||||
@ -228,5 +233,6 @@ admin.site.register(Tag, TagAdmin)
|
|||||||
admin.site.register(Subtitle, SubtitleAdmin)
|
admin.site.register(Subtitle, SubtitleAdmin)
|
||||||
admin.site.register(Language, LanguageAdmin)
|
admin.site.register(Language, LanguageAdmin)
|
||||||
admin.site.register(VideoTrimRequest, VideoTrimRequestAdmin)
|
admin.site.register(VideoTrimRequest, VideoTrimRequestAdmin)
|
||||||
|
admin.site.register(TranscriptionRequest, TranscriptionRequestAdmin)
|
||||||
|
|
||||||
Media._meta.app_config.verbose_name = "Media"
|
Media._meta.app_config.verbose_name = "Media"
|
||||||
|
|||||||
@ -118,14 +118,7 @@ class MediaPublishForm(forms.ModelForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Media
|
model = Media
|
||||||
fields = (
|
fields = ("category", "state", "featured", "reported_times", "is_reviewed", "allow_download")
|
||||||
"category",
|
|
||||||
"state",
|
|
||||||
"featured",
|
|
||||||
"reported_times",
|
|
||||||
"is_reviewed",
|
|
||||||
"allow_download",
|
|
||||||
)
|
|
||||||
|
|
||||||
widgets = {
|
widgets = {
|
||||||
"category": MultipleSelect(),
|
"category": MultipleSelect(),
|
||||||
@ -134,6 +127,7 @@ class MediaPublishForm(forms.ModelForm):
|
|||||||
def __init__(self, user, *args, **kwargs):
|
def __init__(self, user, *args, **kwargs):
|
||||||
self.user = user
|
self.user = user
|
||||||
super(MediaPublishForm, self).__init__(*args, **kwargs)
|
super(MediaPublishForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
if not is_mediacms_editor(user):
|
if not is_mediacms_editor(user):
|
||||||
for field in ["featured", "reported_times", "is_reviewed"]:
|
for field in ["featured", "reported_times", "is_reviewed"]:
|
||||||
self.fields[field].disabled = True
|
self.fields[field].disabled = True
|
||||||
@ -220,16 +214,87 @@ class MediaPublishForm(forms.ModelForm):
|
|||||||
return media
|
return media
|
||||||
|
|
||||||
|
|
||||||
|
class WhisperSubtitlesForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Media
|
||||||
|
fields = (
|
||||||
|
"allow_whisper_transcribe",
|
||||||
|
"allow_whisper_transcribe_and_translate",
|
||||||
|
)
|
||||||
|
labels = {
|
||||||
|
"allow_whisper_transcribe": "automatic transcription",
|
||||||
|
"allow_whisper_transcribe_and_translate": "automatic transcription and translation",
|
||||||
|
}
|
||||||
|
help_texts = {
|
||||||
|
"allow_whisper_transcribe": "Request automatic transcription for this media.",
|
||||||
|
"allow_whisper_transcribe_and_translate": "Request automatic transcription and translation for this media.",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, user, *args, **kwargs):
|
||||||
|
self.user = user
|
||||||
|
super(WhisperSubtitlesForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
if self.instance.allow_whisper_transcribe:
|
||||||
|
self.fields['allow_whisper_transcribe'].widget.attrs['readonly'] = True
|
||||||
|
self.fields['allow_whisper_transcribe'].widget.attrs['disabled'] = True
|
||||||
|
if self.instance.allow_whisper_transcribe_and_translate:
|
||||||
|
self.fields['allow_whisper_transcribe_and_translate'].widget.attrs['readonly'] = True
|
||||||
|
self.fields['allow_whisper_transcribe_and_translate'].widget.attrs['disabled'] = True
|
||||||
|
|
||||||
|
self.helper = FormHelper()
|
||||||
|
self.helper.form_tag = True
|
||||||
|
self.helper.form_class = 'post-form'
|
||||||
|
self.helper.form_method = 'post'
|
||||||
|
self.helper.form_enctype = "multipart/form-data"
|
||||||
|
self.helper.form_show_errors = False
|
||||||
|
self.helper.layout = Layout(
|
||||||
|
CustomField('allow_whisper_transcribe'),
|
||||||
|
CustomField('allow_whisper_transcribe_and_translate'),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.helper.layout.append(FormActions(Submit('submit_whisper', 'Submit', css_class='primaryAction')))
|
||||||
|
|
||||||
|
def clean_allow_whisper_transcribe(self):
|
||||||
|
# Ensure the field value doesn't change if it was originally True
|
||||||
|
if self.instance and self.instance.allow_whisper_transcribe:
|
||||||
|
return self.instance.allow_whisper_transcribe
|
||||||
|
return self.cleaned_data['allow_whisper_transcribe']
|
||||||
|
|
||||||
|
def clean_allow_whisper_transcribe_and_translate(self):
|
||||||
|
# Ensure the field value doesn't change if it was originally True
|
||||||
|
if self.instance and self.instance.allow_whisper_transcribe_and_translate:
|
||||||
|
return self.instance.allow_whisper_transcribe_and_translate
|
||||||
|
return self.cleaned_data['allow_whisper_transcribe_and_translate']
|
||||||
|
|
||||||
|
|
||||||
class SubtitleForm(forms.ModelForm):
|
class SubtitleForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Subtitle
|
model = Subtitle
|
||||||
fields = ["language", "subtitle_file"]
|
fields = ["language", "subtitle_file"]
|
||||||
|
|
||||||
|
labels = {
|
||||||
|
"subtitle_file": "Subtitle or Closed Caption File",
|
||||||
|
}
|
||||||
|
help_texts = {
|
||||||
|
"subtitle_file": "SubRip (.srt) and WebVTT (.vtt) are supported file formats.",
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, media_item, *args, **kwargs):
|
def __init__(self, media_item, *args, **kwargs):
|
||||||
super(SubtitleForm, self).__init__(*args, **kwargs)
|
super(SubtitleForm, self).__init__(*args, **kwargs)
|
||||||
self.instance.media = media_item
|
self.instance.media = media_item
|
||||||
self.fields["subtitle_file"].help_text = "SubRip (.srt) and WebVTT (.vtt) are supported file formats."
|
|
||||||
self.fields["subtitle_file"].label = "Subtitle or Closed Caption File"
|
self.helper = FormHelper()
|
||||||
|
self.helper.form_tag = True
|
||||||
|
self.helper.form_class = 'post-form'
|
||||||
|
self.helper.form_method = 'post'
|
||||||
|
self.helper.form_enctype = "multipart/form-data"
|
||||||
|
self.helper.form_show_errors = False
|
||||||
|
self.helper.layout = Layout(
|
||||||
|
CustomField('subtitle_file'),
|
||||||
|
CustomField('language'),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.helper.layout.append(FormActions(Submit('submit', 'Submit', css_class='primaryAction')))
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.instance.user = self.instance.media.user
|
self.instance.user = self.instance.media.user
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "تشغيل تلقائي",
|
"AUTOPLAY": "تشغيل تلقائي",
|
||||||
"About": "حول",
|
"About": "حول",
|
||||||
"Add a ": "أضف ",
|
"Add a ": "أضف ",
|
||||||
|
"Browse your files": "تصفح ملفاتك",
|
||||||
"COMMENT": "تعليق",
|
"COMMENT": "تعليق",
|
||||||
"Categories": "الفئات",
|
"Categories": "الفئات",
|
||||||
"Category": "الفئة",
|
"Category": "الفئة",
|
||||||
"Change Language": "تغيير اللغة",
|
"Change Language": "تغيير اللغة",
|
||||||
"Change password": "تغيير كلمة المرور",
|
"Change password": "تغيير كلمة المرور",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "انقر على 'بدء التسجيل' واختر الشاشة أو علامة التبويب المراد تسجيلها. بمجرد الانتهاء من التسجيل، انقر على 'إيقاف التسجيل'، وسيتم تحميل التسجيل.",
|
||||||
"Comment": "تعليق",
|
"Comment": "تعليق",
|
||||||
"Comments": "تعليقات",
|
"Comments": "تعليقات",
|
||||||
"Comments are disabled": "التعليقات معطلة",
|
"Comments are disabled": "التعليقات معطلة",
|
||||||
"Contact": "اتصل",
|
"Contact": "اتصل",
|
||||||
"DELETE MEDIA": "حذف الوسائط",
|
"DELETE MEDIA": "حذف الوسائط",
|
||||||
"DOWNLOAD": "تحميل",
|
"DOWNLOAD": "تحميل",
|
||||||
|
"Drag and drop files": "سحب وإفلات الملفات",
|
||||||
"EDIT MEDIA": "تعديل الوسائط",
|
"EDIT MEDIA": "تعديل الوسائط",
|
||||||
"EDIT PROFILE": "تعديل الملف الشخصي",
|
"EDIT PROFILE": "تعديل الملف الشخصي",
|
||||||
"EDIT SUBTITLE": "تعديل الترجمة",
|
"EDIT SUBTITLE": "تعديل الترجمة",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "قوائم التشغيل",
|
"PLAYLISTS": "قوائم التشغيل",
|
||||||
"Playlists": "قوائم التشغيل",
|
"Playlists": "قوائم التشغيل",
|
||||||
"Powered by": "مدعوم من",
|
"Powered by": "مدعوم من",
|
||||||
|
"Publish": "نشر",
|
||||||
"Published on": "نشر في",
|
"Published on": "نشر في",
|
||||||
"Recommended": "موصى به",
|
"Recommended": "موصى به",
|
||||||
|
"Record Screen": "تسجيل الشاشة",
|
||||||
"Register": "تسجيل",
|
"Register": "تسجيل",
|
||||||
"SAVE": "حفظ",
|
"SAVE": "حفظ",
|
||||||
"SEARCH": "بحث",
|
"SEARCH": "بحث",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "اختر",
|
"Select": "اختر",
|
||||||
"Sign in": "تسجيل الدخول",
|
"Sign in": "تسجيل الدخول",
|
||||||
"Sign out": "تسجيل الخروج",
|
"Sign out": "تسجيل الخروج",
|
||||||
|
"Start Recording": "بدء التسجيل",
|
||||||
|
"Stop Recording": "إيقاف التسجيل",
|
||||||
"Subtitle was added": "تمت إضافة الترجمة",
|
"Subtitle was added": "تمت إضافة الترجمة",
|
||||||
|
"Subtitles": "ترجمات",
|
||||||
"Tags": "العلامات",
|
"Tags": "العلامات",
|
||||||
"Terms": "الشروط",
|
"Terms": "الشروط",
|
||||||
|
"Trim": "قص",
|
||||||
"UPLOAD": "رفع",
|
"UPLOAD": "رفع",
|
||||||
"Up next": "التالي",
|
"Up next": "التالي",
|
||||||
"Upload": "رفع",
|
"Upload": "رفع",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "التحميلات",
|
"Uploads": "التحميلات",
|
||||||
"VIEW ALL": "عرض الكل",
|
"VIEW ALL": "عرض الكل",
|
||||||
"View all": "عرض الكل",
|
"View all": "عرض الكل",
|
||||||
|
"View media": "عرض الوسائط",
|
||||||
"comment": "تعليق",
|
"comment": "تعليق",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "هو نظام إدارة محتوى فيديو ووسائط مفتوح المصدر وحديث ومتكامل. تم تطويره لتلبية احتياجات المنصات الويب الحديثة لمشاهدة ومشاركة الوسائط",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "هو نظام إدارة محتوى فيديو ووسائط مفتوح المصدر وحديث ومتكامل. تم تطويره لتلبية احتياجات المنصات الويب الحديثة لمشاهدة ومشاركة الوسائط",
|
||||||
"media in category": "وسائط في الفئة",
|
"media in category": "وسائط في الفئة",
|
||||||
"media in tag": "وسائط في العلامة",
|
"media in tag": "وسائط في العلامة",
|
||||||
|
"or": "أو",
|
||||||
"view": "عرض",
|
"view": "عرض",
|
||||||
"views": "مشاهدات",
|
"views": "مشاهدات",
|
||||||
"yet": "بعد",
|
"yet": "بعد",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "স্বয়ংক্রিয় প্লে",
|
"AUTOPLAY": "স্বয়ংক্রিয় প্লে",
|
||||||
"About": "সম্পর্কে",
|
"About": "সম্পর্কে",
|
||||||
"Add a ": "যোগ করুন",
|
"Add a ": "যোগ করুন",
|
||||||
|
"Browse your files": "আপনার ফাইল ব্রাউজ করুন",
|
||||||
"COMMENT": "মন্তব্য",
|
"COMMENT": "মন্তব্য",
|
||||||
"Categories": "বিভাগসমূহ",
|
"Categories": "বিভাগসমূহ",
|
||||||
"Category": "বিভাগ",
|
"Category": "বিভাগ",
|
||||||
"Change Language": "ভাষা পরিবর্তন করুন",
|
"Change Language": "ভাষা পরিবর্তন করুন",
|
||||||
"Change password": "পাসওয়ার্ড পরিবর্তন করুন",
|
"Change password": "পাসওয়ার্ড পরিবর্তন করুন",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "'রেকর্ডিং শুরু করুন'-এ ক্লিক করুন এবং রেকর্ড করার জন্য স্ক্রিন বা ট্যাব নির্বাচন করুন। রেকর্ডিং শেষ হলে, 'রেকর্ডিং বন্ধ করুন'-এ ক্লিক করুন এবং রেকর্ডিং আপলোড হয়ে যাবে।",
|
||||||
"Comment": "মন্তব্য",
|
"Comment": "মন্তব্য",
|
||||||
"Comments": "মন্তব্যসমূহ",
|
"Comments": "মন্তব্যসমূহ",
|
||||||
"Comments are disabled": "মন্তব্য নিষ্ক্রিয় করা হয়েছে",
|
"Comments are disabled": "মন্তব্য নিষ্ক্রিয় করা হয়েছে",
|
||||||
"Contact": "যোগাযোগ",
|
"Contact": "যোগাযোগ",
|
||||||
"DELETE MEDIA": "মিডিয়া মুছুন",
|
"DELETE MEDIA": "মিডিয়া মুছুন",
|
||||||
"DOWNLOAD": "ডাউনলোড",
|
"DOWNLOAD": "ডাউনলোড",
|
||||||
|
"Drag and drop files": "ফাইল টেনে আনুন",
|
||||||
"EDIT MEDIA": "মিডিয়া সম্পাদনা করুন",
|
"EDIT MEDIA": "মিডিয়া সম্পাদনা করুন",
|
||||||
"EDIT PROFILE": "প্রোফাইল সম্পাদনা করুন",
|
"EDIT PROFILE": "প্রোফাইল সম্পাদনা করুন",
|
||||||
"EDIT SUBTITLE": "সাবটাইটেল সম্পাদনা করুন",
|
"EDIT SUBTITLE": "সাবটাইটেল সম্পাদনা করুন",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "প্লেলিস্ট",
|
"PLAYLISTS": "প্লেলিস্ট",
|
||||||
"Playlists": "প্লেলিস্ট",
|
"Playlists": "প্লেলিস্ট",
|
||||||
"Powered by": "দ্বারা চালিত",
|
"Powered by": "দ্বারা চালিত",
|
||||||
|
"Publish": "প্রকাশ করুন",
|
||||||
"Published on": "প্রকাশিত",
|
"Published on": "প্রকাশিত",
|
||||||
"Recommended": "প্রস্তাবিত",
|
"Recommended": "প্রস্তাবিত",
|
||||||
|
"Record Screen": "স্ক্রিন রেকর্ড করুন",
|
||||||
"Register": "নিবন্ধন করুন",
|
"Register": "নিবন্ধন করুন",
|
||||||
"SAVE": "সংরক্ষণ করুন",
|
"SAVE": "সংরক্ষণ করুন",
|
||||||
"SEARCH": "অনুসন্ধান",
|
"SEARCH": "অনুসন্ধান",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "নির্বাচন করুন",
|
"Select": "নির্বাচন করুন",
|
||||||
"Sign in": "সাইন ইন করুন",
|
"Sign in": "সাইন ইন করুন",
|
||||||
"Sign out": "সাইন আউট করুন",
|
"Sign out": "সাইন আউট করুন",
|
||||||
|
"Start Recording": "রেকর্ডিং শুরু করুন",
|
||||||
|
"Stop Recording": "রেকর্ডিং বন্ধ করুন",
|
||||||
"Subtitle was added": "সাবটাইটেল যোগ করা হয়েছে",
|
"Subtitle was added": "সাবটাইটেল যোগ করা হয়েছে",
|
||||||
|
"Subtitles": "সাবটাইটেল",
|
||||||
"Tags": "ট্যাগ",
|
"Tags": "ট্যাগ",
|
||||||
"Terms": "শর্তাবলী",
|
"Terms": "শর্তাবলী",
|
||||||
|
"Trim": "ছাঁটাই",
|
||||||
"UPLOAD": "আপলোড করুন",
|
"UPLOAD": "আপলোড করুন",
|
||||||
"Up next": "পরবর্তী",
|
"Up next": "পরবর্তী",
|
||||||
"Upload": "আপলোড করুন",
|
"Upload": "আপলোড করুন",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "আপলোডসমূহ",
|
"Uploads": "আপলোডসমূহ",
|
||||||
"VIEW ALL": "সব দেখুন",
|
"VIEW ALL": "সব দেখুন",
|
||||||
"View all": "সব দেখুন",
|
"View all": "সব দেখুন",
|
||||||
|
"View media": "মিডিয়া দেখুন",
|
||||||
"comment": "মন্তব্য",
|
"comment": "মন্তব্য",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "একটি আধুনিক, সম্পূর্ণ বৈশিষ্ট্যযুক্ত ওপেন সোর্স ভিডিও এবং মিডিয়া CMS। এটি আধুনিক ওয়েব প্ল্যাটফর্মের জন্য মিডিয়া দেখার এবং শেয়ার করার প্রয়োজন মেটাতে তৈরি করা হয়েছে",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "একটি আধুনিক, সম্পূর্ণ বৈশিষ্ট্যযুক্ত ওপেন সোর্স ভিডিও এবং মিডিয়া CMS। এটি আধুনিক ওয়েব প্ল্যাটফর্মের জন্য মিডিয়া দেখার এবং শেয়ার করার প্রয়োজন মেটাতে তৈরি করা হয়েছে",
|
||||||
"media in category": "বিভাগে মিডিয়া",
|
"media in category": "বিভাগে মিডিয়া",
|
||||||
"media in tag": "ট্যাগে মিডিয়া",
|
"media in tag": "ট্যাগে মিডিয়া",
|
||||||
|
"or": "অথবা",
|
||||||
"view": "দেখুন",
|
"view": "দেখুন",
|
||||||
"views": "দেখা হয়েছে",
|
"views": "দেখা হয়েছে",
|
||||||
"yet": "এখনও",
|
"yet": "এখনও",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Automatisk afspilning",
|
"AUTOPLAY": "Automatisk afspilning",
|
||||||
"About": "Om",
|
"About": "Om",
|
||||||
"Add a ": "Tilføj en ",
|
"Add a ": "Tilføj en ",
|
||||||
|
"Browse your files": "Gennemse dine filer",
|
||||||
"COMMENT": "KOMMENTAR",
|
"COMMENT": "KOMMENTAR",
|
||||||
"Categories": "Kategorier",
|
"Categories": "Kategorier",
|
||||||
"Category": "Kategori",
|
"Category": "Kategori",
|
||||||
"Change Language": "Skift sprog",
|
"Change Language": "Skift sprog",
|
||||||
"Change password": "Skift adgangskode",
|
"Change password": "Skift adgangskode",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Klik på 'Start optagelse' og vælg den skærm eller fane, du vil optage. Når optagelsen er færdig, skal du klikke på 'Stop optagelse', og optagelsen vil blive uploadet.",
|
||||||
"Comment": "Kommentar",
|
"Comment": "Kommentar",
|
||||||
"Comments": "Kommentarer",
|
"Comments": "Kommentarer",
|
||||||
"Comments are disabled": "Kommentarer er slået fra",
|
"Comments are disabled": "Kommentarer er slået fra",
|
||||||
"Contact": "Kontakt",
|
"Contact": "Kontakt",
|
||||||
"DELETE MEDIA": "SLET MEDIE",
|
"DELETE MEDIA": "SLET MEDIE",
|
||||||
"DOWNLOAD": "HENT",
|
"DOWNLOAD": "HENT",
|
||||||
|
"Drag and drop files": "Træk og slip filer",
|
||||||
"EDIT MEDIA": "REDIGER MEDIE",
|
"EDIT MEDIA": "REDIGER MEDIE",
|
||||||
"EDIT PROFILE": "REDIGER PROFIL",
|
"EDIT PROFILE": "REDIGER PROFIL",
|
||||||
"EDIT SUBTITLE": "REDIGER UNDERTEKSTER",
|
"EDIT SUBTITLE": "REDIGER UNDERTEKSTER",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "PLAYLISTER",
|
"PLAYLISTS": "PLAYLISTER",
|
||||||
"Playlists": "Playlister",
|
"Playlists": "Playlister",
|
||||||
"Powered by": "Drevet af",
|
"Powered by": "Drevet af",
|
||||||
|
"Publish": "Udgiv",
|
||||||
"Published on": "Udgivet på",
|
"Published on": "Udgivet på",
|
||||||
"Recommended": "Anbefalet",
|
"Recommended": "Anbefalet",
|
||||||
|
"Record Screen": "Optag skærm",
|
||||||
"Register": "Registrer",
|
"Register": "Registrer",
|
||||||
"SAVE": "GEM",
|
"SAVE": "GEM",
|
||||||
"SEARCH": "SØG",
|
"SEARCH": "SØG",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Vælg",
|
"Select": "Vælg",
|
||||||
"Sign in": "Log ind",
|
"Sign in": "Log ind",
|
||||||
"Sign out": "Log ud",
|
"Sign out": "Log ud",
|
||||||
|
"Start Recording": "Start optagelse",
|
||||||
|
"Stop Recording": "Stop optagelse",
|
||||||
"Subtitle was added": "Undertekster tilføjet",
|
"Subtitle was added": "Undertekster tilføjet",
|
||||||
|
"Subtitles": "Undertekster",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Terms": "Vilkår",
|
"Terms": "Vilkår",
|
||||||
|
"Trim": "Beskær",
|
||||||
"UPLOAD": "UPLOAD",
|
"UPLOAD": "UPLOAD",
|
||||||
"Up next": "Næste",
|
"Up next": "Næste",
|
||||||
"Upload": "Upload",
|
"Upload": "Upload",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Uploads",
|
"Uploads": "Uploads",
|
||||||
"VIEW ALL": "SE ALLE",
|
"VIEW ALL": "SE ALLE",
|
||||||
"View all": "Se alle",
|
"View all": "Se alle",
|
||||||
|
"View media": "Se medie",
|
||||||
"comment": "kommentar",
|
"comment": "kommentar",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "er et moderne, fuldt udstyret open source video og medie CMS. Det er udviklet til at imødekomme behovene for moderne webplatforme til visning og deling af medier.",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "er et moderne, fuldt udstyret open source video og medie CMS. Det er udviklet til at imødekomme behovene for moderne webplatforme til visning og deling af medier.",
|
||||||
"media in category": "medier i kategori",
|
"media in category": "medier i kategori",
|
||||||
"media in tag": "medier i tag",
|
"media in tag": "medier i tag",
|
||||||
|
"or": "eller",
|
||||||
"view": "visning",
|
"view": "visning",
|
||||||
"views": "visninger",
|
"views": "visninger",
|
||||||
"yet": "endnu",
|
"yet": "endnu",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Automatische Wiedergabe",
|
"AUTOPLAY": "Automatische Wiedergabe",
|
||||||
"About": "Über",
|
"About": "Über",
|
||||||
"Add a ": "Hinzufügen eines ",
|
"Add a ": "Hinzufügen eines ",
|
||||||
|
"Browse your files": "Durchsuchen Sie Ihre Dateien",
|
||||||
"COMMENT": "KOMMENTAR",
|
"COMMENT": "KOMMENTAR",
|
||||||
"Categories": "Kategorien",
|
"Categories": "Kategorien",
|
||||||
"Category": "Kategorie",
|
"Category": "Kategorie",
|
||||||
"Change Language": "Sprache ändern",
|
"Change Language": "Sprache ändern",
|
||||||
"Change password": "Passwort ändern",
|
"Change password": "Passwort ändern",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Klicken Sie auf 'Aufnahme starten' und wählen Sie den Bildschirm oder Tab aus, den Sie aufnehmen möchten. Sobald die Aufnahme beendet ist, klicken Sie auf 'Aufnahme beenden', und die Aufnahme wird hochgeladen.",
|
||||||
"Comment": "Kommentar",
|
"Comment": "Kommentar",
|
||||||
"Comments": "Kommentare",
|
"Comments": "Kommentare",
|
||||||
"Comments are disabled": "Kommentare sind deaktiviert",
|
"Comments are disabled": "Kommentare sind deaktiviert",
|
||||||
"Contact": "Kontakt",
|
"Contact": "Kontakt",
|
||||||
"DELETE MEDIA": "MEDIEN LÖSCHEN",
|
"DELETE MEDIA": "MEDIEN LÖSCHEN",
|
||||||
"DOWNLOAD": "HERUNTERLADEN",
|
"DOWNLOAD": "HERUNTERLADEN",
|
||||||
|
"Drag and drop files": "Dateien per Drag & Drop verschieben",
|
||||||
"EDIT MEDIA": "MEDIEN BEARBEITEN",
|
"EDIT MEDIA": "MEDIEN BEARBEITEN",
|
||||||
"EDIT PROFILE": "PROFIL BEARBEITEN",
|
"EDIT PROFILE": "PROFIL BEARBEITEN",
|
||||||
"EDIT SUBTITLE": "UNTERTITEL BEARBEITEN",
|
"EDIT SUBTITLE": "UNTERTITEL BEARBEITEN",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "PLAYLISTS",
|
"PLAYLISTS": "PLAYLISTS",
|
||||||
"Playlists": "Playlists",
|
"Playlists": "Playlists",
|
||||||
"Powered by": "Bereitgestellt von",
|
"Powered by": "Bereitgestellt von",
|
||||||
|
"Publish": "Veröffentlichen",
|
||||||
"Published on": "Veröffentlicht am",
|
"Published on": "Veröffentlicht am",
|
||||||
"Recommended": "Empfohlen",
|
"Recommended": "Empfohlen",
|
||||||
|
"Record Screen": "Bildschirm aufnehmen",
|
||||||
"Register": "Registrieren",
|
"Register": "Registrieren",
|
||||||
"SAVE": "SPEICHERN",
|
"SAVE": "SPEICHERN",
|
||||||
"SEARCH": "SUCHE",
|
"SEARCH": "SUCHE",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Auswählen",
|
"Select": "Auswählen",
|
||||||
"Sign in": "Anmelden",
|
"Sign in": "Anmelden",
|
||||||
"Sign out": "Abmelden",
|
"Sign out": "Abmelden",
|
||||||
|
"Start Recording": "Aufnahme starten",
|
||||||
|
"Stop Recording": "Aufnahme stoppen",
|
||||||
"Subtitle was added": "Untertitel wurde hinzugefügt",
|
"Subtitle was added": "Untertitel wurde hinzugefügt",
|
||||||
|
"Subtitles": "Untertitel",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Terms": "Bedingungen",
|
"Terms": "Bedingungen",
|
||||||
|
"Trim": "Trimmen",
|
||||||
"UPLOAD": "HOCHLADEN",
|
"UPLOAD": "HOCHLADEN",
|
||||||
"Up next": "Als nächstes",
|
"Up next": "Als nächstes",
|
||||||
"Upload": "Hochladen",
|
"Upload": "Hochladen",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Uploads",
|
"Uploads": "Uploads",
|
||||||
"VIEW ALL": "ALLE ANZEIGEN",
|
"VIEW ALL": "ALLE ANZEIGEN",
|
||||||
"View all": "Alle anzeigen",
|
"View all": "Alle anzeigen",
|
||||||
|
"View media": "Medien anzeigen",
|
||||||
"comment": "Kommentar",
|
"comment": "Kommentar",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "ist ein modernes, voll ausgestattetes Open-Source-Video- und Medien-CMS. Es wurde entwickelt, um den Anforderungen moderner Webplattformen für das Ansehen und Teilen von Medien gerecht zu werden",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "ist ein modernes, voll ausgestattetes Open-Source-Video- und Medien-CMS. Es wurde entwickelt, um den Anforderungen moderner Webplattformen für das Ansehen und Teilen von Medien gerecht zu werden",
|
||||||
"media in category": "Medien in Kategorie",
|
"media in category": "Medien in Kategorie",
|
||||||
"media in tag": "Medien in Tag",
|
"media in tag": "Medien in Tag",
|
||||||
|
"or": "oder",
|
||||||
"view": "Ansicht",
|
"view": "Ansicht",
|
||||||
"views": "Ansichten",
|
"views": "Ansichten",
|
||||||
"yet": "noch",
|
"yet": "noch",
|
||||||
|
|||||||
@ -3,30 +3,33 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Αυτόματη αναπαραγωγή",
|
"AUTOPLAY": "Αυτόματη αναπαραγωγή",
|
||||||
"About": "Σχετικά",
|
"About": "Σχετικά",
|
||||||
"Add a ": "Προσθέστε ένα ",
|
"Add a ": "Προσθέστε ένα ",
|
||||||
|
"Browse your files": "Περιήγηση στα αρχεία σας",
|
||||||
"COMMENT": "ΣΧΟΛΙΟ",
|
"COMMENT": "ΣΧΟΛΙΟ",
|
||||||
"Categories": "Κατηγορίες",
|
"Categories": "Κατηγορίες",
|
||||||
"Category": "Κατηγορία",
|
"Category": "Κατηγορία",
|
||||||
"Change Language": "Αλλαγή Γλώσσας",
|
"Change Language": "Αλλαγή Γλώσσας",
|
||||||
"Change password": "Αλλαγή κωδικού",
|
"Change password": "Αλλαγή κωδικού",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Κάντε κλικ στο 'Έναρξη εγγραφής' και επιλέξτε την οθόνη ή την καρτέλα για εγγραφή. Μόλις ολοκληρωθεί η εγγραφή, κάντε κλικ στο 'Διακοπή εγγραφής' και η εγγραφή θα μεταφορτωθεί.",
|
||||||
"Comment": "Σχόλιο",
|
"Comment": "Σχόλιο",
|
||||||
"Comments": "Σχόλια",
|
"Comments": "Σχόλια",
|
||||||
"Comments are disabled": "Τα σχόλια είναι απενεργοποιημένα",
|
"Comments are disabled": "Τα σχόλια είναι απενεργοποιημένα",
|
||||||
"Contact": "Επικοινωνία",
|
"Contact": "Επικοινωνία",
|
||||||
"DELETE MEDIA": "ΔΙΑΓΡΑΦΗ ΑΡΧΕΙΟΥ",
|
"DELETE MEDIA": "ΔΙΑΓΡΑΦΗ ΑΡΧΕΙΟΥ",
|
||||||
"DOWNLOAD": "ΚΑΤΕΒΑΣΜΑ",
|
"DOWNLOAD": "ΚΑΤΕΒΑΣΜΑ",
|
||||||
|
"Drag and drop files": "Σύρετε και αποθέστε αρχεία",
|
||||||
"EDIT MEDIA": "ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΟΥ",
|
"EDIT MEDIA": "ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΟΥ",
|
||||||
"EDIT PROFILE": "ΕΠΕΞΕΡΓΑΣΙΑ ΠΡΟΦΙΛ",
|
"EDIT PROFILE": "ΕΠΕΞΕΡΓΑΣΙΑ ΠΡΟΦΙΛ",
|
||||||
"EDIT SUBTITLE": "ΕΠΕΞΕΡΓΑΣΙΑ ΥΠΟΤΙΤΛΩΝ",
|
"EDIT SUBTITLE": "ΕΠΕΞΕΡΓΑΣΙΑ ΥΠΟΤΙΤΛΩΝ",
|
||||||
"Edit media": "Επεξεργασία αρχείου",
|
"Edit media": "Επεξεργασία αρχείου",
|
||||||
"Edit profile": "Επεξεργασία προφιλ",
|
"Edit profile": "Επεξεργασία προφίλ",
|
||||||
"Edit subtitle": "Επεξεργασία υποτίτλων",
|
"Edit subtitle": "Επεξεργασία υποτίτλων",
|
||||||
"Featured": "Επιλεγμένα",
|
"Featured": "Επιλεγμένα",
|
||||||
"Go": "Πήγαινε",
|
"Go": "Μετάβαση",
|
||||||
"History": "Ιστορικό",
|
"History": "Ιστορικό",
|
||||||
"Home": "Αρχική",
|
"Home": "Αρχική",
|
||||||
"Language": "Γλώσσα",
|
"Language": "Γλώσσα",
|
||||||
"Latest": "Πρόσφατα",
|
"Latest": "Πρόσφατα",
|
||||||
"Liked media": "Αγαπημένα",
|
"Liked media": "Αγαπημένα αρχεία",
|
||||||
"Manage comments": "Διαχείριση σχολίων",
|
"Manage comments": "Διαχείριση σχολίων",
|
||||||
"Manage media": "Διαχείριση αρχείων",
|
"Manage media": "Διαχείριση αρχείων",
|
||||||
"Manage users": "Διαχείριση χρηστών",
|
"Manage users": "Διαχείριση χρηστών",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "ΛΙΣΤΕΣ",
|
"PLAYLISTS": "ΛΙΣΤΕΣ",
|
||||||
"Playlists": "Λίστες",
|
"Playlists": "Λίστες",
|
||||||
"Powered by": "Υποστηρίζεται από το",
|
"Powered by": "Υποστηρίζεται από το",
|
||||||
|
"Publish": "Δημοσίευση",
|
||||||
"Published on": "Δημοσιεύτηκε στις",
|
"Published on": "Δημοσιεύτηκε στις",
|
||||||
"Recommended": "Προτεινόμενα",
|
"Recommended": "Προτεινόμενα",
|
||||||
|
"Record Screen": "Καταγραφή οθόνης",
|
||||||
"Register": "Εγγραφή",
|
"Register": "Εγγραφή",
|
||||||
"SAVE": "ΑΠΟΘΗΚΕΥΣΗ",
|
"SAVE": "ΑΠΟΘΗΚΕΥΣΗ",
|
||||||
"SEARCH": "ΑΝΑΖΗΤΗΣΗ",
|
"SEARCH": "ΑΝΑΖΗΤΗΣΗ",
|
||||||
@ -54,20 +59,26 @@ translation_strings = {
|
|||||||
"Select": "Επιλογή",
|
"Select": "Επιλογή",
|
||||||
"Sign in": "Σύνδεση",
|
"Sign in": "Σύνδεση",
|
||||||
"Sign out": "Αποσύνδεση",
|
"Sign out": "Αποσύνδεση",
|
||||||
|
"Start Recording": "Έναρξη εγγραφής",
|
||||||
|
"Stop Recording": "Διακοπή εγγραφής",
|
||||||
"Subtitle was added": "Οι υπότιτλοι προστέθηκαν",
|
"Subtitle was added": "Οι υπότιτλοι προστέθηκαν",
|
||||||
|
"Subtitles": "Υπότιτλοι",
|
||||||
"Tags": "Ετικέτες",
|
"Tags": "Ετικέτες",
|
||||||
"Terms": "Όροι",
|
"Terms": "Όροι",
|
||||||
|
"Trim": "Περικοπή",
|
||||||
"UPLOAD": "ΑΝΕΒΑΣΜΑ",
|
"UPLOAD": "ΑΝΕΒΑΣΜΑ",
|
||||||
"Up next": "Επόμενο",
|
"Up next": "Επόμενο",
|
||||||
"Upload": "Ανέβασμα αρχείου",
|
"Upload": "Ανέβασμα",
|
||||||
"Upload media": "Ανέβασμα αρχείων",
|
"Upload media": "Ανέβασμα αρχείων",
|
||||||
"Uploads": "Ανεβάσματα",
|
"Uploads": "Ανεβάσματα",
|
||||||
"VIEW ALL": "ΔΕΣ ΤΑ ΟΛΑ",
|
"VIEW ALL": "ΔΕΣ ΤΑ ΟΛΑ",
|
||||||
"View all": "Δές τα όλα",
|
"View all": "Δες τα όλα",
|
||||||
|
"View media": "Προβολή αρχείου",
|
||||||
"comment": "σχόλιο",
|
"comment": "σχόλιο",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "είναι ένα σύγχρονο, πλήρως λειτουργικό ανοιχτού κώδικα CMS βίντεο και πολυμέσων. Αναπτύχθηκε για να καλύψει τις ανάγκες των σύγχρονων πλατφορμών ιστού για την προβολή και την κοινοποίηση πολυμέσων",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "είναι ένα σύγχρονο, πλήρως λειτουργικό ανοιχτού κώδικα CMS βίντεο και πολυμέσων. Αναπτύχθηκε για να καλύψει τις ανάγκες των σύγχρονων πλατφορμών ιστού για την προβολή και την κοινοποίηση πολυμέσων",
|
||||||
"media in category": "αρχεία στην κατηγορία",
|
"media in category": "αρχεία στην κατηγορία",
|
||||||
"media in tag": "αρχεία με ετικέτα",
|
"media in tag": "αρχεία με ετικέτα",
|
||||||
|
"or": "ή",
|
||||||
"view": "προβολή",
|
"view": "προβολή",
|
||||||
"views": "προβολές",
|
"views": "προβολές",
|
||||||
"yet": "ακόμα",
|
"yet": "ακόμα",
|
||||||
@ -82,10 +93,10 @@ replacement_strings = {
|
|||||||
"Jul": "Ιουλ",
|
"Jul": "Ιουλ",
|
||||||
"Jun": "Ιουν",
|
"Jun": "Ιουν",
|
||||||
"Mar": "Μαρ",
|
"Mar": "Μαρ",
|
||||||
"May": "Μαϊ",
|
"May": "Μάι",
|
||||||
"Nov": "Νοε",
|
"Nov": "Νοε",
|
||||||
"Oct": "Οκτ",
|
"Oct": "Οκτ",
|
||||||
"Sep": "Σεπτ",
|
"Sep": "Σεπ",
|
||||||
"day ago": "μέρα πριν",
|
"day ago": "μέρα πριν",
|
||||||
"days ago": "μέρες πριν",
|
"days ago": "μέρες πριν",
|
||||||
"hour ago": "ώρα πριν",
|
"hour ago": "ώρα πριν",
|
||||||
|
|||||||
@ -2,17 +2,20 @@ translation_strings = {
|
|||||||
"ABOUT": "",
|
"ABOUT": "",
|
||||||
"AUTOPLAY": "",
|
"AUTOPLAY": "",
|
||||||
"Add a ": "",
|
"Add a ": "",
|
||||||
|
"Browse your files": "",
|
||||||
"COMMENT": "",
|
"COMMENT": "",
|
||||||
"Categories": "",
|
"Categories": "",
|
||||||
"Category": "",
|
"Category": "",
|
||||||
"Change Language": "",
|
"Change Language": "",
|
||||||
"Change password": "",
|
"Change password": "",
|
||||||
"About": "",
|
"About": "",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "",
|
||||||
"Comment": "",
|
"Comment": "",
|
||||||
"Comments": "",
|
"Comments": "",
|
||||||
"Comments are disabled": "",
|
"Comments are disabled": "",
|
||||||
"Contact": "",
|
"Contact": "",
|
||||||
"DELETE MEDIA": "",
|
"DELETE MEDIA": "",
|
||||||
|
"Drag and drop files": "",
|
||||||
"DOWNLOAD": "",
|
"DOWNLOAD": "",
|
||||||
"EDIT MEDIA": "",
|
"EDIT MEDIA": "",
|
||||||
"EDIT PROFILE": "",
|
"EDIT PROFILE": "",
|
||||||
@ -42,21 +45,27 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "",
|
"PLAYLISTS": "",
|
||||||
"Playlists": "",
|
"Playlists": "",
|
||||||
"Powered by": "",
|
"Powered by": "",
|
||||||
|
"Publish": "",
|
||||||
"Published on": "",
|
"Published on": "",
|
||||||
"Recommended": "",
|
"Recommended": "",
|
||||||
|
"Record Screen": "",
|
||||||
"Register": "",
|
"Register": "",
|
||||||
"SAVE": "",
|
"SAVE": "",
|
||||||
"SEARCH": "",
|
"SEARCH": "",
|
||||||
"SHARE": "",
|
"SHARE": "",
|
||||||
"SHOW MORE": "",
|
"SHOW MORE": "",
|
||||||
"SUBMIT": "",
|
"SUBMIT": "",
|
||||||
|
"Subtitles": "",
|
||||||
"Search": "",
|
"Search": "",
|
||||||
"Select": "",
|
"Select": "",
|
||||||
"Sign in": "",
|
"Sign in": "",
|
||||||
"Sign out": "",
|
"Sign out": "",
|
||||||
|
"Start Recording": "",
|
||||||
|
"Stop Recording": "",
|
||||||
"Subtitle was added": "",
|
"Subtitle was added": "",
|
||||||
"Tags": "",
|
"Tags": "",
|
||||||
"Terms": "",
|
"Terms": "",
|
||||||
|
"Trim": "",
|
||||||
"UPLOAD": "",
|
"UPLOAD": "",
|
||||||
"Up next": "",
|
"Up next": "",
|
||||||
"Upload": "",
|
"Upload": "",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "",
|
"Uploads": "",
|
||||||
"VIEW ALL": "",
|
"VIEW ALL": "",
|
||||||
"View all": "",
|
"View all": "",
|
||||||
|
"View media": "",
|
||||||
"comment": "",
|
"comment": "",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "",
|
||||||
"media in category": "",
|
"media in category": "",
|
||||||
"media in tag": "",
|
"media in tag": "",
|
||||||
|
"or": "",
|
||||||
"view": "",
|
"view": "",
|
||||||
"views": "",
|
"views": "",
|
||||||
"yet": "",
|
"yet": "",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Reproducción automática",
|
"AUTOPLAY": "Reproducción automática",
|
||||||
"About": "Acerca de",
|
"About": "Acerca de",
|
||||||
"Add a ": "Agregar un ",
|
"Add a ": "Agregar un ",
|
||||||
|
"Browse your files": "Explorar sus archivos",
|
||||||
"COMMENT": "COMENTARIO",
|
"COMMENT": "COMENTARIO",
|
||||||
"Categories": "Categorías",
|
"Categories": "Categorías",
|
||||||
"Category": "Categoría",
|
"Category": "Categoría",
|
||||||
"Change Language": "Cambiar idioma",
|
"Change Language": "Cambiar idioma",
|
||||||
"Change password": "Cambiar contraseña",
|
"Change password": "Cambiar contraseña",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Haga clic en 'Iniciar grabación' y seleccione la pantalla o pestaña para grabar. Una vez finalizada la grabación, haga clic en 'Detener grabación' y la grabación se subirá.",
|
||||||
"Comment": "Comentario",
|
"Comment": "Comentario",
|
||||||
"Comments": "Comentarios",
|
"Comments": "Comentarios",
|
||||||
"Comments are disabled": "Los comentarios están deshabilitados",
|
"Comments are disabled": "Los comentarios están deshabilitados",
|
||||||
"Contact": "Contacto",
|
"Contact": "Contacto",
|
||||||
"DELETE MEDIA": "ELIMINAR MEDIOS",
|
"DELETE MEDIA": "ELIMINAR MEDIOS",
|
||||||
"DOWNLOAD": "DESCARGAR",
|
"DOWNLOAD": "DESCARGAR",
|
||||||
|
"Drag and drop files": "Arrastre y suelte archivos",
|
||||||
"EDIT MEDIA": "EDITAR MEDIOS",
|
"EDIT MEDIA": "EDITAR MEDIOS",
|
||||||
"EDIT PROFILE": "EDITAR PERFIL",
|
"EDIT PROFILE": "EDITAR PERFIL",
|
||||||
"EDIT SUBTITLE": "EDITAR SUBTÍTULO",
|
"EDIT SUBTITLE": "EDITAR SUBTÍTULO",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "LISTAS DE REPRODUCCIÓN",
|
"PLAYLISTS": "LISTAS DE REPRODUCCIÓN",
|
||||||
"Playlists": "Listas de reproducción",
|
"Playlists": "Listas de reproducción",
|
||||||
"Powered by": "Desarrollado por",
|
"Powered by": "Desarrollado por",
|
||||||
|
"Publish": "Publicar",
|
||||||
"Published on": "Publicado en",
|
"Published on": "Publicado en",
|
||||||
"Recommended": "Recomendado",
|
"Recommended": "Recomendado",
|
||||||
|
"Record Screen": "Grabar pantalla",
|
||||||
"Register": "Registrarse",
|
"Register": "Registrarse",
|
||||||
"SAVE": "GUARDAR",
|
"SAVE": "GUARDAR",
|
||||||
"SEARCH": "BUSCAR",
|
"SEARCH": "BUSCAR",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Seleccionar",
|
"Select": "Seleccionar",
|
||||||
"Sign in": "Iniciar sesión",
|
"Sign in": "Iniciar sesión",
|
||||||
"Sign out": "Cerrar sesión",
|
"Sign out": "Cerrar sesión",
|
||||||
|
"Start Recording": "Iniciar grabación",
|
||||||
|
"Stop Recording": "Detener grabación",
|
||||||
"Subtitle was added": "El subtítulo fue agregado",
|
"Subtitle was added": "El subtítulo fue agregado",
|
||||||
|
"Subtitles": "Subtítulos",
|
||||||
"Tags": "Etiquetas",
|
"Tags": "Etiquetas",
|
||||||
"Terms": "Términos",
|
"Terms": "Términos",
|
||||||
|
"Trim": "Recortar",
|
||||||
"UPLOAD": "SUBIR",
|
"UPLOAD": "SUBIR",
|
||||||
"Up next": "A continuación",
|
"Up next": "A continuación",
|
||||||
"Upload": "Subir",
|
"Upload": "Subir",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Subidas",
|
"Uploads": "Subidas",
|
||||||
"VIEW ALL": "VER TODO",
|
"VIEW ALL": "VER TODO",
|
||||||
"View all": "Ver todo",
|
"View all": "Ver todo",
|
||||||
|
"View media": "Ver medios",
|
||||||
"comment": "comentario",
|
"comment": "comentario",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "es un CMS de video y medios de código abierto, moderno y completamente equipado. Está desarrollado para satisfacer las necesidades de las plataformas web modernas para ver y compartir medios",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "es un CMS de video y medios de código abierto, moderno y completamente equipado. Está desarrollado para satisfacer las necesidades de las plataformas web modernas para ver y compartir medios",
|
||||||
"media in category": "medios en la categoría",
|
"media in category": "medios en la categoría",
|
||||||
"media in tag": "medios en la etiqueta",
|
"media in tag": "medios en la etiqueta",
|
||||||
|
"or": "o",
|
||||||
"view": "vista",
|
"view": "vista",
|
||||||
"views": "vistas",
|
"views": "vistas",
|
||||||
"yet": "aún",
|
"yet": "aún",
|
||||||
|
|||||||
@ -3,18 +3,21 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Lecture automatique",
|
"AUTOPLAY": "Lecture automatique",
|
||||||
"About": "À propos",
|
"About": "À propos",
|
||||||
"Add a": "Ajouter un",
|
"Add a": "Ajouter un",
|
||||||
"Add a ": "",
|
"Add a ": "Ajouter un ",
|
||||||
|
"Browse your files": "Parcourir vos fichiers",
|
||||||
"COMMENT": "COMMENTAIRE",
|
"COMMENT": "COMMENTAIRE",
|
||||||
"Categories": "Catégories",
|
"Categories": "Catégories",
|
||||||
"Category": "Catégorie",
|
"Category": "Catégorie",
|
||||||
"Change Language": "Changer de langue",
|
"Change Language": "Changer de langue",
|
||||||
"Change password": "Changer le mot de passe",
|
"Change password": "Changer le mot de passe",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Cliquez sur 'Démarrer l'enregistrement' et sélectionnez l'écran ou l'onglet à enregistrer. Une fois l'enregistrement terminé, cliquez sur 'Arrêter l'enregistrement', et l'enregistrement sera téléversé.",
|
||||||
"Comment": "Commentaire",
|
"Comment": "Commentaire",
|
||||||
"Comments": "Commentaires",
|
"Comments": "Commentaires",
|
||||||
"Comments are disabled": "Les commentaires sont désactivés",
|
"Comments are disabled": "Les commentaires sont désactivés",
|
||||||
"Contact": "Contact",
|
"Contact": "Contact",
|
||||||
"DELETE MEDIA": "SUPPRIMER LE MÉDIA",
|
"DELETE MEDIA": "SUPPRIMER LE MÉDIA",
|
||||||
"DOWNLOAD": "TÉLÉCHARGER",
|
"DOWNLOAD": "TÉLÉCHARGER",
|
||||||
|
"Drag and drop files": "Glisser-déposer des fichiers",
|
||||||
"EDIT MEDIA": "MODIFIER LE MÉDIA",
|
"EDIT MEDIA": "MODIFIER LE MÉDIA",
|
||||||
"EDIT PROFILE": "MODIFIER LE PROFIL",
|
"EDIT PROFILE": "MODIFIER LE PROFIL",
|
||||||
"EDIT SUBTITLE": "MODIFIER LE SOUS-TITRE",
|
"EDIT SUBTITLE": "MODIFIER LE SOUS-TITRE",
|
||||||
@ -43,8 +46,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "PLAYLISTS",
|
"PLAYLISTS": "PLAYLISTS",
|
||||||
"Playlists": "Playlists",
|
"Playlists": "Playlists",
|
||||||
"Powered by": "Propulsé par",
|
"Powered by": "Propulsé par",
|
||||||
|
"Publish": "Publier",
|
||||||
"Published on": "Publié le",
|
"Published on": "Publié le",
|
||||||
"Recommended": "Recommandé",
|
"Recommended": "Recommandé",
|
||||||
|
"Record Screen": "Enregistrer l'écran",
|
||||||
"Register": "S'inscrire",
|
"Register": "S'inscrire",
|
||||||
"SAVE": "ENREGISTRER",
|
"SAVE": "ENREGISTRER",
|
||||||
"SEARCH": "RECHERCHER",
|
"SEARCH": "RECHERCHER",
|
||||||
@ -55,9 +60,13 @@ translation_strings = {
|
|||||||
"Select": "Sélectionner",
|
"Select": "Sélectionner",
|
||||||
"Sign in": "Se connecter",
|
"Sign in": "Se connecter",
|
||||||
"Sign out": "Se déconnecter",
|
"Sign out": "Se déconnecter",
|
||||||
|
"Start Recording": "Commencer l'enregistrement",
|
||||||
|
"Stop Recording": "Arrêter l'enregistrement",
|
||||||
"Subtitle was added": "Le sous-titre a été ajouté",
|
"Subtitle was added": "Le sous-titre a été ajouté",
|
||||||
|
"Subtitles": "Sous-titres",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Terms": "Conditions",
|
"Terms": "Conditions",
|
||||||
|
"Trim": "Couper",
|
||||||
"UPLOAD": "TÉLÉCHARGER",
|
"UPLOAD": "TÉLÉCHARGER",
|
||||||
"Up next": "À suivre",
|
"Up next": "À suivre",
|
||||||
"Upload": "Télécharger",
|
"Upload": "Télécharger",
|
||||||
@ -65,10 +74,12 @@ translation_strings = {
|
|||||||
"Uploads": "Téléchargements",
|
"Uploads": "Téléchargements",
|
||||||
"VIEW ALL": "VOIR TOUT",
|
"VIEW ALL": "VOIR TOUT",
|
||||||
"View all": "Voir tout",
|
"View all": "Voir tout",
|
||||||
|
"View media": "Voir le média",
|
||||||
"comment": "commentaire",
|
"comment": "commentaire",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "est un CMS vidéo et média open source moderne et complet. Il est développé pour répondre aux besoins des plateformes web modernes pour la visualisation et le partage de médias",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "est un CMS vidéo et média open source moderne et complet. Il est développé pour répondre aux besoins des plateformes web modernes pour la visualisation et le partage de médias",
|
||||||
"media in category": "média dans la catégorie",
|
"media in category": "média dans la catégorie",
|
||||||
"media in tag": "média dans le tag",
|
"media in tag": "média dans le tag",
|
||||||
|
"or": "ou",
|
||||||
"view": "vue",
|
"view": "vue",
|
||||||
"views": "vues",
|
"views": "vues",
|
||||||
"yet": "encore",
|
"yet": "encore",
|
||||||
|
|||||||
@ -1,104 +1,115 @@
|
|||||||
translation_strings = {
|
translation_strings = {
|
||||||
'ABOUT': 'על אודות',
|
"ABOUT": "על אודות",
|
||||||
'AUTOPLAY': 'ניגון אוטומטי',
|
"AUTOPLAY": "ניגון אוטומטי",
|
||||||
'About': 'על אודות',
|
"About": "על אודות",
|
||||||
'Add a ': 'הוסף',
|
"Add a ": "הוסף",
|
||||||
'COMMENT': 'תגובה',
|
"Browse your files": "עיין בקבצים שלך",
|
||||||
'Categories': 'קטגוריות',
|
"COMMENT": "תגובה",
|
||||||
'Category': 'קטגוריה',
|
"Categories": "קטגוריות",
|
||||||
'Change Language': 'שנה שפה',
|
"Category": "קטגוריה",
|
||||||
'Change password': 'שנה סיסמה',
|
"Change Language": "שנה שפה",
|
||||||
'Comment': 'תגובה',
|
"Change password": "שנה סיסמה",
|
||||||
'Comments': 'תגובות',
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "לחץ על 'התחל הקלטה' ובחר את המסך או הכרטיסייה להקלטה. לאחר סיום ההקלטה, לחץ על 'עצור הקלטה', וההקלטה תועלה.",
|
||||||
'Comments are disabled': 'התגובות מושבתות',
|
"Comment": "תגובה",
|
||||||
'Contact': 'צור קשר',
|
"Comments": "תגובות",
|
||||||
'DELETE MEDIA': 'מחק מדיה',
|
"Comments are disabled": "התגובות מושבתות",
|
||||||
'DOWNLOAD': 'הורד',
|
"Contact": "צור קשר",
|
||||||
'EDIT MEDIA': 'ערוך מדיה',
|
"DELETE MEDIA": "מחק מדיה",
|
||||||
'EDIT PROFILE': 'ערוך פרופיל',
|
"DOWNLOAD": "הורד",
|
||||||
'EDIT SUBTITLE': 'ערוך כתוביות',
|
"Drag and drop files": "גרור ושחרר קבצים",
|
||||||
'Edit media': 'ערוך מדיה',
|
"EDIT MEDIA": "ערוך מדיה",
|
||||||
'Edit profile': 'ערוך פרופיל',
|
"EDIT PROFILE": "ערוך פרופיל",
|
||||||
'Edit subtitle': 'ערוך כתוביות',
|
"EDIT SUBTITLE": "ערוך כתוביות",
|
||||||
'Featured': 'מומלצים',
|
"Edit media": "ערוך מדיה",
|
||||||
'Go': 'בצע', # in context of "execution"
|
"Edit profile": "ערוך פרופיל",
|
||||||
'History': 'היסטוריה',
|
"Edit subtitle": "ערוך כתוביות",
|
||||||
'Home': 'דף הבית',
|
"Featured": "מומלצים",
|
||||||
'Language': 'שפה',
|
"Go": "בצע",
|
||||||
'Latest': 'העדכונים האחרונים',
|
"History": "היסטוריה",
|
||||||
'Liked media': 'מדיה שאהבתי',
|
"Home": "דף הבית",
|
||||||
'Manage comments': 'ניהול תגובות',
|
"Language": "שפה",
|
||||||
'Manage media': 'ניהול מדיה',
|
"Latest": "העדכונים האחרונים",
|
||||||
'Manage users': 'ניהול משתמשים',
|
"Liked media": "מדיה שאהבתי",
|
||||||
'Media': 'מדיה',
|
"Manage comments": "ניהול תגובות",
|
||||||
'Media was edited': 'המדיה נערכה',
|
"Manage media": "ניהול מדיה",
|
||||||
'Members': 'משתמשים',
|
"Manage users": "ניהול משתמשים",
|
||||||
'My media': 'המדיה שלי',
|
"Media": "מדיה",
|
||||||
'My playlists': 'הפלייליסטים שלי',
|
"Media was edited": "המדיה נערכה",
|
||||||
'No': 'לא', # in context of "no comments", etc.
|
"Members": "משתמשים",
|
||||||
'No comment yet': 'עדיין אין תגובות',
|
"My media": "המדיה שלי",
|
||||||
'No comments yet': 'עדיין אין תגובות',
|
"My playlists": "הפלייליסטים שלי",
|
||||||
'No results for': 'אין תוצאות עבור',
|
"No": "לא",
|
||||||
'PLAYLISTS': 'פלייליסטים',
|
"No comment yet": "עדיין אין תגובות",
|
||||||
'Playlists': 'פלייליסטים',
|
"No comments yet": "עדיין אין תגובות",
|
||||||
'Powered by': 'מופעל על ידי',
|
"No results for": "אין תוצאות עבור",
|
||||||
'Published on': 'פורסם בתאריך',
|
"PLAYLISTS": "פלייליסטים",
|
||||||
'Recommended': 'מומלץ',
|
"Playlists": "פלייליסטים",
|
||||||
'Register': 'הרשמה',
|
"Powered by": "מופעל על ידי",
|
||||||
'SAVE': 'שמור',
|
"Publish": "פרסם",
|
||||||
'SEARCH': 'חפש',
|
"Published on": "פורסם בתאריך",
|
||||||
'SHARE': 'שתף',
|
"Recommended": "מומלץ",
|
||||||
'SHOW MORE': 'הצג עוד',
|
"Record Screen": "הקלטת מסך",
|
||||||
'SUBMIT': 'שלח',
|
"Register": "הרשמה",
|
||||||
'Search': 'חפש',
|
"SAVE": "שמור",
|
||||||
'Select': 'בחר',
|
"SEARCH": "חפש",
|
||||||
'Sign in': 'התחבר',
|
"SHARE": "שתף",
|
||||||
'Sign out': 'התנתק',
|
"SHOW MORE": "הצג עוד",
|
||||||
'Subtitle was added': 'הכתובית נוספה',
|
"SUBMIT": "שלח",
|
||||||
'Tags': 'תגיות',
|
"Search": "חפש",
|
||||||
'Terms': 'תנאים',
|
"Select": "בחר",
|
||||||
'UPLOAD': 'העלה',
|
"Sign in": "התחבר",
|
||||||
'Up next': 'הבא בתור',
|
"Sign out": "התנתק",
|
||||||
'Upload': 'העלה',
|
"Start Recording": "התחל הקלטה",
|
||||||
'Upload media': 'העלה מדיה',
|
"Stop Recording": "עצור הקלטה",
|
||||||
'Uploads': 'העלאות',
|
"Subtitle was added": "הכתובית נוספה",
|
||||||
'VIEW ALL': 'הצג הכל',
|
"Subtitles": "כתוביות",
|
||||||
'View all': 'הצג הכל',
|
"Tags": "תגיות",
|
||||||
'comment': 'תגובה',
|
"Terms": "תנאים",
|
||||||
'is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media': 'מערכת ניהול מדיה ווידאו מודרנית, פתוחה ומלאה בפיצ׳רים. פותחה כדי לענות על הצרכים של פלטפורמות אינטרנט מודרניות לצפייה ושיתוף מדיה.',
|
"Trim": "גזירה",
|
||||||
'media in category': 'מדיה בקטגוריה',
|
"UPLOAD": "העלה",
|
||||||
'media in tag': 'מדיה בתגית',
|
"Up next": "הבא בתור",
|
||||||
'view': 'צפיות',
|
"Upload": "העלה",
|
||||||
'views': 'צפיות',
|
"Upload media": "העלה מדיה",
|
||||||
'yet': 'עדיין',
|
"Uploads": "העלאות",
|
||||||
|
"VIEW ALL": "הצג הכל",
|
||||||
|
"View all": "הצג הכל",
|
||||||
|
"View media": "צפה במדיה",
|
||||||
|
"comment": "תגובה",
|
||||||
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "מערכת ניהול מדיה ווידאו מודרנית, פתוחה ומלאה בפיצ׳רים. פותחה כדי לענות על הצרכים של פלטפורמות אינטרנט מודרניות לצפייה ושיתוף מדיה.",
|
||||||
|
"media in category": "מדיה בקטגוריה",
|
||||||
|
"media in tag": "מדיה בתגית",
|
||||||
|
"or": "או",
|
||||||
|
"view": "צפיות",
|
||||||
|
"views": "צפיות",
|
||||||
|
"yet": "עדיין",
|
||||||
}
|
}
|
||||||
|
|
||||||
replacement_strings = {
|
replacement_strings = {
|
||||||
'Apr': 'אפריל',
|
"Apr": "אפריל",
|
||||||
'Aug': 'אוגוסט',
|
"Aug": "אוגוסט",
|
||||||
'Dec': 'דצמבר',
|
"Dec": "דצמבר",
|
||||||
'Feb': 'פברואר',
|
"Feb": "פברואר",
|
||||||
'Jan': 'ינואר',
|
"Jan": "ינואר",
|
||||||
'Jul': 'יולי',
|
"Jul": "יולי",
|
||||||
'Jun': 'יוני',
|
"Jun": "יוני",
|
||||||
'Mar': 'מרץ',
|
"Mar": "מרץ",
|
||||||
'May': 'מאי',
|
"May": "מאי",
|
||||||
'Nov': 'נובמבר',
|
"Nov": "נובמבר",
|
||||||
'Oct': 'אוקטובר',
|
"Oct": "אוקטובר",
|
||||||
'Sep': 'ספטמבר',
|
"Sep": "ספטמבר",
|
||||||
'day ago': 'לפני יום',
|
"day ago": "לפני יום",
|
||||||
'days ago': 'לפני ימים',
|
"days ago": "לפני ימים",
|
||||||
'hour ago': 'לפני שעה',
|
"hour ago": "לפני שעה",
|
||||||
'hours ago': 'לפני שעות',
|
"hours ago": "לפני שעות",
|
||||||
'just now': 'הרגע',
|
"just now": "הרגע",
|
||||||
'minute ago': 'לפני דקה',
|
"minute ago": "לפני דקה",
|
||||||
'minutes ago': 'לפני דקות',
|
"minutes ago": "לפני דקות",
|
||||||
'month ago': 'לפני חודש',
|
"month ago": "לפני חודש",
|
||||||
'months ago': 'לפני חודשים',
|
"months ago": "לפני חודשים",
|
||||||
'second ago': 'לפני שנייה',
|
"second ago": "לפני שנייה",
|
||||||
'seconds ago': 'לפני שניות',
|
"seconds ago": "לפני שניות",
|
||||||
'week ago': 'לפני שבוע',
|
"week ago": "לפני שבוע",
|
||||||
'weeks ago': 'לפני שבועות',
|
"weeks ago": "לפני שבועות",
|
||||||
'year ago': 'לפני שנה',
|
"year ago": "לפני שנה",
|
||||||
'years ago': 'לפני שנים',
|
"years ago": "לפני שנים",
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "स्वतः चलाएं",
|
"AUTOPLAY": "स्वतः चलाएं",
|
||||||
"About": "के बारे में",
|
"About": "के बारे में",
|
||||||
"Add a ": "जोड़ें",
|
"Add a ": "जोड़ें",
|
||||||
|
"Browse your files": "अपनी फ़ाइलें ब्राउज़ करें",
|
||||||
"COMMENT": "टिप्पणी",
|
"COMMENT": "टिप्पणी",
|
||||||
"Categories": "श्रेणियाँ",
|
"Categories": "श्रेणियाँ",
|
||||||
"Category": "श्रेणी",
|
"Category": "श्रेणी",
|
||||||
"Change Language": "भाषा बदलें",
|
"Change Language": "भाषा बदलें",
|
||||||
"Change password": "पासवर्ड बदलें",
|
"Change password": "पासवर्ड बदलें",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "'रिकॉर्डिंग प्रारंभ करें' पर क्लिक करें और रिकॉर्ड करने के लिए स्क्रीन या टैब का चयन करें। रिकॉर्डिंग समाप्त होने के बाद, 'रिकॉर्डिंग रोकें' पर क्लिक करें, और रिकॉर्डिंग अपलोड हो जाएगी।",
|
||||||
"Comment": "टिप्पणी",
|
"Comment": "टिप्पणी",
|
||||||
"Comments": "टिप्पणियाँ",
|
"Comments": "टिप्पणियाँ",
|
||||||
"Comments are disabled": "टिप्पणियाँ अक्षम हैं",
|
"Comments are disabled": "टिप्पणियाँ अक्षम हैं",
|
||||||
"Contact": "संपर्क करें",
|
"Contact": "संपर्क करें",
|
||||||
"DELETE MEDIA": "मीडिया हटाएं",
|
"DELETE MEDIA": "मीडिया हटाएं",
|
||||||
"DOWNLOAD": "डाउनलोड करें",
|
"DOWNLOAD": "डाउनलोड करें",
|
||||||
|
"Drag and drop files": "फ़ाइलें खींचें और छोड़ें",
|
||||||
"EDIT MEDIA": "मीडिया संपादित करें",
|
"EDIT MEDIA": "मीडिया संपादित करें",
|
||||||
"EDIT PROFILE": "प्रोफ़ाइल संपादित करें",
|
"EDIT PROFILE": "प्रोफ़ाइल संपादित करें",
|
||||||
"EDIT SUBTITLE": "उपशीर्षक संपादित करें",
|
"EDIT SUBTITLE": "उपशीर्षक संपादित करें",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "प्लेलिस्ट",
|
"PLAYLISTS": "प्लेलिस्ट",
|
||||||
"Playlists": "प्लेलिस्ट",
|
"Playlists": "प्लेलिस्ट",
|
||||||
"Powered by": "द्वारा संचालित",
|
"Powered by": "द्वारा संचालित",
|
||||||
|
"Publish": "प्रकाशित करें",
|
||||||
"Published on": "पर प्रकाशित",
|
"Published on": "पर प्रकाशित",
|
||||||
"Recommended": "अनुशंसित",
|
"Recommended": "अनुशंसित",
|
||||||
|
"Record Screen": "स्क्रीन रिकॉर्ड करें",
|
||||||
"Register": "पंजीकरण करें",
|
"Register": "पंजीकरण करें",
|
||||||
"SAVE": "सहेजें",
|
"SAVE": "सहेजें",
|
||||||
"SEARCH": "खोजें",
|
"SEARCH": "खोजें",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "चुनें",
|
"Select": "चुनें",
|
||||||
"Sign in": "साइन इन करें",
|
"Sign in": "साइन इन करें",
|
||||||
"Sign out": "साइन आउट करें",
|
"Sign out": "साइन आउट करें",
|
||||||
|
"Start Recording": "रिकॉर्डिंग प्रारंभ करें",
|
||||||
|
"Stop Recording": "रिकॉर्डिंग रोकें",
|
||||||
"Subtitle was added": "उपशीर्षक जोड़ा गया",
|
"Subtitle was added": "उपशीर्षक जोड़ा गया",
|
||||||
|
"Subtitles": "उपशीर्षक",
|
||||||
"Tags": "टैग",
|
"Tags": "टैग",
|
||||||
"Terms": "शर्तें",
|
"Terms": "शर्तें",
|
||||||
|
"Trim": "छांटें",
|
||||||
"UPLOAD": "अपलोड करें",
|
"UPLOAD": "अपलोड करें",
|
||||||
"Up next": "अगला",
|
"Up next": "अगला",
|
||||||
"Upload": "अपलोड करें",
|
"Upload": "अपलोड करें",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "अपलोड",
|
"Uploads": "अपलोड",
|
||||||
"VIEW ALL": "सभी देखें",
|
"VIEW ALL": "सभी देखें",
|
||||||
"View all": "सभी देखें",
|
"View all": "सभी देखें",
|
||||||
|
"View media": "मीडिया देखें",
|
||||||
"comment": "टिप्पणी",
|
"comment": "टिप्पणी",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "एक आधुनिक, पूर्ण विशेषताओं वाला ओपन सोर्स वीडियो और मीडिया CMS है। इसे मीडिया देखने और साझा करने के लिए आधुनिक वेब प्लेटफार्मों की आवश्यकताओं को पूरा करने के लिए विकसित किया गया है",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "एक आधुनिक, पूर्ण विशेषताओं वाला ओपन सोर्स वीडियो और मीडिया CMS है। इसे मीडिया देखने और साझा करने के लिए आधुनिक वेब प्लेटफार्मों की आवश्यकताओं को पूरा करने के लिए विकसित किया गया है",
|
||||||
"media in category": "श्रेणी में मीडिया",
|
"media in category": "श्रेणी में मीडिया",
|
||||||
"media in tag": "टैग में मीडिया",
|
"media in tag": "टैग में मीडिया",
|
||||||
|
"or": "या",
|
||||||
"view": "देखें",
|
"view": "देखें",
|
||||||
"views": "दृश्य",
|
"views": "दृश्य",
|
||||||
"yet": "अभी तक",
|
"yet": "अभी तक",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "PUTAR OTOMATIS",
|
"AUTOPLAY": "PUTAR OTOMATIS",
|
||||||
"About": "Tentang",
|
"About": "Tentang",
|
||||||
"Add a ": "Tambahkan ",
|
"Add a ": "Tambahkan ",
|
||||||
|
"Browse your files": "Jelajahi file Anda",
|
||||||
"COMMENT": "KOMENTAR",
|
"COMMENT": "KOMENTAR",
|
||||||
"Categories": "Kategori",
|
"Categories": "Kategori",
|
||||||
"Category": "Kategori",
|
"Category": "Kategori",
|
||||||
"Change Language": "Ganti Bahasa",
|
"Change Language": "Ganti Bahasa",
|
||||||
"Change password": "Ganti kata sandi",
|
"Change password": "Ganti kata sandi",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Klik 'Mulai Merekam' dan pilih layar atau tab untuk merekam. Setelah perekaman selesai, klik 'Hentikan Perekaman,' dan rekaman akan diunggah.",
|
||||||
"Comment": "Komentar",
|
"Comment": "Komentar",
|
||||||
"Comments": "Komentar",
|
"Comments": "Komentar",
|
||||||
"Comments are disabled": "Komentar dinonaktifkan",
|
"Comments are disabled": "Komentar dinonaktifkan",
|
||||||
"Contact": "Kontak",
|
"Contact": "Kontak",
|
||||||
"DELETE MEDIA": "HAPUS MEDIA",
|
"DELETE MEDIA": "HAPUS MEDIA",
|
||||||
"DOWNLOAD": "UNDUH",
|
"DOWNLOAD": "UNDUH",
|
||||||
|
"Drag and drop files": "Seret dan lepas file",
|
||||||
"EDIT MEDIA": "EDIT MEDIA",
|
"EDIT MEDIA": "EDIT MEDIA",
|
||||||
"EDIT PROFILE": "EDIT PROFIL",
|
"EDIT PROFILE": "EDIT PROFIL",
|
||||||
"EDIT SUBTITLE": "EDIT SUBTITLE",
|
"EDIT SUBTITLE": "EDIT SUBTITLE",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "DAFTAR PUTAR",
|
"PLAYLISTS": "DAFTAR PUTAR",
|
||||||
"Playlists": "Daftar putar",
|
"Playlists": "Daftar putar",
|
||||||
"Powered by": "Didukung oleh",
|
"Powered by": "Didukung oleh",
|
||||||
|
"Publish": "Terbitkan",
|
||||||
"Published on": "Diterbitkan pada",
|
"Published on": "Diterbitkan pada",
|
||||||
"Recommended": "Direkomendasikan",
|
"Recommended": "Direkomendasikan",
|
||||||
|
"Record Screen": "Rekam Layar",
|
||||||
"Register": "Daftar",
|
"Register": "Daftar",
|
||||||
"SAVE": "SIMPAN",
|
"SAVE": "SIMPAN",
|
||||||
"SEARCH": "CARI",
|
"SEARCH": "CARI",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Pilih",
|
"Select": "Pilih",
|
||||||
"Sign in": "Masuk",
|
"Sign in": "Masuk",
|
||||||
"Sign out": "Keluar",
|
"Sign out": "Keluar",
|
||||||
|
"Start Recording": "Mulai Merekam",
|
||||||
|
"Stop Recording": "Hentikan Perekaman",
|
||||||
"Subtitle was added": "Subtitle telah ditambahkan",
|
"Subtitle was added": "Subtitle telah ditambahkan",
|
||||||
|
"Subtitles": "Subtitel",
|
||||||
"Tags": "Tag",
|
"Tags": "Tag",
|
||||||
"Terms": "Ketentuan",
|
"Terms": "Ketentuan",
|
||||||
|
"Trim": "Potong",
|
||||||
"UPLOAD": "UNGGAH",
|
"UPLOAD": "UNGGAH",
|
||||||
"Up next": "Selanjutnya",
|
"Up next": "Selanjutnya",
|
||||||
"Upload": "Unggah",
|
"Upload": "Unggah",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Unggahan",
|
"Uploads": "Unggahan",
|
||||||
"VIEW ALL": "LIHAT SEMUA",
|
"VIEW ALL": "LIHAT SEMUA",
|
||||||
"View all": "Lihat semua",
|
"View all": "Lihat semua",
|
||||||
|
"View media": "Lihat media",
|
||||||
"comment": "komentar",
|
"comment": "komentar",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "adalah CMS video dan media open source yang modern dan lengkap. Ini dikembangkan untuk memenuhi kebutuhan platform web modern untuk menonton dan berbagi media",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "adalah CMS video dan media open source yang modern dan lengkap. Ini dikembangkan untuk memenuhi kebutuhan platform web modern untuk menonton dan berbagi media",
|
||||||
"media in category": "media dalam kategori",
|
"media in category": "media dalam kategori",
|
||||||
"media in tag": "media dalam tag",
|
"media in tag": "media dalam tag",
|
||||||
|
"or": "atau",
|
||||||
"view": "lihat",
|
"view": "lihat",
|
||||||
"views": "tampilan",
|
"views": "tampilan",
|
||||||
"yet": "belum",
|
"yet": "belum",
|
||||||
|
|||||||
@ -4,17 +4,20 @@ translation_strings = {
|
|||||||
"About": "Su di noi",
|
"About": "Su di noi",
|
||||||
"Add a": "Aggiungi un",
|
"Add a": "Aggiungi un",
|
||||||
"Add a ": "Aggiungi un ",
|
"Add a ": "Aggiungi un ",
|
||||||
|
"Browse your files": "Sfoglia i tuoi file",
|
||||||
"COMMENT": "COMMENTA",
|
"COMMENT": "COMMENTA",
|
||||||
"Categories": "Categorie",
|
"Categories": "Categorie",
|
||||||
"Category": "Categoria",
|
"Category": "Categoria",
|
||||||
"Change Language": "Cambia lingua",
|
"Change Language": "Cambia lingua",
|
||||||
"Change password": "Cambia password",
|
"Change password": "Cambia password",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Fai clic su 'Avvia registrazione' e seleziona lo schermo o la scheda da registrare. Una volta terminata la registrazione, fai clic su 'Interrompi registrazione' e la registrazione verrà caricata.",
|
||||||
"Comment": "Commento",
|
"Comment": "Commento",
|
||||||
"Comments": "Commenti",
|
"Comments": "Commenti",
|
||||||
"Comments are disabled": "I commenti sono disabilitati",
|
"Comments are disabled": "I commenti sono disabilitati",
|
||||||
"Contact": "Contatti",
|
"Contact": "Contatti",
|
||||||
"DELETE MEDIA": "ELIMINA MEDIA",
|
"DELETE MEDIA": "ELIMINA MEDIA",
|
||||||
"DOWNLOAD": "SCARICA",
|
"DOWNLOAD": "SCARICA",
|
||||||
|
"Drag and drop files": "Trascina e rilascia i file",
|
||||||
"EDIT MEDIA": "MODIFICA IL MEDIA",
|
"EDIT MEDIA": "MODIFICA IL MEDIA",
|
||||||
"EDIT PROFILE": "MODIFICA IL PROFILO",
|
"EDIT PROFILE": "MODIFICA IL PROFILO",
|
||||||
"EDIT SUBTITLE": "MODIFICA I SOTTOTITOLI",
|
"EDIT SUBTITLE": "MODIFICA I SOTTOTITOLI",
|
||||||
@ -43,8 +46,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "PLAYLIST",
|
"PLAYLISTS": "PLAYLIST",
|
||||||
"Playlists": "Playlist",
|
"Playlists": "Playlist",
|
||||||
"Powered by": "Powered by",
|
"Powered by": "Powered by",
|
||||||
|
"Publish": "Pubblica",
|
||||||
"Published on": "Pubblicato il",
|
"Published on": "Pubblicato il",
|
||||||
"Recommended": "Raccomandati",
|
"Recommended": "Raccomandati",
|
||||||
|
"Record Screen": "Registra schermo",
|
||||||
"Register": "Registrati",
|
"Register": "Registrati",
|
||||||
"SAVE": "SALVA",
|
"SAVE": "SALVA",
|
||||||
"SEARCH": "CERCA",
|
"SEARCH": "CERCA",
|
||||||
@ -55,9 +60,13 @@ translation_strings = {
|
|||||||
"Select": "Seleziona",
|
"Select": "Seleziona",
|
||||||
"Sign in": "Login",
|
"Sign in": "Login",
|
||||||
"Sign out": "Logout",
|
"Sign out": "Logout",
|
||||||
|
"Start Recording": "Inizia registrazione",
|
||||||
|
"Stop Recording": "Interrompi registrazione",
|
||||||
"Subtitle was added": "I sottotitoli sono stati aggiunti",
|
"Subtitle was added": "I sottotitoli sono stati aggiunti",
|
||||||
|
"Subtitles": "Sottotitoli",
|
||||||
"Tags": "Tag",
|
"Tags": "Tag",
|
||||||
"Terms": "Termini e condizioni",
|
"Terms": "Termini e condizioni",
|
||||||
|
"Trim": "Taglia",
|
||||||
"UPLOAD": "CARICA",
|
"UPLOAD": "CARICA",
|
||||||
"Up next": "A seguire",
|
"Up next": "A seguire",
|
||||||
"Upload": "Carica",
|
"Upload": "Carica",
|
||||||
@ -65,10 +74,12 @@ translation_strings = {
|
|||||||
"Uploads": "Caricamenti",
|
"Uploads": "Caricamenti",
|
||||||
"VIEW ALL": "MOSTRA TUTTI",
|
"VIEW ALL": "MOSTRA TUTTI",
|
||||||
"View all": "Mostra tutti",
|
"View all": "Mostra tutti",
|
||||||
|
"View media": "Visualizza media",
|
||||||
"comment": "commento",
|
"comment": "commento",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "è un CMS per media open source moderno e completo. È stato sviluppato per rispondere per venire incontro alle esigenze delle moderne piattaforme web di visualizzazione e condivisione media",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "è un CMS per media open source moderno e completo. È stato sviluppato per rispondere per venire incontro alle esigenze delle moderne piattaforme web di visualizzazione e condivisione media",
|
||||||
"media in category": "media nella categoria",
|
"media in category": "media nella categoria",
|
||||||
"media in tag": "media con tag",
|
"media in tag": "media con tag",
|
||||||
|
"or": "o",
|
||||||
"view": "visualizzazione",
|
"view": "visualizzazione",
|
||||||
"views": "visualizzazioni",
|
"views": "visualizzazioni",
|
||||||
"yet": "ancora",
|
"yet": "ancora",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "自動再生",
|
"AUTOPLAY": "自動再生",
|
||||||
"About": "約",
|
"About": "約",
|
||||||
"Add a ": "追加",
|
"Add a ": "追加",
|
||||||
|
"Browse your files": "ファイルを参照",
|
||||||
"COMMENT": "コメント",
|
"COMMENT": "コメント",
|
||||||
"Categories": "カテゴリー",
|
"Categories": "カテゴリー",
|
||||||
"Category": "カテゴリー",
|
"Category": "カテゴリー",
|
||||||
"Change Language": "言語を変更",
|
"Change Language": "言語を変更",
|
||||||
"Change password": "パスワードを変更",
|
"Change password": "パスワードを変更",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "「録画開始」をクリックして、録画する画面またはタブを選択します。録画が終了したら、「録画停止」をクリックすると、録画がアップロードされます。",
|
||||||
"Comment": "コメント",
|
"Comment": "コメント",
|
||||||
"Comments": "コメント",
|
"Comments": "コメント",
|
||||||
"Comments are disabled": "コメントは無効です",
|
"Comments are disabled": "コメントは無効です",
|
||||||
"Contact": "連絡先",
|
"Contact": "連絡先",
|
||||||
"DELETE MEDIA": "メディアを削除",
|
"DELETE MEDIA": "メディアを削除",
|
||||||
"DOWNLOAD": "ダウンロード",
|
"DOWNLOAD": "ダウンロード",
|
||||||
|
"Drag and drop files": "ファイルをドラッグアンドドロップ",
|
||||||
"EDIT MEDIA": "メディアを編集",
|
"EDIT MEDIA": "メディアを編集",
|
||||||
"EDIT PROFILE": "プロフィールを編集",
|
"EDIT PROFILE": "プロフィールを編集",
|
||||||
"EDIT SUBTITLE": "字幕を編集",
|
"EDIT SUBTITLE": "字幕を編集",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "プレイリスト",
|
"PLAYLISTS": "プレイリスト",
|
||||||
"Playlists": "プレイリスト",
|
"Playlists": "プレイリスト",
|
||||||
"Powered by": "提供",
|
"Powered by": "提供",
|
||||||
|
"Publish": "公開",
|
||||||
"Published on": "公開日",
|
"Published on": "公開日",
|
||||||
"Recommended": "おすすめ",
|
"Recommended": "おすすめ",
|
||||||
|
"Record Screen": "画面を録画",
|
||||||
"Register": "登録",
|
"Register": "登録",
|
||||||
"SAVE": "保存",
|
"SAVE": "保存",
|
||||||
"SEARCH": "検索",
|
"SEARCH": "検索",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "選択",
|
"Select": "選択",
|
||||||
"Sign in": "サインイン",
|
"Sign in": "サインイン",
|
||||||
"Sign out": "サインアウト",
|
"Sign out": "サインアウト",
|
||||||
|
"Start Recording": "録画開始",
|
||||||
|
"Stop Recording": "録画停止",
|
||||||
"Subtitle was added": "字幕が追加されました",
|
"Subtitle was added": "字幕が追加されました",
|
||||||
|
"Subtitles": "字幕",
|
||||||
"Tags": "タグ",
|
"Tags": "タグ",
|
||||||
"Terms": "利用規約",
|
"Terms": "利用規約",
|
||||||
|
"Trim": "トリム",
|
||||||
"UPLOAD": "アップロード",
|
"UPLOAD": "アップロード",
|
||||||
"Up next": "次に再生",
|
"Up next": "次に再生",
|
||||||
"Upload": "アップロード",
|
"Upload": "アップロード",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "アップロード",
|
"Uploads": "アップロード",
|
||||||
"VIEW ALL": "すべて表示",
|
"VIEW ALL": "すべて表示",
|
||||||
"View all": "すべて表示",
|
"View all": "すべて表示",
|
||||||
|
"View media": "メディアを見る",
|
||||||
"comment": "コメント",
|
"comment": "コメント",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "は、現代のウェブプラットフォームのニーズに応えるために開発された、最新のフル機能のオープンソースビデオおよびメディアCMSです。",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "は、現代のウェブプラットフォームのニーズに応えるために開発された、最新のフル機能のオープンソースビデオおよびメディアCMSです。",
|
||||||
"media in category": "カテゴリー内のメディア",
|
"media in category": "カテゴリー内のメディア",
|
||||||
"media in tag": "タグ内のメディア",
|
"media in tag": "タグ内のメディア",
|
||||||
|
"or": "または",
|
||||||
"view": "ビュー",
|
"view": "ビュー",
|
||||||
"views": "ビュー",
|
"views": "ビュー",
|
||||||
"yet": "まだ",
|
"yet": "まだ",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "자동 재생",
|
"AUTOPLAY": "자동 재생",
|
||||||
"About": "정보",
|
"About": "정보",
|
||||||
"Add a ": "추가",
|
"Add a ": "추가",
|
||||||
|
"Browse your files": "파일 찾아보기",
|
||||||
"COMMENT": "댓글",
|
"COMMENT": "댓글",
|
||||||
"Categories": "카테고리",
|
"Categories": "카테고리",
|
||||||
"Category": "카테고리",
|
"Category": "카테고리",
|
||||||
"Change Language": "언어 변경",
|
"Change Language": "언어 변경",
|
||||||
"Change password": "비밀번호 변경",
|
"Change password": "비밀번호 변경",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "'녹화 시작'을 클릭하고 녹화할 화면이나 탭을 선택하세요. 녹화가 끝나면 '녹화 중지'를 클릭하면 녹화 파일이 업로드됩니다.",
|
||||||
"Comment": "댓글",
|
"Comment": "댓글",
|
||||||
"Comments": "댓글",
|
"Comments": "댓글",
|
||||||
"Comments are disabled": "댓글이 비활성화되었습니다",
|
"Comments are disabled": "댓글이 비활성화되었습니다",
|
||||||
"Contact": "연락처",
|
"Contact": "연락처",
|
||||||
"DELETE MEDIA": "미디어 삭제",
|
"DELETE MEDIA": "미디어 삭제",
|
||||||
"DOWNLOAD": "다운로드",
|
"DOWNLOAD": "다운로드",
|
||||||
|
"Drag and drop files": "파일을 끌어다 놓기",
|
||||||
"EDIT MEDIA": "미디어 편집",
|
"EDIT MEDIA": "미디어 편집",
|
||||||
"EDIT PROFILE": "프로필 편집",
|
"EDIT PROFILE": "프로필 편집",
|
||||||
"EDIT SUBTITLE": "자막 편집",
|
"EDIT SUBTITLE": "자막 편집",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "재생 목록",
|
"PLAYLISTS": "재생 목록",
|
||||||
"Playlists": "재생 목록",
|
"Playlists": "재생 목록",
|
||||||
"Powered by": "제공",
|
"Powered by": "제공",
|
||||||
|
"Publish": "게시",
|
||||||
"Published on": "게시일",
|
"Published on": "게시일",
|
||||||
"Recommended": "추천",
|
"Recommended": "추천",
|
||||||
|
"Record Screen": "화면 녹화",
|
||||||
"Register": "등록",
|
"Register": "등록",
|
||||||
"SAVE": "저장",
|
"SAVE": "저장",
|
||||||
"SEARCH": "검색",
|
"SEARCH": "검색",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "선택",
|
"Select": "선택",
|
||||||
"Sign in": "로그인",
|
"Sign in": "로그인",
|
||||||
"Sign out": "로그아웃",
|
"Sign out": "로그아웃",
|
||||||
|
"Start Recording": "녹화 시작",
|
||||||
|
"Stop Recording": "녹화 중지",
|
||||||
"Subtitle was added": "자막이 추가되었습니다",
|
"Subtitle was added": "자막이 추가되었습니다",
|
||||||
|
"Subtitles": "자막",
|
||||||
"Tags": "태그",
|
"Tags": "태그",
|
||||||
"Terms": "약관",
|
"Terms": "약관",
|
||||||
|
"Trim": "자르기",
|
||||||
"UPLOAD": "업로드",
|
"UPLOAD": "업로드",
|
||||||
"Up next": "다음",
|
"Up next": "다음",
|
||||||
"Upload": "업로드",
|
"Upload": "업로드",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "업로드",
|
"Uploads": "업로드",
|
||||||
"VIEW ALL": "모두 보기",
|
"VIEW ALL": "모두 보기",
|
||||||
"View all": "모두 보기",
|
"View all": "모두 보기",
|
||||||
|
"View media": "미디어 보기",
|
||||||
"comment": "댓글",
|
"comment": "댓글",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "현대적인, 완전한 기능을 갖춘 오픈 소스 비디오 및 미디어 CMS입니다. 미디어를 시청하고 공유하기 위한 현대 웹 플랫폼의 요구를 충족시키기 위해 개발되었습니다",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "현대적인, 완전한 기능을 갖춘 오픈 소스 비디오 및 미디어 CMS입니다. 미디어를 시청하고 공유하기 위한 현대 웹 플랫폼의 요구를 충족시키기 위해 개발되었습니다",
|
||||||
"media in category": "카테고리의 미디어",
|
"media in category": "카테고리의 미디어",
|
||||||
"media in tag": "태그의 미디어",
|
"media in tag": "태그의 미디어",
|
||||||
|
"or": "또는",
|
||||||
"view": "보기",
|
"view": "보기",
|
||||||
"views": "조회수",
|
"views": "조회수",
|
||||||
"yet": "아직",
|
"yet": "아직",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "AUTOMATISCH AFSPELEN",
|
"AUTOPLAY": "AUTOMATISCH AFSPELEN",
|
||||||
"About": "Over",
|
"About": "Over",
|
||||||
"Add a ": "Voeg een ",
|
"Add a ": "Voeg een ",
|
||||||
|
"Browse your files": "Blader door uw bestanden",
|
||||||
"COMMENT": "REACTIE",
|
"COMMENT": "REACTIE",
|
||||||
"Categories": "Categorieën",
|
"Categories": "Categorieën",
|
||||||
"Category": "Categorie",
|
"Category": "Categorie",
|
||||||
"Change Language": "Taal wijzigen",
|
"Change Language": "Taal wijzigen",
|
||||||
"Change password": "Wachtwoord wijzigen",
|
"Change password": "Wachtwoord wijzigen",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Klik op 'Opname starten' en selecteer het scherm of tabblad dat u wilt opnemen. Zodra de opname is voltooid, klikt u op 'Opname stoppen' en de opname wordt geüpload.",
|
||||||
"Comment": "Reactie",
|
"Comment": "Reactie",
|
||||||
"Comments": "Reacties",
|
"Comments": "Reacties",
|
||||||
"Comments are disabled": "Reacties zijn uitgeschakeld",
|
"Comments are disabled": "Reacties zijn uitgeschakeld",
|
||||||
"Contact": "Contact",
|
"Contact": "Contact",
|
||||||
"DELETE MEDIA": "MEDIA VERWIJDEREN",
|
"DELETE MEDIA": "MEDIA VERWIJDEREN",
|
||||||
"DOWNLOAD": "DOWNLOADEN",
|
"DOWNLOAD": "DOWNLOADEN",
|
||||||
|
"Drag and drop files": "Sleep bestanden en zet ze neer",
|
||||||
"EDIT MEDIA": "MEDIA BEWERKEN",
|
"EDIT MEDIA": "MEDIA BEWERKEN",
|
||||||
"EDIT PROFILE": "PROFIEL BEWERKEN",
|
"EDIT PROFILE": "PROFIEL BEWERKEN",
|
||||||
"EDIT SUBTITLE": "ONDERTITEL BEWERKEN",
|
"EDIT SUBTITLE": "ONDERTITEL BEWERKEN",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "AFSPEELLIJSTEN",
|
"PLAYLISTS": "AFSPEELLIJSTEN",
|
||||||
"Playlists": "Afspeellijsten",
|
"Playlists": "Afspeellijsten",
|
||||||
"Powered by": "Aangedreven door",
|
"Powered by": "Aangedreven door",
|
||||||
|
"Publish": "Publiceren",
|
||||||
"Published on": "Gepubliceerd op",
|
"Published on": "Gepubliceerd op",
|
||||||
"Recommended": "Aanbevolen",
|
"Recommended": "Aanbevolen",
|
||||||
|
"Record Screen": "Scherm opnemen",
|
||||||
"Register": "Registreren",
|
"Register": "Registreren",
|
||||||
"SAVE": "OPSLAAN",
|
"SAVE": "OPSLAAN",
|
||||||
"SEARCH": "ZOEKEN",
|
"SEARCH": "ZOEKEN",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Selecteer",
|
"Select": "Selecteer",
|
||||||
"Sign in": "Inloggen",
|
"Sign in": "Inloggen",
|
||||||
"Sign out": "Uitloggen",
|
"Sign out": "Uitloggen",
|
||||||
|
"Start Recording": "Opname starten",
|
||||||
|
"Stop Recording": "Opname stoppen",
|
||||||
"Subtitle was added": "Ondertitel is toegevoegd",
|
"Subtitle was added": "Ondertitel is toegevoegd",
|
||||||
|
"Subtitles": "Ondertitels",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Terms": "Voorwaarden",
|
"Terms": "Voorwaarden",
|
||||||
|
"Trim": "Bijsnijden",
|
||||||
"UPLOAD": "UPLOADEN",
|
"UPLOAD": "UPLOADEN",
|
||||||
"Up next": "Hierna",
|
"Up next": "Hierna",
|
||||||
"Upload": "Uploaden",
|
"Upload": "Uploaden",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Uploads",
|
"Uploads": "Uploads",
|
||||||
"VIEW ALL": "BEKIJK ALLES",
|
"VIEW ALL": "BEKIJK ALLES",
|
||||||
"View all": "Bekijk alles",
|
"View all": "Bekijk alles",
|
||||||
|
"View media": "Media bekijken",
|
||||||
"comment": "reactie",
|
"comment": "reactie",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "is een modern, volledig uitgerust open source video- en media-CMS. Het is ontwikkeld om te voldoen aan de behoeften van moderne webplatforms voor het bekijken en delen van media",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "is een modern, volledig uitgerust open source video- en media-CMS. Het is ontwikkeld om te voldoen aan de behoeften van moderne webplatforms voor het bekijken en delen van media",
|
||||||
"media in category": "media in categorie",
|
"media in category": "media in categorie",
|
||||||
"media in tag": "media in tag",
|
"media in tag": "media in tag",
|
||||||
|
"or": "of",
|
||||||
"view": "bekijk",
|
"view": "bekijk",
|
||||||
"views": "weergaven",
|
"views": "weergaven",
|
||||||
"yet": "nog",
|
"yet": "nog",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "REPRODUÇÃO AUTOMÁTICA",
|
"AUTOPLAY": "REPRODUÇÃO AUTOMÁTICA",
|
||||||
"About": "Sobre",
|
"About": "Sobre",
|
||||||
"Add a ": "Adicionar um ",
|
"Add a ": "Adicionar um ",
|
||||||
|
"Browse your files": "Procurar seus arquivos",
|
||||||
"COMMENT": "COMENTÁRIO",
|
"COMMENT": "COMENTÁRIO",
|
||||||
"Categories": "Categorias",
|
"Categories": "Categorias",
|
||||||
"Category": "Categoria",
|
"Category": "Categoria",
|
||||||
"Change Language": "Mudar idioma",
|
"Change Language": "Mudar idioma",
|
||||||
"Change password": "Mudar senha",
|
"Change password": "Mudar senha",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Clique em 'Iniciar gravação' e selecione a tela ou guia para gravar. Quando a gravação terminar, clique em 'Parar gravação' e a gravação será enviada.",
|
||||||
"Comment": "Comentário",
|
"Comment": "Comentário",
|
||||||
"Comments": "Comentários",
|
"Comments": "Comentários",
|
||||||
"Comments are disabled": "Comentários estão desativados",
|
"Comments are disabled": "Comentários estão desativados",
|
||||||
"Contact": "Contato",
|
"Contact": "Contato",
|
||||||
"DELETE MEDIA": "EXCLUIR MÍDIA",
|
"DELETE MEDIA": "EXCLUIR MÍDIA",
|
||||||
"DOWNLOAD": "BAIXAR",
|
"DOWNLOAD": "BAIXAR",
|
||||||
|
"Drag and drop files": "Arraste e solte arquivos",
|
||||||
"EDIT MEDIA": "EDITAR MÍDIA",
|
"EDIT MEDIA": "EDITAR MÍDIA",
|
||||||
"EDIT PROFILE": "EDITAR PERFIL",
|
"EDIT PROFILE": "EDITAR PERFIL",
|
||||||
"EDIT SUBTITLE": "EDITAR LEGENDA",
|
"EDIT SUBTITLE": "EDITAR LEGENDA",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "PLAYLISTS",
|
"PLAYLISTS": "PLAYLISTS",
|
||||||
"Playlists": "Playlists",
|
"Playlists": "Playlists",
|
||||||
"Powered by": "Desenvolvido por",
|
"Powered by": "Desenvolvido por",
|
||||||
|
"Publish": "Publicar",
|
||||||
"Published on": "Publicado em",
|
"Published on": "Publicado em",
|
||||||
"Recommended": "Recomendado",
|
"Recommended": "Recomendado",
|
||||||
|
"Record Screen": "Gravar tela",
|
||||||
"Register": "Registrar",
|
"Register": "Registrar",
|
||||||
"SAVE": "SALVAR",
|
"SAVE": "SALVAR",
|
||||||
"SEARCH": "PESQUISAR",
|
"SEARCH": "PESQUISAR",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Selecionar",
|
"Select": "Selecionar",
|
||||||
"Sign in": "Entrar",
|
"Sign in": "Entrar",
|
||||||
"Sign out": "Sair",
|
"Sign out": "Sair",
|
||||||
|
"Start Recording": "Iniciar Gravação",
|
||||||
|
"Stop Recording": "Parar Gravação",
|
||||||
"Subtitle was added": "Legenda foi adicionada",
|
"Subtitle was added": "Legenda foi adicionada",
|
||||||
|
"Subtitles": "Legendas",
|
||||||
"Tags": "Tags",
|
"Tags": "Tags",
|
||||||
"Terms": "Termos",
|
"Terms": "Termos",
|
||||||
|
"Trim": "Cortar",
|
||||||
"UPLOAD": "CARREGAR",
|
"UPLOAD": "CARREGAR",
|
||||||
"Up next": "A seguir",
|
"Up next": "A seguir",
|
||||||
"Upload": "Carregar",
|
"Upload": "Carregar",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Uploads",
|
"Uploads": "Uploads",
|
||||||
"VIEW ALL": "VER TODOS",
|
"VIEW ALL": "VER TODOS",
|
||||||
"View all": "Ver todos",
|
"View all": "Ver todos",
|
||||||
|
"View media": "Ver mídia",
|
||||||
"comment": "comentário",
|
"comment": "comentário",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "é um CMS de vídeo e mídia de código aberto, moderno e completo. Foi desenvolvido para atender às necessidades das plataformas web modernas para visualização e compartilhamento de mídia",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "é um CMS de vídeo e mídia de código aberto, moderno e completo. Foi desenvolvido para atender às necessidades das plataformas web modernas para visualização e compartilhamento de mídia",
|
||||||
"media in category": "mídia na categoria",
|
"media in category": "mídia na categoria",
|
||||||
"media in tag": "mídia na tag",
|
"media in tag": "mídia na tag",
|
||||||
|
"or": "ou",
|
||||||
"view": "visualização",
|
"view": "visualização",
|
||||||
"views": "visualizações",
|
"views": "visualizações",
|
||||||
"yet": "ainda",
|
"yet": "ainda",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "Автовоспроизведение",
|
"AUTOPLAY": "Автовоспроизведение",
|
||||||
"About": "О",
|
"About": "О",
|
||||||
"Add a ": "Добавить ",
|
"Add a ": "Добавить ",
|
||||||
|
"Browse your files": "Просмотреть файлы",
|
||||||
"COMMENT": "КОММЕНТАРИЙ",
|
"COMMENT": "КОММЕНТАРИЙ",
|
||||||
"Categories": "Категории",
|
"Categories": "Категории",
|
||||||
"Category": "Категория",
|
"Category": "Категория",
|
||||||
"Change Language": "Изменить язык",
|
"Change Language": "Изменить язык",
|
||||||
"Change password": "Изменить пароль",
|
"Change password": "Изменить пароль",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Нажмите 'Начать запись' и выберите экран или вкладку для записи. После окончания записи нажмите 'Остановить запись', и запись будет загружена.",
|
||||||
"Comment": "Комментарий",
|
"Comment": "Комментарий",
|
||||||
"Comments": "Комментарии",
|
"Comments": "Комментарии",
|
||||||
"Comments are disabled": "Комментарии отключены",
|
"Comments are disabled": "Комментарии отключены",
|
||||||
"Contact": "Контакт",
|
"Contact": "Контакт",
|
||||||
"DELETE MEDIA": "УДАЛИТЬ МЕДИА",
|
"DELETE MEDIA": "УДАЛИТЬ МЕДИА",
|
||||||
"DOWNLOAD": "СКАЧАТЬ",
|
"DOWNLOAD": "СКАЧАТЬ",
|
||||||
|
"Drag and drop files": "Перетащите файлы",
|
||||||
"EDIT MEDIA": "РЕДАКТИРОВАТЬ МЕДИА",
|
"EDIT MEDIA": "РЕДАКТИРОВАТЬ МЕДИА",
|
||||||
"EDIT PROFILE": "РЕДАКТИРОВАТЬ ПРОФИЛЬ",
|
"EDIT PROFILE": "РЕДАКТИРОВАТЬ ПРОФИЛЬ",
|
||||||
"EDIT SUBTITLE": "РЕДАКТИРОВАТЬ СУБТИТРЫ",
|
"EDIT SUBTITLE": "РЕДАКТИРОВАТЬ СУБТИТРЫ",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "ПЛЕЙЛИСТЫ",
|
"PLAYLISTS": "ПЛЕЙЛИСТЫ",
|
||||||
"Playlists": "Плейлисты",
|
"Playlists": "Плейлисты",
|
||||||
"Powered by": "Работает на",
|
"Powered by": "Работает на",
|
||||||
|
"Publish": "Опубликовать",
|
||||||
"Published on": "Опубликовано",
|
"Published on": "Опубликовано",
|
||||||
"Recommended": "Рекомендуемое",
|
"Recommended": "Рекомендуемое",
|
||||||
|
"Record Screen": "Запись экрана",
|
||||||
"Register": "Регистрация",
|
"Register": "Регистрация",
|
||||||
"SAVE": "СОХРАНИТЬ",
|
"SAVE": "СОХРАНИТЬ",
|
||||||
"SEARCH": "ПОИСК",
|
"SEARCH": "ПОИСК",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Выбрать",
|
"Select": "Выбрать",
|
||||||
"Sign in": "Войти",
|
"Sign in": "Войти",
|
||||||
"Sign out": "Выйти",
|
"Sign out": "Выйти",
|
||||||
|
"Start Recording": "Начать запись",
|
||||||
|
"Stop Recording": "Остановить запись",
|
||||||
"Subtitle was added": "Субтитры были добавлены",
|
"Subtitle was added": "Субтитры были добавлены",
|
||||||
|
"Subtitles": "Субтитры",
|
||||||
"Tags": "Теги",
|
"Tags": "Теги",
|
||||||
"Terms": "Условия",
|
"Terms": "Условия",
|
||||||
|
"Trim": "Обрезать",
|
||||||
"UPLOAD": "ЗАГРУЗИТЬ",
|
"UPLOAD": "ЗАГРУЗИТЬ",
|
||||||
"Up next": "Далее",
|
"Up next": "Далее",
|
||||||
"Upload": "Загрузить",
|
"Upload": "Загрузить",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Загрузки",
|
"Uploads": "Загрузки",
|
||||||
"VIEW ALL": "ПОКАЗАТЬ ВСЕ",
|
"VIEW ALL": "ПОКАЗАТЬ ВСЕ",
|
||||||
"View all": "Показать все",
|
"View all": "Показать все",
|
||||||
|
"View media": "Просмотр медиа",
|
||||||
"comment": "комментарий",
|
"comment": "комментарий",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "это современная, полнофункциональная система управления видео и медиа с открытым исходным кодом. Она разработана для удовлетворения потребностей современных веб-платформ для просмотра и обмена медиа",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "это современная, полнофункциональная система управления видео и медиа с открытым исходным кодом. Она разработана для удовлетворения потребностей современных веб-платформ для просмотра и обмена медиа",
|
||||||
"media in category": "медиа в категории",
|
"media in category": "медиа в категории",
|
||||||
"media in tag": "медиа в теге",
|
"media in tag": "медиа в теге",
|
||||||
|
"or": "или",
|
||||||
"view": "просмотр",
|
"view": "просмотр",
|
||||||
"views": "просмотры",
|
"views": "просмотры",
|
||||||
"yet": "еще",
|
"yet": "еще",
|
||||||
|
|||||||
@ -1,19 +1,22 @@
|
|||||||
translation_strings = {
|
translation_strings = {
|
||||||
"ABOUT": "O NAS",
|
"ABOUT": "O NAS",
|
||||||
"AUTOPLAY": "SAMODEJNO PREDVAJANJE",
|
"AUTOPLAY": "SAMODEJNO PREDVAJANJE",
|
||||||
|
"About": "O nas",
|
||||||
"Add a ": "Dodaj ",
|
"Add a ": "Dodaj ",
|
||||||
|
"Browse your files": "Prebrskaj datoteke",
|
||||||
"COMMENT": "KOMENTAR",
|
"COMMENT": "KOMENTAR",
|
||||||
"Categories": "Kategorije",
|
"Categories": "Kategorije",
|
||||||
"Category": "Kategorija",
|
"Category": "Kategorija",
|
||||||
"Change Language": "Spremeni jezik",
|
"Change Language": "Spremeni jezik",
|
||||||
"Change password": "Spremeni geslo",
|
"Change password": "Spremeni geslo",
|
||||||
"About": "O nas",
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "Kliknite 'Začni snemanje' in izberite zaslon ali zavihek za snemanje. Ko je snemanje končano, kliknite 'Ustavi snemanje' in posnetek bo naložen.",
|
||||||
"Comment": "Komentar",
|
"Comment": "Komentar",
|
||||||
"Comments": "Komentarji",
|
"Comments": "Komentarji",
|
||||||
"Comments are disabled": "Komentarji so onemogočeni",
|
"Comments are disabled": "Komentarji so onemogočeni",
|
||||||
"Contact": "Kontakt",
|
"Contact": "Kontakt",
|
||||||
"DELETE MEDIA": "IZBRIŠI MEDIJ",
|
"DELETE MEDIA": "IZBRIŠI MEDIJ",
|
||||||
"DOWNLOAD": "PRENESI",
|
"DOWNLOAD": "PRENESI",
|
||||||
|
"Drag and drop files": "Povleci in spusti datoteke",
|
||||||
"EDIT MEDIA": "UREDI MEDIJ",
|
"EDIT MEDIA": "UREDI MEDIJ",
|
||||||
"EDIT PROFILE": "UREDI PROFIL",
|
"EDIT PROFILE": "UREDI PROFIL",
|
||||||
"EDIT SUBTITLE": "UREDI PODNAPISE",
|
"EDIT SUBTITLE": "UREDI PODNAPISE",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "SEZNAMI PREDVAJANJA",
|
"PLAYLISTS": "SEZNAMI PREDVAJANJA",
|
||||||
"Playlists": "Seznami predvajanja",
|
"Playlists": "Seznami predvajanja",
|
||||||
"Powered by": "Poganja",
|
"Powered by": "Poganja",
|
||||||
|
"Publish": "Objavi",
|
||||||
"Published on": "Objavljeno",
|
"Published on": "Objavljeno",
|
||||||
"Recommended": "Priporočeno",
|
"Recommended": "Priporočeno",
|
||||||
|
"Record Screen": "Snemanje zaslona",
|
||||||
"Register": "Registracija",
|
"Register": "Registracija",
|
||||||
"SAVE": "SHRANI",
|
"SAVE": "SHRANI",
|
||||||
"SEARCH": "ISKANJE",
|
"SEARCH": "ISKANJE",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Izberi",
|
"Select": "Izberi",
|
||||||
"Sign in": "Prijava",
|
"Sign in": "Prijava",
|
||||||
"Sign out": "Odjava",
|
"Sign out": "Odjava",
|
||||||
|
"Start Recording": "Začni snemanje",
|
||||||
|
"Stop Recording": "Ustavi snemanje",
|
||||||
"Subtitle was added": "Podnapisi so bili dodani",
|
"Subtitle was added": "Podnapisi so bili dodani",
|
||||||
|
"Subtitles": "Podnapisi",
|
||||||
"Tags": "Oznake",
|
"Tags": "Oznake",
|
||||||
"Terms": "Pogoji",
|
"Terms": "Pogoji",
|
||||||
|
"Trim": "Obreži",
|
||||||
"UPLOAD": "NALOŽI",
|
"UPLOAD": "NALOŽI",
|
||||||
"Up next": "Naslednji",
|
"Up next": "Naslednji",
|
||||||
"Upload": "Naloži",
|
"Upload": "Naloži",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Naloženi",
|
"Uploads": "Naloženi",
|
||||||
"VIEW ALL": "PRIKAŽI VSE",
|
"VIEW ALL": "PRIKAŽI VSE",
|
||||||
"View all": "Prikaži vse",
|
"View all": "Prikaži vse",
|
||||||
|
"View media": "Ogled medija",
|
||||||
"comment": "komentar",
|
"comment": "komentar",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "je moderni, popolnoma opremljen odprtokodni video in medijski CMS. Razvit je za potrebe sodobnih spletnih platform za ogled in deljenje medijev",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "je moderni, popolnoma opremljen odprtokodni video in medijski CMS. Razvit je za potrebe sodobnih spletnih platform za ogled in deljenje medijev",
|
||||||
"media in category": "mediji v kategoriji",
|
"media in category": "mediji v kategoriji",
|
||||||
"media in tag": "mediji z oznako",
|
"media in tag": "mediji z oznako",
|
||||||
|
"or": "ali",
|
||||||
"view": "ogled",
|
"view": "ogled",
|
||||||
"views": "ogledi",
|
"views": "ogledi",
|
||||||
"yet": "še",
|
"yet": "še",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "OTOMATİK OYNATMA",
|
"AUTOPLAY": "OTOMATİK OYNATMA",
|
||||||
"About": "Hakkında",
|
"About": "Hakkında",
|
||||||
"Add a ": "Ekle ",
|
"Add a ": "Ekle ",
|
||||||
|
"Browse your files": "Dosyalarınıza göz atın",
|
||||||
"COMMENT": "YORUM",
|
"COMMENT": "YORUM",
|
||||||
"Categories": "Kategoriler",
|
"Categories": "Kategoriler",
|
||||||
"Category": "Kategori",
|
"Category": "Kategori",
|
||||||
"Change Language": "Dili Değiştir",
|
"Change Language": "Dili Değiştir",
|
||||||
"Change password": "Şifreyi Değiştir",
|
"Change password": "Şifreyi Değiştir",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "'Kaydı Başlat'a tıklayın ve kaydedilecek ekranı veya sekmeyi seçin. Kayıt bittiğinde, 'Kaydı Durdur'a tıklayın ve kayıt yüklenecektir.",
|
||||||
"Comment": "Yorum",
|
"Comment": "Yorum",
|
||||||
"Comments": "Yorumlar",
|
"Comments": "Yorumlar",
|
||||||
"Comments are disabled": "Yorumlar devre dışı",
|
"Comments are disabled": "Yorumlar devre dışı",
|
||||||
"Contact": "İletişim",
|
"Contact": "İletişim",
|
||||||
"DELETE MEDIA": "MEDYAYI SİL",
|
"DELETE MEDIA": "MEDYAYI SİL",
|
||||||
"DOWNLOAD": "İNDİR",
|
"DOWNLOAD": "İNDİR",
|
||||||
|
"Drag and drop files": "Dosyaları sürükleyip bırakın",
|
||||||
"EDIT MEDIA": "MEDYAYI DÜZENLE",
|
"EDIT MEDIA": "MEDYAYI DÜZENLE",
|
||||||
"EDIT PROFILE": "PROFİLİ DÜZENLE",
|
"EDIT PROFILE": "PROFİLİ DÜZENLE",
|
||||||
"EDIT SUBTITLE": "ALT YAZIYI DÜZENLE",
|
"EDIT SUBTITLE": "ALT YAZIYI DÜZENLE",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "ÇALMA LİSTELERİ",
|
"PLAYLISTS": "ÇALMA LİSTELERİ",
|
||||||
"Playlists": "Çalma listeleri",
|
"Playlists": "Çalma listeleri",
|
||||||
"Powered by": "Tarafından desteklenmektedir",
|
"Powered by": "Tarafından desteklenmektedir",
|
||||||
|
"Publish": "Yayınla",
|
||||||
"Published on": "Yayınlanma tarihi",
|
"Published on": "Yayınlanma tarihi",
|
||||||
"Recommended": "Önerilen",
|
"Recommended": "Önerilen",
|
||||||
|
"Record Screen": "Ekranı Kaydet",
|
||||||
"Register": "Kayıt Ol",
|
"Register": "Kayıt Ol",
|
||||||
"SAVE": "KAYDET",
|
"SAVE": "KAYDET",
|
||||||
"SEARCH": "ARA",
|
"SEARCH": "ARA",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "Seç",
|
"Select": "Seç",
|
||||||
"Sign in": "Giriş Yap",
|
"Sign in": "Giriş Yap",
|
||||||
"Sign out": "Çıkış Yap",
|
"Sign out": "Çıkış Yap",
|
||||||
|
"Start Recording": "Kaydı Başlat",
|
||||||
|
"Stop Recording": "Kaydı Durdur",
|
||||||
"Subtitle was added": "Alt yazı eklendi",
|
"Subtitle was added": "Alt yazı eklendi",
|
||||||
|
"Subtitles": "Altyazılar",
|
||||||
"Tags": "Etiketler",
|
"Tags": "Etiketler",
|
||||||
"Terms": "Şartlar",
|
"Terms": "Şartlar",
|
||||||
|
"Trim": "Kırp",
|
||||||
"UPLOAD": "YÜKLE",
|
"UPLOAD": "YÜKLE",
|
||||||
"Up next": "Sıradaki",
|
"Up next": "Sıradaki",
|
||||||
"Upload": "Yükle",
|
"Upload": "Yükle",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "Yüklemeler",
|
"Uploads": "Yüklemeler",
|
||||||
"VIEW ALL": "HEPSİNİ GÖR",
|
"VIEW ALL": "HEPSİNİ GÖR",
|
||||||
"View all": "Hepsini gör",
|
"View all": "Hepsini gör",
|
||||||
|
"View media": "Medyayı Görüntüle",
|
||||||
"comment": "yorum",
|
"comment": "yorum",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "modern, tam özellikli açık kaynaklı bir video ve medya CMS'sidir. Medya izleme ve paylaşma ihtiyaçlarını karşılamak için geliştirilmiştir",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "modern, tam özellikli açık kaynaklı bir video ve medya CMS'sidir. Medya izleme ve paylaşma ihtiyaçlarını karşılamak için geliştirilmiştir",
|
||||||
"media in category": "kategorideki medya",
|
"media in category": "kategorideki medya",
|
||||||
"media in tag": "etiketteki medya",
|
"media in tag": "etiketteki medya",
|
||||||
|
"or": "veya",
|
||||||
"view": "görünüm",
|
"view": "görünüm",
|
||||||
"views": "görünümler",
|
"views": "görünümler",
|
||||||
"yet": "henüz",
|
"yet": "henüz",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "خودکار پلے",
|
"AUTOPLAY": "خودکار پلے",
|
||||||
"About": "کے بارے میں",
|
"About": "کے بارے میں",
|
||||||
"Add a ": "شامل کریں",
|
"Add a ": "شامل کریں",
|
||||||
|
"Browse your files": "اپنی فائلیں براؤز کریں",
|
||||||
"COMMENT": "تبصرہ",
|
"COMMENT": "تبصرہ",
|
||||||
"Categories": "اقسام",
|
"Categories": "اقسام",
|
||||||
"Category": "قسم",
|
"Category": "قسم",
|
||||||
"Change Language": "زبان تبدیل کریں",
|
"Change Language": "زبان تبدیل کریں",
|
||||||
"Change password": "پاس ورڈ تبدیل کریں",
|
"Change password": "پاس ورڈ تبدیل کریں",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "'ریکارڈنگ شروع کریں' پر کلک کریں اور ریکارڈ کرنے کے لیے اسکرین یا ٹیب منتخب کریں۔ ریکارڈنگ مکمل ہونے کے بعد، 'ریکارڈنگ بند کریں' پر کلک کریں، اور ریکارڈنگ اپ لوڈ ہو جائے گی۔",
|
||||||
"Comment": "تبصرہ",
|
"Comment": "تبصرہ",
|
||||||
"Comments": "تبصرے",
|
"Comments": "تبصرے",
|
||||||
"Comments are disabled": "تبصرے غیر فعال ہیں",
|
"Comments are disabled": "تبصرے غیر فعال ہیں",
|
||||||
"Contact": "رابطہ کریں",
|
"Contact": "رابطہ کریں",
|
||||||
"DELETE MEDIA": "میڈیا حذف کریں",
|
"DELETE MEDIA": "میڈیا حذف کریں",
|
||||||
"DOWNLOAD": "ڈاؤن لوڈ",
|
"DOWNLOAD": "ڈاؤن لوڈ",
|
||||||
|
"Drag and drop files": "فائلیں گھسیٹیں اور چھوڑیں",
|
||||||
"EDIT MEDIA": "میڈیا ترمیم کریں",
|
"EDIT MEDIA": "میڈیا ترمیم کریں",
|
||||||
"EDIT PROFILE": "پروفائل ترمیم کریں",
|
"EDIT PROFILE": "پروفائل ترمیم کریں",
|
||||||
"EDIT SUBTITLE": "سب ٹائٹل ترمیم کریں",
|
"EDIT SUBTITLE": "سب ٹائٹل ترمیم کریں",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "پلے لسٹس",
|
"PLAYLISTS": "پلے لسٹس",
|
||||||
"Playlists": "پلے لسٹس",
|
"Playlists": "پلے لسٹس",
|
||||||
"Powered by": "کے ذریعہ تقویت یافتہ",
|
"Powered by": "کے ذریعہ تقویت یافتہ",
|
||||||
|
"Publish": "شائع کریں",
|
||||||
"Published on": "پر شائع ہوا",
|
"Published on": "پر شائع ہوا",
|
||||||
"Recommended": "تجویز کردہ",
|
"Recommended": "تجویز کردہ",
|
||||||
|
"Record Screen": "اسکرین ریکارڈ کریں",
|
||||||
"Register": "رجسٹر کریں",
|
"Register": "رجسٹر کریں",
|
||||||
"SAVE": "محفوظ کریں",
|
"SAVE": "محفوظ کریں",
|
||||||
"SEARCH": "تلاش کریں",
|
"SEARCH": "تلاش کریں",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "منتخب کریں",
|
"Select": "منتخب کریں",
|
||||||
"Sign in": "سائن ان کریں",
|
"Sign in": "سائن ان کریں",
|
||||||
"Sign out": "سائن آؤٹ کریں",
|
"Sign out": "سائن آؤٹ کریں",
|
||||||
|
"Start Recording": "ریکارڈنگ شروع کریں",
|
||||||
|
"Stop Recording": "ریکارڈنگ روکیں",
|
||||||
"Subtitle was added": "سب ٹائٹل شامل کیا گیا",
|
"Subtitle was added": "سب ٹائٹل شامل کیا گیا",
|
||||||
|
"Subtitles": "سب ٹائٹلز",
|
||||||
"Tags": "ٹیگز",
|
"Tags": "ٹیگز",
|
||||||
"Terms": "شرائط",
|
"Terms": "شرائط",
|
||||||
|
"Trim": "تراشیں",
|
||||||
"UPLOAD": "اپ لوڈ کریں",
|
"UPLOAD": "اپ لوڈ کریں",
|
||||||
"Up next": "اگلا",
|
"Up next": "اگلا",
|
||||||
"Upload": "اپ لوڈ کریں",
|
"Upload": "اپ لوڈ کریں",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "اپ لوڈز",
|
"Uploads": "اپ لوڈز",
|
||||||
"VIEW ALL": "سب دیکھیں",
|
"VIEW ALL": "سب دیکھیں",
|
||||||
"View all": "سب دیکھیں",
|
"View all": "سب دیکھیں",
|
||||||
|
"View media": "میڈیا دیکھیں",
|
||||||
"comment": "تبصرہ",
|
"comment": "تبصرہ",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "ایک جدید، مکمل خصوصیات والا اوپن سورس ویڈیو اور میڈیا CMS ہے۔ یہ جدید ویب پلیٹ فارمز کی ضروریات کو پورا کرنے کے لئے تیار کیا گیا ہے تاکہ میڈیا دیکھنے اور شیئر کرنے کے لئے",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "ایک جدید، مکمل خصوصیات والا اوپن سورس ویڈیو اور میڈیا CMS ہے۔ یہ جدید ویب پلیٹ فارمز کی ضروریات کو پورا کرنے کے لئے تیار کیا گیا ہے تاکہ میڈیا دیکھنے اور شیئر کرنے کے لئے",
|
||||||
"media in category": "زمرے میں میڈیا",
|
"media in category": "زمرے میں میڈیا",
|
||||||
"media in tag": "ٹیگ میں میڈیا",
|
"media in tag": "ٹیگ میں میڈیا",
|
||||||
|
"or": "یا",
|
||||||
"view": "دیکھیں",
|
"view": "دیکھیں",
|
||||||
"views": "دیکھے گئے",
|
"views": "دیکھے گئے",
|
||||||
"yet": "ابھی تک",
|
"yet": "ابھی تک",
|
||||||
|
|||||||
@ -3,17 +3,20 @@ translation_strings = {
|
|||||||
"AUTOPLAY": "自动播放",
|
"AUTOPLAY": "自动播放",
|
||||||
"About": "关于",
|
"About": "关于",
|
||||||
"Add a ": "添加一个",
|
"Add a ": "添加一个",
|
||||||
|
"Browse your files": "浏览文件",
|
||||||
"COMMENT": "评论",
|
"COMMENT": "评论",
|
||||||
"Categories": "分类",
|
"Categories": "分类",
|
||||||
"Category": "类别",
|
"Category": "类别",
|
||||||
"Change Language": "更改语言",
|
"Change Language": "更改语言",
|
||||||
"Change password": "更改密码",
|
"Change password": "更改密码",
|
||||||
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "点击“开始录制”并选择要录制的屏幕或标签页。录制完成后,点击“停止录制”,录制内容将被上传。",
|
||||||
"Comment": "评论",
|
"Comment": "评论",
|
||||||
"Comments": "评论",
|
"Comments": "评论",
|
||||||
"Comments are disabled": "评论已禁用",
|
"Comments are disabled": "评论已禁用",
|
||||||
"Contact": "联系",
|
"Contact": "联系",
|
||||||
"DELETE MEDIA": "删除媒体",
|
"DELETE MEDIA": "删除媒体",
|
||||||
"DOWNLOAD": "下载",
|
"DOWNLOAD": "下载",
|
||||||
|
"Drag and drop files": "拖放文件",
|
||||||
"EDIT MEDIA": "编辑媒体",
|
"EDIT MEDIA": "编辑媒体",
|
||||||
"EDIT PROFILE": "编辑个人资料",
|
"EDIT PROFILE": "编辑个人资料",
|
||||||
"EDIT SUBTITLE": "编辑字幕",
|
"EDIT SUBTITLE": "编辑字幕",
|
||||||
@ -42,8 +45,10 @@ translation_strings = {
|
|||||||
"PLAYLISTS": "播放列表",
|
"PLAYLISTS": "播放列表",
|
||||||
"Playlists": "播放列表",
|
"Playlists": "播放列表",
|
||||||
"Powered by": "由...提供技术支持",
|
"Powered by": "由...提供技术支持",
|
||||||
|
"Publish": "发布",
|
||||||
"Published on": "发布于",
|
"Published on": "发布于",
|
||||||
"Recommended": "推荐",
|
"Recommended": "推荐",
|
||||||
|
"Record Screen": "录制屏幕",
|
||||||
"Register": "注册",
|
"Register": "注册",
|
||||||
"SAVE": "保存",
|
"SAVE": "保存",
|
||||||
"SEARCH": "搜索",
|
"SEARCH": "搜索",
|
||||||
@ -54,9 +59,13 @@ translation_strings = {
|
|||||||
"Select": "选择",
|
"Select": "选择",
|
||||||
"Sign in": "登录",
|
"Sign in": "登录",
|
||||||
"Sign out": "登出",
|
"Sign out": "登出",
|
||||||
|
"Start Recording": "开始录制",
|
||||||
|
"Stop Recording": "停止录制",
|
||||||
"Subtitle was added": "字幕已添加",
|
"Subtitle was added": "字幕已添加",
|
||||||
|
"Subtitles": "字幕",
|
||||||
"Tags": "标签",
|
"Tags": "标签",
|
||||||
"Terms": "条款",
|
"Terms": "条款",
|
||||||
|
"Trim": "修剪",
|
||||||
"UPLOAD": "上传",
|
"UPLOAD": "上传",
|
||||||
"Up next": "接下来",
|
"Up next": "接下来",
|
||||||
"Upload": "上传",
|
"Upload": "上传",
|
||||||
@ -64,10 +73,12 @@ translation_strings = {
|
|||||||
"Uploads": "上传",
|
"Uploads": "上传",
|
||||||
"VIEW ALL": "查看全部",
|
"VIEW ALL": "查看全部",
|
||||||
"View all": "查看全部",
|
"View all": "查看全部",
|
||||||
|
"View media": "查看媒体",
|
||||||
"comment": "评论",
|
"comment": "评论",
|
||||||
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "是一个现代化、功能齐全的开源视频和媒体CMS。它是为了满足现代网络平台观看和分享媒体的需求而开发的",
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "是一个现代化、功能齐全的开源视频和媒体CMS。它是为了满足现代网络平台观看和分享媒体的需求而开发的",
|
||||||
"media in category": "类别中的媒体",
|
"media in category": "类别中的媒体",
|
||||||
"media in tag": "标签中的媒体",
|
"media in tag": "标签中的媒体",
|
||||||
|
"or": "或",
|
||||||
"view": "查看",
|
"view": "查看",
|
||||||
"views": "查看",
|
"views": "查看",
|
||||||
"yet": "还",
|
"yet": "还",
|
||||||
|
|||||||
@ -1,104 +1,115 @@
|
|||||||
translation_strings = {
|
translation_strings = {
|
||||||
'ABOUT': '關於',
|
"ABOUT": "關於",
|
||||||
'AUTOPLAY': '自動播放',
|
"AUTOPLAY": "自動播放",
|
||||||
'About': '關於',
|
"About": "關於",
|
||||||
'Add a ': '新增',
|
"Add a ": "新增",
|
||||||
'COMMENT': '留言',
|
"Browse your files": "瀏覽您的檔案",
|
||||||
'Categories': '分類',
|
"COMMENT": "留言",
|
||||||
'Category': '分類',
|
"Categories": "分類",
|
||||||
'Change Language': '切換語言',
|
"Category": "分類",
|
||||||
'Change password': '變更密碼',
|
"Change Language": "切換語言",
|
||||||
'Comment': '留言',
|
"Change password": "變更密碼",
|
||||||
'Comments': '留言',
|
"Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded.": "點擊「開始錄製」並選擇要錄製的螢幕或分頁。錄製完成後,點擊「停止錄製」,錄製的內容將會上傳。",
|
||||||
'Comments are disabled': '留言功能已關閉',
|
"Comment": "留言",
|
||||||
'Contact': '聯絡資訊',
|
"Comments": "留言",
|
||||||
'DELETE MEDIA': '刪除影片',
|
"Comments are disabled": "留言功能已關閉",
|
||||||
'DOWNLOAD': '下載',
|
"Contact": "聯絡資訊",
|
||||||
'EDIT MEDIA': '編輯影片',
|
"DELETE MEDIA": "刪除影片",
|
||||||
'EDIT PROFILE': '編輯個人資料',
|
"DOWNLOAD": "下載",
|
||||||
'EDIT SUBTITLE': '編輯字幕',
|
"Drag and drop files": "拖放檔案",
|
||||||
'Edit media': '編輯影片',
|
"EDIT MEDIA": "編輯影片",
|
||||||
'Edit profile': '編輯個人資料',
|
"EDIT PROFILE": "編輯個人資料",
|
||||||
'Edit subtitle': '編輯字幕',
|
"EDIT SUBTITLE": "編輯字幕",
|
||||||
'Featured': '精選內容',
|
"Edit media": "編輯影片",
|
||||||
'Go': '執行', # in context of "execution"
|
"Edit profile": "編輯個人資料",
|
||||||
'History': '觀看紀錄',
|
"Edit subtitle": "編輯字幕",
|
||||||
'Home': '首頁',
|
"Featured": "精選內容",
|
||||||
'Language': '語言',
|
"Go": "執行",
|
||||||
'Latest': '最新內容',
|
"History": "觀看紀錄",
|
||||||
'Liked media': '我喜歡的影片',
|
"Home": "首頁",
|
||||||
'Manage comments': '留言管理',
|
"Language": "語言",
|
||||||
'Manage media': '媒體管理',
|
"Latest": "最新內容",
|
||||||
'Manage users': '使用者管理',
|
"Liked media": "我喜歡的影片",
|
||||||
'Media': '媒體',
|
"Manage comments": "留言管理",
|
||||||
'Media was edited': '媒體已更新',
|
"Manage media": "媒體管理",
|
||||||
'Members': '會員',
|
"Manage users": "使用者管理",
|
||||||
'My media': '我的媒體',
|
"Media": "媒體",
|
||||||
'My playlists': '我的播放清單',
|
"Media was edited": "媒體已更新",
|
||||||
'No': '無', # in context of "no comments", etc.
|
"Members": "會員",
|
||||||
'No comment yet': '尚無留言',
|
"My media": "我的媒體",
|
||||||
'No comments yet': '尚未有留言',
|
"My playlists": "我的播放清單",
|
||||||
'No results for': '查無相關結果:',
|
"No": "無",
|
||||||
'PLAYLISTS': '播放清單',
|
"No comment yet": "尚無留言",
|
||||||
'Playlists': '播放清單',
|
"No comments yet": "尚未有留言",
|
||||||
'Powered by': '技術提供為',
|
"No results for": "查無相關結果:",
|
||||||
'Published on': '發布日期為',
|
"PLAYLISTS": "播放清單",
|
||||||
'Recommended': '推薦內容',
|
"Playlists": "播放清單",
|
||||||
'Register': '註冊',
|
"Powered by": "技術提供為",
|
||||||
'SAVE': '儲存',
|
"Publish": "發布",
|
||||||
'SEARCH': '搜尋',
|
"Published on": "發布日期為",
|
||||||
'SHARE': '分享',
|
"Recommended": "推薦內容",
|
||||||
'SHOW MORE': '顯示更多',
|
"Record Screen": "螢幕錄製",
|
||||||
'SUBMIT': '送出',
|
"Register": "註冊",
|
||||||
'Search': '搜尋',
|
"SAVE": "儲存",
|
||||||
'Select': '選擇',
|
"SEARCH": "搜尋",
|
||||||
'Sign in': '登入',
|
"SHARE": "分享",
|
||||||
'Sign out': '登出',
|
"SHOW MORE": "顯示更多",
|
||||||
'Subtitle was added': '字幕已新增',
|
"SUBMIT": "送出",
|
||||||
'Tags': '標籤',
|
"Search": "搜尋",
|
||||||
'Terms': '使用條款',
|
"Select": "選擇",
|
||||||
'UPLOAD': '上傳',
|
"Sign in": "登入",
|
||||||
'Up next': '即將播放',
|
"Sign out": "登出",
|
||||||
'Upload': '上傳',
|
"Start Recording": "開始錄製",
|
||||||
'Upload media': '上傳媒體',
|
"Stop Recording": "停止錄製",
|
||||||
'Uploads': '上傳內容',
|
"Subtitle was added": "字幕已新增",
|
||||||
'VIEW ALL': '查看全部',
|
"Subtitles": "字幕",
|
||||||
'View all': '瀏覽全部',
|
"Tags": "標籤",
|
||||||
'comment': '留言',
|
"Terms": "使用條款",
|
||||||
'is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media': '這是一個現代化且功能完整的開源影音內容管理系統,專為現代網路平台的觀賞與分享需求所打造。',
|
"Trim": "修剪",
|
||||||
'media in category': '此分類下的媒體',
|
"UPLOAD": "上傳",
|
||||||
'media in tag': '此標籤下的媒體',
|
"Up next": "即將播放",
|
||||||
'view': '次觀看',
|
"Upload": "上傳",
|
||||||
'views': '次觀看',
|
"Upload media": "上傳媒體",
|
||||||
'yet': ' ', # no such usage in this language,
|
"Uploads": "上傳內容",
|
||||||
|
"VIEW ALL": "查看全部",
|
||||||
|
"View all": "瀏覽全部",
|
||||||
|
"View media": "查看媒體",
|
||||||
|
"comment": "留言",
|
||||||
|
"is a modern, fully featured open source video and media CMS. It is developed to meet the needs of modern web platforms for viewing and sharing media": "這是一個現代化且功能完整的開源影音內容管理系統,專為現代網路平台的觀賞與分享需求所打造。",
|
||||||
|
"media in category": "此分類下的媒體",
|
||||||
|
"media in tag": "此標籤下的媒體",
|
||||||
|
"or": "或者",
|
||||||
|
"view": "次觀看",
|
||||||
|
"views": "次觀看",
|
||||||
|
"yet": " ",
|
||||||
}
|
}
|
||||||
|
|
||||||
replacement_strings = {
|
replacement_strings = {
|
||||||
'Apr': '四月',
|
"Apr": "四月",
|
||||||
'Aug': '八月',
|
"Aug": "八月",
|
||||||
'Dec': '十二月',
|
"Dec": "十二月",
|
||||||
'Feb': '二月',
|
"Feb": "二月",
|
||||||
'Jan': '一月',
|
"Jan": "一月",
|
||||||
'Jul': '七月',
|
"Jul": "七月",
|
||||||
'Jun': '六月',
|
"Jun": "六月",
|
||||||
'Mar': '三月',
|
"Mar": "三月",
|
||||||
'May': '五月',
|
"May": "五月",
|
||||||
'Nov': '十一月',
|
"Nov": "十一月",
|
||||||
'Oct': '十月',
|
"Oct": "十月",
|
||||||
'Sep': '九月',
|
"Sep": "九月",
|
||||||
'day ago': '天前',
|
"day ago": "天前",
|
||||||
'days ago': '天前',
|
"days ago": "天前",
|
||||||
'hour ago': '小時前',
|
"hour ago": "小時前",
|
||||||
'hours ago': '小時前',
|
"hours ago": "小時前",
|
||||||
'just now': '剛剛',
|
"just now": "剛剛",
|
||||||
'minute ago': '分鐘前',
|
"minute ago": "分鐘前",
|
||||||
'minutes ago': '分鐘前',
|
"minutes ago": "分鐘前",
|
||||||
'month ago': '個月前',
|
"month ago": "個月前",
|
||||||
'months ago': '個月前',
|
"months ago": "個月前",
|
||||||
'second ago': '秒前',
|
"second ago": "秒前",
|
||||||
'seconds ago': '秒前',
|
"seconds ago": "秒前",
|
||||||
'week ago': '週前',
|
"week ago": "週前",
|
||||||
'weeks ago': '週前',
|
"weeks ago": "週前",
|
||||||
'year ago': '年前',
|
"year ago": "年前",
|
||||||
'years ago': '年前',
|
"years ago": "年前",
|
||||||
}
|
}
|
||||||
|
|||||||
@ -427,6 +427,15 @@ def user_allowed_to_upload(request):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def can_transcribe_video(user):
|
||||||
|
"""Checks if a user can transcribe a video."""
|
||||||
|
if is_mediacms_editor(user):
|
||||||
|
return True
|
||||||
|
if getattr(settings, 'USER_CAN_TRANSCRIBE_VIDEO', False):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def kill_ffmpeg_process(filepath):
|
def kill_ffmpeg_process(filepath):
|
||||||
"""Kill ffmpeg process that is processing a specific file
|
"""Kill ffmpeg process that is processing a specific file
|
||||||
|
|
||||||
@ -635,4 +644,6 @@ def copy_media(media_id):
|
|||||||
|
|
||||||
|
|
||||||
def is_media_allowed_type(media):
|
def is_media_allowed_type(media):
|
||||||
|
if "all" in settings.ALLOWED_MEDIA_UPLOAD_TYPES:
|
||||||
|
return True
|
||||||
return media.media_type in settings.ALLOWED_MEDIA_UPLOAD_TYPES
|
return media.media_type in settings.ALLOWED_MEDIA_UPLOAD_TYPES
|
||||||
|
|||||||
@ -0,0 +1,39 @@
|
|||||||
|
# Generated by Django 5.1.6 on 2025-08-31 08:28
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('files', '0011_mediapermission'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='language',
|
||||||
|
name='code',
|
||||||
|
field=models.CharField(help_text='language code', max_length=30),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='media',
|
||||||
|
name='allow_whisper_transcribe',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='Transcribe auto-detected language'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='media',
|
||||||
|
name='allow_whisper_transcribe_and_translate',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='Transcribe auto-detected language and translate to English'),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='TranscriptionRequest',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('add_date', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('status', models.CharField(choices=[('pending', 'Pending'), ('running', 'Running'), ('fail', 'Fail'), ('success', 'Success')], db_index=True, default='pending', max_length=20)),
|
||||||
|
('translate_to_english', models.BooleanField(default=False)),
|
||||||
|
('logs', models.TextField(blank=True, null=True)),
|
||||||
|
('media', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transcriptionrequests', to='files.media')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -6,7 +6,7 @@ from .license import License # noqa: F401
|
|||||||
from .media import Media, MediaPermission # noqa: F401
|
from .media import Media, MediaPermission # noqa: F401
|
||||||
from .playlist import Playlist, PlaylistMedia # noqa: F401
|
from .playlist import Playlist, PlaylistMedia # noqa: F401
|
||||||
from .rating import Rating, RatingCategory # noqa: F401
|
from .rating import Rating, RatingCategory # noqa: F401
|
||||||
from .subtitle import Language, Subtitle # noqa: F401
|
from .subtitle import Language, Subtitle, TranscriptionRequest # noqa: F401
|
||||||
from .utils import CODECS # noqa: F401
|
from .utils import CODECS # noqa: F401
|
||||||
from .utils import ENCODE_EXTENSIONS # noqa: F401
|
from .utils import ENCODE_EXTENSIONS # noqa: F401
|
||||||
from .utils import ENCODE_EXTENSIONS_KEYS # noqa: F401
|
from .utils import ENCODE_EXTENSIONS_KEYS # noqa: F401
|
||||||
|
|||||||
@ -23,6 +23,7 @@ from imagekit.processors import ResizeToFit
|
|||||||
from .. import helpers
|
from .. import helpers
|
||||||
from ..stop_words import STOP_WORDS
|
from ..stop_words import STOP_WORDS
|
||||||
from .encoding import EncodeProfile, Encoding
|
from .encoding import EncodeProfile, Encoding
|
||||||
|
from .subtitle import TranscriptionRequest
|
||||||
from .utils import (
|
from .utils import (
|
||||||
ENCODE_RESOLUTIONS_KEYS,
|
ENCODE_RESOLUTIONS_KEYS,
|
||||||
MEDIA_ENCODING_STATUS,
|
MEDIA_ENCODING_STATUS,
|
||||||
@ -205,6 +206,9 @@ class Media(models.Model):
|
|||||||
|
|
||||||
views = models.IntegerField(db_index=True, default=1)
|
views = models.IntegerField(db_index=True, default=1)
|
||||||
|
|
||||||
|
allow_whisper_transcribe = models.BooleanField("Transcribe auto-detected language", default=False)
|
||||||
|
allow_whisper_transcribe_and_translate = models.BooleanField("Transcribe auto-detected language and translate to English", default=False)
|
||||||
|
|
||||||
# keep track if media file has changed, on saves
|
# keep track if media file has changed, on saves
|
||||||
__original_media_file = None
|
__original_media_file = None
|
||||||
__original_thumbnail_time = None
|
__original_thumbnail_time = None
|
||||||
@ -297,6 +301,26 @@ class Media(models.Model):
|
|||||||
thumbnail_name = helpers.get_file_name(self.uploaded_poster.path)
|
thumbnail_name = helpers.get_file_name(self.uploaded_poster.path)
|
||||||
self.uploaded_thumbnail.save(content=myfile, name=thumbnail_name)
|
self.uploaded_thumbnail.save(content=myfile, name=thumbnail_name)
|
||||||
|
|
||||||
|
def transcribe_function(self):
|
||||||
|
to_transcribe = False
|
||||||
|
to_transcribe_and_translate = False
|
||||||
|
|
||||||
|
if self.allow_whisper_transcribe or self.allow_whisper_transcribe_and_translate:
|
||||||
|
if self.allow_whisper_transcribe and not TranscriptionRequest.objects.filter(media=self, translate_to_english=False).exists():
|
||||||
|
to_transcribe = True
|
||||||
|
|
||||||
|
if self.allow_whisper_transcribe_and_translate and not TranscriptionRequest.objects.filter(media=self, translate_to_english=True).exists():
|
||||||
|
to_transcribe_and_translate = True
|
||||||
|
|
||||||
|
from .. import tasks
|
||||||
|
|
||||||
|
if to_transcribe:
|
||||||
|
TranscriptionRequest.objects.create(media=self, translate_to_english=False)
|
||||||
|
tasks.whisper_transcribe.delay(self.friendly_token, translate_to_english=False)
|
||||||
|
if to_transcribe_and_translate:
|
||||||
|
TranscriptionRequest.objects.create(media=self, translate_to_english=True)
|
||||||
|
tasks.whisper_transcribe.delay(self.friendly_token, translate_to_english=True)
|
||||||
|
|
||||||
def update_search_vector(self):
|
def update_search_vector(self):
|
||||||
"""
|
"""
|
||||||
Update SearchVector field of SearchModel using raw SQL
|
Update SearchVector field of SearchModel using raw SQL
|
||||||
@ -965,6 +989,8 @@ def media_save(sender, instance, created, **kwargs):
|
|||||||
tag.update_tag_media()
|
tag.update_tag_media()
|
||||||
|
|
||||||
instance.update_search_vector()
|
instance.update_search_vector()
|
||||||
|
if instance.media_type == "video":
|
||||||
|
instance.transcribe_function()
|
||||||
|
|
||||||
|
|
||||||
@receiver(pre_delete, sender=Media)
|
@receiver(pre_delete, sender=Media)
|
||||||
|
|||||||
@ -6,7 +6,7 @@ from django.db import models
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from .. import helpers
|
from .. import helpers
|
||||||
from .utils import subtitles_file_path
|
from .utils import MEDIA_ENCODING_STATUS, subtitles_file_path
|
||||||
|
|
||||||
|
|
||||||
class Language(models.Model):
|
class Language(models.Model):
|
||||||
@ -14,7 +14,7 @@ class Language(models.Model):
|
|||||||
to be used with Subtitles
|
to be used with Subtitles
|
||||||
"""
|
"""
|
||||||
|
|
||||||
code = models.CharField(max_length=12, help_text="language code")
|
code = models.CharField(max_length=30, help_text="language code")
|
||||||
|
|
||||||
title = models.CharField(max_length=100, help_text="language code")
|
title = models.CharField(max_length=100, help_text="language code")
|
||||||
|
|
||||||
@ -70,3 +70,15 @@ class Subtitle(models.Model):
|
|||||||
else:
|
else:
|
||||||
raise Exception("Could not convert to srt")
|
raise Exception("Could not convert to srt")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class TranscriptionRequest(models.Model):
|
||||||
|
# Whisper transcription request
|
||||||
|
media = models.ForeignKey("Media", on_delete=models.CASCADE, related_name="transcriptionrequests")
|
||||||
|
add_date = models.DateTimeField(auto_now_add=True)
|
||||||
|
status = models.CharField(max_length=20, choices=MEDIA_ENCODING_STATUS, default="pending", db_index=True)
|
||||||
|
translate_to_english = models.BooleanField(default=False)
|
||||||
|
logs = models.TextField(blank=True, null=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Transcription request for {self.media.title} - {self.status}"
|
||||||
|
|||||||
@ -46,9 +46,12 @@ from .models import (
|
|||||||
Category,
|
Category,
|
||||||
EncodeProfile,
|
EncodeProfile,
|
||||||
Encoding,
|
Encoding,
|
||||||
|
Language,
|
||||||
Media,
|
Media,
|
||||||
Rating,
|
Rating,
|
||||||
|
Subtitle,
|
||||||
Tag,
|
Tag,
|
||||||
|
TranscriptionRequest,
|
||||||
VideoChapterData,
|
VideoChapterData,
|
||||||
VideoTrimRequest,
|
VideoTrimRequest,
|
||||||
)
|
)
|
||||||
@ -465,6 +468,67 @@ def encode_media(
|
|||||||
return success
|
return success
|
||||||
|
|
||||||
|
|
||||||
|
@task(name="whisper_transcribe", queue="long_tasks", soft_time_limit=60 * 60 * 2)
|
||||||
|
def whisper_transcribe(friendly_token, translate_to_english=False):
|
||||||
|
try:
|
||||||
|
media = Media.objects.get(friendly_token=friendly_token)
|
||||||
|
except: # noqa
|
||||||
|
logger.info(f"failed to get media {friendly_token}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
request = TranscriptionRequest.objects.filter(media=media, status="pending", translate_to_english=translate_to_english).first()
|
||||||
|
if not request:
|
||||||
|
logger.info(f"No pending transcription request for media {friendly_token}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if translate_to_english:
|
||||||
|
language = Language.objects.filter(code="whisper-translation").first()
|
||||||
|
if not language:
|
||||||
|
language = Language.objects.create(code="whisper-translation", title="Automatic Transcription and Translation")
|
||||||
|
else:
|
||||||
|
language = Language.objects.filter(code="whisper").first()
|
||||||
|
if not language:
|
||||||
|
language = Language.objects.create(code="whisper", title="Automatic Transcription")
|
||||||
|
|
||||||
|
cwd = os.path.dirname(os.path.realpath(media.media_file.path))
|
||||||
|
request.status = "running"
|
||||||
|
request.save(update_fields=["status"])
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory(dir=settings.TEMP_DIRECTORY) as tmpdirname:
|
||||||
|
video_file_path = get_file_name(media.media_file.name)
|
||||||
|
video_file_path = '.'.join(video_file_path.split('.')[:-1]) # needed by whisper without the extension
|
||||||
|
subtitle_name = f"{video_file_path}.vtt"
|
||||||
|
output_name = f"{tmpdirname}/{subtitle_name}"
|
||||||
|
|
||||||
|
cmd = f"whisper /home/mediacms.io/mediacms/media_files/{media.media_file.name} --model {settings.WHISPER_MODEL} --output_dir {tmpdirname}"
|
||||||
|
if translate_to_english:
|
||||||
|
cmd += " --task translate"
|
||||||
|
|
||||||
|
logger.info(f"Whisper transcribe: ready to run command {cmd}")
|
||||||
|
|
||||||
|
start_time = datetime.now()
|
||||||
|
ret = run_command(cmd, cwd=cwd) # noqa
|
||||||
|
end_time = datetime.now()
|
||||||
|
duration = (end_time - start_time).total_seconds()
|
||||||
|
|
||||||
|
if os.path.exists(output_name):
|
||||||
|
subtitle = Subtitle.objects.create(media=media, user=media.user, language=language)
|
||||||
|
|
||||||
|
with open(output_name, 'rb') as f:
|
||||||
|
subtitle.subtitle_file.save(subtitle_name, File(f))
|
||||||
|
|
||||||
|
request.status = "success"
|
||||||
|
request.logs = f"Transcription took {duration:.2f} seconds." # noqa
|
||||||
|
request.save(update_fields=["status", "logs"])
|
||||||
|
return True
|
||||||
|
|
||||||
|
request.status = "fail"
|
||||||
|
request.logs = f"Transcription failed after {duration:.2f} seconds. Error: {ret.get('error')}" # noqa
|
||||||
|
request.save(update_fields=["status", "logs"])
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
@task(name="produce_sprite_from_video", queue="long_tasks")
|
@task(name="produce_sprite_from_video", queue="long_tasks")
|
||||||
def produce_sprite_from_video(friendly_token):
|
def produce_sprite_from_video(friendly_token):
|
||||||
"""Produces a sprites file for a video, uses ffmpeg"""
|
"""Produces a sprites file for a video, uses ffmpeg"""
|
||||||
|
|||||||
@ -7,6 +7,8 @@ from django.urls import path, re_path
|
|||||||
from . import management_views, views
|
from . import management_views, views
|
||||||
from .feeds import IndexRSSFeed, SearchRSSFeed
|
from .feeds import IndexRSSFeed, SearchRSSFeed
|
||||||
|
|
||||||
|
friendly_token = r"(?P<friendly_token>[\w\-_]*)"
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("i18n/", include("django.conf.urls.i18n")),
|
path("i18n/", include("django.conf.urls.i18n")),
|
||||||
re_path(r"^$", views.index),
|
re_path(r"^$", views.index),
|
||||||
@ -28,12 +30,12 @@ urlpatterns = [
|
|||||||
re_path(r"^latest$", views.latest_media),
|
re_path(r"^latest$", views.latest_media),
|
||||||
re_path(r"^members", views.members, name="members"),
|
re_path(r"^members", views.members, name="members"),
|
||||||
re_path(
|
re_path(
|
||||||
r"^playlist/(?P<friendly_token>[\w]*)$",
|
rf"^playlist/{friendly_token}$",
|
||||||
views.view_playlist,
|
views.view_playlist,
|
||||||
name="get_playlist",
|
name="get_playlist",
|
||||||
),
|
),
|
||||||
re_path(
|
re_path(
|
||||||
r"^playlists/(?P<friendly_token>[\w]*)$",
|
rf"^playlists/{friendly_token}$",
|
||||||
views.view_playlist,
|
views.view_playlist,
|
||||||
name="get_playlist",
|
name="get_playlist",
|
||||||
),
|
),
|
||||||
@ -41,6 +43,7 @@ urlpatterns = [
|
|||||||
re_path(r"^recommended$", views.recommended_media),
|
re_path(r"^recommended$", views.recommended_media),
|
||||||
path("rss/", IndexRSSFeed()),
|
path("rss/", IndexRSSFeed()),
|
||||||
re_path("^rss/search", SearchRSSFeed()),
|
re_path("^rss/search", SearchRSSFeed()),
|
||||||
|
re_path(r"^record_screen", views.record_screen, name="record_screen"),
|
||||||
re_path(r"^search", views.search, name="search"),
|
re_path(r"^search", views.search, name="search"),
|
||||||
re_path(r"^scpublisher", views.upload_media, name="upload_media"),
|
re_path(r"^scpublisher", views.upload_media, name="upload_media"),
|
||||||
re_path(r"^tags", views.tags, name="tags"),
|
re_path(r"^tags", views.tags, name="tags"),
|
||||||
@ -53,7 +56,7 @@ urlpatterns = [
|
|||||||
re_path(r"^api/v1/media$", views.MediaList.as_view()),
|
re_path(r"^api/v1/media$", views.MediaList.as_view()),
|
||||||
re_path(r"^api/v1/media/$", views.MediaList.as_view()),
|
re_path(r"^api/v1/media/$", views.MediaList.as_view()),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w\-_]*)$",
|
rf"^api/v1/media/{friendly_token}$",
|
||||||
views.MediaDetail.as_view(),
|
views.MediaDetail.as_view(),
|
||||||
name="api_get_media",
|
name="api_get_media",
|
||||||
),
|
),
|
||||||
@ -64,32 +67,32 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
re_path(r"^api/v1/search$", views.MediaSearch.as_view()),
|
re_path(r"^api/v1/search$", views.MediaSearch.as_view()),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w]*)/actions$",
|
rf"^api/v1/media/{friendly_token}/actions$",
|
||||||
views.MediaActions.as_view(),
|
views.MediaActions.as_view(),
|
||||||
),
|
),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w]*)/chapters$",
|
rf"^api/v1/media/{friendly_token}/chapters$",
|
||||||
views.video_chapters,
|
views.video_chapters,
|
||||||
),
|
),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w]*)/trim_video$",
|
rf"^api/v1/media/{friendly_token}/trim_video$",
|
||||||
views.trim_video,
|
views.trim_video,
|
||||||
),
|
),
|
||||||
re_path(r"^api/v1/categories$", views.CategoryList.as_view()),
|
re_path(r"^api/v1/categories$", views.CategoryList.as_view()),
|
||||||
re_path(r"^api/v1/tags$", views.TagList.as_view()),
|
re_path(r"^api/v1/tags$", views.TagList.as_view()),
|
||||||
re_path(r"^api/v1/comments$", views.CommentList.as_view()),
|
re_path(r"^api/v1/comments$", views.CommentList.as_view()),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w]*)/comments$",
|
rf"^api/v1/media/{friendly_token}/comments$",
|
||||||
views.CommentDetail.as_view(),
|
views.CommentDetail.as_view(),
|
||||||
),
|
),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/media/(?P<friendly_token>[\w]*)/comments/(?P<uid>[\w-]*)$",
|
rf"^api/v1/media/{friendly_token}/comments/(?P<uid>[\w-]*)$",
|
||||||
views.CommentDetail.as_view(),
|
views.CommentDetail.as_view(),
|
||||||
),
|
),
|
||||||
re_path(r"^api/v1/playlists$", views.PlaylistList.as_view()),
|
re_path(r"^api/v1/playlists$", views.PlaylistList.as_view()),
|
||||||
re_path(r"^api/v1/playlists/$", views.PlaylistList.as_view()),
|
re_path(r"^api/v1/playlists/$", views.PlaylistList.as_view()),
|
||||||
re_path(
|
re_path(
|
||||||
r"^api/v1/playlists/(?P<friendly_token>[\w]*)$",
|
rf"^api/v1/playlists/{friendly_token}$",
|
||||||
views.PlaylistDetail.as_view(),
|
views.PlaylistDetail.as_view(),
|
||||||
name="api_get_playlist",
|
name="api_get_playlist",
|
||||||
),
|
),
|
||||||
|
|||||||
@ -28,6 +28,7 @@ from .pages import manage_users # noqa: F401
|
|||||||
from .pages import members # noqa: F401
|
from .pages import members # noqa: F401
|
||||||
from .pages import publish_media # noqa: F401
|
from .pages import publish_media # noqa: F401
|
||||||
from .pages import recommended_media # noqa: F401
|
from .pages import recommended_media # noqa: F401
|
||||||
|
from .pages import record_screen # noqa: F401
|
||||||
from .pages import search # noqa: F401
|
from .pages import search # noqa: F401
|
||||||
from .pages import setlanguage # noqa: F401
|
from .pages import setlanguage # noqa: F401
|
||||||
from .pages import sitemap # noqa: F401
|
from .pages import sitemap # noqa: F401
|
||||||
|
|||||||
@ -19,10 +19,12 @@ from ..forms import (
|
|||||||
MediaMetadataForm,
|
MediaMetadataForm,
|
||||||
MediaPublishForm,
|
MediaPublishForm,
|
||||||
SubtitleForm,
|
SubtitleForm,
|
||||||
|
WhisperSubtitlesForm,
|
||||||
)
|
)
|
||||||
from ..frontend_translations import translate_string
|
from ..frontend_translations import translate_string
|
||||||
from ..helpers import get_alphanumeric_only
|
from ..helpers import get_alphanumeric_only
|
||||||
from ..methods import (
|
from ..methods import (
|
||||||
|
can_transcribe_video,
|
||||||
create_video_trim_request,
|
create_video_trim_request,
|
||||||
get_user_or_session,
|
get_user_or_session,
|
||||||
handle_video_chapters,
|
handle_video_chapters,
|
||||||
@ -33,6 +35,18 @@ from ..models import Category, Media, Playlist, Subtitle, Tag, VideoTrimRequest
|
|||||||
from ..tasks import save_user_action, video_trim_task
|
from ..tasks import save_user_action, video_trim_task
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def record_screen(request):
|
||||||
|
"""Record screen view"""
|
||||||
|
|
||||||
|
context = {}
|
||||||
|
context["can_add"] = user_allowed_to_upload(request)
|
||||||
|
can_upload_exp = settings.CANNOT_ADD_MEDIA_MESSAGE
|
||||||
|
context["can_upload_exp"] = can_upload_exp
|
||||||
|
|
||||||
|
return render(request, "cms/record_screen.html", context)
|
||||||
|
|
||||||
|
|
||||||
def about(request):
|
def about(request):
|
||||||
"""About view"""
|
"""About view"""
|
||||||
|
|
||||||
@ -54,6 +68,7 @@ def add_subtitle(request):
|
|||||||
friendly_token = request.GET.get("m", "").strip()
|
friendly_token = request.GET.get("m", "").strip()
|
||||||
if not friendly_token:
|
if not friendly_token:
|
||||||
return HttpResponseRedirect("/")
|
return HttpResponseRedirect("/")
|
||||||
|
|
||||||
media = Media.objects.filter(friendly_token=friendly_token).first()
|
media = Media.objects.filter(friendly_token=friendly_token).first()
|
||||||
if not media:
|
if not media:
|
||||||
return HttpResponseRedirect("/")
|
return HttpResponseRedirect("/")
|
||||||
@ -61,24 +76,41 @@ def add_subtitle(request):
|
|||||||
if not (request.user == media.user or is_mediacms_editor(request.user)):
|
if not (request.user == media.user or is_mediacms_editor(request.user)):
|
||||||
return HttpResponseRedirect("/")
|
return HttpResponseRedirect("/")
|
||||||
|
|
||||||
if request.method == "POST":
|
# Initialize variables
|
||||||
form = SubtitleForm(media, request.POST, request.FILES)
|
form = None
|
||||||
if form.is_valid():
|
whisper_form = None
|
||||||
subtitle = form.save()
|
show_whisper_form = can_transcribe_video(request.user)
|
||||||
new_subtitle = Subtitle.objects.filter(id=subtitle.id).first()
|
|
||||||
try:
|
if request.method == "POST":
|
||||||
new_subtitle.convert_to_srt()
|
if 'submit' in request.POST:
|
||||||
messages.add_message(request, messages.INFO, "Subtitle was added!")
|
form = SubtitleForm(media, request.POST, request.FILES, prefix="form")
|
||||||
return HttpResponseRedirect(subtitle.media.get_absolute_url())
|
if form.is_valid():
|
||||||
except: # noqa: E722
|
subtitle = form.save()
|
||||||
new_subtitle.delete()
|
try:
|
||||||
error_msg = "Invalid subtitle format. Use SubRip (.srt) or WebVTT (.vtt) files."
|
subtitle.convert_to_srt()
|
||||||
form.add_error("subtitle_file", error_msg)
|
messages.add_message(request, messages.INFO, "Subtitle was added!")
|
||||||
|
return HttpResponseRedirect(subtitle.media.get_absolute_url())
|
||||||
|
except Exception as e: # noqa
|
||||||
|
subtitle.delete()
|
||||||
|
error_msg = "Invalid subtitle format. Use SubRip (.srt) or WebVTT (.vtt) files."
|
||||||
|
form.add_error("subtitle_file", error_msg)
|
||||||
|
|
||||||
|
elif 'submit_whisper' in request.POST and show_whisper_form:
|
||||||
|
whisper_form = WhisperSubtitlesForm(request.user, request.POST, instance=media, prefix="whisper_form")
|
||||||
|
if whisper_form.is_valid():
|
||||||
|
whisper_form.save()
|
||||||
|
messages.add_message(request, messages.INFO, "Request for transcription was sent")
|
||||||
|
return HttpResponseRedirect(media.get_absolute_url())
|
||||||
|
|
||||||
|
# GET request or form invalid
|
||||||
|
if form is None:
|
||||||
|
form = SubtitleForm(media_item=media, prefix="form")
|
||||||
|
|
||||||
|
if show_whisper_form and whisper_form is None:
|
||||||
|
whisper_form = WhisperSubtitlesForm(request.user, instance=media, prefix="whisper_form")
|
||||||
|
|
||||||
else:
|
|
||||||
form = SubtitleForm(media_item=media)
|
|
||||||
subtitles = media.subtitles.all()
|
subtitles = media.subtitles.all()
|
||||||
context = {"media": media, "form": form, "subtitles": subtitles}
|
context = {"media_object": media, "form": form, "subtitles": subtitles, "whisper_form": whisper_form}
|
||||||
return render(request, "cms/add_subtitle.html", context)
|
return render(request, "cms/add_subtitle.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -166,7 +166,6 @@ button {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 0 0.67em 0;
|
padding: 0 0 0.67em 0;
|
||||||
margin: 0 0 0.5em;
|
margin: 0 0 0.5em;
|
||||||
font-size: 1.13125em;
|
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
border-width: 0 0 1px;
|
border-width: 0 0 1px;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
|
|||||||
@ -86,20 +86,6 @@ function EditMediaButton(props) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function EditSubtitleButton(props) {
|
|
||||||
let link = props.link;
|
|
||||||
|
|
||||||
if (window.MediaCMS.site.devEnv) {
|
|
||||||
link = '#';
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<a href={link} rel="nofollow" title={translateString('Edit subtitle')} className="edit-subtitle">
|
|
||||||
{translateString('EDIT SUBTITLE')}
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function ViewerInfoContent(props) {
|
export default function ViewerInfoContent(props) {
|
||||||
const { userCan } = useUser();
|
const { userCan } = useUser();
|
||||||
|
|
||||||
@ -231,14 +217,9 @@ export default function ViewerInfoContent(props) {
|
|||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
{userCan.editMedia || userCan.editSubtitle || userCan.deleteMedia ? (
|
{userCan.editMedia || userCan.deleteMedia ? (
|
||||||
<div className="media-author-actions">
|
<div className="media-author-actions">
|
||||||
{userCan.editMedia ? <EditMediaButton link={MediaPageStore.get('media-data').edit_url} /> : null}
|
{userCan.editMedia ? <EditMediaButton link={MediaPageStore.get('media-data').edit_url} /> : null}
|
||||||
{userCan.editSubtitle && 'video' === MediaPageStore.get('media-data').media_type ? (
|
|
||||||
<EditSubtitleButton
|
|
||||||
link={MediaPageStore.get('media-data').edit_url.replace('edit?', 'add_subtitle?')}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
|
|
||||||
<PopupTrigger contentRef={popupContentRef}>
|
<PopupTrigger contentRef={popupContentRef}>
|
||||||
<button className="remove-media">{translateString('DELETE MEDIA')}</button>
|
<button className="remove-media">{translateString('DELETE MEDIA')}</button>
|
||||||
|
|||||||
@ -77,16 +77,37 @@ function headerPopupPages(user, popupNavItems, hasHeaderThemeSwitcher) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function UploadMediaButton({ user, links }) {
|
function UploadMediaButton({ user, links }) {
|
||||||
|
const [popupContentRef, PopupContent, PopupTrigger] = usePopup();
|
||||||
|
|
||||||
|
const uploadMenuItems = [
|
||||||
|
{
|
||||||
|
link: links.user.addMedia,
|
||||||
|
icon: 'upload',
|
||||||
|
text: translateString('Upload'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
link: '/record_screen',
|
||||||
|
icon: 'videocam',
|
||||||
|
text: translateString('Record Screen'),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
return !user.is.anonymous && user.can.addMedia ? (
|
return !user.is.anonymous && user.can.addMedia ? (
|
||||||
<div className={'hidden-only-in-small'}>
|
<div>
|
||||||
<CircleIconButton type="link" href={links.user.addMedia} title="Upload media">
|
<PopupTrigger contentRef={popupContentRef}>
|
||||||
<MaterialIcon type="video_call" />
|
<CircleIconButton title={translateString('Upload media')}>
|
||||||
<span className="hidden-txt">Upload media</span>
|
<MaterialIcon type="video_call" />
|
||||||
</CircleIconButton>
|
<span className="hidden-txt">{translateString('Upload media')}</span>
|
||||||
|
</CircleIconButton>
|
||||||
|
</PopupTrigger>
|
||||||
|
<PopupContent contentRef={popupContentRef}>
|
||||||
|
<PopupMain>
|
||||||
|
<NavigationMenuList items={uploadMenuItems} />
|
||||||
|
</PopupMain>
|
||||||
|
</PopupContent>
|
||||||
</div>
|
</div>
|
||||||
) : null;
|
) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function LoginButton({ user, link, hasHeaderThemeSwitcher }) {
|
function LoginButton({ user, link, hasHeaderThemeSwitcher }) {
|
||||||
return user.is.anonymous && user.can.login ? (
|
return user.is.anonymous && user.can.login ? (
|
||||||
<div className="sign-in-wrap">
|
<div className="sign-in-wrap">
|
||||||
|
|||||||
2
requirements-full.txt
Normal file
2
requirements-full.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
openai-whisper==20250625
|
||||||
|
setuptools-rust
|
||||||
@ -2,7 +2,7 @@ Django==5.1.6
|
|||||||
djangorestframework==3.15.2
|
djangorestframework==3.15.2
|
||||||
python3-saml==1.16.0
|
python3-saml==1.16.0
|
||||||
django-allauth==65.4.1
|
django-allauth==65.4.1
|
||||||
psycopg[pool]==3.2.4
|
psycopg[binary,pool]==3.2.4
|
||||||
uwsgi==2.0.28
|
uwsgi==2.0.28
|
||||||
django-redis==5.4.0
|
django-redis==5.4.0
|
||||||
celery==5.4.0
|
celery==5.4.0
|
||||||
@ -22,4 +22,3 @@ pre-commit==4.1.0
|
|||||||
django-jazzmin==3.0.1
|
django-jazzmin==3.0.1
|
||||||
pysubs2==1.8.0
|
pysubs2==1.8.0
|
||||||
sentry-sdk[django]==2.23.1
|
sentry-sdk[django]==2.23.1
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,7 +1,10 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block headtitle %}Add new media - {{PORTAL_NAME}}{% endblock headtitle %}
|
{% block headtitle %}Add new media - {{PORTAL_NAME}}{% endblock headtitle %}
|
||||||
|
{% load custom_filters %}
|
||||||
|
|
||||||
{% block externallinks %}
|
{% block externallinks %}
|
||||||
{% if LOAD_FROM_CDN %}
|
{% if LOAD_FROM_CDN %}
|
||||||
@ -19,6 +22,8 @@
|
|||||||
{%endblock topimports %}
|
{%endblock topimports %}
|
||||||
|
|
||||||
{% block innercontent %}
|
{% block innercontent %}
|
||||||
|
{% get_current_language as LANGUAGE_CODE %}
|
||||||
|
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
|
|
||||||
{% if can_add %}
|
{% if can_add %}
|
||||||
@ -26,7 +31,7 @@
|
|||||||
<div class="media-uploader-wrap">
|
<div class="media-uploader-wrap">
|
||||||
<div class="media-uploader-top-wrap">
|
<div class="media-uploader-top-wrap">
|
||||||
<div class="media-uploader-top-left-wrap">
|
<div class="media-uploader-top-left-wrap">
|
||||||
<h1>Upload media files</h1>
|
<h1>{{ "Upload media" | custom_translate:LANGUAGE_CODE}}</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="media-uploader-top-right-wrap"> </div>
|
<div class="media-uploader-top-right-wrap"> </div>
|
||||||
</div>
|
</div>
|
||||||
@ -38,16 +43,19 @@
|
|||||||
<div class="media-drag-drop-content">
|
<div class="media-drag-drop-content">
|
||||||
<div class="media-drag-drop-content-inner">
|
<div class="media-drag-drop-content-inner">
|
||||||
<span><i class="material-icons">cloud_upload</i></span>
|
<span><i class="material-icons">cloud_upload</i></span>
|
||||||
<span>Drag and drop files</span>
|
<span>{{ "Drag and drop files" | custom_translate:LANGUAGE_CODE}}</span>
|
||||||
<span>or</span>
|
<span>{{ "or" | custom_translate:LANGUAGE_CODE}}</span>
|
||||||
<span class="browse-files-btn-wrap">
|
<span class="browse-files-btn-wrap">
|
||||||
<span class="qq-upload-button-selector">Browse your files</span>
|
<span class="qq-upload-button-selector">{{ "Browse your files" | custom_translate:LANGUAGE_CODE}}</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div class="qq-upload-drop-area-selector media-dropzone" qq-hide-dropzone>
|
<div class="qq-upload-drop-area-selector media-dropzone" qq-hide-dropzone>
|
||||||
<span class="qq-upload-drop-area-text-selector"></span>
|
<span class="qq-upload-drop-area-text-selector"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -76,7 +84,7 @@
|
|||||||
<span class="filename-edit qq-edit-filename-icon-selector" aria-label="Edit filename">Edit filename <i class="material-icons">create</i></span>
|
<span class="filename-edit qq-edit-filename-icon-selector" aria-label="Edit filename">Edit filename <i class="material-icons">create</i></span>
|
||||||
<button type="button" class="delete-media-upload-item qq-upload-delete-selector" aria-label="Delete">Delete <i class="material-icons">delete</i></button>
|
<button type="button" class="delete-media-upload-item qq-upload-delete-selector" aria-label="Delete">Delete <i class="material-icons">delete</i></button>
|
||||||
<button type="button" class="cancel-media-upload-item qq-upload-cancel-selector" aria-label="Cancel">Cancel <i class="material-icons">cancel</i></button>
|
<button type="button" class="cancel-media-upload-item qq-upload-cancel-selector" aria-label="Cancel">Cancel <i class="material-icons">cancel</i></button>
|
||||||
<a href="#" class="view-uploaded-media-link qq-hide" target="_blank">View media <i class="material-icons">open_in_new</i></a>
|
<a href="#" class="view-uploaded-media-link qq-hide" target="_blank">{{ "View media" | custom_translate:LANGUAGE_CODE}}<i class="material-icons">open_in_new</i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="media-upload-item-bottom-actions">
|
<div class="media-upload-item-bottom-actions">
|
||||||
<button type="button" class="continue-media-upload-item qq-upload-continue-selector" aria-label="Continue"><i class="material-icons">play_circle_outline</i> Continue</button>
|
<button type="button" class="continue-media-upload-item qq-upload-continue-selector" aria-label="Continue"><i class="material-icons">play_circle_outline</i> Continue</button>
|
||||||
|
|||||||
@ -1,29 +1,49 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
{% block headtitle %}Add subtitle - {{PORTAL_NAME}}{% endblock headtitle %}
|
{% block headtitle %}Add subtitle - {{PORTAL_NAME}}{% endblock headtitle %}
|
||||||
|
|
||||||
{% block innercontent %}
|
{% block innercontent %}
|
||||||
|
{% include "cms/media_nav.html" with active_tab="subtitles" %}
|
||||||
|
|
||||||
<div class="user-action-form-wrap">
|
<div class="user-action-form-wrap">
|
||||||
<div class="user-action-form-inner">
|
<div class="user-action-form-inner">
|
||||||
<h1>Add subtitle</h1>
|
|
||||||
Media: <a href="{{media.get_absolute_url}}">{{media.title}}</a>
|
|
||||||
|
|
||||||
<form enctype="multipart/form-data" action="" method="post" class="post-form">
|
<form enctype="multipart/form-data" action="" method="post" class="post-form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form|crispy }}
|
{% crispy form %}
|
||||||
<button class="primaryAction" type="submit">Add</button>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if subtitles %}
|
|
||||||
<h3>View/Edit Existing Subtitles</h3>
|
{% if subtitles %}
|
||||||
|
<div class="user-action-form-wrap">
|
||||||
|
<div class="user-action-form-inner">
|
||||||
|
<h3>Existing Subtitles</h3>
|
||||||
<ul>
|
<ul>
|
||||||
{% for subtitle in subtitles %}
|
{% for subtitle in subtitles %}
|
||||||
<li><a href="{{subtitle.url}}">{{subtitle.language.title}}</a></li>
|
<li><a href="{{subtitle.url}}">{{subtitle.language.title}}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endif %}
|
||||||
|
|
||||||
|
{% if whisper_form %}
|
||||||
|
<div class="user-action-form-wrap">
|
||||||
|
<div class="user-action-form-inner">
|
||||||
|
<h3 style="display: flex; align-items: center; gap: 0.25rem;">Request Automatic Tranascription
|
||||||
|
<span title="This is Automatic Transcription using a Whisper model that is loaded locally" style="cursor: help;">
|
||||||
|
<i class="material-icons">info_outline</i>
|
||||||
|
</span>
|
||||||
|
</h3>
|
||||||
|
<form enctype="multipart/form-data" action="" method="post" class="post-form">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% crispy whisper_form %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock innercontent %}
|
{% endblock innercontent %}
|
||||||
|
|||||||
@ -1,17 +1,28 @@
|
|||||||
|
{% load custom_filters %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% get_current_language as LANGUAGE_CODE %}
|
||||||
|
|
||||||
<div class="media-edit-nav" style="background-color: #f0f0f0; padding: 10px 0; margin-bottom: 20px;">
|
<div class="media-edit-nav" style="background-color: #f0f0f0; padding: 10px 0; margin-bottom: 20px;">
|
||||||
<ul style="list-style: none; display: flex; justify-content: space-around; margin: 0; padding: 0;">
|
<ul style="list-style: none; display: flex; justify-content: space-around; margin: 0; padding: 0;">
|
||||||
<li style="display: inline-block;">
|
<li style="display: inline-block;">
|
||||||
<a href="{% url 'edit_media' %}?m={{media_object.friendly_token}}"
|
<a href="{% url 'edit_media' %}?m={{media_object.friendly_token}}"
|
||||||
style="text-decoration: none; {% if active_tab == 'metadata' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
style="text-decoration: none; {% if active_tab == 'metadata' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
||||||
Metadata
|
{{ "Metadata" | custom_translate:LANGUAGE_CODE}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% if media_object.media_type == 'video' %}
|
{% if media_object.media_type == 'video' %}
|
||||||
|
<li style="display: inline-block;">
|
||||||
|
<a href="{% url 'add_subtitle' %}?m={{media_object.friendly_token}}"
|
||||||
|
style="text-decoration: none; {% if active_tab == 'subtitles' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
||||||
|
{{ "Subtitles" | custom_translate:LANGUAGE_CODE}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li style="display: inline-block;">
|
<li style="display: inline-block;">
|
||||||
<a href="{% url 'edit_video' %}?m={{media_object.friendly_token}}"
|
<a href="{% url 'edit_video' %}?m={{media_object.friendly_token}}"
|
||||||
|
|
||||||
style="text-decoration: none; {% if active_tab == 'trim' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
style="text-decoration: none; {% if active_tab == 'trim' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
||||||
Trim
|
{{ "Trim" | custom_translate:LANGUAGE_CODE}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% comment %}
|
{% comment %}
|
||||||
@ -19,7 +30,7 @@
|
|||||||
<a href="{% url 'edit_chapters' %}?m={{media_object.friendly_token}}"
|
<a href="{% url 'edit_chapters' %}?m={{media_object.friendly_token}}"
|
||||||
|
|
||||||
style="text-decoration: none; {% if active_tab == 'chapters' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
style="text-decoration: none; {% if active_tab == 'chapters' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
||||||
Chapters
|
{{ "Chapters" | custom_translate:LANGUAGE_CODE}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
@ -27,7 +38,7 @@
|
|||||||
<li style="display: inline-block;">
|
<li style="display: inline-block;">
|
||||||
<a href="{% url 'publish_media' %}?m={{media_object.friendly_token}}"
|
<a href="{% url 'publish_media' %}?m={{media_object.friendly_token}}"
|
||||||
style="text-decoration: none; {% if active_tab == 'publish' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
style="text-decoration: none; {% if active_tab == 'publish' %}font-weight: bold; color: #333; padding-bottom: 3px; border-bottom: 2px solid #333;{% else %}color: #666;{% endif %}">
|
||||||
Publish
|
{{ "Publish" | custom_translate:LANGUAGE_CODE}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
216
templates/cms/record_screen.html
Normal file
216
templates/cms/record_screen.html
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block headtitle %}Record Screen - {{PORTAL_NAME}}{% endblock headtitle %}
|
||||||
|
{% load custom_filters %}
|
||||||
|
|
||||||
|
{% block innercontent %}
|
||||||
|
{% get_current_language as LANGUAGE_CODE %}
|
||||||
|
|
||||||
|
|
||||||
|
{% if can_add %}
|
||||||
|
|
||||||
|
<div class="custom-page-wrapper">
|
||||||
|
<h2>{{ "Record Screen" | custom_translate:LANGUAGE_CODE}}</h2>
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
<div style="text-align: center; padding: 40px 0;">
|
||||||
|
<p style="margin-bottom: 20px;">{{ "Click 'Start Recording' and select the screen or tab to record. Once recording is finished, click 'Stop Recording,' and the recording will be uploaded." | custom_translate:LANGUAGE_CODE}}</p>
|
||||||
|
<button id="startBtn" class="qq-upload-button-selector" style="padding: 10px 20px; font-size: 16px; margin-right: 10px; cursor: pointer;">{{ "Start Recording" | custom_translate:LANGUAGE_CODE}}</button>
|
||||||
|
<button id="stopBtn" class="qq-upload-button-selector" disabled style="padding: 10px 20px; font-size: 16px; cursor: pointer;">{{ "Stop Recording" | custom_translate:LANGUAGE_CODE}}</button>
|
||||||
|
<div id="spinner" style="display: none; margin-top: 20px;">
|
||||||
|
<div class="spinner"></div>
|
||||||
|
<p>video is getting uploaded</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.spinner {
|
||||||
|
border: 4px solid rgba(0, 0, 0, 0.1);
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-left-color: #09f;
|
||||||
|
animation: spin 1s ease infinite;
|
||||||
|
margin: 10px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
|
const startBtn = document.getElementById('startBtn');
|
||||||
|
const stopBtn = document.getElementById('stopBtn');
|
||||||
|
const spinner = document.getElementById('spinner');
|
||||||
|
|
||||||
|
function isMobileDevice() {
|
||||||
|
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isMobileDevice()) {
|
||||||
|
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
|
||||||
|
alert('Camera recording is not supported in your browser.');
|
||||||
|
startBtn.disabled = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
document.querySelector('h2').textContent = 'Record Video';
|
||||||
|
document.querySelector('p').textContent = 'Click \'Start Recording\' to start recording from your camera. Once recording is finished, click \'Stop Recording,\' and the recording will be uploaded.';
|
||||||
|
} else {
|
||||||
|
if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia) {
|
||||||
|
alert('Screen recording is not supported in your browser. Please try a modern browser on a desktop computer.');
|
||||||
|
startBtn.disabled = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mediaRecorder;
|
||||||
|
let recordedChunks = [];
|
||||||
|
let stream;
|
||||||
|
|
||||||
|
startBtn.addEventListener('click', async () => {
|
||||||
|
try {
|
||||||
|
if (isMobileDevice()) {
|
||||||
|
stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
|
||||||
|
} else {
|
||||||
|
const displayStream = await navigator.mediaDevices.getDisplayMedia({ video: true });
|
||||||
|
const audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||||
|
|
||||||
|
stream = new MediaStream([...displayStream.getTracks(), ...audioStream.getTracks()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// When user stops sharing screen via browser UI
|
||||||
|
stream.getVideoTracks()[0].addEventListener('ended', () => {
|
||||||
|
if (mediaRecorder && mediaRecorder.state === 'recording') {
|
||||||
|
mediaRecorder.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const mimeTypes = [
|
||||||
|
'video/mp4',
|
||||||
|
'video/webm;codecs=vp9',
|
||||||
|
'video/webm;codecs=vp8',
|
||||||
|
'video/webm',
|
||||||
|
];
|
||||||
|
let supportedMimeType = '';
|
||||||
|
for (const mimeType of mimeTypes) {
|
||||||
|
if (MediaRecorder.isTypeSupported(mimeType)) {
|
||||||
|
supportedMimeType = mimeType;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!supportedMimeType) {
|
||||||
|
console.error("No supported mimeType found for MediaRecorder");
|
||||||
|
alert("Your browser doesn't support any suitable video recording format.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mediaRecorder = new MediaRecorder(stream, { mimeType: supportedMimeType });
|
||||||
|
|
||||||
|
mediaRecorder.ondataavailable = event => {
|
||||||
|
if (event.data.size > 0) {
|
||||||
|
recordedChunks.push(event.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
mediaRecorder.onstart = () => {
|
||||||
|
stopBtn.disabled = false;
|
||||||
|
startBtn.disabled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
mediaRecorder.onstop = () => {
|
||||||
|
stopBtn.disabled = true;
|
||||||
|
startBtn.disabled = false;
|
||||||
|
if(stream) {
|
||||||
|
stream.getTracks().forEach(track => track.stop());
|
||||||
|
}
|
||||||
|
|
||||||
|
const blob = new Blob(recordedChunks, { type: supportedMimeType });
|
||||||
|
recordedChunks = [];
|
||||||
|
|
||||||
|
uploadFile(blob);
|
||||||
|
};
|
||||||
|
|
||||||
|
mediaRecorder.start();
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error starting screen recording:", err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
stopBtn.addEventListener('click', () => {
|
||||||
|
if (mediaRecorder && mediaRecorder.state === 'recording') {
|
||||||
|
mediaRecorder.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function getCSRFToken() {
|
||||||
|
var i, cookies, cookie, cookieVal = null;
|
||||||
|
if ( document.cookie && '' !== document.cookie ) {
|
||||||
|
cookies = document.cookie.split(';');
|
||||||
|
i = 0;
|
||||||
|
while( i < cookies.length ){
|
||||||
|
cookie = cookies[i].trim();
|
||||||
|
if ( 'csrftoken=' === cookie.substring(0, 10) ) {
|
||||||
|
cookieVal = decodeURIComponent( cookie.substring(10) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function uploadFile(blob) {
|
||||||
|
const formData = new FormData();
|
||||||
|
const extension = blob.type.includes('mp4') ? 'mp4' : 'webm';
|
||||||
|
const recordingType = isMobileDevice() ? 'video-recording' : 'screen-recording';
|
||||||
|
const fileName = `${recordingType}-${new Date().toISOString().slice(0, 19).replace('T', '_').replace(/:/g, '-')}.${extension}`;
|
||||||
|
formData.append('media_file', blob, fileName);
|
||||||
|
formData.append('title', fileName);
|
||||||
|
|
||||||
|
spinner.style.display = 'block';
|
||||||
|
|
||||||
|
fetch('/api/v1/media', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'X-CSRFToken': getCSRFToken(),
|
||||||
|
},
|
||||||
|
body: formData,
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
return response.json().then(err => { throw new Error(err.detail || 'Upload failed') });
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(data => {
|
||||||
|
spinner.style.display = 'none';
|
||||||
|
console.log('Upload successful:', data);
|
||||||
|
if (data.friendly_token) {
|
||||||
|
window.location.href = '/view?m=' + data.friendly_token;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
spinner.style.display = 'none';
|
||||||
|
console.error('Upload failed:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{can_upload_exp}}
|
||||||
|
<br>
|
||||||
|
<a href='/contact'>Contact</a> portal owners for more information.
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
@ -15,6 +15,7 @@ MediaCMS.url = {
|
|||||||
history: "/history",
|
history: "/history",
|
||||||
/* Add pages */
|
/* Add pages */
|
||||||
addMedia: "/upload",
|
addMedia: "/upload",
|
||||||
|
recordScreen: "/record_screen",
|
||||||
/* Profile/account edit pages */
|
/* Profile/account edit pages */
|
||||||
editProfile: "{{user.edit_url}}",
|
editProfile: "{{user.edit_url}}",
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user