# Changelog
+## v1.2.0
+
+### BREAKING CHANGES
+
+ * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
+ * **Docker:** Check you have all the storage fields in your `/config/production.yaml` file: https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/config/production.yaml#L34
+ * **nginx:** Add redundancy endpoint in static file. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
+ * **nginx:** Add socket io endpoint. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
+ * Moderators can manage users now (add/delete/update/block)
+ * Add `tmp` and `redundancy` directories in configuration file. **You should configure them in your production.yaml**
+
+### Maintenance
+
+ * Check free storage before upgrading in upgrade script ([@Nutomic](https://github.com/nutomic))
+ * Explain that PeerTube must be stopped in prune storage script
+ * Add some security directives in the systemd unit configuration file ([@rigelk](https://github.com/rigelk) & [@mkoppmann](https://github.com/mkoppmann))
+ * Update FreeBSD startup script ([@gegeweb](https://github.com/gegeweb))
+
+### Docker
+
+ * Patch docker entrypoint to speed up the chown at startup ([LecygneNoir](https://github.com/LecygneNoir))
+
+### Features
+
+ * Add Russian, Polish and Italian languages
+ * Add user notifications:
+ * Notification types:
+ * Comment on my video
+ * New video from my subscriptions
+ * New video abuses (for moderators)
+ * Blacklist/Unblacklist on my video
+ * Video import finished (error or success)
+ * Pending video published (after transcoding or a scheduled update)
+ * My account or one of my channel has a new follower
+ * Someone (except muted accounts) mentioned me in comments
+ * A user registered on the instance (for moderators)
+ * Notification actions:
+ * Add a web notification
+ * Send an english email
+ * Add contact form in about page (**enabled by default**)
+ * Add ability to unfederate a local video in blacklist modal (**checkbox checked by default**)
+ * Support additional video extensions if transcoding is enabled (**enabled by default**)
+ * Redirect to the last url on login
+ * Add ability to automatically set the video caption in URL. Example: https://peertube2.cpy.re/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d?subtitle=ru
+ * Automatically enable the last selected caption when watching a video
+ * Add ability to disable, clear and list user videos history
+ * Add a button to help to translate peertube
+ * Add text in the report modal to explain to whom the report will be sent
+ * Open my account menu entries on hover
+ * Explain what features are enabled on the instance in the about page
+ * Add an error message in the forgot password modal if the instance email system is not configured
+ * Add sitemap
+ * Add well known url to change password ([@rigelk](https://github.com/rigelk))
+ * Remove 8GB video upload limit on client side. There may still be such limit depending on the reverse proxy configuration ([@scanlime](https://github.com/scanlime))
+ * Add CSP ([@rigelk](https://github.com/rigelk) & [@Nutomic](https://github.com/nutomic))
+ * Update title and description HTML tags when rendering video HTML page
+ * Add webfinger support for remote follows ([@acid-chicken](https://github.com/acid-chicken))
+ * Add tooltip to explain how the trending algorithm works ([@auberanger](https://github.com/auberanger))
+ * Warn users when they want to delete a channel because they will not be able to create another channel with the same name
+ * Warn users when they leave the video upload/update (on page refresh/tab close)
+ * Set max user name, user display name, channel name and channel display name lengths to 50 characters ([@McFlat](https://github.com/mcflat))
+ * Increase video abuse length to 3000 characters
+ * Add totalLocalVideoFilesSize in the stats endpoint
+
+## Bug fixes
+
+ * Fix the addition of captions to a video
+ * Fix federation of some videos
+ * Fix NSFW blur on search
+ * Add error message when trying to upload .ass subtitles
+ * Fix default homepage in the progressive web application
+ * Don't crash on queue error
+ * Fix EXDEV errors if you have multiple mount points
+ * Fix broken audio in transcoding with some videos
+ * Fix crash on getVideoFileStream issue
+ * Fix followers search
+ * Remove trailing `/` in CLI import script ([@HesioZ](https://github.com/HesioZ/))
+ * Use origin video url in canonical tag
+ * Fix captions in HTTP fallback
+ * Automatically refresh remote actors to fix deleted remote actors that are still displayed on some instances
+ * Add missing translations in video embed page
+ * Fix some styling issues in dark mode
+ * Fix transcoding issues with some videos
+ * Fix Mac OS mkv/avi upload
+ * Fix menu overflow on mobile
+ * Fix ownership button icons ([@joshmorel](https://github.com/joshmorel))
+
+
## v1.1.0
***Since v1.0.1***
### BREAKING CHANGES
+
* **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
### Maintenance
* Chat<a name="contact"></a>:
* IRC : **[#peertube on chat.freenode.net:6697](https://kiwiirc.com/client/irc.freenode.net/#peertube)**
- * Matrix (bridged on the IRC channel) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)**
+ * Matrix (bridged on IRC and [Discord](https://discord.gg/wj8DDUT)) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)**
* Forum:
* Framacolibri: [https://framacolibri.org/c/peertube](https://framacolibri.org/c/peertube)
{
"name": "peertube-client",
- "version": "1.1.0",
+ "version": "1.2.0",
"private": true,
"licence": "GPLv3",
"author": {
"resolutions": {
"video.js": "^7",
"webtorrent/create-torrent/junk": "^1",
- "simple-get": "^2.8.1"
+ "simple-get": "^2.8.1",
+ "punycode": "^1.4.1"
},
"jest": {
"globals": {
"setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts"
},
"devDependencies": {
- "@angular-devkit/build-angular": "~0.11.1",
- "@angular/animations": "~7.1.1",
- "@angular/cli": "~7.1.1",
- "@angular/common": "~7.1.1",
- "@angular/compiler": "~7.1.1",
- "@angular/compiler-cli": "~7.1.1",
- "@angular/core": "~7.1.1",
- "@angular/forms": "~7.1.1",
- "@angular/http": "~7.1.1",
- "@angular/language-service": "~7.1.1",
- "@angular/platform-browser": "~7.1.1",
- "@angular/platform-browser-dynamic": "~7.1.1",
- "@angular/router": "~7.1.1",
- "@angular/service-worker": "~7.1.1",
+ "@angular-devkit/build-angular": "~0.13.1",
+ "@angular/animations": "~7.2.4",
+ "@angular/cli": "~7.3.1",
+ "@angular/common": "~7.2.4",
+ "@angular/compiler": "~7.2.4",
+ "@angular/compiler-cli": "~7.2.4",
+ "@angular/core": "~7.2.4",
+ "@angular/forms": "~7.2.4",
+ "@angular/http": "~7.2.4",
+ "@angular/language-service": "~7.2.4",
+ "@angular/platform-browser": "~7.2.4",
+ "@angular/platform-browser-dynamic": "~7.2.4",
+ "@angular/router": "~7.2.4",
+ "@angular/service-worker": "~7.2.4",
"@angularclass/hmr": "^2.1.3",
"@neos21/bootstrap3-glyphicons": "^1.0.1",
"@ng-bootstrap/ng-bootstrap": "^4.0.0",
"@ngx-loading-bar/router": "^3.0.0",
"@ngx-meta/core": "^6.0.0-rc.1",
"@ngx-translate/i18n-polyfill": "^1.0.0",
+ "@streamroot/videojs-hlsjs-plugin": "^1.0.7",
"@types/core-js": "^2.5.0",
+ "@types/hls.js": "^0.12.0",
"@types/jasmine": "^2.8.7",
"@types/jasminewd2": "^2.0.3",
"@types/jest": "^23.3.1",
"extract-text-webpack-plugin": "4.0.0-beta.0",
"file-loader": "^2.0.0",
"focus-visible": "^4.1.5",
+ "hls.js": "^0.12.2",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"https-browserify": "^1.0.0",
"ngx-qrcode2": "^0.0.9",
"node-sass": "^4.9.3",
"npm-font-source-sans-pro": "^1.0.2",
+ "p2p-media-loader-hlsjs": "^0.4.0",
"path-browserify": "^1.0.0",
"primeng": "^7.0.0",
"process": "^0.11.10",
"typescript": "3.1.6",
"video.js": "^7",
"videojs-contextmenu-ui": "^5.0.0",
+ "videojs-contrib-quality-levels": "^2.0.9",
"videojs-dock": "^2.0.2",
"videojs-hotkeys": "^0.2.21",
- "webpack": "^4.17.1",
"webpack-bundle-analyzer": "^3.0.2",
"webpack-cli": "^3.0.8",
"webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d",
import { Component, OnInit, ViewChild } from '@angular/core'
import { Notifier, ServerService } from '@app/core'
-import { MarkdownService } from '@app/videos/shared'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
import { InstanceService } from '@app/shared/instance/instance.service'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-about-instance',
<ng-template #modal>
<div class="modal-header">
<h4 i18n class="modal-title">Contact {{ instanceName }} administrator</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
-import { Component, OnInit, OnDestroy } from '@angular/core'
+import { Component, OnDestroy, OnInit } from '@angular/core'
import { Account } from '@app/shared/account/account.model'
import { AccountService } from '@app/shared/account/account.service'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { Subscription } from 'rxjs'
-import { MarkdownService } from '@app/videos/shared'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-account-about',
private notifier: Notifier,
private restExtractor: RestExtractor,
private redirectService: RedirectService,
- private authService: AuthService,
- private i18n: I18n
+ private authService: AuthService
) {}
ngOnInit () {
import { JobsComponent } from './jobs/job.component'
import { JobsListComponent } from './jobs/jobs-list/jobs-list.component'
import { JobService } from './jobs/shared/job.service'
-import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent } from './users'
+import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent, UserPasswordComponent } from './users'
import { ModerationCommentModalComponent, VideoAbuseListComponent, VideoBlacklistListComponent } from './moderation'
import { ModerationComponent } from '@app/+admin/moderation/moderation.component'
import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component'
UsersComponent,
UserCreateComponent,
UserUpdateComponent,
+ UserPasswordComponent,
UserListComponent,
ModerationComponent,
font-weight: $font-semibold;
min-width: 200px;
display: inline-block;
+ vertical-align: top;
}
.moderation-expanded-text {
<ng-template #modal>
<div class="modal-header">
<h4 i18n class="modal-title">Moderation comment</h4>
- <span class="close" aria-hidden="true" (click)="hideModerationCommentModal()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
</div>
</div>
- <div i18n>
+ <div class="form-group" i18n>
This comment can only be seen by you or the other moderators.
</div>
<div class="form-group inputs">
- <span i18n class="action-button action-button-cancel" (click)="hideModerationCommentModal()">Cancel</span>
+ <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
<input
type="submit" i18n-value value="Update this comment" class="action-button-submit"
</form>
</div>
-</ng-template>
\ No newline at end of file
+</ng-template>
})
}
- hideModerationCommentModal () {
+ hide () {
this.abuseToComment = undefined
this.openedModal.close()
this.form.reset()
this.notifier.success(this.i18n('Comment updated.'))
this.commentUpdated.emit(moderationComment)
- this.hideModerationCommentModal()
+ this.hide()
},
err => this.notifier.error(err.message)
<td class="moderation-expanded" colspan="6">
<div>
<span i18n class="moderation-expanded-label">Reason:</span>
- <span class="moderation-expanded-text">{{ videoAbuse.reason }}</span>
+ <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.reason)"></span>
</div>
<div *ngIf="videoAbuse.moderationComment">
<span i18n class="moderation-expanded-label">Moderation comment:</span>
- <span class="moderation-expanded-text">{{ videoAbuse.moderationComment }}</span>
+ <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.moderationComment)"></span>
</div>
</td>
</tr>
import { ConfirmService } from '../../../core/index'
import { ModerationCommentModalComponent } from './moderation-comment-modal.component'
import { Video } from '../../../shared/video/video.model'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-video-abuse-list',
private notifier: Notifier,
private videoAbuseService: VideoAbuseService,
private confirmService: ConfirmService,
- private i18n: I18n
+ private i18n: I18n,
+ private markdownRenderer: MarkdownService
) {
super()
}
+ toHtml (text: string) {
+ return this.markdownRenderer.textMarkdownToHTML(text)
+ }
+
protected loadData () {
return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort)
.subscribe(
<th style="width: 40px"></th>
<th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th>
<th i18n>Sensitive</th>
+ <th i18n>Unfederated</th>
<th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th>
<th style="width: 120px;"></th>
</tr>
</a>
</td>
- <td>{{ videoBlacklist.video.nsfw }}</td>
+ <td>{{ booleanToText(videoBlacklist.video.nsfw) }}</td>
+ <td>{{ booleanToText(videoBlacklist.unfederated) }}</td>
<td>{{ videoBlacklist.createdAt }}</td>
<td class="action-cell">
<ng-template pTemplate="rowexpansion" let-videoBlacklist>
<tr>
- <td class="moderation-expanded" colspan="5">
+ <td class="moderation-expanded" colspan="6">
<span i18n class="moderation-expanded-label">Blacklist reason:</span>
- <span class="moderation-expanded-text">{{ videoBlacklist.reason }}</span>
+ <span class="moderation-expanded-text" [innerHTML]="toHtml(videoBlacklist.reason)"></span>
</td>
</tr>
</ng-template>
import { I18n } from '@ngx-translate/i18n-polyfill'
import { DropdownAction } from '../../../shared/buttons/action-dropdown.component'
import { Video } from '../../../shared/video/video.model'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-video-blacklist-list',
private notifier: Notifier,
private confirmService: ConfirmService,
private videoBlacklistService: VideoBlacklistService,
+ private markdownRenderer: MarkdownService,
private i18n: I18n
) {
super()
return Video.buildClientUrl(videoBlacklist.video.uuid)
}
+ booleanToText (value: boolean) {
+ if (value === true) return this.i18n('yes')
+
+ return this.i18n('no')
+ }
+
+ toHtml (text: string) {
+ return this.markdownRenderer.textMarkdownToHTML(text)
+ }
+
async removeVideoFromBlacklist (entry: VideoBlacklist) {
const confirmMessage = this.i18n(
'Do you really want to remove this video from the blacklist? It will be available again in the videos list.'
export * from './user-create.component'
export * from './user-update.component'
+export * from './user-password.component'
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</form>
+
+<div *ngIf="!isCreation()" class="danger-zone">
+ <div class="account-title" i18n>Danger Zone</div>
+
+ <div class="form-group reset-password-email">
+ <label i18n>Send a link to reset the password by email to the user</label>
+ <button (click)="resetPassword()" i18n>Ask for new password</button>
+ </div>
+
+ <div class="form-group">
+ <label i18n>Manually set the user password</label>
+ <my-user-password [userId]="userId"></my-user-password>
+ </div>
+</div>
@include peertube-select-container(340px);
}
-input[type=submit] {
+input[type=submit], button {
@include peertube-button;
@include orange-button;
margin-top: 5px;
font-size: 11px;
}
+
+.account-title {
+ @include in-content-small-title;
+
+ margin-top: 55px;
+ margin-bottom: 30px;
+}
+
+.danger-zone {
+ .reset-password-email {
+ margin-bottom: 30px;
+ padding-bottom: 30px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+
+ button {
+ display: block;
+ margin-top: 0;
+ }
+ }
+}
videoQuotaDailyOptions: { value: string, label: string }[] = []
roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] }))
username: string
+ userId: number
protected abstract serverService: ServerService
protected abstract configService: ConfigService
}
computeQuotaWithTranscoding () {
- const resolutions = this.serverService.getConfig().transcoding.enabledResolutions
+ const transcodingConfig = this.serverService.getConfig().transcoding
+
+ const resolutions = transcodingConfig.enabledResolutions
const higherResolution = VideoResolution.H_1080P
let multiplier = 0
multiplier += resolution / higherResolution
}
+ if (transcodingConfig.hls.enabled) multiplier *= 2
+
return multiplier * parseInt(this.form.value['videoQuota'], 10)
}
+ resetPassword () {
+ return
+ }
+
protected buildQuotaOptions () {
// These are used by a HTML select, so convert key into strings
this.videoQuotaOptions = this.configService
--- /dev/null
+<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
+ <div class="form-group">
+
+ <div class="input-group">
+ <input id="password" [attr.type]="showPassword ? 'text' : 'password'"
+ formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }"
+ >
+ <div class="input-group-append">
+ <button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button">
+ <ng-container *ngIf="!showPassword" i18n>Show</ng-container>
+ <ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
+ </button>
+ </div>
+ </div>
+ <div *ngIf="formErrors.password" class="form-error">
+ {{ formErrors.password }}
+ </div>
+ </div>
+
+ <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
+</form>
--- /dev/null
+@import '_variables';
+@import '_mixins';
+
+input:not([type=submit]):not([type=checkbox]) {
+ @include peertube-input-text(340px);
+
+ display: block;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-right: none;
+}
+
+input[type=submit] {
+ @include peertube-button;
+ @include orange-button;
+
+ margin-top: 10px;
+}
+
+.input-group-append {
+ height: 30px;
+}
--- /dev/null
+import { Component, Input, OnInit } from '@angular/core'
+import { ActivatedRoute, Router } from '@angular/router'
+import { UserService } from '@app/shared/users/user.service'
+import { Notifier } from '../../../core'
+import { User, UserUpdate } from '../../../../../../shared'
+import { I18n } from '@ngx-translate/i18n-polyfill'
+import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
+import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service'
+import { FormReactive } from '../../../shared'
+
+@Component({
+ selector: 'my-user-password',
+ templateUrl: './user-password.component.html',
+ styleUrls: [ './user-password.component.scss' ]
+})
+export class UserPasswordComponent extends FormReactive implements OnInit {
+ error: string
+ username: string
+ showPassword = false
+
+ @Input() userId: number
+
+ constructor (
+ protected formValidatorService: FormValidatorService,
+ private userValidatorsService: UserValidatorsService,
+ private route: ActivatedRoute,
+ private router: Router,
+ private notifier: Notifier,
+ private userService: UserService,
+ private i18n: I18n
+ ) {
+ super()
+ }
+
+ ngOnInit () {
+ this.buildForm({
+ password: this.userValidatorsService.USER_PASSWORD
+ })
+ }
+
+ formValidated () {
+ this.error = undefined
+
+ const userUpdate: UserUpdate = this.form.value
+
+ this.userService.updateUser(this.userId, userUpdate).subscribe(
+ () => {
+ this.notifier.success(
+ this.i18n('Password changed for user {{username}}.', { username: this.username })
+ )
+ },
+
+ err => this.error = err.message
+ )
+ }
+
+ togglePasswordVisibility () {
+ this.showPassword = !this.showPassword
+ }
+
+ getFormButtonTitle () {
+ return this.i18n('Update user password')
+ }
+}
export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
error: string
userId: number
+ userEmail: string
username: string
private paramsSub: Subscription
return this.i18n('Update user')
}
+ resetPassword () {
+ this.userService.askResetPassword(this.userEmail).subscribe(
+ () => {
+ this.notifier.success(
+ this.i18n('An email asking for password reset has been sent to {{username}}.', { username: this.username })
+ )
+ },
+
+ err => this.error = err.message
+ )
+ }
+
private onUserFetched (userJson: User) {
this.userId = userJson.id
this.username = userJson.username
+ this.userEmail = userJson.email
this.form.patchValue({
email: userJson.email,
<div i18n class="form-sub-title">Users list</div>
<a class="add-button" routerLink="/admin/users/create">
- <span class="icon icon-add"></span>
+ <my-global-icon iconName="add"></my-global-icon>
<ng-container i18n>Create user</ng-container>
</a>
</div>
<span i18n *ngIf="user.blocked" class="banned-info">(banned)</span>
</a>
</td>
+
<td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus">{{ user.email }}</td>
+
<ng-template #emailWithVerificationStatus>
<td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login">
<em>? {{ user.email }}</em>
</td>
</ng-template>
</ng-template>
+
<td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td>
<td>{{ user.roleLabel }}</td>
<td>{{ user.createdAt }}</td>
@import '_mixins';
.add-button {
- @include create-button('../../../../assets/images/global/add.svg');
+ @include create-button;
}
tr.banned {
input {
@include peertube-input-text(250px);
}
-}
\ No newline at end of file
+}
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14px;
- color: #585858;
+ color: $grey-foreground-color;
&:hover {
- color: #303030;
+ color: $grey-foreground-hover-color;
}
}
}
<div class="header">
- <a routerLink="/my-account/settings" fragment="notifications" i18n>Notification preferences</a>
+ <a routerLink="/my-account/settings" fragment="notifications" i18n>
+ <my-global-icon iconName="cog"></my-global-icon>
+ Notification preferences
+ </a>
- <button (click)="markAllAsRead()" i18n>Mark all as read</button>
+ <button (click)="markAllAsRead()" i18n>
+ <my-global-icon iconName="circle-tick"></my-global-icon>
+ Mark all as read
+ </button>
</div>
<my-user-notifications #userNotification></my-user-notifications>
display: flex;
justify-content: space-between;
font-size: 15px;
- margin-bottom: 10px;
+ margin-bottom: 20px;
a {
@include peertube-button-link;
@include grey-button;
+ @include button-with-icon(18px, 3px, -1px);
}
button {
@include peertube-button;
@include grey-button;
+ @include button-with-icon(20px, 3px, -1px);
}
}
<ng-template #modal let-close="close" let-dismiss="dismiss">
<div class="modal-header">
<h4 i18n class="modal-title">Accept ownership</h4>
- <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
</div>
<div class="modal-body" [formGroup]="form">
<td class="action-cell">
<ng-container *ngIf="videoChangeOwnership.status === 'WAITING'">
<my-button i18n label="Accept"
- icon="icon-tick"
+ icon="tick"
(click)="openAcceptModal(videoChangeOwnership)"></my-button>
<my-button i18n label="Refuse"
- icon="icon-cross"
+ icon="cross"
(click)="refuse(videoChangeOwnership)">Refuse</my-button>
</ng-container>
</td>
<div class="video-channels-header">
<a class="create-button" routerLink="create">
- <span class="icon icon-add"></span>
+ <my-global-icon iconName="add"></my-global-icon>
<ng-container i18n>Create another video channel</ng-container>
</a>
</div>
@import '_mixins';
.create-button {
- @include create-button('../../../assets/images/global/add.svg');
+ @include create-button;
}
/deep/ .action-button {
async deleteVideoChannel (videoChannel: VideoChannel) {
const res = await this.confirmService.confirmWithInput(
this.i18n(
- 'Do you really want to delete {{videoChannelName}}? It will delete all videos uploaded in this channel too.',
- { videoChannelName: videoChannel.displayName }
+ 'Do you really want to delete {{channelDisplayName}}? It will delete all videos uploaded in this channel, ' +
+ 'and you will not be able to create another channel with the same name ({{channelName}})!',
+ { channelDisplayName: videoChannel.displayName, channelName: videoChannel.name }
+ ),
+ this.i18n(
+ 'Please type the display name of the video channel ({{displayName}}) to confirm',
+ { displayName: videoChannel.displayName }
),
- this.i18n('Please type the name of the video channel to confirm'),
videoChannel.displayName,
this.i18n('Delete')
)
</span>
<span class="action-button action-button-delete-selection" (click)="deleteSelectedVideos()">
- <span class="icon icon-delete-white"></span>
+ <my-global-icon iconName="delete"></my-global-icon>
<ng-container i18n>Delete</ng-container>
</span>
</div>
<my-button i18n-label label="Change ownership"
className="action-button-change-ownership"
- icon="icon-im-with-her"
+ icon="im-with-her"
(click)="changeOwnership($event, video)"
></my-button>
</div>
</div>
</div>
-<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership>
\ No newline at end of file
+<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership>
.action-button-delete-selection {
@include peertube-button;
@include orange-button;
- }
-
- .icon.icon-delete-white {
- @include icon(21px);
+ @include button-with-icon(21px);
- position: relative;
- top: -2px;
- background-image: url('../../../assets/images/global/delete-white.svg');
+ my-global-icon {
+ @include apply-svg-color(#fff);
+ }
}
}
}
<ng-template #modal let-close="close" let-dismiss="dismiss">
<div class="modal-header">
<h4 i18n class="modal-title">Change ownership</h4>
- <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
</div>
<div class="modal-body" [formGroup]="form">
import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { Subscription } from 'rxjs'
-import { MarkdownService } from '@app/videos/shared'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-video-channel-about',
<footer class="row">
<a href="https://joinpeertube.org" title="PeerTube website" target="_blank" rel="noopener noreferrer">PeerTube v{{ serverVersion }}{{ serverCommit }}</a> -
- <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2018</a>
+ <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2019</a>
</footer>
</div>
</div>
</div>
<ngx-loading-bar [includeSpinner]="false"></ngx-loading-bar>
+
<my-confirm></my-confirm>
+
<p-toast position="bottom-right">
<ng-template let-message pTemplate="message">
<div class="notification-block">
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'
import { Injectable } from '@angular/core'
import { Router } from '@angular/router'
-import { Notifier } from '@app/core/notification'
+import { Notifier } from '@app/core/notification/notifier.service'
import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared'
import { User } from '../../../../../shared/models/users'
import { UserLogin } from '../../../../../shared/models/users/user-login.model'
import { environment } from '../../../environments/environment'
-import { RestExtractor } from '../../shared/rest'
+import { RestExtractor } from '../../shared/rest/rest-extractor.service'
import { AuthStatus } from './auth-status.model'
import { AuthUser } from './auth-user.model'
import { objectToUrlEncoded } from '@app/shared/misc/utils'
-export * from './confirm.component'
export * from './confirm.service'
import { LoadingBarRouterModule } from '@ngx-loading-bar/router'
import { AuthService } from './auth'
-import { ConfirmComponent, ConfirmService } from './confirm'
+import { ConfirmService } from './confirm'
import { throwIfAlreadyLoaded } from './module-import-guard'
import { LoginGuard, RedirectService, UserRightGuard } from './routing'
import { ServerService } from './server'
import { ToastModule } from 'primeng/toast'
import { Notifier } from './notification'
import { MessageService } from 'primeng/api'
+import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
@NgModule({
imports: [
],
declarations: [
- ConfirmComponent,
CheatSheetComponent
],
ToastModule,
- ConfirmComponent,
CheatSheetComponent
],
UserRightGuard,
RedirectService,
Notifier,
- MessageService
+ MessageService,
+ UserNotificationSocket
]
})
export class CoreModule {
export * from './notifier.service'
+export * from './user-notification-socket.service'
--- /dev/null
+import { Injectable } from '@angular/core'
+import { environment } from '../../../environments/environment'
+import { UserNotification as UserNotificationServer } from '../../../../../shared'
+import { Subject } from 'rxjs'
+import * as io from 'socket.io-client'
+import { AuthService } from '../auth'
+
+export type NotificationEvent = 'new' | 'read' | 'read-all'
+
+@Injectable()
+export class UserNotificationSocket {
+ private notificationSubject = new Subject<{ type: NotificationEvent, notification?: UserNotificationServer }>()
+
+ private socket: SocketIOClient.Socket
+
+ constructor (
+ private auth: AuthService
+ ) {}
+
+ dispatch (type: NotificationEvent, notification?: UserNotificationServer) {
+ this.notificationSubject.next({ type, notification })
+ }
+
+ getMyNotificationsSocket () {
+ const socket = this.getSocket()
+
+ socket.on('new-notification', (n: UserNotificationServer) => this.dispatch('new', n))
+
+ return this.notificationSubject.asObservable()
+ }
+
+ private getSocket () {
+ if (this.socket) return this.socket
+
+ this.socket = io(environment.apiUrl + '/user-notifications', {
+ query: { accessToken: this.auth.getAccessToken() }
+ })
+
+ return this.socket
+ }
+}
requiresEmailVerification: false
},
transcoding: {
- enabledResolutions: []
+ enabledResolutions: [],
+ hls: {
+ enabled: false
+ }
},
avatar: {
file: {
enabled: false
}
}
+ },
+ trending: {
+ videos: {
+ intervalDays: 0
+ }
}
}
private videoCategories: Array<VideoConstant<number>> = []
<span (click)="doSearch()" class="icon icon-search"></span>
<a class="upload-button" routerLink="/videos/upload">
- <span class="icon icon-upload"></span>
+ <my-global-icon iconName="upload"></my-global-icon>
<span i18n class="upload-button-label">Upload</span>
</a>
padding-left: 10px;
margin-right: 15px;
padding-right: 40px; // For the search icon
+ font-size: 14px;
&::placeholder {
color: var(--inputPlaceholderColor);
.upload-button {
@include peertube-button-link;
@include orange-button;
+ @include button-with-icon(22px, 3px, -1px);
margin-right: 25px;
margin-right: 0;
}
- .icon.icon-upload {
- @include icon(22px);
-
- background-image: url('../../assets/images/header/upload-white.svg');
- height: 24px;
- vertical-align: middle;
- margin-right: 6px;
- }
-
@media screen and (max-width: 600px) {
margin-right: 10px;
padding: 0 10px;
<ng-template #forgotPasswordModal>
<div class="modal-header">
<h4 i18n class="modal-title">Forgot your password</h4>
- <span class="close" aria-hidden="true" (click)="hideForgotPasswordModal()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hideForgotPasswordModal()"></my-global-icon>
</div>
<div class="modal-body">
></a>
</div>
- <my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false"></my-user-notifications>
+ <my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false" itemsPerPage="10"></my-user-notifications>
<a class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
</ng-template>
/deep/ {
.popover-notifications.popover {
- max-width: 400px;
+ max-width: none;
.popover-body {
padding: 0;
font-family: $main-fonts;
overflow-y: auto;
max-height: 500px;
+ width: 400px;
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30);
.notifications-header {
justify-content: center;
font-weight: $font-semibold;
color: var(--mainForegroundColor);
- height: 30px;
+ padding: 7px 0;
}
}
}
justify-content: center;
background-color: var(--mainColor);
- color: var(--mainBackgroundColor);
+ color: var(#fff);
font-size: 10px;
font-weight: $font-semibold;
height: 15px;
}
}
+
+@media screen and (max-width: $mobile-view) {
+ /deep/ {
+ .popover-notifications.popover .popover-body {
+ width: 400px;
+ }
+ }
+}
import { User } from '../shared/users/user.model'
import { UserNotificationService } from '@app/shared/users/user-notification.service'
import { Subscription } from 'rxjs'
-import { Notifier } from '@app/core'
+import { Notifier, UserNotificationSocket } from '@app/core'
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
import { NavigationEnd, Router } from '@angular/router'
import { filter } from 'rxjs/operators'
constructor (
private userNotificationService: UserNotificationService,
+ private userNotificationSocket: UserNotificationSocket,
private notifier: Notifier,
private router: Router
) {}
}
private subscribeToNotifications () {
- this.notificationSub = this.userNotificationService.getMyNotificationsSocket()
+ this.notificationSub = this.userNotificationSocket.getMyNotificationsSocket()
.subscribe(data => {
if (data.type === 'new') return this.unreadNotifications++
if (data.type === 'read') return this.unreadNotifications--
<ng-template #modal let-hide="close">
<div class="modal-header">
<h4 i18n class="modal-title">Change the language</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
height: 100%;
white-space: nowrap;
text-overflow: ellipsis;
- overflow: hidden;
+ overflow: auto;
color: var(--menuForegroundColor);
display: flex;
flex-direction: column;
}
}
-@media screen and (max-width: 400px) {
+@media screen and (max-width: $mobile-view) {
.menu-wrapper {
width: 100% !important;
}
</div>
<div *ngIf="isVideo(result)" class="entry video">
- <my-video-thumbnail [video]="result"></my-video-thumbnail>
+ <my-video-thumbnail [video]="result" [nsfw]="isVideoBlur(result)"></my-video-thumbnail>
<div class="video-info">
<a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', result.uuid]" [attr.title]="result.name">{{ result.name }}</a>
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14px;
- color: #585858;
+ color: $grey-foreground-color;
&:hover {
- color: #303030;
+ color: $grey-foreground-hover-color;
}
}
}
import { Component, OnDestroy, OnInit } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
-import { AuthService, Notifier } from '@app/core'
+import { AuthService, Notifier, ServerService } from '@app/core'
import { forkJoin, Subscription } from 'rxjs'
import { SearchService } from '@app/search/search.service'
import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
private metaService: MetaService,
private notifier: Notifier,
private searchService: SearchService,
- private authService: AuthService
+ private authService: AuthService,
+ private serverService: ServerService
) { }
ngOnInit () {
if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe()
}
+ isVideoBlur (video: Video) {
+ return video.isVideoNSFWForUser(this.authService.getUser(), this.serverService.getConfig())
+ }
+
isVideoChannel (d: VideoChannel | Video): d is VideoChannel {
return d instanceof VideoChannel
}
avatarUrl: string
- static GET_ACTOR_AVATAR_URL (actor: { avatar: Avatar }) {
+ static GET_ACTOR_AVATAR_URL (actor: { avatar?: { path: string } }) {
const absoluteAPIUrl = getAbsoluteAPIUrl()
if (actor && actor.avatar) return absoluteAPIUrl + actor.avatar.path
class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange' }"
ngbDropdownToggle role="button"
>
- <span *ngIf="!label" class="icon icon-action"></span>
+ <my-global-icon *ngIf="!label" class="more-icon" iconName="more"></my-global-icon>
<span *ngIf="label" class="dropdown-toggle">{{ label }}</span>
</div>
}
&:hover, &:active, &:focus {
- background-color: $grey-color;
+ background-color: $grey-background-color;
}
- .icon-action {
- @include icon(21px);
-
- background-image: url('../../../assets/images/video/more.svg');
- top: -1px;
+ .more-icon {
+ width: 21px;
}
&.small {
<span class="action-button" [ngClass]="className" [title]="getTitle()">
- <span class="icon" [ngClass]="icon"></span>
+ <my-global-icon [iconName]="icon"></my-global-icon>
<span class="button-label">{{ label }}</span>
</span>
.action-button {
@include peertube-button-link;
+ @include button-with-icon(21px, 0, -2px);
- font-size: 15px;
font-weight: $font-semibold;
- color: #585858;
- background-color: #E5E5E5;
+ color: $grey-foreground-color;
+ background-color: $grey-background-color;
&:hover {
- background-color: #EFEFEF;
+ background-color: $grey-background-hover-color;
}
- .icon {
- @include icon(21px);
-
- position: relative;
- top: -2px;
-
- &.icon-edit {
- background-image: url('../../../assets/images/global/edit-grey.svg');
- }
-
- &.icon-delete-grey {
- background-image: url('../../../assets/images/global/delete-grey.svg');
- }
-
- &.icon-im-with-her {
- background-image: url('../../../assets/images/global/im-with-her.svg');
- }
-
- &.icon-tick {
- background-image: url('../../../assets/images/global/tick.svg');
- }
-
- &.icon-cross {
- background-image: url('../../../assets/images/global/cross.svg');
- }
+ my-global-icon {
+ @include apply-svg-color($grey-foreground-color);
}
}
import { Component, Input } from '@angular/core'
+import { GlobalIconName } from '@app/shared/icons/global-icon.component'
@Component({
selector: 'my-button',
export class ButtonComponent {
@Input() label = ''
@Input() className: string = undefined
- @Input() icon: string = undefined
+ @Input() icon: GlobalIconName = undefined
@Input() title: string = undefined
getTitle () {
<span class="action-button action-button-delete" [title]="getTitle()" role="button">
- <span class="icon icon-delete-grey"></span>
+ <my-global-icon iconName="delete"></my-global-icon>
<span class="button-label" *ngIf="label">{{ label }}</span>
<span class="button-label" i18n *ngIf="!label">Delete</span>
<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit">
- <span class="icon icon-edit"></span>
+ <my-global-icon iconName="edit"></my-global-icon>
<span class="button-label" *ngIf="label">{{ label }}</span>
<span i18n class="button-label" *ngIf="!label">Edit</span>
<div class="modal-header">
<h4 class="modal-title">{{ title }}</h4>
- <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
</div>
<div class="modal-body" >
import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core'
-import { ConfirmService } from './confirm.service'
+import { ConfirmService } from '@app/core/confirm/confirm.service'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
constructor (private i18n: I18n) {
this.VIDEO_ABUSE_REASON = {
- VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ],
+ VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
MESSAGES: {
'required': this.i18n('Report reason is required.'),
'minlength': this.i18n('Report reason must be at least 2 characters long.'),
- 'maxlength': this.i18n('Report reason cannot be more than 300 characters long.')
+ 'maxlength': this.i18n('Report reason cannot be more than 3000 characters long.')
}
}
this.VIDEO_ABUSE_MODERATION_COMMENT = {
- VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ],
+ VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
MESSAGES: {
'required': this.i18n('Moderation comment is required.'),
'minlength': this.i18n('Moderation comment must be at least 2 characters long.'),
- 'maxlength': this.i18n('Moderation comment cannot be more than 300 characters long.')
+ 'maxlength': this.i18n('Moderation comment cannot be more than 3000 characters long.')
}
}
}
import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
import { Component, forwardRef, Input, OnInit } from '@angular/core'
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
-import { MarkdownService } from '@app/videos/shared'
import { Subject } from 'rxjs'
import truncate from 'lodash-es/truncate'
import { ScreenService } from '@app/shared/misc/screen.service'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-markdown-textarea',
return
}
+ const extension = '.' + file.name.split('.').pop()
+ if (this.extensions.includes(extension) === false) {
+ const message = this.i18n(
+ 'PeerTube cannot handle this kind of file. Accepted extensions are {{extensions}}.',
+ { extensions: this.allowedExtensionsMessage }
+ )
+ this.notifier.error(message)
+
+ return
+ }
+
this.file = file
this.propagateChange(this.file)
--- /dev/null
+/deep/ svg {
+ width: inherit;
+ height: inherit;
+}
--- /dev/null
+import { Component, ElementRef, Input, OnInit } from '@angular/core'
+
+const icons = {
+ 'add': require('../../../assets/images/global/add.html'),
+ 'syndication': require('../../../assets/images/global/syndication.html'),
+ 'help': require('../../../assets/images/global/help.html'),
+ 'sparkle': require('../../../assets/images/global/sparkle.html'),
+ 'alert': require('../../../assets/images/global/alert.html'),
+ 'cloud-error': require('../../../assets/images/global/cloud-error.html'),
+ 'user-add': require('../../../assets/images/global/user-add.html'),
+ 'no': require('../../../assets/images/global/no.html'),
+ 'cloud-download': require('../../../assets/images/global/cloud-download.html'),
+ 'undo': require('../../../assets/images/global/undo.html'),
+ 'circle-tick': require('../../../assets/images/global/circle-tick.html'),
+ 'cog': require('../../../assets/images/global/cog.html'),
+ 'download': require('../../../assets/images/global/download.html'),
+ 'edit': require('../../../assets/images/global/edit.html'),
+ 'im-with-her': require('../../../assets/images/global/im-with-her.html'),
+ 'delete': require('../../../assets/images/global/delete.html'),
+ 'cross': require('../../../assets/images/global/cross.html'),
+ 'validate': require('../../../assets/images/global/validate.html'),
+ 'tick': require('../../../assets/images/global/tick.html'),
+ 'dislike': require('../../../assets/images/video/dislike.html'),
+ 'heart': require('../../../assets/images/video/heart.html'),
+ 'like': require('../../../assets/images/video/like.html'),
+ 'more': require('../../../assets/images/video/more.html'),
+ 'share': require('../../../assets/images/video/share.html'),
+ 'upload': require('../../../assets/images/video/upload.html')
+}
+
+export type GlobalIconName = keyof typeof icons
+
+@Component({
+ selector: 'my-global-icon',
+ template: '',
+ styleUrls: [ './global-icon.component.scss' ]
+})
+export class GlobalIconComponent implements OnInit {
+ @Input() iconName: GlobalIconName
+
+ constructor (private el: ElementRef) {}
+
+ ngOnInit () {
+ const nativeElement = this.el.nativeElement
+
+ nativeElement.innerHTML = icons[this.iconName]
+ }
+}
[autoClose]="true"
(onHidden)="onPopoverHidden()"
(onShown)="onPopoverShown()"
-></span>
+>
+ <my-global-icon iconName="help"></my-global-icon>
+</span>
@import '_mixins';
.help-tooltip-button {
- @include icon(17px);
-
- position: relative;
- top: -2px;
- background-image: url('../../../assets/images/global/help.svg');
+ cursor: pointer;
border: none;
- margin: 5px;
+
+ my-global-icon {
+ width: 17px;
+ position: relative;
+ top: -2px;
+ margin: 5px;
+
+ @include apply-svg-color(var(--mainForegroundColor))
+ }
}
/deep/ {
max-width: 300px;
.popover-body {
+ font-family: $main-fonts;
text-align: left;
padding: 10px;
font-size: 13px;
- font-family: $main-fonts;
- background-color: #fff;
- color: #000;
+ background-color: var(--mainBackgroundColor);
+ color: var(--mainForegroundColor);
box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
+ p {
+ margin-bottom: 0;
+ }
+
ul {
padding-left: 20px;
+ margin-bottom: 0;
}
}
}
import { Component, Input, OnChanges, OnInit } from '@angular/core'
-import { MarkdownService } from '@app/videos/shared'
import { I18n } from '@ngx-translate/i18n-polyfill'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-help',
return fd
}
-function lineFeedToHtml (obj: any, keyToNormalize: string) {
+function objectLineFeedToHtml (obj: any, keyToNormalize: string) {
return immutableAssign(obj, {
- [keyToNormalize]: obj[keyToNormalize].replace(/\r?\n|\r/g, '<br />')
+ [keyToNormalize]: lineFeedToHtml(obj[keyToNormalize])
})
}
+function lineFeedToHtml (text: string) {
+ if (!text) return text
+
+ return text.replace(/\r?\n|\r/g, '<br />')
+}
+
function removeElementFromArray <T> (arr: T[], elem: T) {
const index = arr.indexOf(elem)
if (index !== -1) arr.splice(index, 1)
export {
sortBy,
durationToString,
+ lineFeedToHtml,
objectToUrlEncoded,
getParameterByName,
populateAsyncUserVideoChannels,
dateToHuman,
immutableAssign,
objectToFormData,
- lineFeedToHtml,
+ objectLineFeedToHtml,
removeElementFromArray,
scrollToTop
}
<ng-template #modal>
<div class="modal-header">
<h4 i18n class="modal-title">Ban</h4>
- <span class="close" aria-hidden="true" (click)="hideBanUserModal()"></span>
+
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
</div>
<div class="form-group inputs">
- <span i18n class="action-button action-button-cancel" (click)="hideBanUserModal()">Cancel</span>
+ <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
<input
type="submit" i18n-value value="Ban this user" class="action-button-submit"
</form>
</div>
-</ng-template>
\ No newline at end of file
+</ng-template>
this.openedModal = this.modalService.open(this.modal)
}
- hideBanUserModal () {
+ hide () {
this.usersToBan = undefined
this.openedModal.close()
}
this.notifier.success(message)
this.userBanned.emit(this.usersToBan)
- this.hideBanUserModal()
+ this.hide()
},
err => this.notifier.error(err.message)
--- /dev/null
+import { Injectable } from '@angular/core'
+import { LinkifierService } from '@app/shared/renderer/linkifier.service'
+import * as sanitizeHtml from 'sanitize-html'
+
+@Injectable()
+export class HtmlRendererService {
+
+ constructor (private linkifier: LinkifierService) {
+
+ }
+
+ toSafeHtml (text: string) {
+ // Convert possible markdown to html
+ const html = this.linkifier.linkify(text)
+
+ return sanitizeHtml(html, {
+ allowedTags: [ 'a', 'p', 'span', 'br' ],
+ allowedSchemes: [ 'http', 'https' ],
+ allowedAttributes: {
+ 'a': [ 'href', 'class', 'target' ]
+ },
+ transformTags: {
+ a: (tagName, attribs) => {
+ return {
+ tagName,
+ attribs: Object.assign(attribs, {
+ target: '_blank',
+ rel: 'noopener noreferrer'
+ })
+ }
+ }
+ }
+ })
+ }
+}
--- /dev/null
+export * from './html-renderer.service'
+export * from './linkifier.service'
+export * from './markdown.service'
import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component'
import { HelpComponent } from '@app/shared/misc/help.component'
import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive'
-import { MarkdownService } from '@app/videos/shared'
import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes'
import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared'
import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
import {
CustomConfigValidatorsService,
+ InstanceValidatorsService,
LoginValidatorsService,
ReactiveFileComponent,
ResetPasswordValidatorsService,
- InstanceValidatorsService,
TextareaAutoResizeDirective,
UserValidatorsService,
VideoAbuseValidatorsService,
import { UserNotificationService } from '@app/shared/users/user-notification.service'
import { UserNotificationsComponent } from '@app/shared/users/user-notifications.component'
import { InstanceService } from '@app/shared/instance/instance.service'
+import { HtmlRendererService, LinkifierService, MarkdownService } from '@app/shared/renderer'
+import { ConfirmComponent } from '@app/shared/confirm/confirm.component'
+import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
@NgModule({
imports: [
UserBanModalComponent,
UserModerationDropdownComponent,
TopMenuDropdownComponent,
- UserNotificationsComponent
+ UserNotificationsComponent,
+ ConfirmComponent,
+ GlobalIconComponent
],
exports: [
UserModerationDropdownComponent,
TopMenuDropdownComponent,
UserNotificationsComponent,
+ ConfirmComponent,
+ GlobalIconComponent,
NumberFormatterPipe,
ObjectLengthPipe,
UserService,
VideoService,
AccountService,
- MarkdownService,
VideoChannelService,
VideoCaptionService,
VideoImportService,
UserHistoryService,
InstanceService,
+ MarkdownService,
+ LinkifierService,
+ HtmlRendererService,
+
I18nPrimengCalendarService,
ScreenService,
-import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo } from '../../../../../shared'
+import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo, ActorInfo } from '../../../../../shared'
+import { Actor } from '@app/shared/actor/actor.model'
export class UserNotification implements UserNotificationServer {
id: number
read: boolean
video?: VideoInfo & {
- channel: {
- id: number
- displayName: string
- }
+ channel: ActorInfo & { avatarUrl?: string }
}
videoImport?: {
comment?: {
id: number
threadId: number
- account: {
- id: number
- displayName: string
- }
+ account: ActorInfo & { avatarUrl?: string }
video: VideoInfo
}
video: VideoInfo
}
- account?: {
- id: number
- displayName: string
- name: string
- }
+ account?: ActorInfo & { avatarUrl?: string }
actorFollow?: {
id: number
- follower: {
- name: string
- displayName: string
- }
+ follower: ActorInfo & { avatarUrl?: string }
following: {
type: 'account' | 'channel'
name: string
this.read = hash.read
this.video = hash.video
+ if (this.video) this.setAvatarUrl(this.video.channel)
+
this.videoImport = hash.videoImport
+
this.comment = hash.comment
+ if (this.comment) this.setAvatarUrl(this.comment.account)
+
this.videoAbuse = hash.videoAbuse
+
this.videoBlacklist = hash.videoBlacklist
+
this.account = hash.account
+ if (this.account) this.setAvatarUrl(this.account)
+
this.actorFollow = hash.actorFollow
+ if (this.actorFollow) this.setAvatarUrl(this.actorFollow.follower)
this.createdAt = hash.createdAt
this.updatedAt = hash.updatedAt
case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO:
case UserNotificationType.COMMENT_MENTION:
+ this.accountUrl = this.buildAccountUrl(this.comment.account)
this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ]
break
return '/videos/watch/' + video.uuid
}
- private buildAccountUrl (account: { name: string }) {
- return '/accounts/' + account.name
+ private buildAccountUrl (account: { name: string, host: string }) {
+ return '/accounts/' + Actor.CREATE_BY_STRING(account.name, account.host)
}
private buildVideoImportUrl () {
return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName
}
+ private setAvatarUrl (actor: { avatarUrl?: string, avatar?: { path: string } }) {
+ actor.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(actor)
+ }
}
import { Injectable } from '@angular/core'
import { HttpClient, HttpParams } from '@angular/common/http'
-import { RestExtractor, RestService } from '@app/shared/rest'
+import { RestExtractor, RestService } from '../rest'
import { catchError, map, tap } from 'rxjs/operators'
import { environment } from '../../../environments/environment'
import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared'
-import { UserNotification } from '@app/shared/users/user-notification.model'
-import { Subject } from 'rxjs'
-import * as io from 'socket.io-client'
-import { AuthService } from '@app/core'
-import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
-import { User } from '@app/shared'
+import { UserNotification } from './user-notification.model'
+import { AuthService } from '../../core'
+import { ComponentPagination } from '../rest/component-pagination.model'
+import { User } from '..'
+import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
@Injectable()
export class UserNotificationService {
static BASE_NOTIFICATIONS_URL = environment.apiUrl + '/api/v1/users/me/notifications'
static BASE_NOTIFICATION_SETTINGS = environment.apiUrl + '/api/v1/users/me/notification-settings'
- private notificationSubject = new Subject<{ type: 'new' | 'read' | 'read-all', notification?: UserNotification }>()
-
- private socket: SocketIOClient.Socket
-
constructor (
private auth: AuthService,
private authHttp: HttpClient,
private restExtractor: RestExtractor,
- private restService: RestService
+ private restService: RestService,
+ private userNotificationSocket: UserNotificationSocket
) {}
listMyNotifications (pagination: ComponentPagination, unread?: boolean, ignoreLoadingBar = false) {
.pipe(map(n => n.total))
}
- getMyNotificationsSocket () {
- const socket = this.getSocket()
-
- socket.on('new-notification', (n: UserNotificationServer) => {
- this.notificationSubject.next({ type: 'new', notification: new UserNotification(n) })
- })
-
- return this.notificationSubject.asObservable()
- }
-
markAsRead (notification: UserNotification) {
const url = UserNotificationService.BASE_NOTIFICATIONS_URL + '/read'
return this.authHttp.post(url, body, { headers })
.pipe(
map(this.restExtractor.extractDataBool),
- tap(() => this.notificationSubject.next({ type: 'read' })),
+ tap(() => this.userNotificationSocket.dispatch('read')),
catchError(res => this.restExtractor.handleError(res))
)
}
return this.authHttp.post(url, {}, { headers })
.pipe(
map(this.restExtractor.extractDataBool),
- tap(() => this.notificationSubject.next({ type: 'read-all' })),
+ tap(() => this.userNotificationSocket.dispatch('read-all')),
catchError(res => this.restExtractor.handleError(res))
)
}
)
}
- private getSocket () {
- if (this.socket) return this.socket
-
- this.socket = io(environment.apiUrl + '/user-notifications', {
- query: { accessToken: this.auth.getAccessToken() }
- })
-
- return this.socket
- }
-
private formatNotification (notification: UserNotificationServer) {
return new UserNotification(notification)
}
<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div>
<div class="notifications" myInfiniteScroller [autoInit]="true" (nearOfBottom)="onNearOfBottom()">
- <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }">
+ <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }" (click)="markAsRead(notification)">
- <div [ngSwitch]="notification.type">
+ <ng-container [ngSwitch]="notification.type">
<ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION">
- {{ notification.video.channel.displayName }} published a <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">new video</a>
+ <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.video.channel.avatarUrl" />
+
+ <div class="message">
+ {{ notification.video.channel.displayName }} published a <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">new video</a>
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.UNBLACKLIST_ON_MY_VIDEO">
- Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been unblacklisted
+ <my-global-icon iconName="undo"></my-global-icon>
+
+ <div class="message">
+ Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been unblacklisted
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.BLACKLIST_ON_MY_VIDEO">
- Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been blacklisted
+ <my-global-icon iconName="no"></my-global-icon>
+
+ <div class="message">
+ Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been blacklisted
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS">
- <a (click)="markAsRead(notification)" [routerLink]="notification.videoAbuseUrl">A new video abuse</a> has been created on video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoAbuse.video.name }}</a>
+ <my-global-icon iconName="alert"></my-global-icon>
+
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.videoAbuseUrl">A new video abuse</a> has been created on video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoAbuse.video.name }}</a>
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.NEW_COMMENT_ON_MY_VIDEO">
- {{ notification.comment.account.displayName }} commented your video <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">{{ notification.comment.video.name }}</a>
+ <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
+
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.comment.account.displayName }}</a> commented your video <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">{{ notification.comment.video.name }}</a>
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_PUBLISHED">
- Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been published
+ <my-global-icon iconName="sparkle"></my-global-icon>
+
+ <div class="message">
+ Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been published
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_SUCCESS">
- <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">Your video import</a> {{ notification.videoImportIdentifier }} succeeded
+ <my-global-icon iconName="cloud-download"></my-global-icon>
+
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">Your video import</a> {{ notification.videoImportIdentifier }} succeeded
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_ERROR">
- <a (click)="markAsRead(notification)" [routerLink]="notification.videoImportUrl">Your video import</a> {{ notification.videoImportIdentifier }} failed
+ <my-global-icon iconName="cloud-error"></my-global-icon>
+
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.videoImportUrl">Your video import</a> {{ notification.videoImportIdentifier }} failed
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.NEW_USER_REGISTRATION">
- User <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.account.name }} registered</a> on your instance
+ <my-global-icon iconName="user-add"></my-global-icon>
+
+ <div class="message">
+ User <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.account.name }} registered</a> on your instance
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.NEW_FOLLOW">
- <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.actorFollow.follower.displayName }}</a> is following
+ <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.actorFollow.follower.avatarUrl" />
- <ng-container *ngIf="notification.actorFollow.following.type === 'channel'">
- your channel {{ notification.actorFollow.following.displayName }}
- </ng-container>
- <ng-container *ngIf="notification.actorFollow.following.type === 'account'">your account</ng-container>
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.actorFollow.follower.displayName }}</a> is following
+
+ <ng-container *ngIf="notification.actorFollow.following.type === 'channel'">your channel {{ notification.actorFollow.following.displayName }}</ng-container>
+ <ng-container *ngIf="notification.actorFollow.following.type === 'account'">your account</ng-container>
+ </div>
</ng-container>
<ng-container i18n *ngSwitchCase="UserNotificationType.COMMENT_MENTION">
- {{ notification.comment.account.displayName }} mentioned you on <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">video {{ notification.comment.video.name }}</a>
+ <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
+
+ <div class="message">
+ <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.comment.account.displayName }}</a> mentioned you on <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">video {{ notification.comment.video.name }}</a>
+ </div>
</ng-container>
- </div>
+ </ng-container>
- <div i18n title="Mark as read" class="mark-as-read">
- <div class="glyphicon glyphicon-ok" (click)="markAsRead(notification)"></div>
- </div>
+ <div class="from-date">{{ notification.createdAt | myFromNow }}</div>
</div>
</div>
+@import '_variables';
+@import '_mixins';
+
+.no-notification {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 20px 0;
+}
+
.notification {
display: flex;
- justify-content: space-between;
align-items: center;
font-size: inherit;
- padding: 15px 10px;
+ padding: 15px 5px 15px 10px;
border-bottom: 1px solid rgba(0, 0, 0, 0.10);
- .mark-as-read {
- min-width: 35px;
+ &.unread {
+ background-color: rgba(0, 0, 0, 0.05);
+ }
+
+ my-global-icon {
+ width: 24px;
+ margin-right: 11px;
+ margin-left: 3px;
- .glyphicon {
- display: none;
- cursor: pointer;
- color: rgba(20, 20, 20, 0.5)
- }
+ @include apply-svg-color(#333);
}
- &.unread {
- background-color: rgba(0, 0, 0, 0.05);
+ .avatar {
+ @include avatar(30px);
- &:hover .mark-as-read .glyphicon {
- display: block;
+ margin-right: 10px;
+ }
+
+ .message {
+ flex-grow: 1;
- &:hover {
- color: rgba(20, 20, 20, 0.8);
- }
+ a {
+ font-weight: $font-semibold;
}
}
+
+ .from-date {
+ font-size: 0.85em;
+ color: $grey-foreground-color;
+ padding-left: 5px;
+ min-width: 70px;
+ text-align: right;
+ }
}
export class UserNotificationsComponent implements OnInit {
@Input() ignoreLoadingBar = false
@Input() infiniteScroll = true
+ @Input() itemsPerPage = 20
notifications: UserNotification[] = []
// So we can access it in the template
UserNotificationType = UserNotificationType
- componentPagination: ComponentPagination = {
- currentPage: 1,
- itemsPerPage: 10,
- totalItems: null
- }
+ componentPagination: ComponentPagination
constructor (
private userNotificationService: UserNotificationService,
) { }
ngOnInit () {
+ this.componentPagination = {
+ currentPage: 1,
+ itemsPerPage: this.itemsPerPage, // Reset items per page, because of the @Input() variable
+ totalItems: null
+ }
+
this.loadMoreNotifications()
}
}
markAsRead (notification: UserNotification) {
+ if (notification.read) return
+
this.userNotificationService.markAsRead(notification)
.subscribe(
() => {
reportVideo (id: number, reason: string) {
const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse'
- const body = {
- reason
- }
+ const body = { reason }
return this.authHttp.post(url, body)
.pipe(
)
}
- blacklistVideo (videoId: number, reason?: string) {
- const body = reason ? { reason } : {}
+ blacklistVideo (videoId: number, reason: string, unfederate: boolean) {
+ const body = {
+ unfederate,
+ reason
+ }
return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body)
.pipe(
nsfw: video.nsfw,
waitTranscoding: video.waitTranscoding,
commentsEnabled: video.commentsEnabled,
+ downloadEnabled: video.downloadEnabled,
thumbnailfile: video.thumbnailfile,
previewfile: video.previewfile,
scheduleUpdate,
<div [ngClass]="{ 'margin-content': marginContent }">
<div class="videos-header">
<div *ngIf="titlePage" class="title-page title-page-single">
- {{ titlePage }}
+ <div placement="bottom" [ngbTooltip]="titleTooltip" container="body">
+ {{ titlePage }}
+ </div>
</div>
+
<my-feed [syndicationItems]="syndicationItems"></my-feed>
<div class="moderation-block" *ngIf="displayModerationBlock">
my-feed {
display: inline-block;
- position: relative;
top: 1px;
+ min-width: 60px;
}
.moderation-block {
ownerDisplayType: OwnerDisplayType = 'account'
firstLoadedPage: number
displayModerationBlock = false
+ titleTooltip: string
protected baseVideoWidth = 215
protected baseVideoHeight = 205
<div class="video-feed">
- <span
+ <my-global-icon
*ngIf="syndicationItems.length !== 0" [ngbPopover]="feedsList" [autoClose]="true" placement="bottom"
- class="icon icon-syndication" role="button"
- ></span>
+ class="icon-syndication" role="button" iconName="syndication"
+ >
+ </my-global-icon>
<ng-template #feedsList>
<a *ngFor="let item of syndicationItems" [href]="item.url" target="_blank" rel="noopener noreferrer">{{ item.label }}</a>
</ng-template>
-</div>
\ No newline at end of file
+</div>
+@import '_variables';
@import '_mixins';
.video-feed {
display: block;
}
- .icon {
- @include icon(12px);
+ my-global-icon {
+ cursor: pointer;
+ width: 12px;
+ position: relative;
+ top: -2px;
- &.icon-syndication {
- position: relative;
- top: -2px;
- background-color: var(--mainForegroundColor);
- mask-image: url('../../../assets/images/global/syndication.svg');
- }
+ @include apply-svg-color(var(--mainForegroundColor))
}
-}
\ No newline at end of file
+}
import { Video } from '../../shared/video/video.model'
import { Account } from '@app/shared/account/account.model'
import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
+import { VideoStreamingPlaylist } from '../../../../../shared/models/videos/video-streaming-playlist.model'
+import { VideoStreamingPlaylistType } from '../../../../../shared/models/videos/video-streaming-playlist.type'
export class VideoDetails extends Video implements VideoDetailsServerModel {
descriptionPath: string
files: VideoFile[]
account: Account
commentsEnabled: boolean
+ downloadEnabled: boolean
waitTranscoding: boolean
state: VideoConstant<VideoState>
likesPercent: number
dislikesPercent: number
+ trackerUrls: string[]
+
+ streamingPlaylists: VideoStreamingPlaylist[]
+
constructor (hash: VideoDetailsServerModel, translations = {}) {
super(hash, translations)
this.tags = hash.tags
this.support = hash.support
this.commentsEnabled = hash.commentsEnabled
+ this.downloadEnabled = hash.downloadEnabled
+
+ this.trackerUrls = hash.trackerUrls
+ this.streamingPlaylists = hash.streamingPlaylists
this.buildLikeAndDislikePercents()
}
this.likesPercent = (this.likes / (this.likes + this.dislikes)) * 100
this.dislikesPercent = (this.dislikes / (this.likes + this.dislikes)) * 100
}
+
+ getHlsPlaylist () {
+ return this.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
+ }
}
tags: string[]
nsfw: boolean
commentsEnabled: boolean
+ downloadEnabled: boolean
waitTranscoding: boolean
channelId: number
privacy: VideoPrivacy
scheduleUpdate?: VideoScheduleUpdate
originallyPublishedAt?: Date | string
- constructor (video?: Video & { tags: string[], commentsEnabled: boolean, support: string, thumbnailUrl: string, previewUrl: string }) {
+ constructor (
+ video?: Video & {
+ tags: string[],
+ commentsEnabled: boolean,
+ downloadEnabled: boolean,
+ support: string,
+ thumbnailUrl: string,
+ previewUrl: string
+ }) {
if (video) {
this.id = video.id
this.uuid = video.uuid
this.tags = video.tags
this.nsfw = video.nsfw
this.commentsEnabled = video.commentsEnabled
+ this.downloadEnabled = video.downloadEnabled
this.waitTranscoding = video.waitTranscoding
this.channelId = video.channel.id
this.privacy = video.privacy.id
tags: this.tags,
nsfw: this.nsfw,
commentsEnabled: this.commentsEnabled,
+ downloadEnabled: this.downloadEnabled,
waitTranscoding: this.waitTranscoding,
channelId: this.channelId,
privacy: this.privacy,
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px;
- color: #585858;
+ color: $grey-foreground-color;
&:hover {
- color: #303030;
+ color: $grey-foreground-hover-color;
}
}
}
displayName: string
url: string
host: string
- avatar: Avatar
+ avatar?: Avatar
}
channel: {
displayName: string
url: string
host: string
- avatar: Avatar
+ avatar?: Avatar
}
userHistory?: {
nsfw: video.nsfw,
waitTranscoding: video.waitTranscoding,
commentsEnabled: video.commentsEnabled,
+ downloadEnabled: video.downloadEnabled,
thumbnailfile: video.thumbnailfile,
previewfile: video.previewfile,
scheduleUpdate,
<div class="modal-header">
<h4 i18n class="modal-title">Add caption</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
i18n-helpHtml helpHtml="Some instances do not list videos containing mature or explicit content by default."
></my-peertube-checkbox>
- <my-peertube-checkbox
- inputName="commentsEnabled" formControlName="commentsEnabled"
- i18n-labelText labelText="Enable video comments"
- ></my-peertube-checkbox>
-
<my-peertube-checkbox
*ngIf="waitTranscodingEnabled"
inputName="waitTranscoding" formControlName="waitTranscoding"
<div class="captions-header">
<a (click)="openAddCaptionModal()" class="create-caption">
- <span class="icon icon-add"></span>
+ <my-global-icon iconName="add"></my-global-icon>
<ng-container i18n>Add another caption</ng-container>
</a>
</div>
{{ formErrors.support }}
</div>
</div>
+
+ <my-peertube-checkbox
+ inputName="commentsEnabled" formControlName="commentsEnabled"
+ i18n-labelText labelText="Enable video comments"
+ ></my-peertube-checkbox>
+
+ <my-peertube-checkbox
+ inputName="downloadEnabled" formControlName="downloadEnabled"
+ i18n-labelText labelText="Enable download"
+ ></my-peertube-checkbox>
</div>
</ng-template>
</ngb-tab>
display: block;
}
- input, select {
- font-size: 15px
- }
-
.label-tags + span {
font-size: 15px;
}
text-align: right;
.create-caption {
- @include create-button('../../../../assets/images/global/add.svg');
+ @include create-button;
}
}
display: inline-block;
margin-right: 25px;
- color: #585858;
+ color: $grey-foreground-color;
font-size: 15px;
}
.submit-button {
@include peertube-button;
@include orange-button;
+ @include button-with-icon(20px, 1px);
display: inline-block;
color: inherit;
font-weight: $font-semibold;
}
-
- .icon.icon-validate {
- @include icon(20px);
-
- cursor: inherit;
- position: relative;
- top: -1px;
- margin-right: 4px;
- background-image: url('../../../../assets/images/global/validate.svg');
- }
}
}
}
tag {
- background-color: var(--inputColor) !important;
+ background-color: $grey-background-color !important;
+ color: #000 !important;
border-radius: 3px !important;
font-size: 15px !important;
- color: var(--mainForegroundColor) !important;
height: 30px !important;
line-height: 30px !important;
margin: 0 5px 0 0 !important;
top: -1px;
height: auto !important;
vertical-align: middle !important;
- fill: #585858 !important;
+
+ path {
+ fill: $grey-foreground-color !important;
+ }
}
&:hover {
const defaultValues: any = {
nsfw: 'false',
commentsEnabled: 'true',
+ downloadEnabled: 'true',
waitTranscoding: 'true',
tags: []
}
channelId: this.videoValidatorsService.VIDEO_CHANNEL,
nsfw: null,
commentsEnabled: null,
+ downloadEnabled: null,
waitTranscoding: null,
category: this.videoValidatorsService.VIDEO_CATEGORY,
licence: this.videoValidatorsService.VIDEO_LICENCE,
<div *ngIf="!hasImportedVideo" class="upload-video-container">
- <div class="import-video-torrent">
- <div class="icon icon-upload"></div>
+ <div class="first-step-block">
+ <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
<div class="button-file">
<span i18n>Select the torrent to import</span>
(click)="updateSecondStep()"
[ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
>
- <span class="icon icon-validate"></span>
+ <my-global-icon iconName="validate"></my-global-icon>
<input type="button" i18n-value value="Update" />
</div>
</div>
@import 'variables';
@import 'mixins';
-$width-size: 190px;
-
-.peertube-select-container {
- @include peertube-select-container($width-size);
-}
-
-.alert.alert-danger {
- text-align: center;
-
- & > div {
- font-weight: $font-semibold;
- }
-}
-
-.import-video-torrent {
- display: flex;
- flex-direction: column;
- align-items: center;
-
- .icon.icon-upload {
- @include icon(90px);
- margin-bottom: 25px;
- cursor: default;
-
- background-image: url('../../../../assets/images/video/upload.svg');
- }
-
- .button-file {
- @include peertube-button-file(auto);
-
- min-width: 190px;
- }
-
- .button-file-extension {
- display: block;
- font-size: 12px;
- margin-top: 5px;
- }
-
+.first-step-block {
.torrent-or-magnet {
margin: 10px 0;
}
.form-group-magnet-uri {
margin-bottom: 40px;
}
-
- input[type=text] {
- @include peertube-input-text($width-size);
- display: block;
- }
-
- input[type=button] {
- @include peertube-button;
- @include orange-button;
-
- width: $width-size;
- margin-top: 30px;
- }
}
templateUrl: './video-import-torrent.component.html',
styleUrls: [
'../shared/video-edit.component.scss',
- './video-import-torrent.component.scss'
+ './video-import-torrent.component.scss',
+ './video-send.scss'
]
})
export class VideoImportTorrentComponent extends VideoSend implements OnInit, CanComponentDeactivate {
privacy: this.firstStepPrivacyId,
waitTranscoding: false,
commentsEnabled: true,
+ downloadEnabled: true,
channelId: this.firstStepChannelId
}
this.video = new VideoEdit(Object.assign(res.video, {
commentsEnabled: videoUpdate.commentsEnabled,
+ downloadEnabled: videoUpdate.downloadEnabled,
support: null,
thumbnailUrl: null,
previewUrl: null
<div *ngIf="!hasImportedVideo" class="upload-video-container">
- <div class="import-video-url">
- <div class="icon icon-upload"></div>
+ <div class="first-step-block">
+ <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
<div class="form-group">
<label i18n for="targetUrl">URL</label>
(click)="updateSecondStep()"
[ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
>
- <span class="icon icon-validate"></span>
+ <my-global-icon iconName="validate"></my-global-icon>
<input type="button" i18n-value value="Update" />
</div>
</div>
templateUrl: './video-import-url.component.html',
styleUrls: [
'../shared/video-edit.component.scss',
- './video-import-url.component.scss'
+ './video-send.scss'
]
})
export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate {
privacy: this.firstStepPrivacyId,
waitTranscoding: false,
commentsEnabled: true,
+ downloadEnabled: true,
channelId: this.firstStepChannelId
}
this.video = new VideoEdit(Object.assign(res.video, {
commentsEnabled: videoUpdate.commentsEnabled,
+ downloadEnabled: videoUpdate.downloadEnabled,
support: null,
thumbnailUrl: null,
previewUrl: null
$width-size: 190px;
-.peertube-select-container {
- @include peertube-select-container($width-size);
-}
-
.alert.alert-danger {
text-align: center;
}
}
-.import-video-url {
+.first-step-block {
display: flex;
flex-direction: column;
align-items: center;
- .icon.icon-upload {
- @include icon(90px);
+ .upload-icon {
+ width: 90px;
margin-bottom: 25px;
- cursor: default;
- background-image: url('../../../../assets/images/video/upload.svg');
+ @include apply-svg-color(#C6C6C6);
+ }
+
+ .peertube-select-container {
+ @include peertube-select-container($width-size);
}
input[type=text] {
width: $width-size;
margin-top: 30px;
}
-}
+ .button-file {
+ @include peertube-button-file(auto);
+ min-width: 190px;
+ }
+
+ .button-file-extension {
+ display: block;
+ font-size: 12px;
+ margin-top: 5px;
+ }
+}
<div *ngIf="!isUploadingVideo" class="upload-video-container">
- <div class="upload-video">
- <div class="icon icon-upload"></div>
+ <div class="first-step-block">
+ <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
<div class="button-file">
<span i18n>Select the file to upload</span>
{{ error }}
</div>
+<div *ngIf="videoUploaded && !error" class="alert alert-info" i18n>
+ Congratulations! Your video is now available in your private library.
+</div>
+
<!-- Hidden because we want to load the component -->
<form [hidden]="!isUploadingVideo" novalidate [formGroup]="form">
<my-video-edit
(click)="updateSecondStep()"
[ngClass]="{ disabled: isPublishingButtonDisabled() }"
>
- <span class="icon icon-validate"></span>
+ <my-global-icon iconName="validate"></my-global-icon>
<input [disabled]="isPublishingButtonDisabled()" type="button" i18n-value value="Publish" />
</div>
</div>
@import 'variables';
@import 'mixins';
-.peertube-select-container {
- @include peertube-select-container(190px);
-}
-
-.alert.alert-danger {
- text-align: center;
-
- & > div {
- font-weight: $font-semibold;
- }
-}
-
-.upload-video {
- display: flex;
- flex-direction: column;
- align-items: center;
-
- .form-group-channel {
- margin-bottom: 20px;
- margin-top: 35px;
- }
-
- .icon.icon-upload {
- @include icon(90px);
- margin-bottom: 25px;
- cursor: default;
-
- background-image: url('../../../../assets/images/video/upload.svg');
- }
-
- .button-file {
- @include peertube-button-file(auto);
-
- min-width: 190px;
- }
-
- .button-file-extension {
- display: block;
- font-size: 12px;
- margin-top: 5px;
- }
+.first-step-block .form-group-channel {
+ margin-bottom: 20px;
+ margin-top: 35px;
}
.upload-progress-cancel {
templateUrl: './video-upload.component.html',
styleUrls: [
'../shared/video-edit.component.scss',
- './video-upload.component.scss'
+ './video-upload.component.scss',
+ './video-send.scss'
]
})
export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy, CanComponentDeactivate {
const nsfw = false
const waitTranscoding = true
const commentsEnabled = true
+ const downloadEnabled = true
const channelId = this.firstStepChannelId.toString()
const formData = new FormData()
formData.append('privacy', VideoPrivacy.PRIVATE.toString())
formData.append('nsfw', '' + nsfw)
formData.append('commentsEnabled', '' + commentsEnabled)
+ formData.append('downloadEnabled', '' + downloadEnabled)
formData.append('waitTranscoding', '' + waitTranscoding)
formData.append('channelId', '' + channelId)
formData.append('videofile', videofile)
-import { Component, ViewChild } from '@angular/core'
+import { Component, HostListener, ViewChild } from '@angular/core'
import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service'
import { VideoImportUrlComponent } from '@app/videos/+video-edit/video-add-components/video-import-url.component'
import { VideoUploadComponent } from '@app/videos/+video-edit/video-add-components/video-upload.component'
this.secondStepType = undefined
}
- canDeactivate () {
+ @HostListener('window:beforeunload', [ '$event' ])
+ onUnload (event: any) {
+ const { text, canDeactivate } = this.canDeactivate()
+
+ if (canDeactivate) return
+
+ event.returnValue = text
+ return text
+ }
+
+ canDeactivate (): { canDeactivate: boolean, text?: string} {
if (this.secondStepType === 'upload') return this.videoUpload.canDeactivate()
if (this.secondStepType === 'import-url') return this.videoImportUrl.canDeactivate()
if (this.secondStepType === 'import-torrent') return this.videoImportTorrent.canDeactivate()
<div class="submit-container">
<div class="submit-button" (click)="update()" [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }">
- <span class="icon icon-validate"></span>
+ <my-global-icon iconName="validate"></my-global-icon>
<input type="button" i18n-value value="Update" />
</div>
</div>
import { map, switchMap } from 'rxjs/operators'
-import { Component, OnInit } from '@angular/core'
+import { Component, HostListener, OnInit } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
import { LoadingBarService } from '@ngx-loading-bar/core'
import { Notifier } from '@app/core'
)
}
- canDeactivate () {
+ @HostListener('window:beforeunload', [ '$event' ])
+ onUnload (event: any) {
+ const { text, canDeactivate } = this.canDeactivate()
+
+ if (canDeactivate) return
+
+ event.returnValue = text
+ return text
+ }
+
+ canDeactivate (): { canDeactivate: boolean, text?: string } {
if (this.updateDone === true) return { canDeactivate: true }
+ const text = this.i18n('You have unsaved changes! If you leave, your changes will be lost.')
+
for (const caption of this.videoCaptions) {
- if (caption.action) return { canDeactivate: false }
+ if (caption.action) return { canDeactivate: false, text }
}
- return { canDeactivate: this.formChanged === false }
+ return { canDeactivate: this.formChanged === false, text }
}
checkForm () {
}
.comment-date {
- color: #585858;
+ color: $grey-foreground-color;
margin-left: 10px;
}
}
.comment-action-reply,
.comment-action-delete {
- color: #585858;
+ color: $grey-foreground-color;
cursor: pointer;
margin-right: 10px;
.root-comment {
font-size: 14px;
}
-}
\ No newline at end of file
+}
import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'
-import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
-import * as sanitizeHtml from 'sanitize-html'
import { UserRight } from '../../../../../../shared/models/users'
import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
import { AuthService } from '../../../core/auth'
import { Video } from '../../../shared/video/video.model'
import { VideoComment } from './video-comment.model'
+import { HtmlRendererService } from '@app/shared/renderer'
@Component({
selector: 'my-video-comment',
newParentComments: VideoComment[] = []
constructor (
- private linkifierService: LinkifierService,
+ private htmlRenderer: HtmlRendererService,
private authService: AuthService
) {}
}
private init () {
- // Convert possible markdown to html
- const html = this.linkifierService.linkify(this.comment.text)
-
- this.sanitizedCommentHTML = sanitizeHtml(html, {
- allowedTags: [ 'a', 'p', 'span', 'br' ],
- allowedSchemes: [ 'http', 'https' ],
- allowedAttributes: {
- 'a': [ 'href', 'class', 'target' ]
- },
- transformTags: {
- a: (tagName, attribs) => {
- return {
- tagName,
- attribs: Object.assign(attribs, {
- target: '_blank',
- rel: 'noopener noreferrer'
- })
- }
- }
- }
- })
+ this.sanitizedCommentHTML = this.htmlRenderer.toSafeHtml(this.comment.text)
this.newParentComments = this.parentComments.concat([ this.comment ])
}
import { catchError, map } from 'rxjs/operators'
import { HttpClient, HttpParams } from '@angular/common/http'
import { Injectable } from '@angular/core'
-import { lineFeedToHtml } from '@app/shared/misc/utils'
+import { objectLineFeedToHtml } from '@app/shared/misc/utils'
import { Observable } from 'rxjs'
import { ResultList, FeedFormat } from '../../../../../../shared/models'
import {
addCommentThread (videoId: number | string, comment: VideoCommentCreate) {
const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
- const normalizedComment = lineFeedToHtml(comment, 'text')
+ const normalizedComment = objectLineFeedToHtml(comment, 'text')
return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
.pipe(
addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) {
const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId
- const normalizedComment = lineFeedToHtml(comment, 'text')
+ const normalizedComment = objectLineFeedToHtml(comment, 'text')
return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
.pipe(
<ng-template #modal>
<div class="modal-header">
<h4 i18n class="modal-title">Blacklist video</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
</div>
</div>
+ <div class="form-group" *ngIf="video.isLocal">
+ <my-peertube-checkbox
+ inputName="unfederate" formControlName="unfederate"
+ i18n-labelText labelText="Unfederate the video (ask for its deletion from the remote instances)"
+ ></my-peertube-checkbox>
+ </div>
+
<div class="form-group inputs">
<span i18n class="action-button action-button-cancel" (click)="hide()">
Cancel
}
ngOnInit () {
+ const defaultValues = { unfederate: 'true' }
+
this.buildForm({
- reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON
- })
+ reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON,
+ unfederate: null
+ }, defaultValues)
}
show () {
blacklist () {
const reason = this.form.value[ 'reason' ] || undefined
+ const unfederate = this.video.isLocal ? this.form.value[ 'unfederate' ] : undefined
- this.videoBlacklistService.blacklistVideo(this.video.id, reason)
+ this.videoBlacklistService.blacklistVideo(this.video.id, reason, unfederate)
.subscribe(
() => {
this.notifier.success(this.i18n('Video blacklisted.'))
<ng-template #modal let-hide="close">
<div class="modal-header">
<h4 i18n class="modal-title">Download video</h4>
- <span class="close" aria-hidden="true" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
<ng-template #modal>
<div class="modal-header">
<h4 i18n class="modal-title">Report video</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
<ng-template #modal let-hide="close">
<div class="modal-header">
<h4 i18n class="modal-title">Share</h4>
- <span class="close" aria-hidden="true" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body">
<ng-template #modal let-hide="close">
<div class="modal-header">
<h4 i18n class="modal-title">Support</h4>
- <span class="close" aria-label="Close" role="button" (click)="hide()"></span>
+ <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="modal-body" [innerHTML]="videoHTMLSupport"></div>
import { Component, Input, ViewChild } from '@angular/core'
-import { MarkdownService } from '@app/videos/shared'
-
import { VideoDetails } from '../../../shared/video/video-details.model'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
+import { MarkdownService } from '@app/shared/renderer'
@Component({
selector: 'my-video-support',
<div
*ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()"
class="action-button action-button-like" role="button" [attr.aria-pressed]="userRating === 'like'"
+ i18n-title title="Like this video"
>
- <span class="icon icon-like" i18n-title title="Like this video" ></span>
+ <my-global-icon iconName="like"></my-global-icon>
</div>
<div
*ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()"
class="action-button action-button-dislike" role="button" [attr.aria-pressed]="userRating === 'dislike'"
+ i18n-title title="Dislike this video"
>
- <span class="icon icon-dislike" i18n-title title="Dislike this video"></span>
+ <my-global-icon iconName="dislike"></my-global-icon>
</div>
<div *ngIf="video.support" (click)="showSupportModal()" class="action-button action-button-support">
- <span class="icon icon-support"></span>
+ <my-global-icon iconName="heart"></my-global-icon>
<span class="icon-text" i18n>Support</span>
</div>
<div (click)="showShareModal()" class="action-button action-button-share" role="button">
- <span class="icon icon-share"></span>
+ <my-global-icon iconName="share"></my-global-icon>
<span class="icon-text" i18n>Share</span>
</div>
<div class="action-more" ngbDropdown placement="top" role="button">
<div class="action-button" ngbDropdownToggle role="button">
- <span class="icon icon-more"></span>
+ <my-global-icon class="more-icon" iconName="more"></my-global-icon>
</div>
<div ngbDropdownMenu>
- <a class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
- <span class="icon icon-download"></span> <ng-container i18n>Download</ng-container>
+ <a *ngIf="isVideoDownloadable()" class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
+ <my-global-icon iconName="download"></my-global-icon> <ng-container i18n>Download</ng-container>
</a>
<a *ngIf="isUserLoggedIn()" class="dropdown-item" i18n-title title="Report this video" href="#" (click)="showReportModal($event)">
- <span class="icon icon-alert"></span> <ng-container i18n>Report</ng-container>
+ <my-global-icon iconName="alert"></my-global-icon> <ng-container i18n>Report</ng-container>
</a>
<a *ngIf="isVideoUpdatable()" class="dropdown-item" i18n-title title="Update this video" href="#" [routerLink]="[ '/videos/update', video.uuid ]">
- <span class="icon icon-edit"></span> <ng-container i18n>Update</ng-container>
+ <my-global-icon iconName="edit"></my-global-icon> <ng-container i18n>Update</ng-container>
</a>
<a *ngIf="isVideoBlacklistable()" class="dropdown-item" i18n-title title="Blacklist this video" href="#" (click)="showBlacklistModal($event)">
- <span class="icon icon-blacklist"></span> <ng-container i18n>Blacklist</ng-container>
+ <my-global-icon iconName="no"></my-global-icon> <ng-container i18n>Blacklist</ng-container>
</a>
<a *ngIf="isVideoUnblacklistable()" class="dropdown-item" i18n-title title="Unblacklist this video" href="#" (click)="unblacklistVideo($event)">
- <span class="icon icon-unblacklist"></span> <ng-container i18n>Unblacklist</ng-container>
+ <my-global-icon iconName="undo"></my-global-icon> <ng-container i18n>Unblacklist</ng-container>
</a>
<a *ngIf="isVideoRemovable()" class="dropdown-item" i18n-title title="Delete this video" href="#" (click)="removeVideo($event)">
- <span class="icon icon-delete"></span> <ng-container i18n>Delete</ng-container>
+ <my-global-icon iconName="delete"></my-global-icon> <ng-container i18n>Delete</ng-container>
</a>
</div>
</div>
<span class="video-attribute-value">{{ video.privacy.label }}</span>
</div>
- <div class="video-attribute">
- <span i18n class="video-attribute-label">Originally published on</span>
- <span *ngIf="!video.originallyPublishedAt" class="video-attribute-value">Unknown</span>
- <span *ngIf="video.originallyPublishedAt" class="video-attribute-value">
- {{ video.originallyPublishedAt | date: 'dd MMMM yyyy' }}
- </span>
+ <div *ngIf="!!video.originallyPublishedAt" class="video-attribute">
+ <span i18n class="video-attribute-label">Originally published</span>
+ <span class="video-attribute-value">{{ video.originallyPublishedAt | date: 'dd MMMM yyyy' }}</span>
</div>
<div class="video-attribute">
.action-button {
@include peertube-button;
@include grey-button;
+ @include button-with-icon(21px, 0, -1px);
+ @include apply-svg-color($grey-foreground-color);
font-size: 15px;
font-weight: $font-semibold;
display: none;
}
- .icon {
- @include icon(21px);
-
- position: relative;
- top: -2px;
-
- &.icon-like {
- background-image: url('../../../assets/images/video/like-grey.svg');
- }
-
- &.icon-dislike {
- background-image: url('../../../assets/images/video/dislike-grey.svg');
- }
-
- &.icon-support {
- background-image: url('../../../assets/images/video/heart.svg');
- }
-
- &.icon-share {
- background-image: url('../../../assets/images/video/share.svg');
- }
-
- &.icon-more {
- background-image: url('../../../assets/images/video/more.svg');
- top: -1px;
- }
- }
-
- .icon-text {
- margin-left: 3px;
- }
-
&.action-button-like.activated {
background-color: $green;
- .icon-like {
- background-image: url('../../../assets/images/video/like-white.svg');
+ my-global-icon {
+ @include apply-svg-color(#fff);
}
}
&.action-button-dislike.activated {
background-color: $red;
- .icon-dislike {
- background-image: url('../../../assets/images/video/dislike-white.svg');
+ my-global-icon {
+ @include apply-svg-color(#fff);
}
}
+
+ .icon-text {
+ margin-left: 3px;
+ }
}
.action-more {
.dropdown-menu .dropdown-item {
padding: 6px 24px;
- .icon {
- @include icon(24px);
+ my-global-icon {
+ width: 24px;
margin-right: 10px;
position: relative;
- top: -1px;
-
- &.icon-download {
- background-image: url('../../../assets/images/video/download-black.svg');
- }
-
- &.icon-edit {
- background-image: url('../../../assets/images/global/edit-black.svg');
- }
-
- &.icon-alert {
- background-image: url('../../../assets/images/video/alert.svg');
- }
-
- &.icon-blacklist {
- background-image: url('../../../assets/images/video/blacklist.svg');
- }
-
- &.icon-unblacklist {
- background-image: url('../../../assets/images/global/undo.svg');
- }
-
- &.icon-delete {
- background-image: url('../../../assets/images/global/delete-black.svg');
- }
+ top: -2px;
}
}
}
.video-info-description-more {
cursor: pointer;
font-weight: $font-semibold;
- color: #585858;
+ color: $grey-foreground-color;
font-size: 14px;
.glyphicon {
min-width: 142px;
padding-right: 5px;
display: inline-block;
- color: #585858;
+ color: $grey-foreground-color;
font-weight: $font-bold;
}
import { MetaService } from '@ngx-meta/core'
import { Notifier, ServerService } from '@app/core'
import { forkJoin, Subscription } from 'rxjs'
-// FIXME: something weird with our path definition in tsconfig and typings
-// @ts-ignore
-import videojs from 'video.js'
-import 'videojs-hotkeys'
import { Hotkey, HotkeysService } from 'angular2-hotkeys'
-import * as WebTorrent from 'webtorrent'
import { UserVideoRateType, VideoCaption, VideoPrivacy, VideoState } from '../../../../../shared'
-import '../../../assets/player/peertube-videojs-plugin'
import { AuthService, ConfirmService } from '../../core'
import { RestExtractor, VideoBlacklistService } from '../../shared'
import { VideoDetails } from '../../shared/video/video-details.model'
import { VideoService } from '../../shared/video/video.service'
-import { MarkdownService } from '../shared'
import { VideoDownloadComponent } from './modal/video-download.component'
import { VideoReportComponent } from './modal/video-report.component'
import { VideoShareComponent } from './modal/video-share.component'
import { VideoBlacklistComponent } from './modal/video-blacklist.component'
import { SubscribeButtonComponent } from '@app/shared/user-subscription/subscribe-button.component'
-import { addContextMenu, getVideojsOptions, loadLocaleInVideoJS } from '../../../assets/player/peertube-player'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { environment } from '../../../environments/environment'
-import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
import { VideoCaptionService } from '@app/shared/video-caption'
+import { MarkdownService } from '@app/shared/renderer'
+import {
+ P2PMediaLoaderOptions,
+ PeertubePlayerManager,
+ PeertubePlayerManagerOptions,
+ PlayerMode
+} from '../../../assets/player/peertube-player-manager'
@Component({
selector: 'my-video-watch',
@ViewChild('videoBlacklistModal') videoBlacklistModal: VideoBlacklistComponent
@ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
- player: videojs.Player
+ player: any
playerElement: HTMLVideoElement
userRating: UserVideoRateType = null
video: VideoDetails = null
remoteServerDown = false
hotkeys: Hotkey[]
- private videojsLocaleLoaded = false
private paramsSub: Subscription
constructor (
ngOnInit () {
if (
- WebTorrent.WEBRTC_SUPPORT === false ||
+ !!((window as any).RTCPeerConnection || (window as any).mozRTCPeerConnection || (window as any).webkitRTCPeerConnection) === false ||
peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
) {
this.hasAlreadyAcceptedPrivacyConcern = true
.subscribe(([ video, captionsResult ]) => {
const startTime = this.route.snapshot.queryParams.start
const subtitle = this.route.snapshot.queryParams.subtitle
+ const playerMode = this.route.snapshot.queryParams.mode
- this.onVideoFetched(video, captionsResult.data, { startTime, subtitle })
+ this.onVideoFetched(video, captionsResult.data, { startTime, subtitle, playerMode })
.catch(err => this.handleError(err))
})
})
return this.video && this.video.state.id === VideoState.TO_TRANSCODE
}
+ isVideoDownloadable () {
+ return this.video && this.video.downloadEnabled
+ }
+
isVideoToImport () {
return this.video && this.video.state.id === VideoState.TO_IMPORT
}
)
}
- private async onVideoFetched (video: VideoDetails, videoCaptions: VideoCaption[], urlOptions: { startTime: number, subtitle: string }) {
+ private async onVideoFetched (
+ video: VideoDetails,
+ videoCaptions: VideoCaption[],
+ urlOptions: { startTime?: number, subtitle?: string, playerMode?: string }
+ ) {
this.video = video
// Re init attributes
src: environment.apiUrl + c.captionPath
}))
- const videojsOptions = getVideojsOptions({
- autoplay: this.isAutoplay(),
- inactivityTimeout: 2500,
- videoFiles: this.video.files,
- videoCaptions: playerCaptions,
- playerElement: this.playerElement,
- videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null,
- videoDuration: this.video.duration,
- enableHotkeys: true,
- peertubeLink: false,
- poster: this.video.previewUrl,
- startTime,
- subtitle: urlOptions.subtitle,
- theaterMode: true,
- language: this.localeId,
-
- userWatching: this.user && this.user.videosHistoryEnabled === true ? {
- url: this.videoService.getUserWatchingVideoUrl(this.video.uuid),
- authorizationHeader: this.authService.getRequestHeaderValue()
- } : undefined
- })
+ const options: PeertubePlayerManagerOptions = {
+ common: {
+ autoplay: this.isAutoplay(),
+
+ playerElement: this.playerElement,
+ onPlayerElementChange: (element: HTMLVideoElement) => this.playerElement = element,
+
+ videoDuration: this.video.duration,
+ enableHotkeys: true,
+ inactivityTimeout: 2500,
+ poster: this.video.previewUrl,
+ startTime,
+
+ theaterMode: true,
+ captions: videoCaptions.length !== 0,
+ peertubeLink: false,
+
+ videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null,
+ embedUrl: this.video.embedUrl,
+
+ language: this.localeId,
+
+ subtitle: urlOptions.subtitle,
+
+ userWatching: this.user && this.user.videosHistoryEnabled === true ? {
+ url: this.videoService.getUserWatchingVideoUrl(this.video.uuid),
+ authorizationHeader: this.authService.getRequestHeaderValue()
+ } : undefined,
- if (this.videojsLocaleLoaded === false) {
- await loadLocaleInVideoJS(environment.apiUrl, videojs, isOnDevLocale() ? getDevLocale() : this.localeId)
- this.videojsLocaleLoaded = true
+ serverUrl: environment.apiUrl,
+
+ videoCaptions: playerCaptions
+ },
+
+ webtorrent: {
+ videoFiles: this.video.files
+ }
}
- const self = this
- this.zone.runOutsideAngular(async () => {
- videojs(this.playerElement, videojsOptions, function (this: videojs.Player) {
- self.player = this
- this.on('customError', ({ err }: { err: any }) => self.handleError(err))
+ const mode: PlayerMode = urlOptions.playerMode === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
+
+ if (mode === 'p2p-media-loader') {
+ const hlsPlaylist = this.video.getHlsPlaylist()
- addContextMenu(self.player, self.video.embedUrl)
- })
+ const p2pMediaLoader = {
+ playlistUrl: hlsPlaylist.playlistUrl,
+ segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
+ redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
+ trackerAnnounce: this.video.trackerUrls,
+ videoFiles: this.video.files
+ } as P2PMediaLoaderOptions
+
+ Object.assign(options, { p2pMediaLoader })
+ }
+
+ this.zone.runOutsideAngular(async () => {
+ this.player = await PeertubePlayerManager.initialize(mode, options)
+ this.player.on('customError', ({ err }: { err: any }) => this.handleError(err))
})
this.setVideoDescriptionHTML()
import { NgModule } from '@angular/core'
-import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component'
import { ClipboardModule } from 'ngx-clipboard'
import { SharedModule } from '../../shared'
-import { MarkdownService } from '../shared'
import { VideoCommentAddComponent } from './comment/video-comment-add.component'
import { VideoCommentComponent } from './comment/video-comment.component'
import { VideoCommentService } from './comment/video-comment.service'
],
providers: [
- MarkdownService,
- LinkifierService,
VideoCommentService
]
})
+++ /dev/null
-export * from './markdown.service'
import { VideoService } from '../../shared/video/video.service'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { ScreenService } from '@app/shared/misc/screen.service'
-import { Notifier } from '@app/core'
+import { Notifier, ServerService } from '@app/core'
@Component({
selector: 'my-videos-trending',
protected authService: AuthService,
protected location: Location,
protected screenService: ScreenService,
+ private serverService: ServerService,
protected i18n: I18n,
private videoService: VideoService
) {
super()
-
- this.titlePage = i18n('Trending')
}
ngOnInit () {
super.ngOnInit()
this.generateSyndicationList()
+
+ this.serverService.configLoaded.subscribe(
+ () => {
+ const trendingDays = this.serverService.getConfig().trending.videos.intervalDays
+
+ if (trendingDays === 1) {
+ this.titlePage = this.i18n('Trending for the last 24 hours')
+ this.titleTooltip = this.i18n('Trending videos are those totalizing the greatest number of views during the last 24 hours.')
+ } else {
+ this.titlePage = this.i18n('Trending for the last {{days}} days', { days: trendingDays })
+ this.titleTooltip = this.i18n(
+ 'Trending videos are those totalizing the greatest number of views during the last {{days}} days.',
+ { days: trendingDays }
+ )
+ }
+ })
}
ngOnDestroy () {
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-92.000000, -115.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-92.000000, -115.000000)">
<g id="2" transform="translate(92.000000, 115.000000)">
<circle id="Oval-1" stroke="#ffffff" stroke-width="2" cx="12" cy="12" r="10"></circle>
<rect id="Rectangle-1" fill="#ffffff" x="11" y="7" width="2" height="10" rx="1"></rect>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>alert</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-48.000000, -467.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-48.000000, -467.000000)">
<g id="161" transform="translate(48.000000, 467.000000)">
<path d="M12.8715755,3.50973876 L12,1.96027114 L11.1284245,3.50973876 L2.12842446,19.5097388 L1.29015252,21 L3,21 L21,21 L22.7098475,21 L21.8715755,19.5097388 L12.8715755,3.50973876 Z" id="Triangle-2" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
<path d="M12,17.75 C12.6903559,17.75 13.25,17.1903559 13.25,16.5 C13.25,15.8096441 12.6903559,15.25 12,15.25 C11.3096441,15.25 10.75,15.8096441 10.75,16.5 C10.75,17.1903559 11.3096441,17.75 12,17.75 Z" id="Oval-8" fill="#000000"></path>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
+ <g id="Extras" transform="translate(48.000000, 1046.000000)">
+ <g id="yes" transform="translate(352.000000, 88.000000)">
+ <circle id="Oval-1" cx="12" cy="12" r="10"/>
+ <polyline id="Path-288" stroke-linecap="round" stroke-linejoin="round" points="8.5 12.5 10.5 14.5 15.5 9.5"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-356.000000, -775.000000)" stroke="#000000" stroke-width="2">
+ <g id="308" transform="translate(356.000000, 775.000000)">
+ <path d="M8,17 L5,17 L5,17 C2.790861,17 1,15.209139 1,13 C1,10.790861 2.790861,9 5,9 C5.35840468,9 5.70579988,9.04713713 6.03632437,9.13555013 C6.01233106,8.92702603 6,8.71495305 6,8.5 C6,5.46243388 8.46243388,3 11.5,3 C14.0673313,3 16.2238156,4.7590449 16.8299648,7.1376465 C17.2052921,7.04765874 17.5970804,7 18,7 C20.7614237,7 23,9.23857625 23,12 C23,14.7614237 20.7614237,17 18,17 L16,17" id="Combined-Shape" stroke-linejoin="round"></path>
+ <path d="M12,13 L12,21" id="Path-58"></path>
+ <polyline id="Path-59" stroke-linejoin="round" points="15 20 12 23 9 20"></polyline>
+ </g>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
+ <g transform="translate(-400.000000, -775.000000)" stroke="#000000" stroke-width="2">
+ <g id="309" transform="translate(400.000000, 775.000000)">
+ <path d="M7,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L17,18" id="Combined-Shape"></path>
+ <path d="M9,21 L15,15" id="Path-238"></path>
+ <path d="M9,21 L15,15" id="Path-238" transform="translate(12.000000, 18.000000) scale(-1, 1) translate(-12.000000, -18.000000) "></path>
+ </g>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
+ <g transform="translate(-796.000000, -159.000000)" stroke="#000000" stroke-width="2">
+ <g id="38" transform="translate(796.000000, 159.000000)">
+ <path d="M7.20852293,4.3800958 C8.05442158,3.84706631 8.99528987,3.45099725 10,3.22301642 L10,1.99980749 C10,1.44762906 10.4433532,1 11.0093689,1 L12.9906311,1 C13.5480902,1 14,1.44371665 14,1.99980749 L14,3.22301642 C15.0047101,3.45099725 15.9455784,3.84706631 16.7914771,4.3800958 L17.6569904,3.5145825 C18.0474395,3.12413339 18.6774591,3.12110988 19.0776926,3.52134344 L20.4786566,4.92230738 C20.8728396,5.31649045 20.8786331,5.94979402 20.4854175,6.34300963 L19.6199042,7.20852293 C20.1529337,8.05442158 20.5490027,8.99528987 20.7769836,10 L22.0001925,10 C22.5523709,10 23,10.4433532 23,11.0093689 L23,12.9906311 C23,13.5480902 22.5562834,14 22.0001925,14 L20.7769836,14 C20.5490027,15.0047101 20.1529337,15.9455784 19.6199042,16.7914771 L20.4854175,17.6569904 C20.8758666,18.0474395 20.8788901,18.6774591 20.4786566,19.0776926 L19.0776926,20.4786566 C18.6835095,20.8728396 18.050206,20.8786331 17.6569904,20.4854175 L16.7914771,19.6199042 C15.9455784,20.1529337 15.0047101,20.5490027 14,20.7769836 L14,22.0001925 C14,22.5523709 13.5566468,23 12.9906311,23 L11.0093689,23 C10.4519098,23 10,22.5562834 10,22.0001925 L10,20.7769836 C8.99528987,20.5490027 8.05442158,20.1529337 7.20852293,19.6199042 L6.34300963,20.4854175 C5.95256051,20.8758666 5.32254093,20.8788901 4.92230738,20.4786566 L3.52134344,19.0776926 C3.12716036,18.6835095 3.12136689,18.050206 3.5145825,17.6569904 L4.3800958,16.7914771 C3.84706631,15.9455784 3.45099725,15.0047101 3.22301642,14 L1.99980749,14 C1.44762906,14 1,13.5566468 1,12.9906311 L1,11.0093689 C1,10.4519098 1.44371665,10 1.99980749,10 L3.22301642,10 C3.45099725,8.99528987 3.84706631,8.05442158 4.3800958,7.20852293 L3.5145825,6.34300963 C3.12413339,5.95256051 3.12110988,5.32254093 3.52134344,4.92230738 L4.92230738,3.52134344 C5.31649045,3.12716036 5.94979402,3.12136689 6.34300963,3.5145825 L7.20852293,4.3800958 Z M12,16 C14.209139,16 16,14.209139 16,12 C16,9.790861 14.209139,8 12,8 C9.790861,8 8,9.790861 8,12 C8,14.209139 9.790861,16 12,16 Z" id="Combined-Shape"/>
+ </g>
+ </g>
+ </g>
+</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-312.000000, -115.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-312.000000, -115.000000)" stroke="#000000" stroke-width="2">
<g id="7" transform="translate(312.000000, 115.000000)">
<path d="M19,5 L5,19" id="Path-14"></path>
<path d="M19,5 L5,19" id="Path-14" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
- <g id="25" transform="translate(224.000000, 159.000000)">
- <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#000" stroke-width="2"></path>
- <rect id="Rectangle-424" fill="#000" x="2" y="4" width="20" height="2" rx="1"></rect>
- <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#000"></path>
- <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#000" stroke-width="2" stroke-linejoin="round"></path>
- </g>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
- <g id="25" transform="translate(224.000000, 159.000000)">
- <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#ffffff" stroke-width="2"></path>
- <rect id="Rectangle-424" fill="#ffffff" x="2" y="4" width="20" height="2" rx="1"></rect>
- <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#ffffff"></path>
- <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#ffffff" stroke-width="2" stroke-linejoin="round"></path>
- </g>
- </g>
- </g>
-</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-224.000000, -159.000000)">
<g id="25" transform="translate(224.000000, 159.000000)">
- <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#585858" stroke-width="2"></path>
- <rect id="Rectangle-424" fill="#585858" x="2" y="4" width="20" height="2" rx="1"></rect>
- <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#585858"></path>
- <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#585858" stroke-width="2" stroke-linejoin="round"></path>
+ <path d="M5,7 L5,20.0081158 C5,21.1082031 5.89706013,22 7.00585866,22 L16.9941413,22 C18.1019465,22 19,21.1066027 19,20.0081158 L19,7" id="Path-296" stroke="#000000" stroke-width="2"></path>
+ <rect id="Rectangle-424" fill="#000000" x="2" y="4" width="20" height="2" rx="1"></rect>
+ <path d="M9,10.9970301 C9,10.4463856 9.44386482,10 10,10 C10.5522847,10 11,10.4530363 11,10.9970301 L11,17.0029699 C11,17.5536144 10.5561352,18 10,18 C9.44771525,18 9,17.5469637 9,17.0029699 L9,10.9970301 Z M13,10.9970301 C13,10.4463856 13.4438648,10 14,10 C14.5522847,10 15,10.4530363 15,10.9970301 L15,17.0029699 C15,17.5536144 14.5561352,18 14,18 C13.4477153,18 13,17.5469637 13,17.0029699 L13,10.9970301 Z" id="Combined-Shape" fill="#000000"></path>
+ <path d="M9,5 L9,2.99895656 C9,2.44724809 9.45097518,2 9.99077797,2 L14.009222,2 C14.5564136,2 15,2.44266033 15,2.99895656 L15,5" id="Path-33" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
</g>
</g>
</g>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>download</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
<g id="84" transform="translate(180.000000, 291.000000)">
<path d="M12,3 L12,15" id="Path-58"></path>
<polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>edit</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
- <g id="41" transform="translate(48.000000, 203.000000)">
- <path d="M3,21.0000003 L3,17 L15.8898356,4.11016442 C17.0598483,2.9401517 18.9638992,2.94723715 20.1306896,4.11402752 L19.9181432,3.90148112 C21.0902894,5.07362738 21.0882407,6.97202708 19.9174652,8.1377941 L7,21.0000003 L3,21.0000003 Z" id="Path-74" stroke-linecap="round" stroke-linejoin="round"></path>
- <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
- </g>
- </g>
- </g>
-</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>edit</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
<g id="41" transform="translate(48.000000, 203.000000)">
<path d="M3,21.0000003 L3,17 L15.8898356,4.11016442 C17.0598483,2.9401517 18.9638992,2.94723715 20.1306896,4.11402752 L19.9181432,3.90148112 C21.0902894,5.07362738 21.0882407,6.97202708 19.9174652,8.1377941 L7,21.0000003 L3,21.0000003 Z" id="Path-74" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-400.000000, -247.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-400.000000, -247.000000)">
<g id="69" transform="translate(400.000000, 247.000000)">
- <circle id="Oval-7" stroke="#333333" stroke-width="2" cx="12" cy="12" r="10"></circle>
- <path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="#333333"></path>
+ <circle id="Oval-7" stroke="#000000" stroke-width="2" cx="12" cy="12" r="10"></circle>
+ <path d="M12.016,14.544 C12.384,14.544 12.64,14.256 12.704,13.904 L12.768,13.168 C14.544,12.864 16,11.952 16,9.936 L16,9.904 C16,7.904 14.48,6.656 12.24,6.656 C10.768,6.656 9.696,7.184 8.848,7.984 C8.624,8.176 8.528,8.432 8.528,8.672 C8.528,9.152 8.928,9.552 9.424,9.552 C9.648,9.552 9.856,9.456 10.016,9.328 C10.656,8.752 11.344,8.448 12.192,8.448 C13.344,8.448 14.032,9.072 14.032,9.968 L14.032,10 C14.032,11.008 13.2,11.584 11.696,11.728 C11.264,11.776 11.008,12.096 11.072,12.528 L11.232,13.904 C11.28,14.272 11.552,14.544 11.92,14.544 L12.016,14.544 Z M10.784,16.816 L10.784,16.976 C10.784,17.6 11.264,18.08 11.92,18.08 C12.576,18.08 13.056,17.6 13.056,16.976 L13.056,16.816 C13.056,16.192 12.576,15.712 11.92,15.712 C11.264,15.712 10.784,16.192 10.784,16.816 Z" id="?" fill="#000000"></path>
</g>
</g>
</g>
-</svg>
\ No newline at end of file
+</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>im-with-her</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-708.000000, -467.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-708.000000, -467.000000)">
<g id="176" transform="translate(708.000000, 467.000000)">
- <path d="M8,9 L8,3.99339768 C8,3.44494629 7.55641359,3 7.00922203,3 L2.99077797,3 C2.45097518,3 2,3.44475929 2,3.99339768 L2,20.0066023 C2,20.5550537 2.44358641,21 2.99077797,21 L7.00922203,21 C7.54902482,21 8,20.5552407 8,20.0066023 L8,15 L14,15 L14,20.0066023 C14,20.5550537 14.4435864,21 14.990778,21 L19.009222,21 C19.5490248,21 20,20.5564587 20,20.0093228 L20,15.0006104 L23,12 L20,8.99267578 L20,4.00303919 C20,3.45042467 19.5564136,3 19.009222,3 L14.990778,3 C14.4509752,3 14,3.44475929 14,3.99339768 L14,9 L8,9 Z" id="Combined-Shape" fill="#333333" opacity="0.5"></path>
+ <path d="M8,9 L8,3.99339768 C8,3.44494629 7.55641359,3 7.00922203,3 L2.99077797,3 C2.45097518,3 2,3.44475929 2,3.99339768 L2,20.0066023 C2,20.5550537 2.44358641,21 2.99077797,21 L7.00922203,21 C7.54902482,21 8,20.5552407 8,20.0066023 L8,15 L14,15 L14,20.0066023 C14,20.5550537 14.4435864,21 14.990778,21 L19.009222,21 C19.5490248,21 20,20.5564587 20,20.0093228 L20,15.0006104 L23,12 L20,8.99267578 L20,4.00303919 C20,3.45042467 19.5564136,3 19.009222,3 L14.990778,3 C14.4509752,3 14,3.44475929 14,3.99339768 L14,9 L8,9 Z" id="Combined-Shape" fill="#000000" opacity="0.5"></path>
<path d="M2,9 L14,9 L14,3.99077797 C14,3.44358641 14.3203148,3.32031476 14.7062149,3.7062149 L23,12 L14.7062149,20.2937851 C14.3161832,20.6838168 14,20.5490248 14,20.009222 L14,15 L2,15 L2,9 Z" id="Rectangle-121" fill-opacity="0.5" fill="#000000"></path>
</g>
</g>
</g>
-</svg>
\ No newline at end of file
+</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
+ <g id="347" transform="translate(312.000000, 863.000000)">
+ <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
+ <path d="M18,18 L6,6" id="Path-275"></path>
+ </g>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
+ <g transform="translate(-488.000000, -731.000000)" stroke="#000000" stroke-width="2">
+ <g id="291" transform="translate(488.000000, 731.000000)">
+ <path d="M10,9 C8.5,7.5 8,3 8,3 C8,3 7.5,7.5 6,9 C4.5,10.5 2,11 2,11 C2,11 4.5,11.5 6,13 C7.5,14.5 8,19 8,19 C8,19 8.5,14.5 10,13 C11.5,11.5 14,11 14,11 C14,11 11.5,10.5 10,9 Z" id="Combined-Shape"></path>
+ <path d="M19.6666667,4.75 C18.7916667,3.8125 18.5,1 18.5,1 C18.5,1 18.2083333,3.8125 17.3333333,4.75 C16.4583333,5.6875 15,6 15,6 C15,6 16.4583333,6.3125 17.3333333,7.25 C18.2083333,8.1875 18.5,11 18.5,11 C18.5,11 18.7916667,8.1875 19.6666667,7.25 C20.5416667,6.3125 22,6 22,6 C22,6 20.5416667,5.6875 19.6666667,4.75 Z" id="Combined-Shape"></path>
+ <path d="M17,17 C16.25,16.25 16,14 16,14 C16,14 15.75,16.25 15,17 C14.25,17.75 13,18 13,18 C13,18 14.25,18.25 15,19 C15.75,19.75 16,22 16,22 C16,22 16.25,19.75 17,19 C17.75,18.25 19,18 19,18 C19,18 17.75,17.75 17,17 Z" id="Combined-Shape"></path>
+ </g>
+ </g>
+ </g>
+</svg>
-<?xml version="1.0" encoding="iso-8859-1"?>\r
-<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->\r
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
viewBox="0 0 559.372 559.372" style="enable-background:new 0 0 559.372 559.372;" xml:space="preserve">\r
<g>\r
<g>\r
- <path style="fill:#010002;" d="M53.244,0.002c46.512,0,91.29,6.018,134.334,18.054s83.334,29.07,120.869,51.102\r
+ <path fill="#000000" d="M53.244,0.002c46.512,0,91.29,6.018,134.334,18.054s83.334,29.07,120.869,51.102\r
c37.537,22.032,71.707,48.45,102.514,79.254c30.803,30.804,57.221,64.974,79.254,102.51\r
c22.029,37.539,39.063,77.828,51.102,120.873c12.037,43.043,18.055,87.818,18.055,134.334c0,14.688-5.201,27.23-15.605,37.637\r
c-10.404,10.407-22.949,15.604-37.637,15.604c-14.689,0-27.234-5.199-37.641-15.604c-10.402-10.404-15.604-22.949-15.604-37.637\r
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-356.000000, -115.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-356.000000, -115.000000)" stroke="#000000" stroke-width="2">
<g id="8" transform="translate(356.000000, 115.000000)">
<path d="M21,6 L9,18" id="Path-14"></path>
<path d="M9,13 L4,18" id="Path-14" transform="translate(6.500000, 15.500000) scale(-1, 1) translate(-6.500000, -15.500000) "></path>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-180.000000, -115.000000)" fill="#000000">
+ <g id="4" transform="translate(180.000000, 115.000000)">
+ <path d="M10,19 C10.5522847,19 11,19.4477153 11,20 C11,20.5522847 10.5522847,21 10,21 C9.99404288,21 9.98809793,20.9999479 9.98216558,20.9998442 C5.01980239,20.990358 1,16.9646166 1,12 C1,7.02943725 5.02943725,3 10,3 C14.9705627,3 19,7.02943725 19,12 L17,12 C17,8.13400675 13.8659932,5 10,5 C6.13400675,5 3,8.13400675 3,12 C3,15.8659932 6.13400675,19 10,19 Z M14,12 L22,12 L18,16 L14,12 Z" id="Combined-Shape" transform="translate(11.500000, 12.000000) scale(-1, 1) translate(-11.500000, -12.000000) "/>
+ </g>
+ </g>
+ </g>
+</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-180.000000, -115.000000)" fill="#000">
- <g id="4" transform="translate(180.000000, 115.000000)">
- <path d="M10,19 C10.5522847,19 11,19.4477153 11,20 C11,20.5522847 10.5522847,21 10,21 C9.99404288,21 9.98809793,20.9999479 9.98216558,20.9998442 C5.01980239,20.990358 1,16.9646166 1,12 C1,7.02943725 5.02943725,3 10,3 C14.9705627,3 19,7.02943725 19,12 L17,12 C17,8.13400675 13.8659932,5 10,5 C6.13400675,5 3,8.13400675 3,12 C3,15.8659932 6.13400675,19 10,19 Z M14,12 L22,12 L18,16 L14,12 Z" id="Combined-Shape" transform="translate(11.500000, 12.000000) scale(-1, 1) translate(-11.500000, -12.000000) "></path>
- </g>
- </g>
- </g>
-</svg>
--- /dev/null
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-136.000000, -863.000000)">
+ <g id="343" transform="translate(136.000000, 863.000000)">
+ <path d="M14.2571621,15 L7,15 C4.20063223,15 2.390348,16.1679253 1.5255785,18.0896353 C1.07423388,19.0926234 0.949016905,20.1108713 0.995546634,20.9698816 C0.998604759,21.0263393 1.0014872,21.0632937 1.00496281,21.0995037 C1.0599172,21.6490476 1.54995985,22.0499916 2.09950372,21.9950372 C2.64904758,21.9400828 3.04999158,21.4500401 2.99503719,20.9004963 C2.99555422,20.9071205 2.99399879,20.8871791 2.99261905,20.8617069 C2.96185588,20.2937714 3.05021139,19.575276 3.34942151,18.9103647 C3.890902,17.7070747 4.98686778,17 7,17 L12.0070975,17 L13.2070325,17 C13.4170071,16.2576107 13.7789623,15.5790321 14.2571621,15 Z" id="Path-41" fill="#000000" fill-rule="nonzero"></path>
+ <path d="M19,18 L19,16.4976988 C19,16.2228273 18.7680664,16 18.5,16 C18.2238576,16 18,16.2148438 18,16.4976988 L18,18 L16.4976988,18 C16.2148438,18 16,18.2238576 16,18.5 C16,18.7680664 16.2228273,19 16.4976988,19 L18,19 L18,20.5023012 C18,20.7771727 18.2319336,21 18.5,21 C18.7761424,21 19,20.7851562 19,20.5023012 L19,19 L20.5023012,19 C20.7851562,19 21,18.7761424 21,18.5 C21,18.2319336 20.7771727,18 20.5023012,18 L19,18 Z M18.5,23 C16.0147186,23 14,20.9852814 14,18.5 C14,16.0147186 16.0147186,14 18.5,14 C20.9852814,14 23,16.0147186 23,18.5 C23,20.9852814 20.9852814,23 18.5,23 Z" id="Combined-Shape" fill="#000000"></path>
+ <circle id="Oval-40" stroke="#000000" stroke-width="2" cx="12" cy="8" r="5"></circle>
+ </g>
+ </g>
+ </g>
+</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-400.000000, -1134.000000)" stroke="#ffffff" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
<g id="Extras" transform="translate(48.000000, 1046.000000)">
<g id="yes" transform="translate(352.000000, 88.000000)">
<circle id="Oval-1" cx="12" cy="12" r="10"></circle>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>no</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
- <g id="347" transform="translate(312.000000, 863.000000)">
- <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
- <path d="M18,18 L6,6" id="Path-275"></path>
- </g>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#ffffff" stroke-width="2">
- <g id="Extras" transform="translate(48.000000, 1046.000000)">
- <g id="thumbs-down" transform="translate(704.000000, 44.000000)">
- <path d="M6,16 C6,18.5 6.5,21 8,21 L16.9938335,21 C17.5495239,21 18.1819788,20.5956028 18.4072817,20.0949295 L20.8562951,14.6526776 C21.7640882,12.6353595 20.7154925,11 18.5092545,11 L15.5,11 C15.5,11 18.5,5 15,5 C12.5,5 11.5,11 8,11 C6.5,11 6,13.5 6,16 Z" id="Path-188" stroke-linejoin="round" transform="translate(13.591488, 13.000000) scale(1, -1) translate(-13.591488, -13.000000) "></path>
- <path d="M4,4.5 C4,4.5 3,7 3,10 C3,13 4,15.5 4,15.5" id="Path-189" transform="translate(3.500000, 10.000000) scale(1, -1) translate(-3.500000, -10.000000) "></path>
- </g>
- </g>
- </g>
- </g>
-</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-752.000000, -1090.000000)" stroke="#000000" stroke-width="2">
<g id="Extras" transform="translate(48.000000, 1046.000000)">
<g id="thumbs-down" transform="translate(704.000000, 44.000000)">
<path d="M6,16 C6,18.5 6.5,21 8,21 L16.9938335,21 C17.5495239,21 18.1819788,20.5956028 18.4072817,20.0949295 L20.8562951,14.6526776 C21.7640882,12.6353595 20.7154925,11 18.5092545,11 L15.5,11 C15.5,11 18.5,5 15,5 C12.5,5 11.5,11 8,11 C6.5,11 6,13.5 6,16 Z" id="Path-188" stroke-linejoin="round" transform="translate(13.591488, 13.000000) scale(1, -1) translate(-13.591488, -13.000000) "></path>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>download</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#585858" stroke-width="2">
- <g id="84" transform="translate(180.000000, 291.000000)">
- <path d="M12,3 L12,15" id="Path-58"></path>
- <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
- <path d="M3,18 L3,20.0590859 C3,20.6127331 3.44494889,21.0615528 3.99340349,21.0615528 L20.0067018,21.0615528 C20.5553434,21.0615528 21.0001052,20.6098102 21.0001051,20.0590859 L21.0001049,18" id="Path-12" stroke-linejoin="round"></path>
- </g>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>download</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#ffffff" stroke-width="2">
- <g id="84" transform="translate(180.000000, 291.000000)">
- <path d="M12,3 L12,15" id="Path-58"></path>
- <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 14.000000) rotate(-270.000000) translate(-12.000000, -14.000000) " points="9 8 15 14 9 20"></polyline>
- <path d="M3,18 L3,20.0590859 C3,20.6127331 3.44494889,21.0615528 3.99340349,21.0615528 L20.0067018,21.0615528 C20.5553434,21.0615528 21.0001052,20.6098102 21.0001051,20.0590859 L21.0001049,18" id="Path-12" stroke-linejoin="round"></path>
- </g>
- </g>
- </g>
-</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#585858">
- <g id="Extras" transform="translate(48.000000, 1046.000000)">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#000000">
+ <g transform="translate(48.000000, 1046.000000)">
<g id="heart">
<path d="M12.0174466,21 L20.9041801,11.3556763 C22.6291961,9.13778099 22.2795957,5.90145416 20.1233257,4.12713796 C17.9670557,2.35282175 14.8206518,2.71241362 13.0956358,4.93030888 L12.0174465,6.5 L10.9043642,4.93030888 C9.17934824,2.71241362 6.0329443,2.35282175 3.87667432,4.12713796 C1.72040435,5.90145416 1.37080391,9.13778099 3.09581989,11.3556763 L12.0174466,21 Z"></path>
</g>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>thumbs-up</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#ffffff" stroke-width="2">
- <g id="256" transform="translate(708.000000, 643.000000)">
- <path d="M6,14 C6,16.5 6.5,19 8,19 L16.9938335,19 C17.5495239,19 18.1819788,18.5956028 18.4072817,18.0949295 L20.8562951,12.6526776 C21.7640882,10.6353595 20.7154925,9 18.5092545,9 L15.5,9 C15.5,9 18.5,3 15,3 C12.5,3 11.5,9 8,9 C6.5,9 6,11.5 6,14 Z" id="Path-188" stroke-linejoin="round"></path>
- <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
- </g>
- </g>
- </g>
-</svg>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>thumbs-up</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-708.000000, -643.000000)" stroke="#000000" stroke-width="2">
<g id="256" transform="translate(708.000000, 643.000000)">
<path d="M6,14 C6,16.5 6.5,19 8,19 L16.9938335,19 C17.5495239,19 18.1819788,18.5956028 18.4072817,18.0949295 L20.8562951,12.6526776 C21.7640882,10.6353595 20.7154925,9 18.5092545,9 L15.5,9 C15.5,9 18.5,3 15,3 C12.5,3 11.5,9 8,9 C6.5,9 6,11.5 6,14 Z" id="Path-188" stroke-linejoin="round"></path>
<path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
- <g id="Artboard-4" transform="translate(-444.000000, -115.000000)" fill="#585858">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g transform="translate(-444.000000, -115.000000)" fill="#000000">
<g id="10" transform="translate(444.000000, 115.000000)">
<path d="M10,12 C10,10.8954305 10.8877296,10 12,10 C13.1045695,10 14,10.8877296 14,12 C14,13.1045695 13.1122704,14 12,14 C10.8954305,14 10,13.1122704 10,12 Z M17,12 C17,10.8954305 17.8877296,10 19,10 C20.1045695,10 21,10.8877296 21,12 C21,13.1045695 20.1122704,14 19,14 C17.8954305,14 17,13.1122704 17,12 Z M3,12 C3,10.8954305 3.88772964,10 5,10 C6.1045695,10 7,10.8877296 7,12 C7,13.1045695 6.11227036,14 5,14 C3.8954305,14 3,13.1122704 3,12 Z" id="Combined-Shape"></path>
</g>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>share</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-312.000000, -203.000000)" stroke="#585858" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-312.000000, -203.000000)" stroke="#000000" stroke-width="2">
<g id="47" transform="translate(312.000000, 203.000000)">
<path d="M20,15 L20,18.0026083 C20,19.1057373 19.1073772,20 18.0049107,20 L5.99508929,20 C4.8932319,20 4,19.1073772 4,18.0049107 L4,5.99508929 C4,4.8932319 4.89585781,4 5.9973917,4 L9,4" id="Rectangle-460"></path>
<polyline id="Path-93" stroke-linejoin="round" points="13 4 20.0207973 4 20.0207973 11.0191059"></polyline>
-<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>cloud-upload</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#fff" stroke-width="2">
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
+ <g transform="translate(-312.000000, -775.000000)" stroke="#000000" stroke-width="2">
<g id="307" transform="translate(312.000000, 775.000000)">
<path d="M8,18 L5,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L16,18" id="Combined-Shape" stroke-linejoin="round"></path>
<path d="M12,13 L12,21" id="Path-58"></path>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
- <title>cloud-upload</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
- <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#C6C6C6" stroke-width="2">
- <g id="307" transform="translate(312.000000, 775.000000)">
- <path d="M8,18 L5,18 L5,18 C2.790861,18 1,16.209139 1,14 C1,11.790861 2.790861,10 5,10 C5.35840468,10 5.70579988,10.0471371 6.03632437,10.1355501 C6.01233106,9.92702603 6,9.71495305 6,9.5 C6,6.46243388 8.46243388,4 11.5,4 C14.0673313,4 16.2238156,5.7590449 16.8299648,8.1376465 C17.2052921,8.04765874 17.5970804,8 18,8 C20.7614237,8 23,10.2385763 23,13 C23,15.7614237 20.7614237,18 18,18 L16,18" id="Combined-Shape" stroke-linejoin="round"></path>
- <path d="M12,13 L12,21" id="Path-58"></path>
- <polyline id="Path-59" stroke-linejoin="round" transform="translate(12.000000, 12.500000) scale(1, -1) translate(-12.000000, -12.500000) " points="15 11 12 14 9 11"></polyline>
- </g>
- </g>
- </g>
-</svg>
--- /dev/null
+// FIXME: something weird with our path definition in tsconfig and typings
+// @ts-ignore
+import * as videojs from 'video.js'
+import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo, VideoJSComponentInterface } from '../peertube-videojs-typings'
+import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from 'p2p-media-loader-hlsjs'
+import { Events } from 'p2p-media-loader-core'
+
+// videojs-hlsjs-plugin needs videojs in window
+window['videojs'] = videojs
+require('@streamroot/videojs-hlsjs-plugin')
+
+const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
+class P2pMediaLoaderPlugin extends Plugin {
+
+ private readonly CONSTANTS = {
+ INFO_SCHEDULER: 1000 // Don't change this
+ }
+ private readonly options: P2PMediaLoaderPluginOptions
+
+ private hlsjs: any // Don't type hlsjs to not bundle the module
+ private p2pEngine: Engine
+ private statsP2PBytes = {
+ pendingDownload: [] as number[],
+ pendingUpload: [] as number[],
+ numPeers: 0,
+ totalDownload: 0,
+ totalUpload: 0
+ }
+ private statsHTTPBytes = {
+ pendingDownload: [] as number[],
+ pendingUpload: [] as number[],
+ totalDownload: 0,
+ totalUpload: 0
+ }
+
+ private networkInfoInterval: any
+
+ constructor (player: videojs.Player, options: P2PMediaLoaderPluginOptions) {
+ super(player, options)
+
+ this.options = options
+
+ videojs.Html5Hlsjs.addHook('beforeinitialize', (videojsPlayer: any, hlsjs: any) => {
+ this.hlsjs = hlsjs
+ })
+
+ initVideoJsContribHlsJsPlayer(player)
+
+ player.src({
+ type: options.type,
+ src: options.src
+ })
+
+ player.on('play', () => {
+ player.addClass('vjs-has-big-play-button-clicked')
+ })
+
+ player.ready(() => this.initialize())
+ }
+
+ dispose () {
+ if (this.hlsjs) this.hlsjs.destroy()
+ if (this.p2pEngine) this.p2pEngine.destroy()
+
+ clearInterval(this.networkInfoInterval)
+ }
+
+ private initialize () {
+ initHlsJsPlayer(this.hlsjs)
+
+ const tech = this.player.tech_
+ this.p2pEngine = tech.options_.hlsjsConfig.loader.getEngine()
+
+ // Avoid using constants to not import hls.hs
+ // https://github.com/video-dev/hls.js/blob/master/src/events.js#L37
+ this.hlsjs.on('hlsLevelSwitching', (_: any, data: any) => {
+ this.trigger('resolutionChange', { auto: this.hlsjs.autoLevelEnabled, resolutionId: data.height })
+ })
+
+ this.p2pEngine.on(Events.SegmentError, (segment, err) => {
+ console.error('Segment error.', segment, err)
+ })
+
+ this.statsP2PBytes.numPeers = 1 + this.options.redundancyBaseUrls.length
+
+ this.runStats()
+ }
+
+ private runStats () {
+ this.p2pEngine.on(Events.PieceBytesDownloaded, (method: string, size: number) => {
+ const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
+
+ elem.pendingDownload.push(size)
+ elem.totalDownload += size
+ })
+
+ this.p2pEngine.on(Events.PieceBytesUploaded, (method: string, size: number) => {
+ const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
+
+ elem.pendingUpload.push(size)
+ elem.totalUpload += size
+ })
+
+ this.p2pEngine.on(Events.PeerConnect, () => this.statsP2PBytes.numPeers++)
+ this.p2pEngine.on(Events.PeerClose, () => this.statsP2PBytes.numPeers--)
+
+ this.networkInfoInterval = setInterval(() => {
+ const p2pDownloadSpeed = this.arraySum(this.statsP2PBytes.pendingDownload)
+ const p2pUploadSpeed = this.arraySum(this.statsP2PBytes.pendingUpload)
+
+ const httpDownloadSpeed = this.arraySum(this.statsHTTPBytes.pendingDownload)
+ const httpUploadSpeed = this.arraySum(this.statsHTTPBytes.pendingUpload)
+
+ this.statsP2PBytes.pendingDownload = []
+ this.statsP2PBytes.pendingUpload = []
+ this.statsHTTPBytes.pendingDownload = []
+ this.statsHTTPBytes.pendingUpload = []
+
+ return this.player.trigger('p2pInfo', {
+ http: {
+ downloadSpeed: httpDownloadSpeed,
+ uploadSpeed: httpUploadSpeed,
+ downloaded: this.statsHTTPBytes.totalDownload,
+ uploaded: this.statsHTTPBytes.totalUpload
+ },
+ p2p: {
+ downloadSpeed: p2pDownloadSpeed,
+ uploadSpeed: p2pUploadSpeed,
+ numPeers: this.statsP2PBytes.numPeers,
+ downloaded: this.statsP2PBytes.totalDownload,
+ uploaded: this.statsP2PBytes.totalUpload
+ }
+ } as PlayerNetworkInfo)
+ }, this.CONSTANTS.INFO_SCHEDULER)
+ }
+
+ private arraySum (data: number[]) {
+ return data.reduce((a: number, b: number) => a + b, 0)
+ }
+}
+
+videojs.registerPlugin('p2pMediaLoader', P2pMediaLoaderPlugin)
+export { P2pMediaLoaderPlugin }
--- /dev/null
+import { basename } from 'path'
+import { Segment } from 'p2p-media-loader-core'
+
+function segmentUrlBuilderFactory (baseUrls: string[]) {
+ return function segmentBuilder (segment: Segment) {
+ const max = baseUrls.length + 1
+ const i = getRandomInt(max)
+
+ if (i === max - 1) return segment.url
+
+ let newBaseUrl = baseUrls[i]
+ let middlePart = newBaseUrl.endsWith('/') ? '' : '/'
+
+ return newBaseUrl + middlePart + basename(segment.url)
+ }
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ segmentUrlBuilderFactory
+}
+
+// ---------------------------------------------------------------------------
+
+function getRandomInt (max: number) {
+ return Math.floor(Math.random() * Math.floor(max))
+}
--- /dev/null
+import { Segment } from 'p2p-media-loader-core'
+import { basename } from 'path'
+
+function segmentValidatorFactory (segmentsSha256Url: string) {
+ const segmentsJSON = fetchSha256Segments(segmentsSha256Url)
+ const regex = /bytes=(\d+)-(\d+)/
+
+ return async function segmentValidator (segment: Segment) {
+ const filename = basename(segment.url)
+ const captured = regex.exec(segment.range)
+
+ const range = captured[1] + '-' + captured[2]
+
+ const hashShouldBe = (await segmentsJSON)[filename][range]
+ if (hashShouldBe === undefined) {
+ throw new Error(`Unknown segment name ${filename}/${range} in segment validator`)
+ }
+
+ const calculatedSha = bufferToEx(await sha256(segment.data))
+ if (calculatedSha !== hashShouldBe) {
+ throw new Error(
+ `Hashes does not correspond for segment ${filename}/${range}` +
+ `(expected: ${hashShouldBe} instead of ${calculatedSha})`
+ )
+ }
+ }
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ segmentValidatorFactory
+}
+
+// ---------------------------------------------------------------------------
+
+function fetchSha256Segments (url: string) {
+ return fetch(url)
+ .then(res => res.json())
+ .catch(err => {
+ console.error('Cannot get sha256 segments', err)
+ return {}
+ })
+}
+
+function sha256 (data?: ArrayBuffer) {
+ if (!data) return undefined
+
+ return window.crypto.subtle.digest('SHA-256', data)
+}
+
+// Thanks: https://stackoverflow.com/a/53307879
+function bufferToEx (buffer?: ArrayBuffer) {
+ if (!buffer) return ''
+
+ let s = ''
+ const h = '0123456789abcdef'
+ const o = new Uint8Array(buffer)
+
+ o.forEach((v: any) => s += h[ v >> 4 ] + h[ v & 15 ])
+
+ return s
+}
--- /dev/null
+import { VideoFile } from '../../../../shared/models/videos'
+// @ts-ignore
+import * as videojs from 'video.js'
+import 'videojs-hotkeys'
+import 'videojs-dock'
+import 'videojs-contextmenu-ui'
+import 'videojs-contrib-quality-levels'
+import './peertube-plugin'
+import './videojs-components/peertube-link-button'
+import './videojs-components/resolution-menu-button'
+import './videojs-components/settings-menu-button'
+import './videojs-components/p2p-info-button'
+import './videojs-components/peertube-load-progress-bar'
+import './videojs-components/theater-button'
+import { P2PMediaLoaderPluginOptions, UserWatching, VideoJSCaption, VideoJSPluginOptions, videojsUntyped } from './peertube-videojs-typings'
+import { buildVideoEmbed, buildVideoLink, copyToClipboard, getRtcConfig } from './utils'
+import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
+import { segmentValidatorFactory } from './p2p-media-loader/segment-validator'
+import { segmentUrlBuilderFactory } from './p2p-media-loader/segment-url-builder'
+
+// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
+videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
+// Change Captions to Subtitles/CC
+videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
+// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
+videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
+
+export type PlayerMode = 'webtorrent' | 'p2p-media-loader'
+
+export type WebtorrentOptions = {
+ videoFiles: VideoFile[]
+}
+
+export type P2PMediaLoaderOptions = {
+ playlistUrl: string
+ segmentsSha256Url: string
+ trackerAnnounce: string[]
+ redundancyBaseUrls: string[]
+ videoFiles: VideoFile[]
+}
+
+export type CommonOptions = {
+ playerElement: HTMLVideoElement
+ onPlayerElementChange: (element: HTMLVideoElement) => void
+
+ autoplay: boolean
+ videoDuration: number
+ enableHotkeys: boolean
+ inactivityTimeout: number
+ poster: string
+ startTime: number | string
+
+ theaterMode: boolean
+ captions: boolean
+ peertubeLink: boolean
+
+ videoViewUrl: string
+ embedUrl: string
+
+ language?: string
+ controls?: boolean
+ muted?: boolean
+ loop?: boolean
+ subtitle?: string
+
+ videoCaptions: VideoJSCaption[]
+
+ userWatching?: UserWatching
+
+ serverUrl: string
+}
+
+export type PeertubePlayerManagerOptions = {
+ common: CommonOptions,
+ webtorrent: WebtorrentOptions,
+ p2pMediaLoader?: P2PMediaLoaderOptions
+}
+
+export class PeertubePlayerManager {
+
+ private static videojsLocaleCache: { [ path: string ]: any } = {}
+ private static playerElementClassName: string
+
+ static getServerTranslations (serverUrl: string, locale: string) {
+ const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
+ // It is the default locale, nothing to translate
+ if (!path) return Promise.resolve(undefined)
+
+ return fetch(path + '/server.json')
+ .then(res => res.json())
+ .catch(err => {
+ console.error('Cannot get server translations', err)
+ return undefined
+ })
+ }
+
+ static async initialize (mode: PlayerMode, options: PeertubePlayerManagerOptions) {
+ let p2pMediaLoader: any
+
+ this.playerElementClassName = options.common.playerElement.className
+
+ if (mode === 'webtorrent') await import('./webtorrent/webtorrent-plugin')
+ if (mode === 'p2p-media-loader') {
+ [ p2pMediaLoader ] = await Promise.all([
+ import('p2p-media-loader-hlsjs'),
+ import('./p2p-media-loader/p2p-media-loader-plugin')
+ ])
+ }
+
+ const videojsOptions = this.getVideojsOptions(mode, options, p2pMediaLoader)
+
+ await this.loadLocaleInVideoJS(options.common.serverUrl, options.common.language)
+
+ const self = this
+ return new Promise(res => {
+ videojs(options.common.playerElement, videojsOptions, function (this: any) {
+ const player = this
+
+ player.tech_.on('error', () => {
+ // Fallback to webtorrent?
+ if (mode === 'p2p-media-loader') {
+ self.fallbackToWebTorrent(player, options)
+ }
+ })
+
+ self.addContextMenu(mode, player, options.common.embedUrl)
+
+ return res(player)
+ })
+ })
+ }
+
+ private static async fallbackToWebTorrent (player: any, options: PeertubePlayerManagerOptions) {
+ const newVideoElement = document.createElement('video')
+ newVideoElement.className = this.playerElementClassName
+
+ // VideoJS wraps our video element inside a div
+ const currentParentPlayerElement = options.common.playerElement.parentNode
+ currentParentPlayerElement.parentNode.insertBefore(newVideoElement, currentParentPlayerElement)
+
+ options.common.playerElement = newVideoElement
+ options.common.onPlayerElementChange(newVideoElement)
+
+ player.dispose()
+
+ await import('./webtorrent/webtorrent-plugin')
+
+ const mode = 'webtorrent'
+ const videojsOptions = this.getVideojsOptions(mode, options)
+
+ const self = this
+ videojs(newVideoElement, videojsOptions, function (this: any) {
+ const player = this
+
+ self.addContextMenu(mode, player, options.common.embedUrl)
+ })
+ }
+
+ private static loadLocaleInVideoJS (serverUrl: string, locale: string) {
+ const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
+ // It is the default locale, nothing to translate
+ if (!path) return Promise.resolve(undefined)
+
+ let p: Promise<any>
+
+ if (PeertubePlayerManager.videojsLocaleCache[path]) {
+ p = Promise.resolve(PeertubePlayerManager.videojsLocaleCache[path])
+ } else {
+ p = fetch(path + '/player.json')
+ .then(res => res.json())
+ .then(json => {
+ PeertubePlayerManager.videojsLocaleCache[path] = json
+ return json
+ })
+ .catch(err => {
+ console.error('Cannot get player translations', err)
+ return undefined
+ })
+ }
+
+ const completeLocale = getCompleteLocale(locale)
+ return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
+ }
+
+ private static getVideojsOptions (mode: PlayerMode, options: PeertubePlayerManagerOptions, p2pMediaLoaderModule?: any) {
+ const commonOptions = options.common
+ const webtorrentOptions = options.webtorrent
+ const p2pMediaLoaderOptions = options.p2pMediaLoader
+
+ let autoplay = options.common.autoplay
+ let html5 = {}
+
+ const plugins: VideoJSPluginOptions = {
+ peertube: {
+ mode,
+ autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
+ videoViewUrl: commonOptions.videoViewUrl,
+ videoDuration: commonOptions.videoDuration,
+ startTime: commonOptions.startTime,
+ userWatching: commonOptions.userWatching,
+ subtitle: commonOptions.subtitle,
+ videoCaptions: commonOptions.videoCaptions
+ }
+ }
+
+ if (mode === 'p2p-media-loader') {
+ const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
+ redundancyBaseUrls: options.p2pMediaLoader.redundancyBaseUrls,
+ type: 'application/x-mpegURL',
+ src: p2pMediaLoaderOptions.playlistUrl
+ }
+
+ const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
+ .filter(t => t.startsWith('ws'))
+
+ const p2pMediaLoaderConfig = {
+ loader: {
+ trackerAnnounce,
+ segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url),
+ rtcConfig: getRtcConfig(),
+ requiredSegmentsPriority: 5,
+ segmentUrlBuilder: segmentUrlBuilderFactory(options.p2pMediaLoader.redundancyBaseUrls)
+ },
+ segments: {
+ swarmId: p2pMediaLoaderOptions.playlistUrl
+ }
+ }
+ const streamrootHls = {
+ levelLabelHandler: (level: { height: number, width: number }) => {
+ const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height)
+
+ let label = file.resolution.label
+ if (file.fps >= 50) label += file.fps
+
+ return label
+ },
+ html5: {
+ hlsjsConfig: {
+ liveSyncDurationCount: 7,
+ loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass()
+ }
+ }
+ }
+
+ Object.assign(plugins, { p2pMediaLoader, streamrootHls })
+ html5 = streamrootHls.html5
+ }
+
+ if (mode === 'webtorrent') {
+ const webtorrent = {
+ autoplay,
+ videoDuration: commonOptions.videoDuration,
+ playerElement: commonOptions.playerElement,
+ videoFiles: webtorrentOptions.videoFiles
+ }
+ Object.assign(plugins, { webtorrent })
+
+ // WebTorrent plugin handles autoplay, because we do some hackish stuff in there
+ autoplay = false
+ }
+
+ const videojsOptions = {
+ html5,
+
+ // We don't use text track settings for now
+ textTrackSettings: false,
+ controls: commonOptions.controls !== undefined ? commonOptions.controls : true,
+ loop: commonOptions.loop !== undefined ? commonOptions.loop : false,
+
+ muted: commonOptions.muted !== undefined
+ ? commonOptions.muted
+ : undefined, // Undefined so the player knows it has to check the local storage
+
+ poster: commonOptions.poster,
+ autoplay: autoplay === true ? 'any' : autoplay, // Use 'any' instead of true to get notifier by videojs if autoplay fails
+ inactivityTimeout: commonOptions.inactivityTimeout,
+ playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
+ plugins,
+ controlBar: {
+ children: this.getControlBarChildren(mode, {
+ captions: commonOptions.captions,
+ peertubeLink: commonOptions.peertubeLink,
+ theaterMode: commonOptions.theaterMode
+ })
+ }
+ }
+
+ if (commonOptions.enableHotkeys === true) {
+ Object.assign(videojsOptions.plugins, {
+ hotkeys: {
+ enableVolumeScroll: false,
+ enableModifiersForNumbers: false,
+
+ fullscreenKey: function (event: KeyboardEvent) {
+ // fullscreen with the f key or Ctrl+Enter
+ return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
+ },
+
+ seekStep: function (event: KeyboardEvent) {
+ // mimic VLC seek behavior, and default to 5 (original value is 5).
+ if (event.ctrlKey && event.altKey) {
+ return 5 * 60
+ } else if (event.ctrlKey) {
+ return 60
+ } else if (event.altKey) {
+ return 10
+ } else {
+ return 5
+ }
+ },
+
+ customKeys: {
+ increasePlaybackRateKey: {
+ key: function (event: KeyboardEvent) {
+ return event.key === '>'
+ },
+ handler: function (player: videojs.Player) {
+ player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
+ }
+ },
+ decreasePlaybackRateKey: {
+ key: function (event: KeyboardEvent) {
+ return event.key === '<'
+ },
+ handler: function (player: videojs.Player) {
+ player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
+ }
+ },
+ frameByFrame: {
+ key: function (event: KeyboardEvent) {
+ return event.key === '.'
+ },
+ handler: function (player: videojs.Player) {
+ player.pause()
+ // Calculate movement distance (assuming 30 fps)
+ const dist = 1 / 30
+ player.currentTime(player.currentTime() + dist)
+ }
+ }
+ }
+ }
+ })
+ }
+
+ if (commonOptions.language && !isDefaultLocale(commonOptions.language)) {
+ Object.assign(videojsOptions, { language: commonOptions.language })
+ }
+
+ return videojsOptions
+ }
+
+ private static getControlBarChildren (mode: PlayerMode, options: {
+ peertubeLink: boolean
+ theaterMode: boolean,
+ captions: boolean
+ }) {
+ const settingEntries = []
+ const loadProgressBar = mode === 'webtorrent' ? 'peerTubeLoadProgressBar' : 'loadProgressBar'
+
+ // Keep an order
+ settingEntries.push('playbackRateMenuButton')
+ if (options.captions === true) settingEntries.push('captionsButton')
+ settingEntries.push('resolutionMenuButton')
+
+ const children = {
+ 'playToggle': {},
+ 'currentTimeDisplay': {},
+ 'timeDivider': {},
+ 'durationDisplay': {},
+ 'liveDisplay': {},
+
+ 'flexibleWidthSpacer': {},
+ 'progressControl': {
+ children: {
+ 'seekBar': {
+ children: {
+ [loadProgressBar]: {},
+ 'mouseTimeDisplay': {},
+ 'playProgressBar': {}
+ }
+ }
+ }
+ },
+
+ 'p2PInfoButton': {},
+
+ 'muteToggle': {},
+ 'volumeControl': {},
+
+ 'settingsButton': {
+ setup: {
+ maxHeightOffset: 40
+ },
+ entries: settingEntries
+ }
+ }
+
+ if (options.peertubeLink === true) {
+ Object.assign(children, {
+ 'peerTubeLinkButton': {}
+ })
+ }
+
+ if (options.theaterMode === true) {
+ Object.assign(children, {
+ 'theaterButton': {}
+ })
+ }
+
+ Object.assign(children, {
+ 'fullscreenToggle': {}
+ })
+
+ return children
+ }
+
+ private static addContextMenu (mode: PlayerMode, player: any, videoEmbedUrl: string) {
+ const content = [
+ {
+ label: player.localize('Copy the video URL'),
+ listener: function () {
+ copyToClipboard(buildVideoLink())
+ }
+ },
+ {
+ label: player.localize('Copy the video URL at the current time'),
+ listener: function () {
+ const player = this as videojs.Player
+ copyToClipboard(buildVideoLink(player.currentTime()))
+ }
+ },
+ {
+ label: player.localize('Copy embed code'),
+ listener: () => {
+ copyToClipboard(buildVideoEmbed(videoEmbedUrl))
+ }
+ }
+ ]
+
+ if (mode === 'webtorrent') {
+ content.push({
+ label: player.localize('Copy magnet URI'),
+ listener: function () {
+ const player = this as videojs.Player
+ copyToClipboard(player.webtorrent().getCurrentVideoFile().magnetUri)
+ }
+ })
+ }
+
+ player.contextmenuUI({ content })
+ }
+
+ private static getLocalePath (serverUrl: string, locale: string) {
+ const completeLocale = getCompleteLocale(locale)
+
+ if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
+
+ return serverUrl + '/client/locales/' + completeLocale
+ }
+}
+
+// ############################################################################
+
+export {
+ videojs
+}
+++ /dev/null
-import { VideoFile } from '../../../../shared/models/videos'
-
-import 'videojs-hotkeys'
-import 'videojs-dock'
-import 'videojs-contextmenu-ui'
-import './peertube-link-button'
-import './resolution-menu-button'
-import './settings-menu-button'
-import './webtorrent-info-button'
-import './peertube-videojs-plugin'
-import './peertube-load-progress-bar'
-import './theater-button'
-import { UserWatching, VideoJSCaption, videojsUntyped } from './peertube-videojs-typings'
-import { buildVideoEmbed, buildVideoLink, copyToClipboard } from './utils'
-import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
-
-// FIXME: something weird with our path definition in tsconfig and typings
-// @ts-ignore
-import { Player } from 'video.js'
-
-// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
-videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
-// Change Captions to Subtitles/CC
-videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
-// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
-videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
-
-function getVideojsOptions (options: {
- autoplay: boolean
- playerElement: HTMLVideoElement
- videoViewUrl: string
- videoDuration: number
- videoFiles: VideoFile[]
- enableHotkeys: boolean
- inactivityTimeout: number
- peertubeLink: boolean
- poster: string
- startTime: number | string
- theaterMode: boolean
- videoCaptions: VideoJSCaption[]
-
- language?: string
- controls?: boolean
- muted?: boolean
- loop?: boolean
- subtitle?: string
-
- userWatching?: UserWatching
-}) {
- const videojsOptions = {
- // We don't use text track settings for now
- textTrackSettings: false,
- controls: options.controls !== undefined ? options.controls : true,
- loop: options.loop !== undefined ? options.loop : false,
-
- muted: options.muted !== undefined ? options.muted : undefined, // Undefined so the player knows it has to check the local storage
-
- poster: options.poster,
- autoplay: false,
- inactivityTimeout: options.inactivityTimeout,
- playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
- plugins: {
- peertube: {
- autoplay: options.autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
- videoCaptions: options.videoCaptions,
- videoFiles: options.videoFiles,
- playerElement: options.playerElement,
- videoViewUrl: options.videoViewUrl,
- videoDuration: options.videoDuration,
- startTime: options.startTime,
- userWatching: options.userWatching,
- subtitle: options.subtitle
- }
- },
- controlBar: {
- children: getControlBarChildren(options)
- }
- }
-
- if (options.enableHotkeys === true) {
- Object.assign(videojsOptions.plugins, {
- hotkeys: {
- enableVolumeScroll: false,
- enableModifiersForNumbers: false,
-
- fullscreenKey: function (event: KeyboardEvent) {
- // fullscreen with the f key or Ctrl+Enter
- return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
- },
-
- seekStep: function (event: KeyboardEvent) {
- // mimic VLC seek behavior, and default to 5 (original value is 5).
- if (event.ctrlKey && event.altKey) {
- return 5 * 60
- } else if (event.ctrlKey) {
- return 60
- } else if (event.altKey) {
- return 10
- } else {
- return 5
- }
- },
-
- customKeys: {
- increasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return event.key === '>'
- },
- handler: function (player: Player) {
- player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
- }
- },
- decreasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return event.key === '<'
- },
- handler: function (player: Player) {
- player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
- }
- },
- frameByFrame: {
- key: function (event: KeyboardEvent) {
- return event.key === '.'
- },
- handler: function (player: Player) {
- player.pause()
- // Calculate movement distance (assuming 30 fps)
- const dist = 1 / 30
- player.currentTime(player.currentTime() + dist)
- }
- }
- }
- }
- })
- }
-
- if (options.language && !isDefaultLocale(options.language)) {
- Object.assign(videojsOptions, { language: options.language })
- }
-
- return videojsOptions
-}
-
-function getControlBarChildren (options: {
- peertubeLink: boolean
- theaterMode: boolean,
- videoCaptions: VideoJSCaption[]
-}) {
- const settingEntries = []
-
- // Keep an order
- settingEntries.push('playbackRateMenuButton')
- if (options.videoCaptions.length !== 0) settingEntries.push('captionsButton')
- settingEntries.push('resolutionMenuButton')
-
- const children = {
- 'playToggle': {},
- 'currentTimeDisplay': {},
- 'timeDivider': {},
- 'durationDisplay': {},
- 'liveDisplay': {},
-
- 'flexibleWidthSpacer': {},
- 'progressControl': {
- children: {
- 'seekBar': {
- children: {
- 'peerTubeLoadProgressBar': {},
- 'mouseTimeDisplay': {},
- 'playProgressBar': {}
- }
- }
- }
- },
-
- 'webTorrentButton': {},
-
- 'muteToggle': {},
- 'volumeControl': {},
-
- 'settingsButton': {
- setup: {
- maxHeightOffset: 40
- },
- entries: settingEntries
- }
- }
-
- if (options.peertubeLink === true) {
- Object.assign(children, {
- 'peerTubeLinkButton': {}
- })
- }
-
- if (options.theaterMode === true) {
- Object.assign(children, {
- 'theaterButton': {}
- })
- }
-
- Object.assign(children, {
- 'fullscreenToggle': {}
- })
-
- return children
-}
-
-function addContextMenu (player: any, videoEmbedUrl: string) {
- player.contextmenuUI({
- content: [
- {
- label: player.localize('Copy the video URL'),
- listener: function () {
- copyToClipboard(buildVideoLink())
- }
- },
- {
- label: player.localize('Copy the video URL at the current time'),
- listener: function () {
- const player = this as Player
- copyToClipboard(buildVideoLink(player.currentTime()))
- }
- },
- {
- label: player.localize('Copy embed code'),
- listener: () => {
- copyToClipboard(buildVideoEmbed(videoEmbedUrl))
- }
- },
- {
- label: player.localize('Copy magnet URI'),
- listener: function () {
- const player = this as Player
- copyToClipboard(player.peertube().getCurrentVideoFile().magnetUri)
- }
- }
- ]
- })
-}
-
-function loadLocaleInVideoJS (serverUrl: string, videojs: any, locale: string) {
- const path = getLocalePath(serverUrl, locale)
- // It is the default locale, nothing to translate
- if (!path) return Promise.resolve(undefined)
-
- let p: Promise<any>
-
- if (loadLocaleInVideoJS.cache[path]) {
- p = Promise.resolve(loadLocaleInVideoJS.cache[path])
- } else {
- p = fetch(path + '/player.json')
- .then(res => res.json())
- .then(json => {
- loadLocaleInVideoJS.cache[path] = json
- return json
- })
- }
-
- const completeLocale = getCompleteLocale(locale)
- return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
-}
-namespace loadLocaleInVideoJS {
- export const cache: { [ path: string ]: any } = {}
-}
-
-function getServerTranslations (serverUrl: string, locale: string) {
- const path = getLocalePath(serverUrl, locale)
- // It is the default locale, nothing to translate
- if (!path) return Promise.resolve(undefined)
-
- return fetch(path + '/server.json')
- .then(res => res.json())
-}
-
-// ############################################################################
-
-export {
- getServerTranslations,
- loadLocaleInVideoJS,
- getVideojsOptions,
- addContextMenu
-}
-
-// ############################################################################
-
-function getLocalePath (serverUrl: string, locale: string) {
- const completeLocale = getCompleteLocale(locale)
-
- if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
-
- return serverUrl + '/client/locales/' + completeLocale
-}
--- /dev/null
+// FIXME: something weird with our path definition in tsconfig and typings
+// @ts-ignore
+import * as videojs from 'video.js'
+import './videojs-components/settings-menu-button'
+import {
+ PeerTubePluginOptions,
+ ResolutionUpdateData,
+ UserWatching,
+ VideoJSCaption,
+ VideoJSComponentInterface,
+ videojsUntyped
+} from './peertube-videojs-typings'
+import { isMobile, timeToInt } from './utils'
+import {
+ getStoredLastSubtitle,
+ getStoredMute,
+ getStoredVolume,
+ saveLastSubtitle,
+ saveMuteInStore,
+ saveVolumeInStore
+} from './peertube-player-local-storage'
+
+const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
+class PeerTubePlugin extends Plugin {
+ private readonly autoplay: boolean = false
+ private readonly startTime: number = 0
+ private readonly videoViewUrl: string
+ private readonly videoDuration: number
+ private readonly CONSTANTS = {
+ USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
+ }
+
+ private player: any
+ private videoCaptions: VideoJSCaption[]
+ private defaultSubtitle: string
+
+ private videoViewInterval: any
+ private userWatchingVideoInterval: any
+ private qualityObservationTimer: any
+ private lastResolutionChange: ResolutionUpdateData
+
+ constructor (player: videojs.Player, options: PeerTubePluginOptions) {
+ super(player, options)
+
+ this.startTime = timeToInt(options.startTime)
+ this.videoViewUrl = options.videoViewUrl
+ this.videoDuration = options.videoDuration
+ this.videoCaptions = options.videoCaptions
+
+ if (options.autoplay === true) this.player.addClass('vjs-has-autoplay')
+
+ this.player.on('autoplay-failure', () => {
+ this.player.removeClass('vjs-has-autoplay')
+ })
+
+ this.player.ready(() => {
+ const playerOptions = this.player.options_
+
+ if (options.mode === 'webtorrent') {
+ this.player.webtorrent().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
+ this.player.webtorrent().on('autoResolutionChange', (_: any, d: any) => this.trigger('autoResolutionChange', d))
+ }
+
+ if (options.mode === 'p2p-media-loader') {
+ this.player.p2pMediaLoader().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
+ }
+
+ this.player.tech_.on('loadedqualitydata', () => {
+ setTimeout(() => {
+ // Replay a resolution change, now we loaded all quality data
+ if (this.lastResolutionChange) this.handleResolutionChange(this.lastResolutionChange)
+ }, 0)
+ })
+
+ const volume = getStoredVolume()
+ if (volume !== undefined) this.player.volume(volume)
+
+ const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
+ if (muted !== undefined) this.player.muted(muted)
+
+ this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
+
+ this.player.on('volumechange', () => {
+ saveVolumeInStore(this.player.volume())
+ saveMuteInStore(this.player.muted())
+ })
+
+ this.player.textTracks().on('change', () => {
+ const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
+ return t.kind === 'captions' && t.mode === 'showing'
+ })
+
+ if (!showing) {
+ saveLastSubtitle('off')
+ return
+ }
+
+ saveLastSubtitle(showing.language)
+ })
+
+ this.player.on('sourcechange', () => this.initCaptions())
+
+ this.player.duration(options.videoDuration)
+
+ this.initializePlayer()
+ this.runViewAdd()
+
+ if (options.userWatching) this.runUserWatchVideo(options.userWatching)
+ })
+ }
+
+ dispose () {
+ clearTimeout(this.qualityObservationTimer)
+
+ clearInterval(this.videoViewInterval)
+
+ if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
+ }
+
+ private initializePlayer () {
+ if (isMobile()) this.player.addClass('vjs-is-mobile')
+
+ this.initSmoothProgressBar()
+
+ this.initCaptions()
+
+ this.alterInactivity()
+ }
+
+ private runViewAdd () {
+ this.clearVideoViewInterval()
+
+ // After 30 seconds (or 3/4 of the video), add a view to the video
+ let minSecondsToView = 30
+
+ if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
+
+ let secondsViewed = 0
+ this.videoViewInterval = setInterval(() => {
+ if (this.player && !this.player.paused()) {
+ secondsViewed += 1
+
+ if (secondsViewed > minSecondsToView) {
+ this.clearVideoViewInterval()
+
+ this.addViewToVideo().catch(err => console.error(err))
+ }
+ }
+ }, 1000)
+ }
+
+ private runUserWatchVideo (options: UserWatching) {
+ let lastCurrentTime = 0
+
+ this.userWatchingVideoInterval = setInterval(() => {
+ const currentTime = Math.floor(this.player.currentTime())
+
+ if (currentTime - lastCurrentTime >= 1) {
+ lastCurrentTime = currentTime
+
+ this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
+ .catch(err => console.error('Cannot notify user is watching.', err))
+ }
+ }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
+ }
+
+ private clearVideoViewInterval () {
+ if (this.videoViewInterval !== undefined) {
+ clearInterval(this.videoViewInterval)
+ this.videoViewInterval = undefined
+ }
+ }
+
+ private addViewToVideo () {
+ if (!this.videoViewUrl) return Promise.resolve(undefined)
+
+ return fetch(this.videoViewUrl, { method: 'POST' })
+ }
+
+ private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) {
+ const body = new URLSearchParams()
+ body.append('currentTime', currentTime.toString())
+
+ const headers = new Headers({ 'Authorization': authorizationHeader })
+
+ return fetch(url, { method: 'PUT', body, headers })
+ }
+
+ private handleResolutionChange (data: ResolutionUpdateData) {
+ this.lastResolutionChange = data
+
+ const qualityLevels = this.player.qualityLevels()
+
+ for (let i = 0; i < qualityLevels.length; i++) {
+ if (qualityLevels[i].height === data.resolutionId) {
+ data.id = qualityLevels[i].id
+ break
+ }
+ }
+
+ this.trigger('resolutionChange', data)
+ }
+
+ private alterInactivity () {
+ let saveInactivityTimeout: number
+
+ const disableInactivity = () => {
+ saveInactivityTimeout = this.player.options_.inactivityTimeout
+ this.player.options_.inactivityTimeout = 0
+ }
+ const enableInactivity = () => {
+ this.player.options_.inactivityTimeout = saveInactivityTimeout
+ }
+
+ const settingsDialog = this.player.children_.find((c: any) => c.name_ === 'SettingsDialog')
+
+ this.player.controlBar.on('mouseenter', () => disableInactivity())
+ settingsDialog.on('mouseenter', () => disableInactivity())
+ this.player.controlBar.on('mouseleave', () => enableInactivity())
+ settingsDialog.on('mouseleave', () => enableInactivity())
+ }
+
+ private initCaptions () {
+ for (const caption of this.videoCaptions) {
+ this.player.addRemoteTextTrack({
+ kind: 'captions',
+ label: caption.label,
+ language: caption.language,
+ id: caption.language,
+ src: caption.src,
+ default: this.defaultSubtitle === caption.language
+ }, false)
+ }
+
+ this.player.trigger('captionsChanged')
+ }
+
+ // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657
+ private initSmoothProgressBar () {
+ const SeekBar = videojsUntyped.getComponent('SeekBar')
+ SeekBar.prototype.getPercent = function getPercent () {
+ // Allows for smooth scrubbing, when player can't keep up.
+ // const time = (this.player_.scrubbing()) ?
+ // this.player_.getCache().currentTime :
+ // this.player_.currentTime()
+ const time = this.player_.currentTime()
+ const percent = time / this.player_.duration()
+ return percent >= 1 ? 1 : percent
+ }
+ SeekBar.prototype.handleMouseMove = function handleMouseMove (event: any) {
+ let newTime = this.calculateDistance(event) * this.player_.duration()
+ if (newTime === this.player_.duration()) {
+ newTime = newTime - 0.1
+ }
+ this.player_.currentTime(newTime)
+ this.update()
+ }
+ }
+}
+
+videojs.registerPlugin('peertube', PeerTubePlugin)
+export { PeerTubePlugin }
import * as videojs from 'video.js'
import { VideoFile } from '../../../../shared/models/videos/video.model'
-import { PeerTubePlugin } from './peertube-videojs-plugin'
+import { PeerTubePlugin } from './peertube-plugin'
+import { WebTorrentPlugin } from './webtorrent/webtorrent-plugin'
+import { P2pMediaLoaderPlugin } from './p2p-media-loader/p2p-media-loader-plugin'
+import { PlayerMode } from './peertube-player-manager'
declare namespace videojs {
interface Player {
peertube (): PeerTubePlugin
+ webtorrent (): WebTorrentPlugin
+ p2pMediaLoader (): P2pMediaLoaderPlugin
}
}
authorizationHeader: string
}
-type PeertubePluginOptions = {
- videoFiles: VideoFile[]
- playerElement: HTMLVideoElement
+type PeerTubePluginOptions = {
+ mode: PlayerMode
+
+ autoplay: boolean
videoViewUrl: string
videoDuration: number
startTime: number | string
- autoplay: boolean,
- videoCaptions: VideoJSCaption[]
- subtitle?: string
userWatching?: UserWatching
+ subtitle?: string
+
+ videoCaptions: VideoJSCaption[]
+}
+
+type WebtorrentPluginOptions = {
+ playerElement: HTMLVideoElement
+
+ autoplay: boolean
+ videoDuration: number
+
+ videoFiles: VideoFile[]
+}
+
+type P2PMediaLoaderPluginOptions = {
+ redundancyBaseUrls: string[]
+ type: string
+ src: string
+}
+
+type VideoJSPluginOptions = {
+ peertube: PeerTubePluginOptions
+
+ webtorrent?: WebtorrentPluginOptions
+
+ p2pMediaLoader?: P2PMediaLoaderPluginOptions
}
// videojs typings don't have some method we need
const videojsUntyped = videojs as any
+type LoadedQualityData = {
+ qualitySwitchCallback: Function,
+ qualityData: {
+ video: {
+ id: number
+ label: string
+ selected: boolean
+ }[]
+ }
+}
+
+type ResolutionUpdateData = {
+ auto: boolean,
+ resolutionId: number
+ id?: number
+}
+
+type AutoResolutionUpdateData = {
+ possible: boolean
+}
+
+type PlayerNetworkInfo = {
+ http: {
+ downloadSpeed: number
+ uploadSpeed: number
+ downloaded: number
+ uploaded: number
+ }
+
+ p2p: {
+ downloadSpeed: number
+ uploadSpeed: number
+ downloaded: number
+ uploaded: number
+ numPeers: number
+ }
+}
+
export {
+ PlayerNetworkInfo,
+ ResolutionUpdateData,
+ AutoResolutionUpdateData,
VideoJSComponentInterface,
- PeertubePluginOptions,
videojsUntyped,
VideoJSCaption,
- UserWatching
+ UserWatching,
+ PeerTubePluginOptions,
+ WebtorrentPluginOptions,
+ P2PMediaLoaderPluginOptions,
+ VideoJSPluginOptions,
+ LoadedQualityData
}
+++ /dev/null
-// FIXME: something weird with our path definition in tsconfig and typings
-// @ts-ignore
-import { Player } from 'video.js'
-
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { ResolutionMenuItem } from './resolution-menu-item'
-
-const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
-const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
-class ResolutionMenuButton extends MenuButton {
- label: HTMLElement
-
- constructor (player: Player, options: any) {
- super(player, options)
- this.player = player
-
- player.peertube().on('videoFileUpdate', () => this.updateLabel())
- player.peertube().on('autoResolutionUpdate', () => this.updateLabel())
- }
-
- createEl () {
- const el = super.createEl()
-
- this.labelEl_ = videojsUntyped.dom.createEl('div', {
- className: 'vjs-resolution-value',
- innerHTML: this.buildLabelHTML()
- })
-
- el.appendChild(this.labelEl_)
-
- return el
- }
-
- updateARIAAttributes () {
- this.el().setAttribute('aria-label', 'Quality')
- }
-
- createMenu () {
- const menu = new Menu(this.player_)
- for (const videoFile of this.player_.peertube().videoFiles) {
- let label = videoFile.resolution.label
- if (videoFile.fps && videoFile.fps >= 50) {
- label += videoFile.fps
- }
-
- menu.addChild(new ResolutionMenuItem(
- this.player_,
- {
- id: videoFile.resolution.id,
- label,
- src: videoFile.magnetUri
- })
- )
- }
-
- menu.addChild(new ResolutionMenuItem(
- this.player_,
- {
- id: -1,
- label: this.player_.localize('Auto'),
- src: null
- }
- ))
-
- return menu
- }
-
- updateLabel () {
- if (!this.labelEl_) return
-
- this.labelEl_.innerHTML = this.buildLabelHTML()
- }
-
- buildCSSClass () {
- return super.buildCSSClass() + ' vjs-resolution-button'
- }
-
- buildWrapperCSSClass () {
- return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
- }
-
- private buildLabelHTML () {
- return this.player_.peertube().getCurrentResolutionLabel()
- }
-}
-ResolutionMenuButton.prototype.controlText_ = 'Quality'
-
-MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
+++ /dev/null
-// FIXME: something weird with our path definition in tsconfig and typings
-// @ts-ignore
-import { Player } from 'video.js'
-
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-
-const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
-class ResolutionMenuItem extends MenuItem {
-
- constructor (player: Player, options: any) {
- const currentResolutionId = player.peertube().getCurrentResolutionId()
- options.selectable = true
- options.selected = options.id === currentResolutionId
-
- super(player, options)
-
- this.label = options.label
- this.id = options.id
-
- player.peertube().on('videoFileUpdate', () => this.updateSelection())
- player.peertube().on('autoResolutionUpdate', () => this.updateSelection())
- }
-
- handleClick (event: any) {
- if (this.id === -1 && this.player_.peertube().isAutoResolutionForbidden()) return
-
- super.handleClick(event)
-
- // Auto resolution
- if (this.id === -1) {
- this.player_.peertube().enableAutoResolution()
- return
- }
-
- this.player_.peertube().disableAutoResolution()
- this.player_.peertube().updateResolution(this.id)
- }
-
- updateSelection () {
- // Check if auto resolution is forbidden or not
- if (this.id === -1) {
- if (this.player_.peertube().isAutoResolutionForbidden()) {
- this.addClass('disabled')
- } else {
- this.removeClass('disabled')
- }
- }
-
- if (this.player_.peertube().isAutoResolutionOn()) {
- this.selected(this.id === -1)
- return
- }
-
- this.selected(this.player_.peertube().getCurrentResolutionId() === this.id)
- }
-
- getLabel () {
- if (this.id === -1) {
- return this.label + ' <small>' + this.player_.peertube().getCurrentResolutionLabel() + '</small>'
- }
-
- return this.label
- }
-}
-MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
-
-export { ResolutionMenuItem }
return min
}
+function getRtcConfig () {
+ return {
+ iceServers: [
+ {
+ urls: 'stun:stun.stunprotocol.org'
+ },
+ {
+ urls: 'stun:stun.framasoft.org'
+ }
+ ]
+ }
+}
+
// ---------------------------------------------------------------------------
export {
+ getRtcConfig,
toTitleCase,
timeToInt,
buildVideoLink,
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { bytes } from './utils'
+import { PlayerNetworkInfo, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+import { bytes } from '../utils'
const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
-class WebtorrentInfoButton extends Button {
+class P2pInfoButton extends Button {
createEl () {
const div = videojsUntyped.dom.createEl('div', {
subDivHttp.appendChild(subDivHttpText)
div.appendChild(subDivHttp)
- this.player_.peertube().on('torrentInfo', (event: any, data: any) => {
+ this.player_.on('p2pInfo', (event: any, data: PlayerNetworkInfo) => {
// We are in HTTP fallback
if (!data) {
subDivHttp.className = 'vjs-peertube-displayed'
return
}
- const downloadSpeed = bytes(data.downloadSpeed)
- const uploadSpeed = bytes(data.uploadSpeed)
- const totalDownloaded = bytes(data.downloaded)
- const totalUploaded = bytes(data.uploaded)
- const numPeers = data.numPeers
+ const p2pStats = data.p2p
+ const httpStats = data.http
+
+ const downloadSpeed = bytes(p2pStats.downloadSpeed + httpStats.downloadSpeed)
+ const uploadSpeed = bytes(p2pStats.uploadSpeed + httpStats.uploadSpeed)
+ const totalDownloaded = bytes(p2pStats.downloaded + httpStats.downloaded)
+ const totalUploaded = bytes(p2pStats.uploaded + httpStats.uploaded)
+ const numPeers = p2pStats.numPeers
subDivWebtorrent.title = this.player_.localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' +
this.player_.localize('Total uploaded: ' + totalUploaded.join(' '))
uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ]
peersNumber.textContent = numPeers
- peersText.textContent = ' ' + this.player_.localize('peers')
+ peersText.textContent = ' ' + (numPeers > 1 ? this.player_.localize('peers') : this.player_.localize('peer'))
subDivHttp.className = 'vjs-peertube-hidden'
subDivWebtorrent.className = 'vjs-peertube-displayed'
return div
}
}
-Button.registerComponent('WebTorrentButton', WebtorrentInfoButton)
+Button.registerComponent('P2PInfoButton', P2pInfoButton)
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { buildVideoLink } from './utils'
+import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+import { buildVideoLink } from '../utils'
// FIXME: something weird with our path definition in tsconfig and typings
// @ts-ignore
import { Player } from 'video.js'
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
+import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
// FIXME: something weird with our path definition in tsconfig and typings
// @ts-ignore
import { Player } from 'video.js'
}
update () {
- const torrent = this.player().peertube().getTorrent()
+ const torrent = this.player().webtorrent().getTorrent()
if (!torrent) return
this.el_.style.width = (torrent.progress * 100) + '%'
--- /dev/null
+// FIXME: something weird with our path definition in tsconfig and typings
+// @ts-ignore
+import { Player } from 'video.js'
+
+import { LoadedQualityData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+import { ResolutionMenuItem } from './resolution-menu-item'
+
+const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
+const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
+class ResolutionMenuButton extends MenuButton {
+ label: HTMLElement
+
+ constructor (player: Player, options: any) {
+ super(player, options)
+ this.player = player
+
+ player.tech_.on('loadedqualitydata', (e: any, data: any) => this.buildQualities(data))
+
+ player.peertube().on('resolutionChange', () => setTimeout(() => this.trigger('updateLabel'), 0))
+ }
+
+ createEl () {
+ const el = super.createEl()
+
+ this.labelEl_ = videojsUntyped.dom.createEl('div', {
+ className: 'vjs-resolution-value'
+ })
+
+ el.appendChild(this.labelEl_)
+
+ return el
+ }
+
+ updateARIAAttributes () {
+ this.el().setAttribute('aria-label', 'Quality')
+ }
+
+ createMenu () {
+ return new Menu(this.player_)
+ }
+
+ buildCSSClass () {
+ return super.buildCSSClass() + ' vjs-resolution-button'
+ }
+
+ buildWrapperCSSClass () {
+ return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
+ }
+
+ private addClickListener (component: any) {
+ component.on('click', () => {
+ let children = this.menu.children()
+
+ for (const child of children) {
+ if (component !== child) {
+ child.selected(false)
+ }
+ }
+ })
+ }
+
+ private buildQualities (data: LoadedQualityData) {
+ // The automatic resolution item will need other labels
+ const labels: { [ id: number ]: string } = {}
+
+ data.qualityData.video.sort((a, b) => {
+ if (a.id > b.id) return -1
+ if (a.id === b.id) return 0
+ return 1
+ })
+
+ for (const d of data.qualityData.video) {
+ // Skip auto resolution, we'll add it ourselves
+ if (d.id === -1) continue
+
+ this.menu.addChild(new ResolutionMenuItem(
+ this.player_,
+ {
+ id: d.id,
+ label: d.label,
+ selected: d.selected,
+ callback: data.qualitySwitchCallback
+ })
+ )
+
+ labels[d.id] = d.label
+ }
+
+ this.menu.addChild(new ResolutionMenuItem(
+ this.player_,
+ {
+ id: -1,
+ label: this.player_.localize('Auto'),
+ labels,
+ callback: data.qualitySwitchCallback,
+ selected: true // By default, in auto mode
+ }
+ ))
+
+ for (const m of this.menu.children()) {
+ this.addClickListener(m)
+ }
+
+ this.trigger('menuChanged')
+ }
+}
+ResolutionMenuButton.prototype.controlText_ = 'Quality'
+
+MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
--- /dev/null
+// FIXME: something weird with our path definition in tsconfig and typings
+// @ts-ignore
+import { Player } from 'video.js'
+
+import { AutoResolutionUpdateData, ResolutionUpdateData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+
+const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
+class ResolutionMenuItem extends MenuItem {
+ private readonly id: number
+ private readonly label: string
+ // Only used for the automatic item
+ private readonly labels: { [id: number]: string }
+ private readonly callback: Function
+
+ private autoResolutionPossible: boolean
+ private currentResolutionLabel: string
+
+ constructor (player: Player, options: any) {
+ options.selectable = true
+
+ super(player, options)
+
+ this.autoResolutionPossible = true
+ this.currentResolutionLabel = ''
+
+ this.label = options.label
+ this.labels = options.labels
+ this.id = options.id
+ this.callback = options.callback
+
+ player.peertube().on('resolutionChange', (_: any, data: ResolutionUpdateData) => this.updateSelection(data))
+
+ // We only want to disable the "Auto" item
+ if (this.id === -1) {
+ player.peertube().on('autoResolutionChange', (_: any, data: AutoResolutionUpdateData) => this.updateAutoResolution(data))
+ }
+ }
+
+ handleClick (event: any) {
+ // Auto button disabled?
+ if (this.autoResolutionPossible === false && this.id === -1) return
+
+ super.handleClick(event)
+
+ this.callback(this.id, 'video')
+ }
+
+ updateSelection (data: ResolutionUpdateData) {
+ if (this.id === -1) {
+ this.currentResolutionLabel = this.labels[data.id]
+ }
+
+ // Automatic resolution only
+ if (data.auto === true) {
+ this.selected(this.id === -1)
+ return
+ }
+
+ this.selected(this.id === data.id)
+ }
+
+ updateAutoResolution (data: AutoResolutionUpdateData) {
+ // Check if the auto resolution is enabled or not
+ if (data.possible === false) {
+ this.addClass('disabled')
+ } else {
+ this.removeClass('disabled')
+ }
+
+ this.autoResolutionPossible = data.possible
+ }
+
+ getLabel () {
+ if (this.id === -1) {
+ return this.label + ' <small>' + this.currentResolutionLabel + '</small>'
+ }
+
+ return this.label
+ }
+}
+MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
+
+export { ResolutionMenuItem }
import * as videojs from 'video.js'
import { SettingsMenuItem } from './settings-menu-item'
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { toTitleCase } from './utils'
+import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+import { toTitleCase } from '../utils'
const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
// @ts-ignore
import * as videojs from 'video.js'
-import { toTitleCase } from './utils'
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
+import { toTitleCase } from '../utils'
+import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
const component: VideoJSComponentInterface = videojsUntyped.getComponent('Component')
// Update on rate change
player.on('ratechange', this.submenuClickHandler)
+ if (subMenuName === 'CaptionsButton') {
+ // Hack to regenerate captions on HTTP fallback
+ player.on('captionsChanged', () => {
+ setTimeout(() => {
+ this.settingsSubMenuEl_.innerHTML = ''
+ this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
+ this.update()
+ this.bindClickEvents()
+
+ }, 0)
+ })
+ }
+
this.reset()
}, 0)
})
}
build () {
- const saveUpdateLabel = this.subMenu.updateLabel
- this.subMenu.updateLabel = () => {
+ this.subMenu.on('updateLabel', () => {
this.update()
-
- saveUpdateLabel.call(this.subMenu)
- }
+ })
+ this.subMenu.on('menuChanged', () => {
+ this.bindClickEvents()
+ this.setSize()
+ this.update()
+ })
this.settingsSubMenuTitleEl_.innerHTML = this.player_.localize(this.subMenu.controlText_)
this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
this.update()
this.createBackButton()
- this.getSize()
+ this.setSize()
this.bindClickEvents()
// prefixed event listeners for CSS TransitionEnd
// save size of submenus on first init
// if number of submenu items change dynamically more logic will be needed
- getSize () {
+ setSize () {
this.dialog.removeClass('vjs-hidden')
+ videojsUntyped.dom.removeClass(this.settingsSubMenuEl_, 'vjs-hidden')
this.size = this.settingsButton.getComponentSize(this.settingsSubMenuEl_)
this.setMargin()
this.dialog.addClass('vjs-hidden')
// @ts-ignore
import * as videojs from 'video.js'
-import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { saveTheaterInStore, getStoredTheater } from './peertube-player-local-storage'
+import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
+import { saveTheaterInStore, getStoredTheater } from '../peertube-player-local-storage'
const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
class TheaterButton extends Button {
import * as videojs from 'video.js'
import * as WebTorrent from 'webtorrent'
-import { VideoFile } from '../../../../shared/models/videos/video.model'
+import { VideoFile } from '../../../../../shared/models/videos/video.model'
import { renderVideo } from './video-renderer'
-import './settings-menu-button'
-import { PeertubePluginOptions, UserWatching, VideoJSCaption, VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
-import { isMobile, timeToInt, videoFileMaxByResolution, videoFileMinByResolution } from './utils'
+import { LoadedQualityData, PlayerNetworkInfo, VideoJSComponentInterface, WebtorrentPluginOptions } from '../peertube-videojs-typings'
+import { getRtcConfig, videoFileMaxByResolution, videoFileMinByResolution } from '../utils'
import { PeertubeChunkStore } from './peertube-chunk-store'
import {
getAverageBandwidthInStore,
- getStoredLastSubtitle,
getStoredMute,
getStoredVolume,
getStoredWebTorrentEnabled,
- saveAverageBandwidth,
- saveLastSubtitle,
- saveMuteInStore,
- saveVolumeInStore
-} from './peertube-player-local-storage'
+ saveAverageBandwidth
+} from '../peertube-player-local-storage'
const CacheChunkStore = require('cache-chunk-store')
}
const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
-class PeerTubePlugin extends Plugin {
+class WebTorrentPlugin extends Plugin {
private readonly playerElement: HTMLVideoElement
private readonly autoplay: boolean = false
private readonly startTime: number = 0
private readonly savePlayerSrcFunction: Function
private readonly videoFiles: VideoFile[]
- private readonly videoViewUrl: string
private readonly videoDuration: number
private readonly CONSTANTS = {
INFO_SCHEDULER: 1000, // Don't change this
AUTO_QUALITY_THRESHOLD_PERCENT: 30, // Bandwidth should be 30% more important than a resolution bitrate to change to it
AUTO_QUALITY_OBSERVATION_TIME: 10000, // Wait 10 seconds after having change the resolution before another check
AUTO_QUALITY_HIGHER_RESOLUTION_DELAY: 5000, // Buffering higher resolution during 5 seconds
- BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5, // Last 5 seconds to build average bandwidth
- USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
+ BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5 // Last 5 seconds to build average bandwidth
}
private readonly webtorrent = new WebTorrent({
tracker: {
- rtcConfig: {
- iceServers: [
- {
- urls: 'stun:stun.stunprotocol.org'
- },
- {
- urls: 'stun:stun.framasoft.org'
- }
- ]
- }
+ rtcConfig: getRtcConfig()
},
dht: false
})
private player: any
private currentVideoFile: VideoFile
private torrent: WebTorrent.Torrent
- private videoCaptions: VideoJSCaption[]
- private defaultSubtitle: string
private renderer: any
private fakeRenderer: any
private destroyingFakeRenderer = false
private autoResolution = true
- private forbidAutoResolution = false
+ private autoResolutionPossible = true
private isAutoResolutionObservation = false
private playerRefusedP2P = false
- private videoViewInterval: any
private torrentInfoInterval: any
private autoQualityInterval: any
- private userWatchingVideoInterval: any
private addTorrentDelay: any
private qualityObservationTimer: any
private runAutoQualitySchedulerTimer: any
private downloadSpeeds: number[] = []
- constructor (player: videojs.Player, options: PeertubePluginOptions) {
+ constructor (player: videojs.Player, options: WebtorrentPluginOptions) {
super(player, options)
// Disable auto play on iOS
this.autoplay = options.autoplay && this.isIOS() === false
this.playerRefusedP2P = !getStoredWebTorrentEnabled()
- this.startTime = timeToInt(options.startTime)
this.videoFiles = options.videoFiles
- this.videoViewUrl = options.videoViewUrl
this.videoDuration = options.videoDuration
- this.videoCaptions = options.videoCaptions
this.savePlayerSrcFunction = this.player.src
this.playerElement = options.playerElement
- if (this.autoplay === true) this.player.addClass('vjs-has-autoplay')
-
this.player.ready(() => {
const playerOptions = this.player.options_
const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
if (muted !== undefined) this.player.muted(muted)
- this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
-
- this.player.on('volumechange', () => {
- saveVolumeInStore(this.player.volume())
- saveMuteInStore(this.player.muted())
- })
-
- this.player.textTracks().on('change', () => {
- const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
- return t.kind === 'captions' && t.mode === 'showing'
- })
-
- if (!showing) {
- saveLastSubtitle('off')
- return
- }
-
- saveLastSubtitle(showing.language)
- })
-
this.player.duration(options.videoDuration)
this.initializePlayer()
this.runTorrentInfoScheduler()
- this.runViewAdd()
-
- if (options.userWatching) this.runUserWatchVideo(options.userWatching)
this.player.one('play', () => {
// Don't run immediately scheduler, wait some seconds the TCP connections are made
clearTimeout(this.qualityObservationTimer)
clearTimeout(this.runAutoQualitySchedulerTimer)
- clearInterval(this.videoViewInterval)
clearInterval(this.torrentInfoInterval)
clearInterval(this.autoQualityInterval)
- if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
-
// Don't need to destroy renderer, video player will be destroyed
this.flushVideoFile(this.currentVideoFile, false)
return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1
}
- getCurrentResolutionLabel () {
- if (!this.currentVideoFile) return ''
-
- const fps = this.currentVideoFile.fps >= 50 ? this.currentVideoFile.fps : ''
- return this.currentVideoFile.resolution.label + fps
- }
-
updateVideoFile (
videoFile?: VideoFile,
options: {
return done()
})
- this.trigger('videoFileUpdate')
+ this.changeQuality()
+ this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.currentVideoFile.resolution.id })
}
updateResolution (resolutionId: number, delay = 0) {
}
}
- isAutoResolutionOn () {
- return this.autoResolution
- }
-
enableAutoResolution () {
this.autoResolution = true
- this.trigger('autoResolutionUpdate')
+ this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
}
disableAutoResolution (forbid = false) {
- if (forbid === true) this.forbidAutoResolution = true
+ if (forbid === true) this.autoResolutionPossible = false
this.autoResolution = false
- this.trigger('autoResolutionUpdate')
- }
-
- isAutoResolutionForbidden () {
- return this.forbidAutoResolution === true
- }
-
- getCurrentVideoFile () {
- return this.currentVideoFile
+ this.trigger('autoResolutionChange', { possible: this.autoResolutionPossible })
+ this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
}
getTorrent () {
}
private initializePlayer () {
- if (isMobile()) this.player.addClass('vjs-is-mobile')
-
- this.initSmoothProgressBar()
-
- this.initCaptions()
-
- this.alterInactivity()
+ this.buildQualities()
if (this.autoplay === true) {
this.player.posterImage.hide()
// Not initialized or in HTTP fallback
if (this.torrent === undefined || this.torrent === null) return
- if (this.isAutoResolutionOn() === false) return
+ if (this.autoResolution === false) return
if (this.isAutoResolutionObservation === true) return
const file = this.getAppropriateFile()
if (this.torrent === undefined) return
// Http fallback
- if (this.torrent === null) return this.trigger('torrentInfo', false)
+ if (this.torrent === null) return this.player.trigger('p2pInfo', false)
// this.webtorrent.downloadSpeed because we need to take into account the potential old torrent too
if (this.webtorrent.downloadSpeed !== 0) this.downloadSpeeds.push(this.webtorrent.downloadSpeed)
- return this.trigger('torrentInfo', {
- downloadSpeed: this.torrent.downloadSpeed,
- numPeers: this.torrent.numPeers,
- uploadSpeed: this.torrent.uploadSpeed,
- downloaded: this.torrent.downloaded,
- uploaded: this.torrent.uploaded
- })
- }, this.CONSTANTS.INFO_SCHEDULER)
- }
-
- private runViewAdd () {
- this.clearVideoViewInterval()
-
- // After 30 seconds (or 3/4 of the video), add a view to the video
- let minSecondsToView = 30
-
- if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
-
- let secondsViewed = 0
- this.videoViewInterval = setInterval(() => {
- if (this.player && !this.player.paused()) {
- secondsViewed += 1
-
- if (secondsViewed > minSecondsToView) {
- this.clearVideoViewInterval()
-
- this.addViewToVideo().catch(err => console.error(err))
+ return this.player.trigger('p2pInfo', {
+ http: {
+ downloadSpeed: 0,
+ uploadSpeed: 0,
+ downloaded: 0,
+ uploaded: 0
+ },
+ p2p: {
+ downloadSpeed: this.torrent.downloadSpeed,
+ numPeers: this.torrent.numPeers,
+ uploadSpeed: this.torrent.uploadSpeed,
+ downloaded: this.torrent.downloaded,
+ uploaded: this.torrent.uploaded
}
- }
- }, 1000)
- }
-
- private runUserWatchVideo (options: UserWatching) {
- let lastCurrentTime = 0
-
- this.userWatchingVideoInterval = setInterval(() => {
- const currentTime = Math.floor(this.player.currentTime())
-
- if (currentTime - lastCurrentTime >= 1) {
- lastCurrentTime = currentTime
-
- this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
- .catch(err => console.error('Cannot notify user is watching.', err))
- }
- }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
- }
-
- private clearVideoViewInterval () {
- if (this.videoViewInterval !== undefined) {
- clearInterval(this.videoViewInterval)
- this.videoViewInterval = undefined
- }
- }
-
- private addViewToVideo () {
- if (!this.videoViewUrl) return Promise.resolve(undefined)
-
- return fetch(this.videoViewUrl, { method: 'POST' })
- }
-
- private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) {
- const body = new URLSearchParams()
- body.append('currentTime', currentTime.toString())
-
- const headers = new Headers({ 'Authorization': authorizationHeader })
-
- return fetch(url, { method: 'PUT', body, headers })
+ } as PlayerNetworkInfo)
+ }, this.CONSTANTS.INFO_SCHEDULER)
}
private fallbackToHttp (options: PlayOptions, done?: Function) {
this.player.src = this.savePlayerSrcFunction
this.player.src(httpUrl)
+ this.changeQuality()
+
+ // We changed the source, so reinit captions
+ this.player.trigger('sourcechange')
+
return this.tryToPlay(err => {
if (err && done) return done(err)
return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
}
- private alterInactivity () {
- let saveInactivityTimeout: number
-
- const disableInactivity = () => {
- saveInactivityTimeout = this.player.options_.inactivityTimeout
- this.player.options_.inactivityTimeout = 0
- }
- const enableInactivity = () => {
- this.player.options_.inactivityTimeout = saveInactivityTimeout
- }
-
- const settingsDialog = this.player.children_.find((c: any) => c.name_ === 'SettingsDialog')
-
- this.player.controlBar.on('mouseenter', () => disableInactivity())
- settingsDialog.on('mouseenter', () => disableInactivity())
- this.player.controlBar.on('mouseleave', () => enableInactivity())
- settingsDialog.on('mouseleave', () => enableInactivity())
- }
-
private pickAverageVideoFile () {
if (this.videoFiles.length === 1) return this.videoFiles[0]
}
}
- private initCaptions () {
- for (const caption of this.videoCaptions) {
- this.player.addRemoteTextTrack({
- kind: 'captions',
- label: caption.label,
- language: caption.language,
- id: caption.language,
- src: caption.src,
- default: this.defaultSubtitle === caption.language
- }, false)
+ private buildQualities () {
+ const qualityLevelsPayload = []
+
+ for (const file of this.videoFiles) {
+ const representation = {
+ id: file.resolution.id,
+ label: this.buildQualityLabel(file),
+ height: file.resolution.id,
+ _enabled: true
+ }
+
+ this.player.qualityLevels().addQualityLevel(representation)
+
+ qualityLevelsPayload.push({
+ id: representation.id,
+ label: representation.label,
+ selected: false
+ })
+ }
+
+ const payload: LoadedQualityData = {
+ qualitySwitchCallback: (d: any) => this.qualitySwitchCallback(d),
+ qualityData: {
+ video: qualityLevelsPayload
+ }
}
+ this.player.tech_.trigger('loadedqualitydata', payload)
}
- // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657
- private initSmoothProgressBar () {
- const SeekBar = videojsUntyped.getComponent('SeekBar')
- SeekBar.prototype.getPercent = function getPercent () {
- // Allows for smooth scrubbing, when player can't keep up.
- // const time = (this.player_.scrubbing()) ?
- // this.player_.getCache().currentTime :
- // this.player_.currentTime()
- const time = this.player_.currentTime()
- const percent = time / this.player_.duration()
- return percent >= 1 ? 1 : percent
+ private buildQualityLabel (file: VideoFile) {
+ let label = file.resolution.label
+
+ if (file.fps && file.fps >= 50) {
+ label += file.fps
}
- SeekBar.prototype.handleMouseMove = function handleMouseMove (event: any) {
- let newTime = this.calculateDistance(event) * this.player_.duration()
- if (newTime === this.player_.duration()) {
- newTime = newTime - 0.1
- }
- this.player_.currentTime(newTime)
- this.update()
+
+ return label
+ }
+
+ private qualitySwitchCallback (id: number) {
+ if (id === -1) {
+ if (this.autoResolutionPossible === true) this.enableAutoResolution()
+ return
+ }
+
+ this.disableAutoResolution()
+ this.updateResolution(id)
+ }
+
+ private changeQuality () {
+ const resolutionId = this.currentVideoFile.resolution.id
+ const qualityLevels = this.player.qualityLevels()
+
+ if (resolutionId === -1) {
+ qualityLevels.selectedIndex = -1
+ return
+ }
+
+ for (let i = 0; i < qualityLevels; i++) {
+ const q = this.player.qualityLevels[i]
+ if (q.height === resolutionId) qualityLevels.selectedIndex = i
}
}
}
-videojs.registerPlugin('peertube', PeerTubePlugin)
-export { PeerTubePlugin }
+videojs.registerPlugin('webtorrent', WebTorrentPlugin)
+export { WebTorrentPlugin }
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#fff" />
-
+ <meta property="og:platform" content="PeerTube" />
<!-- Web Manifest file -->
<link rel="manifest" href="/manifest.webmanifest">
<source>Display unlisted and private videos</source>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit><trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e" datatype="html">
<source>No results.</source>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/videos/video-list/video-overview.component.html</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/+my-account/my-account-videos/my-account-videos.component.html</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit><trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6" datatype="html">
<source>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
- <context context-type="linenumber">19</context>
+ <context context-type="linenumber">26</context>
</context-group>
</trans-unit><trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd" datatype="html">
<source>Submit</source>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit><trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07" datatype="html">
<source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
<source>User's email must be verified to login</source>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">72</context>
</context-group>
</trans-unit><trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b" datatype="html">
<source>User's email is verified / User can login without email verification</source>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
- <context context-type="linenumber">74</context>
+ <context context-type="linenumber">76</context>
</context-group>
</trans-unit><trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee" datatype="html">
<source>Ban reason:</source>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit><trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f" datatype="html">
<source>Moderation comment</source>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">25</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit><trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2" datatype="html">
<source>Reason:</source>
<context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
<context context-type="linenumber">9</context>
</context-group>
+ </trans-unit><trans-unit id="b748c96a1ee98d2fa9a645fb71838f5d4938855b" datatype="html">
+ <source>Unfederated</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
+ <context context-type="linenumber">10</context>
+ </context-group>
</trans-unit><trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99" datatype="html">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit><trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f" datatype="html">
<source>Blacklist reason:</source>
<context-group purpose="location">
<context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit><trans-unit id="90868353e7e6f5994109ee1011131cefa992116c" datatype="html">
<source>Moderation</source>
<context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
<context context-type="linenumber">25</context>
</context-group>
+ </trans-unit><trans-unit id="6357683911e256c566259880de43ea9403de00d3" datatype="html">
+ <source>
+ Congratulations! Your video is now available in your private library.
+</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
+ <context context-type="linenumber">45</context>
+ </context-group>
</trans-unit><trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215" datatype="html">
<source>Publish will be available when upload is finished</source>
<context-group purpose="location">
<context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
- <context context-type="linenumber">54</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit><trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3" datatype="html">
<source>Publish</source>
<context-group purpose="location">
<context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit><trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b" datatype="html">
<source>Select the torrent to import</source>
<context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
<context context-type="linenumber">3</context>
</context-group>
+ </trans-unit><trans-unit id="9849bf6a9e45a9a91d13a419afbb5176f9b2367d" datatype="html">
+ <source>Unfederate the video (ask for its deletion from the remote instances)</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
+ <context context-type="linenumber">21</context>
+ </context-group>
</trans-unit><trans-unit id="7584313e33a66811eb10646627914a01fff0347d" datatype="html">
<source>
The video is being imported, it will be available when the import is finished.
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="0594812d4c50c2adbd1a892a3497c4e5c19e4b32" datatype="html">
+ <source>yes</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6320692861e01fa9c9d4e692d0d27b6c12b21c3b" datatype="html">
+ <source>no</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223" datatype="html">
<source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
<context-group purpose="location">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814" datatype="html">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <context-group purpose="location">
- <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e" datatype="html">
- <source>Please type the name of the video channel to confirm</source>
+ <trans-unit id="3859ca2a7577ba8797058d7d97eb8054bc56ec99" datatype="html">
+ <source>Please type the display name of the video channel (<x id="INTERPOLATION" equiv-text="{{displayName}}"/>) to confirm</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
<context context-type="linenumber">1</context>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9" datatype="html">
- <source>Report reason cannot be more than 300 characters long.</source>
+ <trans-unit id="8c7d4c82b057aea5dbae811e16935f9bcae4c2aa" datatype="html">
+ <source>Report reason cannot be more than 3000 characters long.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
<context context-type="linenumber">1</context>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f" datatype="html">
- <source>Moderation comment cannot be more than 300 characters long.</source>
+ <trans-unit id="23c1c2e105a98b0b6728949418a256b026b8971c" datatype="html">
+ <source>Moderation comment cannot be more than 3000 characters long.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
<context context-type="linenumber">1</context>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="2f5f2093f14679fed82ff76a0cd2a28145a83ca9" datatype="html">
+ <source>PeerTube cannot handle this kind of file. Accepted extensions are <x id="INTERPOLATION" equiv-text="{{extensions}}"/>.</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/shared/forms/reactive-file.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4" datatype="html">
<source>All unsaved data will be lost, are you sure you want to leave this page?</source>
<context-group purpose="location">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="bfdf9de4bd9140f77feb6a5fe2b51f3f0565eaa4" datatype="html">
+ <source>You have unsaved changes! If you leave, your changes will be lost.</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187" datatype="html">
<source>Video updated.</source>
<context-group purpose="location">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="5b94148c16fa19e3db89972d11e93f790a73a054" datatype="html">
+ <source>Trending for the last 24 hours</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8c429645223c24afe30218fc45bb07e352bb1938" datatype="html">
+ <source>Trending videos are those totalizing the greatest number of views during the last 24 hours.</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6da9ddede61711ecfeaa94fc61a6b7bb844ab3df" datatype="html">
+ <source>Trending for the last <x id="INTERPOLATION" equiv-text="{{days}}"/> days</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98b98154eca3533e16b81c5b08611d19949e8661" datatype="html">
+ <source>Trending videos are those totalizing the greatest number of views during the last <x id="INTERPOLATION" equiv-text="{{days}}"/> days.</source>
+ <context-group purpose="location">
+ <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165" datatype="html">
<source>Videos from your subscriptions</source>
<context-group purpose="location">
<source>Failed</source>
<target>undefined</target>
</trans-unit>
+ <trans-unit id="This video does not exist.">
+ <source>This video does not exist.</source>
+ <target>undefined</target>
+ </trans-unit>
+ <trans-unit id="We cannot fetch the video. Please try again later.">
+ <source>We cannot fetch the video. Please try again later.</source>
+ <target>undefined</target>
+ </trans-unit>
+ <trans-unit id="Sorry">
+ <source>Sorry</source>
+ <target>undefined</target>
+ </trans-unit>
+ <trans-unit id="This video is not available because the remote instance is not responding.">
+ <source>This video is not available because the remote instance is not responding.</source>
+ <target>undefined</target>
+ </trans-unit>
<trans-unit id="Misc">
<source>Misc</source>
<target>undefined</target>
<source>Password</source>
<target>الكلمة السرية</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>تسجيل الدخول</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>أرسل لي رسالة لإعادة تعيين كلمتي السرية</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>سجل</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>تغيير اللغة</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
</source>
<target>صفحتي العمومية</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
</source>
<target>حسابي</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
</source>
<target>فيديوهاتي</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
</source>
<target>الخروج</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>إنشاء حساب</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>الإشتراكات</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>نظرة شاملة</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>الشائعة</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>التي تم إضافتها حديثًا</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>المحلية</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>المزيد</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>الإدارة</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Toggle dark interface</source>
<target>الإنتقال إلى الواجهة الداكنة</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>No results.</source>
<target>لا نتائج</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- حول مثيل الخدوم <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Cancel
+ </source>
+ <target>إلغاء</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>إرسال</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>الشروط</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>التسجيل مسموح و</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
-مثيل الخادوم هذا يوفر مساحة <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> لفيديوهات المستخدمين.</target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
-مثيل الخادوم هذا يوفر مساحة غير محددة لفيديوهات المستخدمين.</target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
-التسجيل غير مسموح حاليا.</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>الوصف القصير</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>نظرة شاملة عن الفيديوهات</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>الفيديوهات الشائعة</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>الفيديوهات المُضافة حديثًا</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>الفيديوهات المحلية</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>سياسة الفيديوهات التي تحتوي على محتوى حساس</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5e155c34fb3ed8159bf0a486a366cfbc6874f9fe">
<source>Signup enabled</source>
<target>التسجيل مُفعل</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>يتطلب التسجيل رسالة تأكيد</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>حد التسجيل</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>المستخدِمون</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>حصة الفيديو الافتراضية للمستخدم</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>حد الرفع الإفتراضي للمستخدِم</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>استيراد</target>
<source>Administrator</source>
<target>المدير</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>البريد الإلكتروني للمدير</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>المستخدِمون</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>حصة الفيديو الافتراضية للمستخدم</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>حد الرفع الإفتراضي للمستخدِم</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>اسم المستخدِم الخاص بك على تويتر</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Customizations</source>
<target>التخصيصات</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>الجافا سكريبت</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>الإعدادات المتقدمة</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>سبب الحظر:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>الإجراءات</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Blacklist reason:</source>
<target>سبب الحجب:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>إعداداتي</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>مكتبتي</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>قنواتي</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>فيديوهاتي</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>اشتراكاتي</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>وارداتي</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>أخرى</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>مثيلات الخوادم المكتومة</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>تقم الفيديو:</target>
<source>Profile</source>
<target>الملف الشخصي</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>إعدادات الفيديو</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>منطقة الخطر</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>إرسال</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="4a806761798181e907e28ed1af053d466526800d">
<source>Blacklisted</source>
<target>تم حجبه</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>مثيلات الخوادم المكتومة</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>تغيير الكلمة السرية</target>
<source>Publish</source>
<target>أنشر</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Cancel create</source>
<target>إلغاء الإنشاء</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>إلغاء الحذف</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>تحديث الصورة المصغرة</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>إرسال معاينة</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Advanced settings</source>
<target>الإعدادات المتقدمة</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>إلغاء</target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>شارك</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>خطأ</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>تم بنجاح</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>تم تحديث الإعدادات</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>رجاء أدخل اسم القنات للتأكيد</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>فيديوهاتي</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>القنوات</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>مكتبتي</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>قنواتي</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>اشتراكاتي</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>أخرى</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>إعداداتي</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>خطأ</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>يجب عليك إعادة الإتصال.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>معلومات</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>تم بنجاح</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>اسم المستخدم أو كلمة المرور خاطئة.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>البريد الإلكتروني مطلوب.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>اسم المستخدم مطلوب.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>يجب أن يكون طول اسم المستخدِم أكبر مِن 3 أحرف. </target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>البريد الإلكتروني مطلوب.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
<source>User role is required.</source>
<target>دور المستخدم مطلوب.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>طول الاسم لا يجب أن يتجاوز 20 حرفا.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
<source>Comment is required.</source>
<target>التعليق مطلوب.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>معلومات</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>تم إلغاء الإرسال</target>
<source>Password</source>
<target>Contrasenya</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Iniciar sessió</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Envia'm un correu per reiniciar la meva contrasenya</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registra't</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
<source>Change the language</source>
<target>Canvia la llengua</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Registrar un compte</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Trending</source>
<target>Tendència</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Afegits fa poc</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Local</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Més</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administració</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>Sense resultats.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- Quant a la instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Envia</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Termes</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>El registre d'usuaris és permès i</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- aquesta instància proporciona una quota bàsica de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> d''espai per els vídeos dels seus usuaris.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- aquesta instància proporciona espai il·limitat per els vídeos del seus usuaris.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- El registre d'usuaris actualment no és permès.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Descripció curta</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Ruta per defecte del client</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vídeos tendència</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vídeos afegits fa poc</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vídeos locals</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Política sobre vídeos que contenen contingut sensible</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registre activat</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limit de registres</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Usuaris</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Quota de vídeo per defecte de l'usuari</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrador</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Correu del Administrador</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Usuaris</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Quota de vídeo per defecte de l'usuari</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>El teu nom d'usuari de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica el compte de Twitter del lloc web o plataforma en què es va publicar el contingut.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instància a la llista blanca de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transcodificació</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transcodificació activada</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Si desactives la transcodificació, molts vídeos dels teus usuaris no funcionaran.</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Subprocessos per la transcodificació</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Memòria cau per a visualitzacions prèvies</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalitzacions</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Escriu directament el codi JavaScript.<br />Exemple: <pre>console.log('la meva instància és sorprenent');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Configuració avançada</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Actualitza la configuració</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Sembla que la configuració no és vàlida. Cerca possibles errors a les diferents pestanyes.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>La meva configuració</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Els meus vídeos</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Quota de vídeo:</target>
<source>Profile</source>
<target>Perfil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Ajustos de vídeo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
- </context-group>
- </trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Envia</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source>Publish will be available when upload is finished</source>
<target>La publicació estarà disponible quan finalitzi la càrrega</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publica</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
<source>Wait transcoding before publishing the video</source>
<target>Espera la transcodificació abans de publicar el vídeo</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Upload thumbnail</source>
<target>Puja miniatura</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Previsualitza la càrrega</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Text breu per dir a la gent com us poden ajudar (plataforma de pertinença ...).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Ajustos avançats</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>S'ha produït un error en obtenir quant a del servidor</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Sense descripció</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Error</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Èxit</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>S'ha actualitzat la configuració.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Estàs segur que vols eliminar <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? També s''esborraràn tots els vídeos carregats en aquest canal.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Escriu el nom del canal de vídeo per confirmar</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Els meus vídeos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>La meva configuració</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
<source>Unable to find user id or verification string.</source>
<target>No es pot trobar l'identificador d'usuari ni la cadena de verificació.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Error</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Necessites tornar a connectar.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Informació</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Èxit</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
<source>Your password has been successfully reset!</source>
<target>La contrasenya s'ha restablit correctament.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Es requereix un correu electrònic.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>El correu electrònic ha de ser vàlid.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Es requereix nom d'usuari.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>El nom d'usuari ha de tenir com a mínim 3 caràcters.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>El nom d'usuari no pot tenir més de 20 caràcters.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>El nom d'usuari ha de ser només caràcters alfanumèrics en minúscules.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Es requereix un correu electrònic.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>El correu electrònic ha de ser vàlid.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>La contrasenya ha de tenir com a mínim 6 caràcters.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>El nom de visualització ha de tenir un mínim de 3 caràcters.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>El nom de visualització no pot tenir més de 120 caràcters.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>La descripció ha de tenir almenys 3 caràcters de longitud.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>El motiu de l'informe no pot tenir més de 300 caràcters.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>El text de suport ha de tenir un mínim de 3 caràcters.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Informació</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Pujada cancel·lada</target>
Unsubscribe
</source>
<target>
-Přestat odebírat</target>
+ Přestat odebírat
+ </target>
<context-group name="null">
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
<source>Subscribe with a Mastodon account:</source>
- <target>Odebírat přes Mastodon účet</target>
+ <target>Odebírat přes účet na Mastodonu:</target>
<context-group name="null">
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
+ <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
+ <source>Using a syndication feed</source>
+ <target>Použít syndikační proud</target>
+ <context-group name="null">
+ <context context-type="linenumber">48</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
<source>Subscribe via RSS</source>
- <target>Odebírat RSS</target>
+ <target>Odebírat přes RSS</target>
<context-group name="null">
<context context-type="linenumber">49</context>
</context-group>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
+ <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
+ <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
+ <target>Tento kanál můžete odebírat z jakékoliv instance na fediverse používající ActivityPub. Například u Mastodonu nebo Pleromy můžete napsat URL adresu kanálu do vyhledávacího pole a tam začít odebírat.</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
+ <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
+ <target>S tímto videem můžete interagovat z jakékoliv instance na fediverse používající ActivityPub. Například u Mastodonu nebo Pleromy můžete napsat aktuální URL adresu do vyhledávacího pole a odtamtud interagovat.</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
<source>Video quota</source>
<target>Limit na videa</target>
</trans-unit>
<trans-unit id="51ef29329faccb28d94369897068897d1b3d0478">
<source>Username or email address</source>
- <target>Uživatelské jméno nebo email</target>
+ <target>Uživatelské jméno nebo e-mail</target>
<context-group name="null">
<context context-type="linenumber">15</context>
</context-group>
<source>Password</source>
<target>Heslo</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Přihlásit</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
</trans-unit>
<trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
<source>Email</source>
- <target>Email</target>
+ <target>E-mail</target>
<context-group name="null">
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
<source>Email address</source>
- <target>Emailová adresa</target>
+ <target>E-mailová adresa</target>
<context-group name="null">
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55">
<source>Send me an email to reset my password</source>
- <target>Poslat email pro resetování hesla</target>
+ <target>Poslat e-mail pro resetování hesla</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registrovat</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Změnit jazyk</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Můj veřejný profil
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Můj účet
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Moje videa
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Odhlásit
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Vytvořit účet</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Odběry</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Přehled</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Trendy</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Nedávno přidané</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Místní</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Další</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administrace</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
+ <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
+ <source>Show keyboard shortcuts</source>
+ <target>Zobrazit klávesové zkratky</target>
+ <context-group name="null">
+ <context context-type="linenumber">89</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Přepnout tmavé rozhraní</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
+ <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
+ <source>Duration</source>
+ <target>Trvání</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
+ <source>Display sensitive content</source>
+ <target>Zobrazit citlivý obsah</target>
+ <context-group name="null">
+ <context context-type="linenumber">33</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
<source>Yes</source>
<target>Ano</target>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
+ <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
+ <source>Display unlisted and private videos</source>
+ <target>Zobrazit neuvedená a soukromá videa</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Žádné výsledky.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- O instanci <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Odeslat</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Podmínky</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Registrace uživatelů je povolena a</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- tato instance poskytuje základní limit <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> místa pro videa svým uživatelům.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- tato instance poskytuje neomezený prostor pro videa svých uživatelů.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Registrace uživatelů není momentálně povolena.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
+ <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
+ <source>
+ Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>), the protocol is different from classic BitTorrent.
+ When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
+ See <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> for more information
+ </source>
+ <target>
+ Webové peery nejsou veřejně dostupné: jelikož používáme WebRTC v prohlížeči (<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>s knihovnou WebTorrent<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>), je protokol odlišný od klasického BitTorrentu.
+ Když jste ve webovém prohlížeči, pošlete trackeru signál obsahující vaši IP adresu. Tracker pak náhodně vybere další peery, kterým přepošle informace.
+ Pro více informací si přečtěte <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/>tento dokument<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">55</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
<source>
The worst-case scenario of an average person spying on their friends is quite unlikely.
</trans-unit>
<trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
<source>How does PeerTube compare with YouTube?</source>
- <target>Jaký e PeerTube v porovnání s YouTube?</target>
+ <target>Jaký je PeerTube v porovnání s YouTube?</target>
<context-group name="null">
<context context-type="linenumber">67</context>
</context-group>
Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
</source>
<target>
- Ohrožení soukromí je na YouTube odlišné od toho na PeerTube.
+ Ohrožení soukromí je na YouTubu odlišné od toho na PeerTubu.
V případě YouTube, tato služba o vás sbírá obrovské mnžoství osobních informací (nejen vaší IP adresu), aby je poté analyzovala a sledovala vás.
- Kromě toho, YouTube je vlastněn Google/Alphabet, společností, která vás sleduje napříč různými webovými stránkami (přes AdSense nebo Google Analytics).
+ Kromě toho je YouTube vlastněn Googlem/Alphabetem, společností, která vás sleduje napříč různými webovými stránkami (přes AdSense nebo Google Analytics).
</target>
<context-group name="null">
<context context-type="linenumber">69</context>
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
+ <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
+ <source>
+ PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
+ In the meantime, we want to test different ideas related to this issue:
+ </source>
+ <target>
+ PeerTube je v rané fázi a chceme vám doručit ta nejlepší možná opatření, dokud nebude vydána stabilní verze.
+ Mezitím chceme vyzkoušet různé nápady spojené s tímto problémem:
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">85</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
<source>Set a limit to the number of peers sent by the tracker</source>
<target>Nastavit limit počtu peerů odeslaných trackerem</target>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
+ <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
+ <source>Banned</source>
+ <target>Zablokován</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
<source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
<target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> odběratelů</target>
<source>Short description</source>
<target>Krátký popis</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Výchozí hlavní stránka</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
+ <source>Videos Overview</source>
+ <target>Přehled videí</target>
+ <context-group name="null">
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Trendy</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Naposledy přidaná videa</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Místní videa</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Pravidla pro videa obsahující citlivý obsah</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Povolit registrace</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
+ <source>Signup requires email verification</source>
+ <target>Registrace vyžaduje ověření e-mailem.</target>
+ <context-group name="null">
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limit registrací</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Uživatelé</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
- <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
- <source>Administrator</source>
- <target>Administrátor</target>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Výchozí limit na uživatele</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">109</context>
</context-group>
</trans-unit>
- <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
- <source>Admin email</source>
- <target>Email administrátora</target>
+ <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
+ <source>Import</source>
+ <target>Import</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
+ <context context-type="linenumber">42</context>
</context-group>
</trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Uživatelé</target>
+ <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
+ <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
+ <target>Import videa pomocí URL HTTP (např. YouTube) povolen</target>
<context-group name="null">
- <context context-type="linenumber">144</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Výchozí limit na uživatele</target>
+ <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
+ <source>Administrator</source>
+ <target>Administrátor</target>
+ <context-group name="null">
+ <context context-type="linenumber">155</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
+ <source>Admin email</source>
+ <target>E-mail administrátora</target>
<context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Váš účet na Twitteru</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Uveďte Twitter účet stránky nebo služby, na které byl obsah publikován.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Twitter povolil tuto instanci</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Překódování</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Překódování povoleno</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Pokud zakážete překódování, mnoho videí od vašich uživatelů nebude fungovat!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Vlákna na překódování</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
+ <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
+ <target>Rozlišení <x id="INTERPOLATION" equiv-text="{{resolution}}"/> povoleno</target>
+ <context-group name="null">
+ <context context-type="linenumber">252</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
+ <source>
+ Cache
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
+ </source>
+ <target>
+ Mezipaměť
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Velikost mezipaměti náhledů</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Přizpůsobení</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Pište přímo JavaScript kód.<br />Například: <pre>console.log('moje instance je úžasná');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Pokročilá nastavení</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Aktualizovat nastavení</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Zdá se, že vaše konfigurace není validní. Prosím, vyhledejte potencialní chyby v jiné záložce.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
+ <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
+ <source>
+ Moderation
+ </source>
+ <target>
+ Moderace
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
<source>
Jobs
<context context-type="linenumber">21</context>
</context-group>
</trans-unit>
+ <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
+ <source>Filter...</source>
+ <target>Filtrovat...</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
<source>ID</source>
<target>ID</target>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
+ <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
+ <source>(banned)</source>
+ <target>(zablokován)</target>
+ <context-group name="null">
+ <context context-type="linenumber">65</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
<source>Go to the account page</source>
<target>Přejít na stránku kanálu</target>
<context context-type="linenumber">133</context>
</context-group>
</trans-unit>
+ <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
+ <source>Ban reason:</source>
+ <target>Důvod zablokování:</target>
+ <context-group name="null">
+ <context context-type="linenumber">95</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
+ <source>
+ This comment can only be seen by you or the other moderators.
+ </source>
+ <target>
+ Tento komentář můžete vidět pouze vy nebo ostatní moderátoři.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
+ <source>Update this comment</source>
+ <target>Aktualizovat tento komentář</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
<source>Reporter</source>
<target>Autor nahlášení</target>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
- <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
- <source>Blacklisted videos</source>
- <target>Videa na černé listině</target>
+ <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
+ <source>Actions</source>
+ <target>Akce</target>
<context-group name="null">
- <context context-type="linenumber">7</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Moje nastavení</target>
+ <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
+ <source>Reason:</source>
+ <target>Důvod:</target>
<context-group name="null">
- <context context-type="linenumber">3</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Moje videa</target>
+ <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
+ <source>Blacklisted videos</source>
+ <target>Videa na černé listině</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Profile</source>
<target>Profil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Nastavení videí</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
- </context-group>
- </trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Odeslat</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<context context-type="linenumber">27</context>
</context-group>
</trans-unit>
+ <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
+ <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> odběratelů</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
<source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
<target>(typ souboru: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximální velikost: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
<source>Publish will be available when upload is finished</source>
<target>Publikovat lze jakmile bude dokončeno nahrávání</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publikovat</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
</trans-unit>
<trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
<source>Tags</source>
- <target>Tagy</target>
+ <target>Štítky</target>
<context-group name="null">
<context context-type="linenumber">191</context>
</context-group>
</trans-unit>
+ <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
+ <source>Tags could be used to suggest relevant recommendations.</br>Press Enter to add a new tag.</source>
+ <target>Štítky mohou být použity pro navržení relevantních doporučení.</br>Stisknutím klávesy Enter přidáte nový štítek.</target>
+ <context-group name="null">
+ <context context-type="linenumber">18</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
<source>Video descriptions are truncated by default and require manual action to expand them.</source>
<target>Popisy videí jsou ve výchozím stavu sbaleny a rozbalují se kliknutím.</target>
<source>Wait transcoding before publishing the video</source>
<target>Čekat na překódování před publikováním videa</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Upload thumbnail</source>
<target>Nahrát miniaturu</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Nahrát náhled</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Krátký text, co řekne lidem, jak vás mohou podpořit.</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Rozšířená nastavení</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Chyba při získávání popisu</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Žádný popis</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Chyba</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Úspěšně</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Nastavení aktualizováno.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
+ <source>Unban</source>
+ <target>Odblokovat</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
+ <target>Opravdu chcete odblokovat <x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů odblokováno.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
<source>You cannot delete root.</source>
<target>Uživatel root nelze odstranit.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Opravdu chcete odstranit <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Tato akce odstraní i veškerá videa na tomto kanálu.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Prosím, napište název tohoto kanálu pro potvrzení</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Moje videa</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Moje odběry</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Moje nastavení</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
<source>Unable to find user id or verification string.</source>
<target>Nelze najít uživatelovo id nebo verifikační řetězec.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
+ <source>Subscribe to the account</source>
+ <target>Odebírat účet</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
<source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
</source>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Chyba</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Musíte se znovu připojit.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Úspěšně</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
<source>Your password has been successfully reset!</source>
<target>Vaše heslo bylo úspěšně resetováno!</target>
</trans-unit>
<trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
<source>Admin email is required.</source>
- <target>Email administrátora je vyžadován.</target>
+ <target>E-mail administrátora je vyžadován.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
<source>Admin email must be valid.</source>
- <target>Email administrátora musí být platný.</target>
+ <target>E-mail administrátora musí být platný.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>E-mail je vyžadován.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>E-mail musí být platný.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Uživatelské jméno je vyžadováno.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Uživatelské jméno musí mít délku minimálně 3 znaky.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Uživatelské jméno nemůže být delší než 20 znaků.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Uživatelské jméno by mělo obsahovat pouze malá písmena a číslice.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Email je vyžadován.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>Email musí být platný.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Heslo musí mít délku minimálně 6 znaků.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Zobrazované jméno musí mít delku minimálně 3 znaky.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Zobrazované jméno nesmí být delší než 120 znaků.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Popis musí mít délku minimálně 3 znaky.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Důvod nahlášení nesmí být delší než 300 znaků.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Text pro podporu musí mít délku minimálně 3 znaky.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů zablokováno.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
+ <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> zablokován.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
+ <target>Opravdu chcete odblokovat uživatele <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
+ <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odblokován.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
<source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
<target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odstraněn.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
+ <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Odebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
<source>Subscribed</source>
- <target>Odebírám</target>
+ <target>Odebíráte</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
+ <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Již neodebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Odběr zrušen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
+ <source>Anyone can see this video</source>
+ <target>Kdokoliv může vidět toto video</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
+ <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
+ <target>Nyní jste přihlášen/a jako <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
<source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
- <target>Přiřazená data (tagy, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target>
+ <target>Ovšem přidružená data (štítky, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Info</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Nahrávání zrušeno</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
+ <source>Like the video</source>
+ <target>To se mi líbí</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
+ <source>Dislike the video</source>
+ <target>To se mi nelíbí</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
<source>Do you really want to delete this video?</source>
<target>Opravdu chcete odstranit toto video?</target>
</trans-unit>
<trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
<source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
- <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> se to nelíbí</target>
+ <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> lidem se to nelíbí</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
+ <source>Videos from your subscriptions</source>
+ <target>Videa od vašich odběrů</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
</body>
</file></xliff>
\ No newline at end of file
<source>Password</source>
<target>Passwort</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Anmelden</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Mir eine E-Mail schicken, um mein Passwort zurückzusetzen</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
+ <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
+ <source>I am at least 16 years old and agree to the <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Terms</a> of this instance</source>
+ <target>Ich bin mindestens 16 Jahre alt und stimme den <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Bestimmungen</a> dieser Instanz zu</target>
+ <context-group name="null">
+ <context context-type="linenumber">55</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
<source>Signup</source>
<target>Registrieren</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
+ <source>
+ Filters
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </source>
+ <target>
+ Filter
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
<source>
No results found
<source>Change the language</source>
<target>Sprache wechseln</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Mein öffentliches Profil
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Mein Konto
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Meine Videos
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Abmelden
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Konto erstellen</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Abos</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Übersicht</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Beliebt</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Kürzlich hinzugefügt</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Lokal</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Mehr</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administration</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Zeige Tastatur-Kürzel</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Dunkle Oberfläche umschalten</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Private und nicht gelisteten Videos aufzeigen</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Keine Ergebnisse.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- Über die Instanz <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Abbrechen
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Abschicken</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Bestimmungen</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Benutzerregistrierung ist möglich und</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- für die Videos ihrer Nutzer stellt diese Instanz einen Speicherplatz von <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> zur Verfügung.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- für die Videos ihrer Nutzer stellt diese Instanz unbegrenzten Speicherplatz zur Verfügung.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Die Benutzerregistrierung ist zur Zeit nicht erlaubt.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
</trans-unit>
<trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf">
<source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source>
- <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die mit WebTorrent P2P-Technologie direkt im Browser verwendet.</target>
+ <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die WebTorrent P2P-Technologie direkt im Browser verwendet.</target>
<context-group name="null">
<context context-type="linenumber">6</context>
</context-group>
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
+ <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
+ <source>
+ PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
+ In the meantime, we want to test different ideas related to this issue:
+ </source>
+ <target>
+ PeerTube ist in der frühen Entwicklungsphase und es ist geplant, die besten Gegenmaßnahmen in der nächsten stabilen Version zu implementieren.
+ Bis dahin wollen wir verschiedene Ideen für dieses Problem testen:
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">85</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
<source>Set a limit to the number of peers sent by the tracker</source>
<target>Die Zahl der Peers, die durch einen Tracker gesendet wird, begrenzen.</target>
</context-group>
</trans-unit>
<trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
- <source>Banned</source><target>Banned</target><context-group name="null">
+ <source>Banned</source>
+ <target>Gebannt</target>
+ <context-group name="null">
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
- <source>Muted</source><target>Muted</target><context-group name="null">
+ <source>Muted</source>
+ <target>Stummgeschaltet</target>
+ <context-group name="null">
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
- <source>Muted by your instance</source><target>Muted by your instance</target><context-group name="null">
+ <source>Muted by your instance</source>
+ <target>Von deiner Instanz stummgeschaltet</target>
+ <context-group name="null">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
- <source>Instance muted</source><target>Instance muted</target><context-group name="null">
+ <source>Instance muted</source>
+ <target>Instanz stummgeschaltet</target>
+ <context-group name="null">
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
- <source>Instance muted by your instance</source><target>Instance muted by your instance</target><context-group name="null">
+ <source>Instance muted by your instance</source>
+ <target>Diese Instanz wurde deiner Instanz stummgeschaltet</target>
+ <context-group name="null">
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<source>Short description</source>
<target>Kurze Beschreibung</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Standardpfad (Client)</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Video-Übersicht</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Beliebte Videos</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Kürzlich hinzugefügte Videos</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Lokale Videos</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Verhalten bei Videos mit anstößigen Inhalten</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registrierung aktiviert</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Registrierung erfordert eine Bestätigung der E-Mail-Adresse</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Obergrenze für Registrierungen</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Benutzer</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Standardkontingent für die Videos eines Nutzers</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importieren</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>Video durch HTTP URL (z.b. YouTube©) import erlaubt.</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Video-Import über eine Torrent-Datei oder einen Magnet-Link aktiviert</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrator</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Admin E-Mail</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Benutzer</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Standardkontingent für die Videos eines Nutzers</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Dein Twitter-Benutzername</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Zeigt den Twitter-Account für die Webseite, auf der der Inhalt veröffentlicht wurde.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instanz von Twitter vertraut</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transkodierung</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transkodierung an</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Wenn du die Transkodierung abschaltest, werden viele Videos nicht laufen!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Transcodierungsthreads</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Eingestellte Auflösung: <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Einige Dateien (Vorschau, Untertitel) werden nicht verteilt gespeichert. Wir laden sie direkt von der Ursprungsinstanz und speichern sie zwischen.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Cachegröße der Vorschau</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Cachegröße der Untertitel</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalisierung</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Füge dein JavaScript ein.<br />Beispiel: <pre>console.log('Meine Instanz ist großartig');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Schreibe direkt CSS-Code. Beispiel:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Stelle <em>#custom-css</em> voran, um den Stil zu überschreiben. Beispiel:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Erweiterte Einstellungen</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Einstellungen aktualisieren</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Die Einstellungen sind anscheinend ungültig. Bitte suche nach potentiellen Fehlern in den verschiedenen Reitern.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
</context-group>
</trans-unit>
<trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
- <source>(banned)</source><target>(banned)</target><context-group name="null">
+ <source>(banned)</source>
+ <target>(gebannt)</target>
+ <context-group name="null">
<context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<context context-type="linenumber">133</context>
</context-group>
</trans-unit>
+ <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
+ <source>User's email must be verified to login</source>
+ <target>Die E-Mail-Adresse des Nutzers muss vor dem Einloggen bestätigt werden</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
+ <source>User's email is verified / User can login without email verification</source>
+ <target>Die E-Mail-Addresse des Nutzers wurde bestätigt / Nutzer kann ohne E-Mail-Bestätigung einloggen</target>
+ <context-group name="null">
+ <context context-type="linenumber">76</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>Grund für die Sperrung:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Aktionen</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Grund für die Sperre:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
</context-group>
</trans-unit>
<trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
- <source>Muted accounts</source><target>Muted accounts</target><context-group name="null">
+ <source>Muted accounts</source>
+ <target>Stummgeschaltete Accounts</target>
+ <context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
<trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
- <source>Muted servers</source><target>Muted servers</target><context-group name="null">
+ <source>Muted servers</source>
+ <target>Stummgeschaltete Server</target>
+ <context-group name="null">
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
</context-group>
</trans-unit>
<trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
- <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source><target>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target><context-group name="null">
+ <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Stummgeschaltet am <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
- <source>Unmute</source><target>Unmute</target><context-group name="null">
+ <source>Unmute</source>
+ <target>Stummschalten aufheben</target>
+ <context-group name="null">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Meine Einstellungen</target>
+ <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
+ <source>Video quota:</source>
+ <target>Videokontingent:</target>
<context-group name="null">
- <context context-type="linenumber">3</context>
+ <context context-type="linenumber">4</context>
</context-group>
</trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Meine Bibliothek</target>
+ <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
+ <source>Profile</source>
+ <target>Profil</target>
<context-group name="null">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Meine Kanäle</target>
+ <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
+ <source>Video settings</source>
+ <target>Videoeinstellungen</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Meine Videos</target>
+ <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
+ <source>Danger zone</source>
+ <target>Gefahrenzone</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Meine Abos</target>
+ <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
+ <source>Change ownership</source>
+ <target>Besitzer ändern</target>
<context-group name="null">
- <context context-type="linenumber">16</context>
+ <context context-type="linenumber">46</context>
</context-group>
</trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Meine Importe</target>
+ <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
+ <source>Select the next owner</source>
+ <target>Wähle den nächsten Besitzer</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source><target>Muted instances</target><context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Besitzer ändern</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
- <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
- <source>Video quota:</source>
- <target>Videokontingent:</target>
- <context-group name="null">
- <context context-type="linenumber">4</context>
- </context-group>
- </trans-unit>
- <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
- <source>Profile</source>
- <target>Profil</target>
- <context-group name="null">
- <context context-type="linenumber">8</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
- <source>Video settings</source>
- <target>Videoeinstellungen</target>
- <context-group name="null">
- <context context-type="linenumber">15</context>
- </context-group>
- </trans-unit>
- <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
- <source>Danger zone</source>
- <target>Gefahrenzone</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
- <source>Change ownership</source>
- <target>Besitzer ändern</target>
- <context-group name="null">
- <context context-type="linenumber">46</context>
- </context-group>
- </trans-unit>
- <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
- <source>Select the next owner</source>
- <target>Wähle den nächsten Besitzer</target>
- <context-group name="null">
- <context context-type="linenumber">9</context>
+ <context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Abschicken</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Stummgeschaltete Instanzen</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Passwort ändern</target>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
+ <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
+ <source>Sorry, but something went wrong</source>
+ <target>Entschuldigung, etwas ist schiefgegangen</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
<source>
Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
<source>Publish will be available when upload is finished</source>
<target>Veröffentlichung ist möglich, sobald das Hochladen abgeschlossen ist</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Veröffentlichen</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Transkodieren abwarten, bevor das Video veröffentlicht wird</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Wenn du dich entschließt, das Transkodieren nicht abzuwarten, kann das Video unabspielbar sein, bis das Transkodieren beendet ist.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Weitere Untertitel hinzufügen</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Siehe in der Untertiteldatei</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>Fast hochgeladen ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>Wird bei einer Aktualisierung erstellt</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Erstellen abbrechen</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>Wird bei einer Aktualisierung gelöscht</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Löschen abbrechen</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
Bis auf Weiteres keine Untertitel.
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Untertitel</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Miniaturansicht hochladen</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Vorschau hochladen</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Ein kurzer Text, der anderen erklärt, wie sie dich unterstützen können.</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Erweiterte Einstellungen</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Abbrechen
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Teilen</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Server-Fehler.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Keine Beschreibung</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Fehler</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Erfolg</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Einstellungen aktualisiert.</target>
</context-group>
</trans-unit>
<trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ist von deiner Instanz nicht mehr stummgeschatet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
+ <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> ist von deiner Instanz nicht mehr stummgeschaltet.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
+ <source>Delete this report</source>
+ <target>Missbrauchsmeldung löschen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
<source>Update moderation comment</source>
<target>Moderationskommentar aktualisieren</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
+ <source>Do you really want to delete this abuse report?</source>
+ <target>Wollen Sie wirklich diese Missbrauchsmeldung löschen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
<source>Abuse deleted.</source>
<target>Missbrauchsmeldung gelöscht.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
+ <source>Set Email as Verified</source>
+ <target>E-Mail als bestätigt setzen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
<source>You cannot ban root.</source>
<target>Du kannst root nicht sperren.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
+ <target>Willst du wirklich den Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufheben?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
+ <target>Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufgehoben.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
<source>You cannot delete root.</source>
<target>Du kannst die Wurzel nicht löschen.</target>
</context-group>
</trans-unit>
<trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
- <source>If you remove these users, you will not be able to create others with the same username!</source><target>If you remove these users, you will not be able to create others with the same username!</target><context-group name="null">
+ <source>If you remove these users, you will not be able to create others with the same username!</source>
+ <target>Wenn du diesen Benutzer löschst, kannst du keine neuen Benutzer mit gleichem Benutzernamen einrichten !</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gelöscht.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
+ <target>E-Mail von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern als bestätigt markiert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
+ <target>Stummschaltung von Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> aufgehoben.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
+ <target>Stummschaltung von Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> aufgehoben.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
+ <source>This name already exists on this instance.</source>
+ <target>Dieser Name existiert bereits auf dieser Instanz.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
<source>Create</source>
<target>Erstellen</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Willst du wirklich <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> löschen? Alle hochgeladenen Videos des Kanals werden dann ebenfalls unwiderruflich gelöscht.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Bitte gib zur Bestätigung den Namen des Videokanals ein</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Meine Videos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Kanäle</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Meine Bibliothek</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Meine Kanäle</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Meine Abos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Verschiedenes</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Video-Importe</target>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Besitzer ändern</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Meine Einstellungen</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</context-group>
</trans-unit>
<trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
- <source>Subscribe to the account</source><target>Subscribe to the account</target><context-group name="null">
+ <source>Subscribe to the account</source>
+ <target>Diesen Account abonnieren</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
+ <source>Focus the search bar</source>
+ <target>Die Suchleiste fokussieren</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
+ <source>Toggle the left menu</source>
+ <target>Linkes Menü umschalten</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
+ <source>Toggle Dark theme</source>
+ <target>Dunkles Theme umschalten</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
+ <source>Go to my subscriptions</source>
+ <target>Gehe zu meinen Abos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
<source>Go to my videos</source>
<target>zur meine Videos gehen</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
+ <source>Go to my imports</source>
+ <target>Gehe zu meinen Importen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
+ <source>Go to my channels</source>
+ <target>Gehe zu meinen Kanälen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
<source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
</source>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Fehler</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Bitte verbinde dich erneut.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Infos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Erfolg</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Falscher Benutzername oder falsches Passwort.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Bitte gib eine E-Mail-Adresse ein.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Bitte gib einen Benutzernamen ein.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Der Benutzername muss mindestens 3 Zeichen lang sein.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Der Benutzername darf nicht länger als 20 Zeichen lang sein.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Der Benutzername sollte nur kleine alphanumerische Zeichen enthalten.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Bitte gib eine E-Mail-Adresse ein.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Das Passwort muss mindestens 6 Zeichen lang sein.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Der Anzeigename muss mindestens 3 Zeichen lang sein.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Der Anzeigename darf nicht länger als 120 Zeichen lang sein.</target>
+ <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
+ <source>Description must be at least 3 characters long.</source>
+ <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
- <source>Description must be at least 3 characters long.</source>
- <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target>
+ <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
+ <source>Description cannot be more than 1000 characters long.</source>
+ <target>Beschreibung kann nicht länger als 1000 Zeichen sein.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Der Grund für die Meldung darf nicht mehr als 300 Zeichen umfassen.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Der Moderationskommentar muss angegeben werden.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Der Moderationskommentar darf nicht mehr als 300 Zeichen umfassen.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>Der Kanal muss angegeben werden.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
- <source>Name is required.</source>
- <target>Der Name muss angegeben werden.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Der Name muss mindestens 3 Zeichen umfassen.</target>
+ <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
+ <source>You can only transfer ownership to a local account</source>
+ <target>Du kannst den Besitz nur auf einen lokalen Account übertragen</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Der Name darf nicht mehr als 20 Zeichen umfassen.</target>
+ <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
+ <source>Name is required.</source>
+ <target>Der Name muss angegeben werden.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Der Name sollte nur kleine alphanumerische Zeichen enthalten.</target>
+ <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
+ <source>Support text must be at least 3 characters long.</source>
+ <target>Die Beschreibung zur Unterstützung muss mindestens 3 Zeichen umfassen.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
- <source>Support text must be at least 3 characters long.</source>
- <target>Die Beschreibung zur Unterstützung muss mindestens 3 Zeichen umfassen.</target>
+ <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
+ <source>Support text cannot be more than 1000 characters long.</source>
+ <target>Die Beschreibung zur Unterstützung kann nicht mehr als 1000 Zeichen lang sein.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
+ <source>Video support cannot be more than 1000 characters long.</source>
+ <target>Die Beschreibung zur Unterstützung darf nicht mehr als 1000 Zeichen umfassen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
<source>A date is required to schedule video update.</source>
<target>Bitte gib ein ein Datum für die geplante Veröffentlichung ein.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gebannt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
<source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
<target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> gesperrt.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
+ <target>E-Mail des Benutzers <x id="INTERPOLATION" equiv-text="{{username}}"/> als bestätigt markiert</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
+ <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> von der Instanz stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
+ <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> von der Instanz stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
+ <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
+ <source>Mute this account</source>
+ <target>Dieses Konto stummschalten</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
+ <source>Unmute this account</source>
+ <target>Stummschaltung für dieses Konto aufheben</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
+ <source>Mute the instance</source>
+ <target>Diese Instanz stummschalten</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
+ <source>Unmute the instance</source>
+ <target>Stummschaltung für diese Instanz aufheben</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
+ <source>Mute this account by your instance</source>
+ <target>Dieses Konto durch deine Instanz stummschalten lassen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
+ <source>Unmute this account by your instance</source>
+ <target>Stummschaltung dieses Kontos durch deine Instanz aufheben</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
+ <source>Mute the instance by your instance</source>
+ <target>Diese Instanz durch deine Instanz stummschalten lassen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
+ <source>Unmute the instance by your instance</source>
+ <target>Stummschaltung dieser Instanz durch deine Instanz aufheben</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
<source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
<target>Die Anfrage ist zu groß. Bitte kontaktiere den Administrator, um die Obergrenze für die Größe zu erhöhen.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Abonniert</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> abonniert</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Abo beendet</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Abonniert</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Abo beendet</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Moderator</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
+ <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
+ <target>Wilkommen! Bitte überprüfe deine Mails um dein Benutzerkonto zu bestätigen und die Registrierung abzuschließen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
+ <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
+ <target>Du bist jetzt eingeloggt als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
<source>Video to import updated.</source>
<target>Zu importierendes Video wurde aktualisiert.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Infos</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Hochladen abgebrochen</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Leider kann PeerTube keine Videos verarbeiten, die größer als 8 GB sind.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Dein Videokontingent wird mit diesem Video überschritten (Videogröße: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, benutzt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, Kontingent: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>Pasvorto</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Saluti</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Sendu al mi retleteron por restarigi mian pasvorton</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registriĝo</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
<source>Change the language</source>
<target>Ŝanĝi la lingvon</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Miaj filmoj
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Adiaŭi
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Krei konton</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Abonoj</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Superrigardo</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Furoraj</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Freŝe aldonitaj</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Lokaj</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Pli</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administrado</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>Nenio troviĝis.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- Pri la nodo « <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> »
-</target>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Sendi</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Kondiĉoj</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Registrado de uzantoj estas permesata kaj</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- ĉi tiu nodo donas bazan datumlimon de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> da spaco por filmoj de siaj uzantoj.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- ĉi tiu nodo donas senliman spacon por filmoj de siaj uzantoj.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Registrado de novaj uzantoj nun ne estas permesata.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Mallonga priskribo</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Norma klienta vojo</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Filma superrigardo</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Filmoj furoraj</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Filmoj freŝe aldonitaj</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Filmoj lokaj</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Politiko pri filmoj kun konsterna enhavo</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registriĝoj ŝaltitaj</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Registriĝo bezonas kontrolon de retpoŝtadreso</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limo de registriĝoj</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Uzantoj</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Norma datumlimo por filmoj de uzantoj</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Enporti</target>
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Enporto de filmoj per torenta dosiero aŭ magneta ligilo ŝaltita</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administranto</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Retpoŝtadreso de administranto</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Uzantoj</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Norma datumlimo por filmoj de uzantoj</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Via Tvitera salutnomo</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indikas konton de Twitter por la retejo aŭ platformo, sur kiu la afero publikiĝis.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Nodo permesata de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transkodado</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transkodado ŝaltita</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Se vi malŝaltos transkodadon, multaj filmoj de viaj uzantoj eble ne funkcios!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Fadenoj por transkodado</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Distingo <x id="INTERPOLATION" equiv-text="{{resolution}}"/> ŝaltita</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Iuj dosieroj ne estas federataj (antaŭrigardoj, transskriboj). Ni prenas kaj kaŝmemoras ilin rekte el la fonta nodo.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Grando de antaŭrigarda kaŝmemoro</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Grandeco de kaŝmemoro por filmaj transskriboj.</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Adaptoj</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>Ĝavoskripto</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Skribu rekte Ĝavoskriptan kodon.<br />Ekzemple: <pre>console.log('mia nodo bonegas');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Specialaj agordoj</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Efektivigi agordojn</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Ŝajnas, ke la agordo estas nevalida. Bonvolu serĉi eblajn erarojn en la langetoj.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Miaj agordoj</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Miaj kanaloj</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Miaj filmoj</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Miaj abonoj</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Miaj enportoj</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Datumlimo por filmoj:</target>
<source>Profile</source>
<target>Profilo</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Filmaj agordoj:</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Danĝera areo</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Sendi</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source>Publish will be available when upload is finished</source>
<target>Eldono eblos post fino de alŝuto</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Eldoni</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Atendi transkodadon antaŭ publikigi la filmon</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Se vi decidos ne atendi finon de transkodado antaŭ publikigo, ĝi povus esti neludebla ĝis la transkodo finiĝos.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Aldoni alian transskribon</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Rigardi la dosieron kun subtekstoj</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Nuligi kreon</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Nuligi forigon</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Transskriboj</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Alŝuti miniaturon</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Alŝuti antaŭrigardon</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Mallonga teksto por sciigi homojn, kiel ili povas subteni vin.</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Specialaj agordoj</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Eraro ricevante prion de la servilo</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Neniu priskribo</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Eraro</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Sukceso</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Agordo ĝisdatigita</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Ĉu vi certe volas forigi kanalon <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Tiel vi ankaŭ forigos ĉiujn filmojn alŝutitajn al tiu ĉi kanalo.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Bonvolu tajpi nomon de la filma kanalo por konfirmi</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Miaj filmoj</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Miaj kanaloj</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Miaj abonoj</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Miaj agordoj</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
<source>Unable to find user id or verification string.</source>
<target>Ne povas trovi identigilon aŭ kontrolan ĉenon de uzanto</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Eraro</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Vi devas rekonektiĝi</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Informoj</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Sukceso</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
<source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
<target>Retletero kun instrukcioj por restarigi la pasvorton sendiĝos al <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Necesas retpoŝtadreso.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>Retpoŝtadreso devas esti valida.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Necesas salutnomo.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Salutnomo devas havi almenaŭ 3 signojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Salutnomo ne povas havi pli ol 20 signojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Salutnomo havu nur ciferojn kaj minusklajn literojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Necesas retpoŝtadreso.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>Retpoŝtadreso devas esti valida.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Pasvorto devas havi almenaŭ 6 signojn.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Prezenta nomo devas havi almenaŭ 3 signojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Prezenta nomo ne povas havi pli ol 120 signojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Priskribo havu almenaŭ 3 signojn.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Kialo de raporto maldevas havi pli ol 300 signojn.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
<source>Video caption language is required.</source>
<target>Necesas lingvo de filma transskribo.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Informoj</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Alŝuto nuligita.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Pardonu nin, sed PeerTube ne kapablas trakti filmojn super 8GB</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
<source>Video published.</source>
<target>Filmo publikigita.</target>
<body>
<trans-unit id="ngb.alert.close">
<source>Close</source>
- <target>Cerrar</target>
+ <target>tppCerrar</target>
<context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
+ <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
+ <source>You don't have notifications.</source>
+ <target>No tiene notificaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> ha publicado un <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>nuevo vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been unblacklisted
+ </source>
+ <target>
+ Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> ha sido desbloqueado
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been blacklisted
+ </source>
+ <target>
+ Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> ha sido bloqueado
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Una nueva denuncia de abuso<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> ha sido creada sobre el vídeo <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> ha comentado su vídeo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been published
+ </source>
+ <target>
+ Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> ha sido publicado
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> exitosa
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
+ </source>
+ <target>
+ Error durante la <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
+ <source>
+ User <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> on your instance
+ </source>
+ <target>
+ Nuevo usuario <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/>registrado<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> en su instancia
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> is following
+
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>
+ your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
+ <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="<ng-container>"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> ahora sigue
+
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>
+ su canal <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
+ <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="<ng-container>"/>su cuenta<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">43</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> le ha mencionado en el <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>vídeo <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">52</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
+ <source>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </source>
+ <target>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
<source>Unlisted</source>
<target>No listado</target>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
+ <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
+ <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
<source>
Login
<source>Password</source>
<target>Contraseña</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Identificarse</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<context context-type="linenumber">57</context>
</context-group>
</trans-unit>
+ <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
+ <source>
+ We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
+ </source>
+ <target>
+ Lo sentimos, no puede recuperar su contraseña porque el administrador de su instancia no configuró el sistema de correos electrónicos de PeerTube.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">63</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
<source>Email</source>
<target>Correo electrónico </target>
<source>Send me an email to reset my password</source>
<target>Enviar un correo electrónico para restablecer mi contraseña</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registro</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Cambiar el idioma</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
+ <source>
+ Help to translate PeerTube!
+ </source>
+ <target>
+ ¡Ayude a traducir PeerTube!
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Mi perfil público
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Mi cuenta
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Mis vídeos
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Desconectarse
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Crear una cuenta</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Suscripciones</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Vista general</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Tendencias</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Añadidos recientemente</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Local</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Más</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administración</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Mostrar los atajos de teclado</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Alternar con la interfaz oscura</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
+ <source>View your notifications</source>
+ <target>Ver sus notificaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
+ <source>Notifications</source>
+ <target>Notificaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
+ <source>Update your notification preferences</source>
+ <target>Actualizar sus preferencias de notificación</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
+ <source>See all your notifications</source>
+ <target>Ver todas sus notificaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Mostrar los vídeos no listados y privados</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target> Ningún resultados</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
+ <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
+ <target>Contactar al administrador de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
+ <source>Your name</source>
+ <target>Su nombre</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
+ <source>Your email</source>
+ <target>Su dirección de correo electrónico</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
+ <source>Your message</source>
+ <target>Su mensaje</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- Acerca del nodo <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Cancelar
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Enviar</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
+ <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
+ <target>Acerca de la instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
+ <source>Contact administrator</source>
+ <target>Contactar al administrador</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Términos de uso</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>El registro de usuarios está permitido y</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
+ <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
<source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
+ this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
+ </source>
<target>
- este nodo ofrece una cuota estándar de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> de espacio para los vídeos de sus usuarios.
- </target>
+ esta instancia provee un espacio máximo de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para los vídeos de sus usuarios.
+ </target>
<context-group name="null">
- <context context-type="linenumber">27</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
+ <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
<source>
- this instance provides unlimited space for the videos of its users.
- </source>
+ this instance provides unlimited space for the videos of its users.
+ </source>
<target>
- este nodo ofrece espacio ilimitado para los vídeos de sus usuarios.
- </target>
+ esta instancia provee un espacio ilimitado para los vídeos de sus usuarios.
+ </target>
<context-group name="null">
- <context context-type="linenumber">31</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
+ <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
<source>
- User registration is currently not allowed.
- </source>
+ User registration is currently not allowed.
+ </source>
<target>
- El registro de usuarios no está permitido actualmente.
- </target>
+ El registro de usuarios no está abierto actualmente.
+ </target>
<context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Descripción corta</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Routa de cliente por defecto</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Vista general de los vídeos</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vídeos en Tendencia</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vídeos Recientemente Añadidos</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vídeos locales</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Política para los vídeos que contengan material sensible</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registro habilitado</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>La suscripción requiere una verificación mediante correo electrónico</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Límite de registro</target>
<context-group name="null">
- <context context-type="linenumber">105</context>
+ <context context-type="linenumber">96</context>
</context-group>
</trans-unit>
- <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
- <source>Import</source>
- <target>Importar</target>
- <context-group name="null">
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Usuarios</target>
+ <context-group name="null">
+ <context context-type="linenumber">105</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Cuota de vídeo por defecto del usuario</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Límite diario de subida por día por usuario</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
+ <source>Import</source>
+ <target>Importar</target>
+ <context-group name="null">
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>La importación de vídeos mediante URL HTTP (por ejemplo YouTube) está activada</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Importar video con un archivo torrent o un enlace magnet activado</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrador</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Correo del administrador</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Usuarios</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Cuota de vídeo por defecto del usuario</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Límite diario de subida por día por usuario</target>
+ <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
+ <source>Enable contact form</source>
+ <target>Habilitar el formulario de contacto</target>
<context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">169</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Tu usuario de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica la cuenta de Twitter del sitio web o de la plataforma en la que el contenido fue publicado</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Nodo en lista blanca de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
+ <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
+ If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
+ Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted.</source>
+ <target>Si su instancia está autorizada por Twitter, un reproductor de vídeo estará incorporado al hilo Twitter cuando se comparta un vídeo desde PeerTube.<br />
+ Si la instancia no está autorizada, usamos una tarjeta con una imagen con vínculo que redireccionará hacia su instancia PeerTube.<br /><br />
+ Seleccione esta casilla, guarde la configuración y pruebe colocando el URL de un vídeo de su instancia (https://example.com/videos/watch/blabla) en <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> para verificar si su instancia está autorizada por Twitter.</target>
+ <context-group name="null">
+ <context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transcodificar</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transcodificación activada</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>¡Si desactivas la transcodificación, muchos vídeos de tus usuarios no funcionarán!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
+ <source>Allow additional extensions</source>
+ <target>Autorizar extensiones adicionales</target>
+ <context-group name="null">
+ <context context-type="linenumber">231</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
+ <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
+ <target>Autorizar sus usuarios a subir vídeos .mkv, .mov, .avi y .flv</target>
+ <context-group name="null">
+ <context context-type="linenumber">232</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Hilos de transcodificaciones</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
+ <source>
+ Cache
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
+ </source>
+ <target>
+ Caché
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Algunos archivos (previsualizaciones, subtítulos) no están federados. Los obtenemos directamente del nodo de origen y las ponemos en caché.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Tamaño de caché de las previsualizaciones</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Tamaño de caché de los subtítulos</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalizaciones</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Escribir código Javascript directamente.<br />Ejemplo: <pre>console.log('mi nodo es maravilloso');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
+ <source>
+ Write directly CSS code. Example:<br />
+ <pre>
+ body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ background-color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+
+ Prepend with <em>#custom-css</em> to override styles. Example:
+ <pre>
+ #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+ </source>
+ <target>
+ Escriba directamente código CSS. Por ejemplo:<br />
+ <pre>
+ body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ background-color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+
+ Prefijar con <em>#custom-css</em> para sobrecargar estilos. Por ejemplo:
+ <pre>
+ #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">311</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Configuración avanzada</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Actualizar configuración</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Parece que la configuración no es válida. Por favor, busque errores potenciales en las diferentes pestañas.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
+ <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
+ <source>
+ Moderation
+ </source>
+ <target>
+ Moderación
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
<source>
Jobs
<context context-type="linenumber">21</context>
</context-group>
</trans-unit>
+ <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
+ <source>Filter...</source>
+ <target>Filtrar...</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
<source>ID</source>
<target>ID</target>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
+ <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
+ <source>Accepted</source>
+ <target>Aceptado</target>
+ <context-group name="null">
+ <context context-type="linenumber">32</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
+ <source>Pending</source>
+ <target>Pendiente</target>
+ <context-group name="null">
+ <context context-type="linenumber">33</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
+ <source>Redundancy allowed</source>
+ <target>Redundancia autorizada</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
<source>Manage follows</source>
<target>Gestionar seguimientos</target>
<context context-type="linenumber">65</context>
</context-group>
</trans-unit>
+ <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
+ <source>Daily video quota</source>
+ <target>Cuota diaria de vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
<source>Users list</source>
<target>Lista de usuarios</target>
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
+ <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
+ <source>Batch actions</source>
+ <target>Acciones másivas</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
<source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Nombre de usuario <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
+ <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
+ <source>(banned)</source>
+ <target>(expulsado)</target>
+ <context-group name="null">
+ <context context-type="linenumber">65</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
<source>Go to the account page</source>
<target>Ir a la página de la cuenta</target>
<context context-type="linenumber">133</context>
</context-group>
</trans-unit>
+ <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
+ <source>User's email must be verified to login</source>
+ <target>Se requiere validar la dirección de correo electrónico del usuario antes de conectarse</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
+ <source>User's email is verified / User can login without email verification</source>
+ <target>La dirección de correo electrónico del usuario ha sido verificada / El usuario puede conectarse sin verificación de dirección de correo electrónico</target>
+ <context-group name="null">
+ <context context-type="linenumber">76</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
+ <source>Ban reason:</source>
+ <target>Razón de la expulsión:</target>
+ <context-group name="null">
+ <context context-type="linenumber">95</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
+ <source>Moderation comment</source>
+ <target>Comentarios de moderación</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
+ <source>
+ This comment can only be seen by you or the other moderators.
+ </source>
+ <target>
+ Este comentario puede ser visto solo por usted y los otros moderadores.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
+ <source>Update this comment</source>
+ <target>Actualizar este comentario</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
<source>Reporter</source>
<target>Reportador</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
+ <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
+ <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Estado <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
<source>Go to the account</source>
<target>Ir a la cuenta</target>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
+ <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
+ <source>Actions</source>
+ <target>Acciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
+ <source>Reason:</source>
+ <target>Razón:</target>
+ <context-group name="null">
+ <context context-type="linenumber">53</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
+ <source>Moderation comment:</source>
+ <target>Comentario de moderación:</target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
+ <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Nombre del vídeo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
+ <source>Sensitive</source>
+ <target>Sensible</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
+ <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Fecha <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
+ <source>Blacklist reason:</source>
+ <target>Razón del bloqueo:</target>
+ <context-group name="null">
+ <context context-type="linenumber">43</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
+ <source>Moderation</source>
+ <target>Moderación</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
+ <source>Video abuses</source>
+ <target>Vídeos denunciados como abusivos</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
<source>Blacklisted videos</source>
<target>Vídeos en lista negra</target>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Mis ajustes</target>
+ <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
+ <source>Muted accounts</source>
+ <target>Cuentas silenciadas</target>
<context-group name="null">
- <context context-type="linenumber">3</context>
+ <context context-type="linenumber">2</context>
</context-group>
</trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Mis vídeos</target>
+ <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
+ <source>Muted servers</source>
+ <target>Servidores silenciados</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
+ <source>Account</source>
+ <target>Cuenta</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
+ <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Silenciado en <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
+ <source>Unmute</source>
+ <target>Dejar de silenciar</target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Profile</source>
<target>Perfil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Ajustes de vídeo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Zona peligrosa</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Enviar</target>
+ <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
+ <source>Change ownership</source>
+ <target>Cambiar el titular</target>
<context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">46</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
+ <source>Select the next owner</source>
+ <target>Seleccionar el próxima titular</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
+ <source>
+ Cancel
+ </source>
+ <target>
+ Cancelar
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
+ <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
+ <source>Blacklisted</source>
+ <target>Bloqueado</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
<source>
Cancel
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
+ <source>Example: my_channel</source>
+ <target>Por ejemplo: mi_canal</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
<source>Display name</source>
<target>Nombre a mostrar</target>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
+ <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
+ <source>You don't have any subscriptions yet.</source>
+ <target>No tiene suscripciones todavía.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
<source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
<target>Creado por <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
- <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
- <source>Change password</source>
- <target>Cambiar contraseña</target>
+ <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
+ <source>Accept ownership</source>
+ <target>Aceptar la titularidad</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
- <source>New password</source>
- <target>Nueva contraseña</target>
+ <trans-unit id="4570c754149df06f31096510abfc925968c35562">
+ <source>Select the target channel</source>
+ <target>Seleccionar el canal objetivo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">9</context>
</context-group>
</trans-unit>
- <trans-unit id="ede41f01c781b168a783cfcefc6fb67d48780d9b">
- <source>Confirm new password</source>
- <target>Confirmar nueva contraseña</target>
+ <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
+ <source>Initiator</source>
+ <target>Iniciador</target>
<context-group name="null">
- <context context-type="linenumber">23</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
- <trans-unit id="20f62f24170d57b1efeb2387a0949f482cd4d129">
- <source>Default policy on videos containing sensitive content</source>
- <target>Política por defecto para vídeos que contengan material sensible</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
+ <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
+ <source>
+ Created
+ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/>
+ </source>
+ <target>
+ Creado
+ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
+ <source>Status</source>
+ <target>Estatus</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
+ <source>Action</source>
+ <target>Acción</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
+ <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
+ <source>Refuse</source>
+ <target>Rechazar</target>
+ <context-group name="null">
+ <context context-type="linenumber">47</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Instancias silenciadas</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
+ <source>History enabled</source>
+ <target>Historial habilitado</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
+ <source>Delete history</source>
+ <target>Borrar el historial</target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
+ <source>You don't have videos history yet.</source>
+ <target>No tiene historial de vídeos todavía</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
+ <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
+ <source>Notification preferences</source>
+ <target>Preferencias de notificación</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
+ <source>Mark all as read</source>
+ <target>Marcar todo como leído</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
+ <source>Change password</source>
+ <target>Cambiar contraseña</target>
+ <context-group name="null">
+ <context context-type="linenumber">30</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
+ <source>Current password</source>
+ <target>Contraseña actual</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
+ <source>New password</source>
+ <target>Nueva contraseña</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ede41f01c781b168a783cfcefc6fb67d48780d9b">
+ <source>Confirm new password</source>
+ <target>Confirmar nueva contraseña</target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="20f62f24170d57b1efeb2387a0949f482cd4d129">
+ <source>Default policy on videos containing sensitive content</source>
+ <target>Política por defecto para vídeos que contengan material sensible</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
+ <source>Use WebTorrent to exchange parts of the video with others</source>
+ <target>Usar WebTorrent para intercambiar partes del vídeo con otros</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
+ <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
+ <source>Once you delete your account, there is no going back. Please be certain.</source>
+ <target>Eliminar su cuenta es definitivo. ¿Está seguro?</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
<source>Delete your account</source>
<target>Eliminar tu cuenta</target>
<context context-type="linenumber">4</context>
</context-group>
</trans-unit>
+ <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
+ <source>Activities</source>
+ <target>Actividades</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
+ <source>Web</source>
+ <target>Web</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
<source>
Sorry, but we couldn't find the page you were looking for.
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
+ <source>
+ Verify account email confirmation
+ </source>
+ <target>
+ Verificar la confirmación de la dirección de correo electrónico de la cuenta
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
+ <source>
+ Your email has been verified and you may now login. Redirecting...
+ </source>
+ <target>
+ Su dirección de correo electrónico ha sido verificada y puede conectarse ahora. En curso de redirección...
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
+ <source>An error occurred. </source>
+ <target>Un error ocurrió.</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
+ <source>
+ Request email for account verification
+ </source>
+ <target>
+ Solicitar un correo electrónico de verificación de la cuenta
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
+ <source>Send verification email</source>
+ <target>Enviar un correo electrónico de verificación</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
+ <source>This instance does not require email verification.</source>
+ <target>Esta instancia no requiere verificación por correo electrónico</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
<source>Support this channel</source>
<target>Apoyar este canal</target>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
+ <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
+ <source>Sorry, but something went wrong</source>
+ <target>Disculpas, algo salió mal</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
<source>
Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
+ <source>Scheduled</source>
+ <target>Programado</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
<source>Publish will be available when upload is finished</source>
<target>La publicación estará disponible cuando finalice la subida</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publicar</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
+ <source>Or</source>
+ <target>O</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
<source>Paste magnet URI</source>
<target>Pegar el enlace magnético</target>
<context context-type="linenumber">24</context>
</context-group>
</trans-unit>
+ <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
+ <source>
+ This will replace an existing caption!
+ </source>
+ <target>
+ Eso remplazará el texto existente!
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
<source>Add this caption</source>
<target>Añadir este subtítulo</target>
<context context-type="linenumber">191</context>
</context-group>
</trans-unit>
+ <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
+ <source>Tags could be used to suggest relevant recommendations.</br>Press Enter to add a new tag.</source>
+ <target>Se puede utilizar etiquetas para sugerir recomendaciones relevantes.</br>Presione Enter para añadir una nueva etiqueta.</target>
+ <context-group name="null">
+ <context context-type="linenumber">18</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
+ <source>+ Tag</source>
+ <target>+ Etiqueta</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
+ <source>Enter a new tag</source>
+ <target>Ingresar una nueva etiqueta</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
<source>Video descriptions are truncated by default and require manual action to expand them.</source>
<target>Las descripciones de vídeo se muestran truncadas por defecto y requieren de acción manual para expandirlas.</target>
<source>Wait transcoding before publishing the video</source>
<target>Esperar transcodificación antes de publicar el vídeo</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Si decides no esperar a la transcodificación antes de publicar el vídeo, quizás no se pueda reproducir hasta que finalice la transcodificación.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Añadir otro subtítulo</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Ver el archivo de subtítulo</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
+ <source>Already uploaded ✔</source>
+ <target>Ya ha sido subido ✔</target>
+ <context-group name="null">
+ <context context-type="linenumber">160</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
+ <source>Will be created on update</source>
+ <target>Estará creado al actualizar</target>
+ <context-group name="null">
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Cancelar creación</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
+ <source>Will be deleted on update</source>
+ <target>Estará eliminado al actualizar</target>
+ <context-group name="null">
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Cancelar borrado</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
+ <source>
+ No captions for now.
+ </source>
+ <target>
+ Ningún texto por el momento.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Subtítulos</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Subir miniatura</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Subir previsualización</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Breve texto para explicar a la gente cómo pueden apoyarte (plataforma de miembros...).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Ajustes avanzados</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
+ <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
+ <source>
+ Cancel
+ </source>
+ <target>
+ Cancelar
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">47</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
<source>Download</source>
<target>Descargar</target>
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
+ <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
+ <source>
+ Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/> It will be forwarded to origin instance <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/> too.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </source>
+ <target>
+ Su reporte estará enviado a los moderadores de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/> También estará transferido a la instancia original <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/>.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Compartir</target>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
+ <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
+ <source>
+ The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
+ </source>
+ <target>
+ El URL no es seguro (no utiliza HTTPS), por lo que el vídeo embebido no funcionará en los sitios web HTTPS (los navegadores web bloquean las consultas HTTP inseguras en los sitios web HTTPS).
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">45</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
+ <source>Close</source>
+ <target>Cerrar</target>
+ <context-group name="null">
+ <context context-type="linenumber">51</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
+ <source>Blacklist video</source>
+ <target>Bloquear el vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
<source>
The video is being imported, it will be available when the import is finished.
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
+ <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
+ <source>
+ This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
+ </source>
+ <target>
+ Este vídeo será publicado el <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
+ <source>This video is blacklisted.</source>
+ <target>Este vídeo está bloqueado</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
+ <source>
+ Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
+ </source>
+ <target>
+ Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">37</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
+ <source>
+ Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
+ </source>
+ <target>
+ Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">46</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
<source>Like this video</source>
<target>Me gusta este vídeo</target>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
+ <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
+ <source>Unblacklist this video</source>
+ <target>Desbloquear este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">99</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
<source>Delete this video</source>
<target>Eliminar este vídeo</target>
<context context-type="linenumber">123</context>
</context-group>
</trans-unit>
+ <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
+ <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
+ <target>Por <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">134</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
<source>Show more</source>
<target>Mostrar más</target>
<context context-type="linenumber">152</context>
</context-group>
</trans-unit>
+ <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
+ <source>Friendly Reminder: </source>
+ <target>Recuerdo amistoso:</target>
+ <context-group name="null">
+ <context context-type="linenumber">208</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
+ <source>
+ the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
+ </source>
+ <target>
+ el sistema utilizado para compartir este vídeo implica que algunas informaciones técnicas acerca de su sistema (como la dirección IP pública) pueden estar enviadas a otros pares.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">209</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
<source>More information</source>
<target>Más información</target>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
+ <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
+ <source>
+ Other videos
+ </source>
+ <target>
+ Otros vídeos
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
<source>
Comments
<context context-type="linenumber">20</context>
</context-group>
</trans-unit>
+ <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
+ <source>You are one step away from commenting</source>
+ <target>Está a un paso de poder comentar</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
+ <source>
+ If you have an account on this instance, you can login:
+ </source>
+ <target>
+ Si tiene una cuenta en esta instancia, puede conectarse:
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">32</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
+ <source>login to comment</source>
+ <target>conectarse para comentar</target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
+ <source>
+ Otherwise you can comment using an account on any ActivityPub-compatible instance.
+ On most platforms, you can find the video by typing its URL in the search bar and then comment it
+ from within the software's interface.
+ </source>
+ <target>
+ Sino, puede comentar usando una cuenta de cualquier instancia compatible con ActivityPub.
+ En la mayoría de las plataformas, puede encontrar el vídeo colocando su URL en el campo de búsqueda y luego comentarlo
+ desde la interfaz del software.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">36</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
+ <source>
+ If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
+ </source>
+ <target>
+ Si tiene una cuenta en Mastodon o Pleroma, puede abrirlo directamente en su interfaz:
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">41</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
<source>Highlighted comment</source>
<target>Comentario resaltado</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Error al obtener información del servidor</target>
+ <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
+ <source>Cannot get about information from server</source>
+ <target>No se puede obtener información del servidor</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
+ <source>Your message has been sent.</source>
+ <target>Su mensaje ha sido remitido</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
+ <source>You already sent this form recently</source>
+ <target>Ya envió este formulario recientemente</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Error</target>
+ <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
+ <source>240p</source>
+ <target>240p</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Correcto</target>
+ <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
+ <source>360p</source>
+ <target>360p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
+ <source>480p</source>
+ <target>480p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
+ <source>720p</source>
+ <target>720p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
+ <source>1080p</source>
+ <target>1080p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
+ <source>Auto (via ffmpeg)</source>
+ <target>Auto (vía ffmpeg)</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
+ <source>100MB</source>
+ <target>100MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
+ <source>500MB</source>
+ <target>500MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
+ <source>1GB</source>
+ <target>1GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
+ <source>5GB</source>
+ <target>5GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
+ <source>20GB</source>
+ <target>20GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
+ <source>50GB</source>
+ <target>50GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
+ <source>10MB</source>
+ <target>10MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
+ <source>50MB</source>
+ <target>50MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
+ <source>2GB</source>
+ <target>2GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
<source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
<target><x id="INTERPOLATION" equiv-text="{{host}}"/> no es válido</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
+ <source>enabled</source>
+ <target>habilitada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
+ <source>disabled</source>
+ <target>deshabilitada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1123807fc813c816404598147173403d00117557">
+ <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
+ <target>La redundancia para <x id="INTERPOLATION" equiv-text="{{host}}"/> está <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
+ <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> no está silenciada por su instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
+ <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> no está silenciada por su instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
+ <source>Comment updated.</source>
+ <target>Comentario actualizado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
+ <source>Delete this report</source>
+ <target>Eliminar este reporte</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
+ <source>Update moderation comment</source>
+ <target>Actualizar el comentario de moderación</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
+ <source>Mark as accepted</source>
+ <target>Marcar como aceptado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
+ <source>Mark as rejected</source>
+ <target>Marcar como rechazado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
+ <source>Do you really want to delete this abuse report?</source>
+ <target>¿Confirma la eliminación del reporte de abuso?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
+ <source>Abuse deleted.</source>
+ <target>Reporte de abuso eliminado.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
+ <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
+ <target>¿Confirmar el desbloqueo de este vídeo? Estará disponible de nuevo en la lista de vídeos.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
<source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
<target>Vídeo <x id="INTERPOLATION" equiv-text="{{name}}"/> eliminado de la lista negra.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
+ <source>Unban</source>
+ <target>Dejar sin efecto la expulsión</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
+ <source>Set Email as Verified</source>
+ <target>Establecer la dirección de correo electrónico como Verificada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
+ <source>You cannot ban root.</source>
+ <target>No puede expulsar al root.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
+ <target>¿Confirma dejar sin efecto la expulsión de <x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios expulsados.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
<source>You cannot delete root.</source>
<target>No puedes eliminar al root.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
+ <source>If you remove these users, you will not be able to create others with the same username!</source>
+ <target>¡Si elimina estos usuarios, no será posible crear otros con el mismo nombre de usuario!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios eliminados.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> direcciones de correo electrónico de usuarios establecidas como verificadas.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
+ <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no está silenciada.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
+ <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no está silenciada.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
+ <source>My videos history</source>
+ <target>Mi historial de vídeos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
+ <source>Videos history is enabled</source>
+ <target>El historial de vídeos está habilitado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
+ <source>Videos history is disabled</source>
+ <target>El historial de vídeos está deshabilitado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
+ <source>Delete videos history</source>
+ <target>Eliminar el historial de vídeos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
+ <source>Are you sure you want to delete all your videos history?</source>
+ <target>¿Confirma la eliminación de todo su historial de vídeos?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
+ <source>Videos history deleted</source>
+ <target>Historial de vídeos eliminado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
+ <source>Ownership accepted</source>
+ <target>Titularidad aceptada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
<source>Password updated.</source>
<target>Contraseña actualizada.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
+ <source>You current password is invalid.</source>
+ <target>Su contraseña actual es invalida.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
<source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
<target>Estás seguro de querer eliminar tu cuenta? Todos tus datos serán eliminados, incluyendo canales, vídeos, etc.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
+ <source>New video from your subscriptions</source>
+ <target>Nuevo vídeo desde sus suscripciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
+ <source>New comment on your video</source>
+ <target>Nuevo comentario en su vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
+ <source>New video abuse on local video</source>
+ <target>Nueva denuncia de abuso sobre un vídeo local</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
+ <source>One of your video is blacklisted/unblacklisted</source>
+ <target>Uno de sus vídeos ha sido bloqueado/desbloqueado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
+ <source>Video published (after transcoding/scheduled update)</source>
+ <target>Vídeo publicado (después de una transcodificación / actualización programada)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
+ <source>Video import finished</source>
+ <target>Importación de vídeo terminada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
+ <source>A new user registered on your instance</source>
+ <target>Un nuevo usuario se registró en su instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
+ <source>You or your channel(s) has a new follower</source>
+ <target>Usted o su(s) canal(es) tiene un nuevo seguidor</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
+ <source>Someone mentioned you in video comments</source>
+ <target>Alguien le mencionó en comentarios de vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
+ <source>Preferences saved</source>
+ <target>Preferencias guardadas</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
<source>Profile updated.</source>
<target>Perfil actualizado.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
+ <source>This name already exists on this instance.</source>
+ <target>El nombre ya existe en esta instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
<source>Create</source>
<target>Crear</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>¿De verdad quieres eliminar <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Esto eliminará también todos los vídeos subidos a este canal.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Por favor escribe el nombre del canal de vídeo para confirmar</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Mis vídeos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
+ <source>Ownership change request sent.</source>
+ <target>Solicitud de cambio de titularidad enviada.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Mi biblioteca</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Mis canales</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Mis suscripciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
+ <source>My history</source>
+ <target>Mi historial</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Diversos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Cambios de titularidad</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Mis ajustes</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
+ <source>My notifications</source>
+ <target>Mis notificaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
+ <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
+ <target>Un correo electrónico con un vínculo de verificación será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
<source>Unable to find user id or verification string.</source>
<target>No se pudo encontrar el id de usuario o la cadena de verificación.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
+ <source>Subscribe to the account</source>
+ <target>Suscribirse a la cuenta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
+ <source>Focus the search bar</source>
+ <target>Enfocar la barra de búsqueda</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
+ <source>Toggle the left menu</source>
+ <target>Conmutar el menú de la izquierda</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
+ <source>Go to the videos overview page</source>
+ <target>Ir a la página general de vídeos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
+ <source>Go to the trending videos page</source>
+ <target>Ir a la página de vídeos populares</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
+ <source>Go to the recently added videos page</source>
+ <target>Ir a la página de vídeos recientes</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
+ <source>Go to the local videos page</source>
+ <target>Ir a la página de vídeos locales</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
+ <source>Go to the videos upload page</source>
+ <target>Ir a la página de subida de vídeos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
+ <source>Toggle Dark theme</source>
+ <target>Conmutar el tema Oscuro</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
+ <source>Go to my subscriptions</source>
+ <target>Ir a mis suscripciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
+ <source>Go to my videos</source>
+ <target>Ir a mis vídeos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
+ <source>Go to my imports</source>
+ <target>Ir a mis importaciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
+ <source>Go to my channels</source>
+ <target>Ir a mis canales</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
<source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
</source>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Error</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Tienes que reconectar.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
+ <source>Keyboard Shortcuts:</source>
+ <target>Atajos de teclado:</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Correcto</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
+ <source>Incorrect username or password.</source>
+ <target>Nombre de usuario o contraseña incorrecta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
+ <source>You account is blocked.</source>
+ <target>Su cuenta ha sido bloqueada</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
<source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
<target>Un correo con las instrucciones para restablecer la contraseña será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
- <source>Signup limit must be a number.</source>
- <target>El límite de registro debe ser un número.</target>
+ <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
+ <source>Signup limit must be a number.</source>
+ <target>El límite de registro debe ser un número.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
+ <source>Admin email is required.</source>
+ <target>Se requiere un correo de administrador.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
+ <source>Admin email must be valid.</source>
+ <target>El correo de adminstrador ha de ser válido.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
+ <source>Transcoding threads is required.</source>
+ <target>Se requieren hilos de transcodificación.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
+ <source>Transcoding threads must be greater or equal to 0.</source>
+ <target>El número de subprocesos de transcodificación tiene que ser superior o igual a 0.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Se requiere un correo electrónico.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>El correo electrónico ha de ser válido.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
+ <source>Your name is required.</source>
+ <target>Su nombre es requerido.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
+ <source>Your name must be at least 1 character long.</source>
+ <target>Su nombre tiene que contener por lo menos 1 carácter.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
+ <source>Your name cannot be more than 120 characters long.</source>
+ <target>Su nombre no puede contener más de 120 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
- <source>Admin email is required.</source>
- <target>Se requiere un correo de administrador.</target>
+ <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
+ <source>A message is required.</source>
+ <target>Se tiene que colocar un mensaje.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
- <source>Admin email must be valid.</source>
- <target>El correo de adminstrador ha de ser válido.</target>
+ <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
+ <source>The message must be at least 3 characters long.</source>
+ <target>El mensaje tiene que contener por lo menos 3 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
- <source>Transcoding threads is required.</source>
- <target>Se requieren hilos de transcodificación.</target>
+ <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
+ <source>The message cannot be more than 5000 characters long.</source>
+ <target>El mensaje no puede contener más de 5.000 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>El nombre de usuario ha de ocupar más de 3 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>El nombre de usuario no puede ocupar más de 20 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>El nombre de usuario debe utilizar únicamente caracteres alfanuméricos en minúscula.</target>
+ <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
+ <source>Username must be at least 1 character long.</source>
+ <target>El nombre de usuario tiene que contener por lo menos un carácter.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Se requiere un correo electrónico.</target>
+ <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
+ <source>Username cannot be more than 50 characters long.</source>
+ <target>El nombre de usuario no puede contener más de 50 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>El correo electrónico ha de ser válido.</target>
+ <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
+ <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
+ <target>El nombre de usuario puede contener minúsculas, cifras, puntos y barras bajas.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
+ <source>Daily upload limit is required.</source>
+ <target>Se requiere colocar un límite diario de subida.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
+ <source>Daily upload limit must be greater than -1.</source>
+ <target>El límite diario de subida tiene que ser superior a -1.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
<source>User role is required.</source>
<target>Se requiere un rol de usuario.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>El nombre para mostrar debe ocupar como mínimo 3 caracteres.</target>
+ <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
+ <source>Display name must be at least 1 character long.</source>
+ <target>El nombre mostrado tiene que contener por lo menos 1 carácter.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>El nombre a mostrar no puede ocupar más de 120 caracteres.</target>
+ <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
+ <source>Display name cannot be more than 50 characters long.</source>
+ <target>El nombre mostrado no puede contener más de 50 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
+ <source>Description cannot be more than 1000 characters long.</source>
+ <target>La descripción no puede contener más de 1.000 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
<source>You must to agree with the instance terms in order to registering on it.</source>
<target>Debes aceptar los términos de uso del nodo para poder registrarte en él.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
+ <source>Ban reason must be at least 3 characters long.</source>
+ <target>La razón de la expulsión tiene que contener por lo menos 3 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
+ <source>Ban reason cannot be more than 250 characters long.</source>
+ <target>La razón de la expulsión no puede contener más de 250 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
<source>Report reason is required.</source>
<target>Se requiere un motivo para reportar.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>El motivo del reporte no puede ocupar más de 300 caracteres.</target>
+ <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
+ <source>Moderation comment is required.</source>
+ <target>Se requiere llenar el comentario de moderación.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
+ <source>Moderation comment must be at least 2 characters long.</source>
+ <target>El comentario de moderación tiene que contener por lo menos 2 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
+ <source>The channel is required.</source>
+ <target>Se requiere llenar el canal.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
+ <source>Blacklist reason must be at least 2 characters long.</source>
+ <target>La razón del bloqueo tiene que contener por lo menos 2 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
+ <source>Blacklist reason cannot be more than 300 characters long.</source>
+ <target>La razón del bloqueo no puede contener más de 300 caracteres.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
+ <source>The username is required.</source>
+ <target>Se requiere llenar el nombre de usuario.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
+ <source>You can only transfer ownership to a local account</source>
+ <target>Solo puede transferir la titularidad a una cuenta local</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
+ <source>Name is required.</source>
+ <target>Se requiere llenar el nombre.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
+ <source>Name must be at least 1 character long.</source>
+ <target>El nombre tiene que contener por lo menos 1 carácter.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
+ <source>Name cannot be more than 50 characters long.</source>
+ <target>El nombre no puede contener más de 50 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
+ <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
+ <target>El nombre puede contener minúsculas, cifras, puntos y barras bajas.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>El texto para el apoyo ha de ocupar como mínimo 3 caracteres.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
+ <source>Support text cannot be more than 1000 characters long.</source>
+ <target>El texto de apoyo no puede contener más de 1.000 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
<source>Comment is required.</source>
<target>Se requiere comentario.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
+ <source>Video support cannot be more than 1000 characters long.</source>
+ <target>El soporte de vídeo no puede contener más de 1.000 caracteres.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
<source>A date is required to schedule video update.</source>
<target>Se requiere una fecha para actualizar la programación del vídeo.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
+ <source>Transcode your videos in multiple resolutions</source>
+ <target>Transcodificar sus vídeos en múltiples resoluciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
+ <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
+ <target>Importación HTTP (YouTube, Vimeo, URL directo...)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
+ <source>Torrent import</source>
+ <target>Importación de torrent</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
<source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
<target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios bloqueados.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
+ <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> bloqueado.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
+ <target>¿Confirma el desbloqueo de <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
+ <target>El usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> ha sido desbloqueado.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
+ <source>If you remove this user, you will not be able to create another with the same username!</source>
+ <target>¡Si elimina este usuario, no podrá crear otro con el mismo nombre de usuario!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
<source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
<target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminado.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
+ <target>El correo electrónico del usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> establecido como verificado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
+ <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
+ <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
+ <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada por la instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
+ <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no silenciada por la instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
+ <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada por la instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
+ <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no es silenciada por la instancia.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
+ <source>Mute this account</source>
+ <target>Silenciar esta cuenta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
+ <source>Unmute this account</source>
+ <target>Dejar de silenciar esta cuenta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
+ <source>Mute the instance</source>
+ <target>Silenciar esta instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
+ <source>Unmute the instance</source>
+ <target>Dejar de silenciar esta instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
+ <source>Mute this account by your instance</source>
+ <target>Silenciar esta cuenta por su instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
+ <source>Unmute this account by your instance</source>
+ <target>Dejar de silenciar esta cuenta por su instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
+ <source>Mute the instance by your instance</source>
+ <target>Silenciar esta instancia por su instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
+ <source>Unmute the instance by your instance</source>
+ <target>Dejar de silenciar esta instancia por su instancia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
<source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
<target>La petición es demasiado grande para el servidor. Por favor contacta con tu administrador si quieres aumentar el límite de tamaño.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
+ <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Suscrito</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
+ <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Ya no está suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Ya no está suscrito</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
+ <source>Moderator</source>
+ <target>Moderador</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
+ <source>Only I can see this video</source>
+ <target>Soy el único que pueda ver este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
+ <source>Only people with the private link can see this video</source>
+ <target>Solo las personas que tengan el vínculo privado pueden ver este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
+ <source>Anyone can see this video</source>
+ <target>Todos pueden ver este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
+ <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
+ <target>¡Le damos la bienvenida! Ahora revise sus correos electrónicos para verificar su cuenta y terminar el proceso de registro. </target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
+ <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
+ <target>¡Está conectado como <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
<source>Video to import updated.</source>
<target>Video to import updated.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Info</target>
+ <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
+ <source>Upload cancelled</source>
+ <target>Subida cancelada</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
- <source>Upload cancelled</source>
- <target>Subida cancelada</target>
+ <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
+ <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
+ <target>Con este vídeo, está pasando su cuota de espacio (tamaño del vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, espacio utilizado: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, cuota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Lo sentimos pero PeerTube no puede manejar vídeos > 8 GB</target>
+ <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
+ <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
+ <target>Con este vídeo, su cuota de espacio diario ha sido excedido (tamaño del vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, espacio usado: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, cuota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
+ <source>Video blacklisted.</source>
+ <target>Vídeo bloqueado</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
<source>Copied</source>
<target>Copiado</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
+ <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
+ <target>Iniciar a <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
+ <source>Like the video</source>
+ <target>Colocar Me gusta a este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
+ <source>Dislike the video</source>
+ <target>Eliminar Me gusta de este vídeo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
<source>Do you really want to delete this video?</source>
<target>¿De verdad quieres eliminar este vídeo?</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
+ <source>Videos from your subscriptions</source>
+ <target>Vídeos desde sus suscripciones</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
</body>
</file></xliff>
\ No newline at end of file
<source>Password</source>
<target>Pasahitza</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Hasi saioa</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Bidali e-mail bat nire pasahitza berrezartzeko</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Eman izena</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Aldatu hizkuntza</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Nire profil publikoa
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Nire kontua
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Nire bideoak
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Amaitu saioa
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Sortu kontu bat</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Harpidetzak</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Gainbegirada</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Joerak</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Gehitutako azkenak</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Tokikoa</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Gehiago</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administrazioa</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Erakutsi teklatu-lasterbideak</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Txandakatu interfaze iluna</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Bistaratu zerrendatu gabeko bideoak eta bideo pribatuak</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Emaitzarik ez.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instantziari buruz
-</target>
+ Utzi
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Bidali</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Baldintzak</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Erabiltzaile berriek izena ematea onartzen da eta</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- instantzia honek <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> eskaintzen ditu erabiltzaileen bideoetarako oinarrizko kuota gisa.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- instantzia honek mugagabeko espazioa eskaintzen du bere erabiltzaileen bideoetarako. </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
-Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Deskripzio laburra</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Lehenetsitako bezeroaren ibilbidea</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Bideoen gainbegirada</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Joera diren bideoak</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Azkenaldian gehitutako bidoeak</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Tokiko bideoak</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Eduki hunkigarria duten bideoen politika</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Izena ematea gaituta</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Izena emateko e-mail helbidea baieztatu behar da</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Izena emateko muga</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Erabiltzaileak</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Inportatu</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>HTTP URL bidezko bideoen inportazioa gaituta (adibidez YouTube)</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Bideoa torrent fitxategia edo magnet URL bidez inportatzea gaituta</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administratzailea</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Administratzailearen e-maila</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Erabiltzaileak</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Zure Twitter erabiltzaile-izena</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Edukia argitaratuko den webgune edo plataformarentzat Twitter kontua adierazten du.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Twitter-ek onartutako instantzia</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transkodeketa</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transkodeketa gaituta</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Transkodeketa desgaitzen baduzu, erabiltzaileen bideo askok ez dute funtzionatuko!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Transkodetze hariak</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target><x id="INTERPOLATION" equiv-text="{{resolution}}"/> bereizmena gaituta</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Fitxategi batzuk ez dira federatzen (aurrebistak, azpitituluak). Zuzenean jatorrizko instantziatik jasotzen ditugu eta cachean gorde.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Aurrebisten cachearen tamaina</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Bideoaren azpitituluen cachearen tamaina</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Pertsonalizazioak</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>IdatziJavaScript kodea zuzenean.<br />Adibidez: <pre>console.log('nire instantzia zoragarria da');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Idatzi CSS kodea zuzenean. Adibidez:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Idatzi aurretik <em>#custom-css</em> estiloak gainidazteko. Adibidez:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Konfigurazio aurreratua</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Eguneratu konfigurazioa</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Konfigurazioa baliogabea dela dirudi. Bilatu zer egon daitekeen gaizki fitxa desberdinetan begiratuz.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>User's email must be verified to login</source>
<target>Erabiltzailearen e-mail helbidea baieztatu behar da saioa hasi aurretik</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
<source>User's email is verified / User can login without email verification</source>
<target>Erabiltzailearen e-mail helbidea baieztatuta dago / Erabiltzaileak e-mail helbidea baieztatu gabe saioa hasi dezake</target>
<context-group name="null">
- <context context-type="linenumber">74</context>
+ <context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>Debekatzeko arrazoia:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Ekintzak</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Zerrenda beltzean sartzeko arrazoia:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Nire ezarpenak</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Nire liburutegia</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Nire kanalak</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Nire bideoak</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Nire harpidetzak</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Nire inportazioak</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>Denetarik</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>Mutututako instantziak</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Jabetza aldaketak</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Bideo-kuota:</target>
<source>Profile</source>
<target>Profila</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Bideo ezarpenak</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Eremu arriskutsua</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Bidali</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Mutututako instantziak</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Aldatu pasahitza</target>
<source>Publish will be available when upload is finished</source>
<target>Argitaratzea behin igoera bukatzean egongo da erabilgarri</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Argitaratu</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Itxaron transkodetzeari bideoa argitaratu aurretik</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Bideoa argitaratu aurretik ez baduzu transkodetzea bukatu arte itxaroten, bideoa transkodetzea bukatu arte ezin ikustea gerta daiteke.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Gehitu beste azpititulu bat</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Ikusi azpitituluen fitxategia</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>Jadanik igota ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>Eguneratzean sortuko da</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Ezeztatu sorkuntza</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>Eguneratzean ezabatuko da</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Ezeztatu ezabaketa</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
Azpititulurik ez oraingoz.
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Azpitituluak</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Igo irudia</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Igo aurrebista</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Jendeari zu nola babestu azaltzeko testu labur bat (kidetza plataforma...).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Ezarpen aurreratuak</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Utzi
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Partekatu</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Errorea informazioa zerbitzaritik jasotzean</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Deskripziorik ez</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Errorea</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Arrakasta</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Konfigurazioa eguneratuta.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Ziur <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ezabatu nahi duzula? Kanalera igotako bideo guztiak ezabatuko dira ere.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Idatzi bideo kanalaren izena berresteko</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Nire bideoak</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Kanalak</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Nire liburutegia</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Bideo inportazioak</target>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Nire kanalak</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Nire harpidetzak</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Denetarik</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Jabetza aldaketak</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Nire ezarpenak</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Errorea</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Berriro konektatu behar duzu.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Informazioa</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Arrakasta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Erabiltzaile-izen edo pasahitz okerra.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>E-maila behar da.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>E-maila baliozkoa izan behar da.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Erabiltzaile izena beha da.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Erabiltzaile-izenak gutxienez 3 karaktere izan behar ditu.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Erabiltzaile-izenak ezin ditu 20 karaktere baino gehiago izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Erabiltzaile-izena minuskulaz dauden karaktere alfanumerikoak besterik ezin ditu izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>E-maila behar da.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>E-maila baliozkoa izan behar da.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Pasahitza gutxienez 6 karaktere luze izan behar da.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Pantaila-izena gutxienez 3 karaktere luze izan behar da.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Pantaila-izena ezin da 120 karaktere baino luzeagoa izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Deskripzioa gutxienez 3 karaktere luze izan behar da.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Salatzeko arrazoia ezin da 300 karaktere baino luzeagoa izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Moderazio iruzkina derrigorrezkoa da.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Moderazio iruzkina ezin da 300 karaktere baino luzeagoa izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>Kanala derrigorrezkoa da.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Izena gutxienez 3 karakterekoa izan behar da</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Izena ezin da20 karaktere baino luzeagoa izan</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Izenak karaktere alfanumerikoak minuskulan besterik ezin ditu izan.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Babes testua gutxienez 3 karaktere luze izan behar da</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Harpidetuta</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ra harpidetuta</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Harpidetza kenduta</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Harpidetuta</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Harpidetza kenduta</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Moderatzailea</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Informazioa</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Igoera ezeztatuta</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Sentitzen dugu, PeerTubek ezin du 8GB baino gehiagoko bideorik kudeatu</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Zure bideo-kuota bideo honekin gainditzen da (bideoaren tamaina: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, erabilita: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, kuota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>گذرواژه</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>ورود</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>یک رایانامه برای بازنشانی گذرواژه برای من بفرست</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>ثبتنام</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
<source>Change the language</source>
<target>تغییر زبان</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
نمایه عمومی من
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
حساب کاربری من
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
ویدئوهای من
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
خروج
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>ساخت حساب</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>اشتراک</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>نمایکلی</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>مورد بحث</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>به تازگی اضافه شده</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>محلی</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>دیگر</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>مدیریت</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source><target>Toggle dark interface</target><context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>No results.</source>
<target>بدون نتیجه.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
<source>Videos Overview</source>
<target>نمایکلی ویدئوها</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>ویدئوهای محلی</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e">
<source>Signup enabled</source>
<target>ثبتنام فعال است</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>کاربران</target>
+ <context-group name="null">
+ <context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Administrator</source>
<target>مدیر</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>کاربران</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
<source>Your Twitter username</source>
<target>نامکاربری توییتر شما</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>جاوااکسریپت</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>ویديوهای من</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
<source>My settings</source>
<target>تنظیمات من</target>
<context-group name="null">
- <context context-type="linenumber">3</context>
+ <context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>ویديوهای من</target>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>راهنما</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>راهنما</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>بارگزاری لغوشد</target>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
+ <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
+ <source>You don't have notifications.</source>
+ <target>Vous n'avez pas de notifications.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publié une <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>nouvelle vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been unblacklisted
+ </source>
+ <target>
+ Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> a été débloquée
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been blacklisted
+ </source>
+ <target>
+ Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> a été bloquée
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Un nouveau signalement<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> a été créé sur la vidéo <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a commenté votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been published
+ </source>
+ <target>
+ Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> a été publiée
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a été importée
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>L'importation de votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a échoué
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
+ <source>
+ User <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> on your instance
+ </source>
+ <target>
+ L'utilisateur <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> a créé un compte<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> sur votre instance
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> is following
+
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>
+ your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
+ <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="<ng-container>"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </source>
+ <target>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> suit
+
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>
+ votre chaîne <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
+ <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="<ng-container>"/>votre compte<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">43</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> vous a mentionné sur la vidéo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/> <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">52</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
+ <source>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </source>
+ <target>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
<source>Unlisted</source>
<target>Non répertoriée</target>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
+ <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
+ <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
<source>
Login
<source>Password</source>
<target>Mot de passe</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Se connecter</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<context context-type="linenumber">57</context>
</context-group>
</trans-unit>
+ <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
+ <source>
+ We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
+ </source>
+ <target>
+ Désolé, vous ne pouvez pas récupérer votre mot de passe car l'administrateur de votre instance n'a pas configuré le système de mails de PeerTube.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">63</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
<source>Email</source>
<target>Courriel</target>
<source>Send me an email to reset my password</source>
<target>M'envoyer un courriel pour réinitialiser mon mot de passe</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Créer un compte</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Changer la langue</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
+ <source>
+ Help to translate PeerTube!
+ </source>
+ <target>
+ Aidez à traduire PeerTube !
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Mon profil public
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Mon compte
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Mes vidéos
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Se déconnecter
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Créer un compte</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Abonnements</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Vue d'ensemble</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Tendances</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Récemment ajoutées</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Locales</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Plus</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administration</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Montrer les raccourcis clavier</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>(Dés)activer le thème sombre</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
+ <source>View your notifications</source>
+ <target>Voir vos notifications</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
+ <source>Notifications</source>
+ <target>Notifications</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
+ <source>Update your notification preferences</source>
+ <target>Mettre à jour vos préférences de notification</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
+ <source>See all your notifications</source>
+ <target>Voir toutes vos notifications</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Afficher les vidéos privées et non répertoriées</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Aucun résultat.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
+ <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
+ <target>Contacter l'administrateur de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
+ <source>Your name</source>
+ <target>Votre nom</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
+ <source>Your email</source>
+ <target>Votre mail</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
+ <source>Your message</source>
+ <target>Votre message</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- À propos de l'instance : <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> </target>
+ Annuler
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Envoyer</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
+ <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
+ <target>À propos de l'instance <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
+ <source>Contact administrator</source>
+ <target>Contact de l'administrateur</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Conditions d'utilisation</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>La création de comptes utilisateurs est autorisée et</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
+ <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
<source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
+ this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
+ </source>
<target>
- cette instance fournit un quota de base de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs.
- </target>
+ cette instance propose un quota d'espace de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs.
+ </target>
<context-group name="null">
- <context context-type="linenumber">27</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
+ <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
<source>
- this instance provides unlimited space for the videos of its users.
- </source>
+ this instance provides unlimited space for the videos of its users.
+ </source>
<target>
- cette instance met à disposition de ses utilisateurs un espace de stockage vidéo illimité.
- </target>
+ cette instance propose un espace illimité pour les vidéos de ses utilisateurs.
+ </target>
<context-group name="null">
- <context context-type="linenumber">31</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
+ <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
<source>
- User registration is currently not allowed.
- </source>
+ User registration is currently not allowed.
+ </source>
<target>
- Vous ne pouvez pas créer de comptes utilisateurs pour le moment.
- </target>
+ La création de nouveaux compte n'est pas autorisée pour l'instant.
+ </target>
<context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Courte description</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Route du client par défaut</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Vue d'ensemble des vidéos</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vidéos tendance</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vidéos récemment ajoutées</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vidéos locales</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Politique concernant les vidéos ayant du contenu sensible</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Enregistrement activé</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>L'inscription requiert la vérification par courriel</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limitation des enregistrements</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Utilisateurs</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Quota de vidéos par défaut par utilisateur </target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>La limite journalière de téléversement est atteinte</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importer</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>Import de vidéo via une URL (YouTube par exemple) activé</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Import de vidéo avec un fichier torrent ou URL magnet activé</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrateur</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Email de l'administrateur</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Utilisateurs</target>
+ <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
+ <source>Enable contact form</source>
+ <target>Activer le formulaire de contact</target>
<context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Quota de vidéos par défaut par utilisateur </target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>La limite journalière de téléversement est atteinte</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">169</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Votre identifiant Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indique le compte Twitter pour le site ou la plateforme sur laquelle le contenu a été publié.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instance sur la liste blanche de Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
+ <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
+ If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
+ Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted.</source>
+ <target>Si votre instance est autorisée par Twitter, un lecteur de vidéo sera inséré dans le flux Twitter pour les partages de vidéo depuis PeerTube.<br />
+ Si votre instance n'est pas autorisée, une carte sera inséré avec une image et un lien vers votre instance PeerTube.<br /><br />
+ Selectionnez cette case, sauvegardez la configuration et pour tester si votre instance est autorisée par Twitter, insérez l'URL d'une vidéo de votre instance (https://example.com/videos/watch/blabla) sur <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a>.</target>
+ <context-group name="null">
+ <context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Encodage</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Encodage activé</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Si vous désactivez le transcodage, de nombreuses vidéos d'utilisateurs ne fonctionneront pas !</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
+ <source>Allow additional extensions</source>
+ <target>Permettre des extensions additionnelles</target>
+ <context-group name="null">
+ <context context-type="linenumber">231</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
+ <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
+ <target>Autoriser vos utilisateurs à publier des vidéos .mkv, .mov, .avi et .flv.</target>
+ <context-group name="null">
+ <context context-type="linenumber">232</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Nombre de threads pour l'encodage</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Résolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activée</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Certain fichiers ne sont pas fédérés (miniature, sous-titre). Nous les récupérons directement depuis l'instance d'origine et nous les gardons en cache.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Taille du cache des prévisualisations </target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Taille du cache des sous-titres</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personnalisations</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Écrivez directement du code JavaScript.<br />Exemple : <pre>console.log('mon instance est super géniale');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
+ <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
<source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
+ Write directly CSS code. Example:<br />
+ <pre>
+ body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ background-color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
+ Prepend with <em>#custom-css</em> to override styles. Example:
+ <pre>
+ #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+ </source>
<target>
- Écrivez directement du code CSS. Exemple :<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
+ Écrivez directement du code CSS. Par exemple:<br />
+ <pre>
+ body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ background-color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
- Ajoutez le préfixe <em>#custom-css</em> pour remplacer les styles. Exemple:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
+ Ajoutez le préfixe <em>#custom-css</em> pour surcharger les styles. Par exemple:
+ <pre>
+ #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
+ color: red;
+ <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
+ </pre>
+ </target>
<context-group name="null">
- <context context-type="linenumber">297</context>
+ <context context-type="linenumber">311</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Configuration avancée</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Mettre à jour la configuration</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Il semblerait que la configuration soit invalide. Merci de chercher des erreurs potentielles dans les différents onglets.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">133</context>
</context-group>
</trans-unit>
+ <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
+ <source>User's email must be verified to login</source>
+ <target>L'adresse mail de l'utilisateur doit être vérifiée afin de se connecter</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
+ <source>User's email is verified / User can login without email verification</source>
+ <target>L'adresse mail de l'utilisateur est vérifié / L'utilisateur peut se connecter sans vérification mail</target>
+ <context-group name="null">
+ <context context-type="linenumber">76</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>Raison du bannissement :</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Actions</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Raison de mise sur liste noire :</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Mes paramètres</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Ma bibliothèque</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Mes chaînes</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Mes vidéos</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Mes abonnements</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Mes imports</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>Divers</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>Instances muettes</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Changements de propriétaires</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Quota de vidéos :</target>
<source>Profile</source>
<target>Profil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Paramètres de la vidéo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Zone dangereuse</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Envoyer</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Instances muettes</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
+ <source>History enabled</source>
+ <target>Historique activé</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
+ <source>Delete history</source>
+ <target>Supprimer l'historique</target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
+ <source>You don't have videos history yet.</source>
+ <target>Vous n'avez pas d'historique de vidéos pour l'instant.</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
+ <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
+ <source>Notification preferences</source>
+ <target>Préférences de notification</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
+ <source>Mark all as read</source>
+ <target>Tout marqué comme lu</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Changer le mot de passe</target>
<context context-type="linenumber">4</context>
</context-group>
</trans-unit>
+ <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
+ <source>Activities</source>
+ <target>Activités</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
+ <source>Web</source>
+ <target>Web</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
<source>
Sorry, but we couldn't find the page you were looking for.
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
+ <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
+ <source>Sorry, but something went wrong</source>
+ <target>Désolé, mais quelque chose s'est mal passé</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
<source>
Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
<source>Publish will be available when upload is finished</source>
<target>Vous pourrez publier cette vidéo lorsque l'envoi sera terminé</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publier</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Attendre l'encodage avant de publier la vidéo</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Si vous décidez de ne pas attendre la fin du traitement avant la publication de la vidéo, elle pourrait bien être injouable.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Ajouter un nouveau sous-titre</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Voir le fichier de sous-titres</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>Déjà téléversé ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>Sera créé après la mise à jour</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Annuler la création</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>Sera supprimé après la mise à jour</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Annuler la suppression</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
Pas de sous-titres pour le moment.
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Sous-titres</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Téléverser une vignette</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Téléverser un aperçu</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Courte description des moyens qu'ont les utilisateurs de vous soutenir (financement participatif, etc.).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Paramétrage avancé</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
+ <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
<source>
- Cancel
- </source>
+ Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/> It will be forwarded to origin instance <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/> too.<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </source>
<target>
- Annuler
- </target>
+ Votre signalement sera envoyé aux modérateurs de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
+ <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/> Il sera également transmis à l'instance d'origine <x id="INTERPOLATION_1" equiv-text="{{ originHost }}"/><x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </target>
<context-group name="null">
- <context context-type="linenumber">19</context>
+ <context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Erreur lors de la récupération des informations 'à propos' du serveur</target>
+ <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
+ <source>Cannot get about information from server</source>
+ <target>Impossible d'obtenir la description du serveur</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
+ <source>Your message has been sent.</source>
+ <target>Votre message a été envoyé</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
+ <source>You already sent this form recently</source>
+ <target>Vous avez déjà rempli ce formulaire récemment</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Erreur</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<target>1080p</target>
<context-group name="null">
<context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
- <source>Auto (via ffmpeg)</source>
- <target>Auto (avec ffmpeg)</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Réussite</target>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
+ <source>Auto (via ffmpeg)</source>
+ <target>Auto (avec ffmpeg)</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
+ <source>Set Email as Verified</source>
+ <target>Définir l'adresse mail comme vérifiée</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
<source>You cannot ban root.</source>
<target>Vous ne pouvez pas bannir root.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> adresses mail d'utilisateurs ont été vérifiées.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
<source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
<target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
+ <source>My videos history</source>
+ <target>Mon historique de vidéos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
+ <source>Videos history is enabled</source>
+ <target>Historique de vidéos activé</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
+ <source>Videos history is disabled</source>
+ <target>Historique de vidéos désactivé</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
+ <source>Delete videos history</source>
+ <target>Supprimer l'historique de vidéos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
+ <source>Are you sure you want to delete all your videos history?</source>
+ <target>Êtes vous sur de vouloir supprimer toutes les vidéos de votre historique ?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
+ <source>Videos history deleted</source>
+ <target>Historique de vidéos supprimé</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
<source>Ownership accepted</source>
<target>Changement de propriété accepté</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
+ <source>New video from your subscriptions</source>
+ <target>Nouvelle vidéo depuis vos souscriptions</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
+ <source>New comment on your video</source>
+ <target>Nouveau commentaire sur votre vidéo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
+ <source>New video abuse on local video</source>
+ <target>Nouveau signalement sur une vidéo locale</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
+ <source>One of your video is blacklisted/unblacklisted</source>
+ <target>Une de vos vidéos a été bloquée/débloquée</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
+ <source>Video published (after transcoding/scheduled update)</source>
+ <target>Vidéo publiée (après transcodage / mise à jour programmée)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
+ <source>Video import finished</source>
+ <target>Import de vidéo terminé</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
+ <source>A new user registered on your instance</source>
+ <target>Nouveau compte créé sur votre instance</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
+ <source>You or your channel(s) has a new follower</source>
+ <target>Vous (ou votre chaîne) avez un nouveau suiveur</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
+ <source>Someone mentioned you in video comments</source>
+ <target>Quelqu'un vous a mentionné dans les commentaires d'une vidéo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
+ <source>Preferences saved</source>
+ <target>Préférences sauvegardées</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
<source>Profile updated.</source>
<target>Profil mis à jour.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Voulez-vous vraiment supprimer <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ? Ceci supprimera aussi toutes les vidéos téléversées dans cette chaîne.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Merci de confirmer le nom de la chaîne</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Mes vidéos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Chaînes</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Ma bibliothèque</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Mes chaînes</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Mes abonnements</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
+ <source>My history</source>
+ <target>Mon historique</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Divers</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Changements de propriétaires</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Mes paramètres</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Importations de vidéos</target>
+ <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
+ <source>My notifications</source>
+ <target>Mes notifications</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Erreur</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Vous devez vous reconnecter.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Réussite</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Nom d'utilisateur ou mot de passe incorrects.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Le courriel est requis.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>Le courriel doit être valide.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
+ <source>Your name is required.</source>
+ <target>Votre nom doit être rempli.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
+ <source>Your name must be at least 1 character long.</source>
+ <target>Votre nom doit contenir au moins un caractère.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
+ <source>Your name cannot be more than 120 characters long.</source>
+ <target>Votre nom ne peut pas contenir plus de 120 caractères.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
+ <source>A message is required.</source>
+ <target>Votre message doit être rempli.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
+ <source>The message must be at least 3 characters long.</source>
+ <target>Votre message doit contenir au moins 3 caractères.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
+ <source>The message cannot be more than 5000 characters long.</source>
+ <target>Le message ne peut pas contenir plus de 5000 caractères.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Le nom d'utilisateur est requis.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Le nom d'utilisateur doit être composé d'au moins 3 caractères.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Le nom d'utilisateur ne peut pas faire plus de 20 caractères.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Le nom d'utilisateur ne doit être composé que de caractères alphanumériques en minuscule.</target>
+ <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
+ <source>Username must be at least 1 character long.</source>
+ <target>Votre nom d'utilisateur doit contenir au moins un caractère.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Le courriel est requis.</target>
+ <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
+ <source>Username cannot be more than 50 characters long.</source>
+ <target>Votre nom d'utilisateur ne peut pas contenir plus de 50 caractères.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>Le courriel doit être valide.</target>
+ <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
+ <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
+ <target>Le nom d'utilisateur peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Le nom d'affichage doit être composé d'au moins 3 caractères.</target>
+ <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
+ <source>Display name must be at least 1 character long.</source>
+ <target>Votre nom affiché doit contenir au moins un caractère.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Le nom d'affichage ne peut pas faire plus de 120 caractères.</target>
+ <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
+ <source>Display name cannot be more than 50 characters long.</source>
+ <target>Votre nom affiché ne peut pas contenir plus de 50 caractères.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>La raison du signalement ne peut pas dépasser 300 caractères.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Un commentaire de modération est requis.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Le commentaire de modération doit faire au plus 300 caractères.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>La chaîne est requise.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Le nom doit faire au moins 3 caractères.</target>
+ <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
+ <source>Name must be at least 1 character long.</source>
+ <target>Le nom doit contenir au moins un caractère.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Le nom doit faire au plus 20 caractères.</target>
+ <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
+ <source>Name cannot be more than 50 characters long.</source>
+ <target>Le nom ne peut pas contenir plus de 50 caractères.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Le nom doit contenir seulement des caractères alphanumériques minuscules.</target>
+ <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
+ <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
+ <target>Le nom peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
+ <target>L'adresse mail de l'utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> a été vérifiée</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
<source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
<target>Comptes <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muets.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Abonné</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>Abonné à <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Désabonné</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Abonné</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Désabonné</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Modérateur</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
+ <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
+ <target>Bienvenue ! Veuillez maintenant consulter vos mails afin de vérifier votre compte et compéter l'inscription. </target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
+ <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
+ <target>Vous êtes maintenant connecté en tant que <x id="INTERPOLATION" equiv-text="{{username}}"/> !</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
<source>Video to import updated.</source>
<target>Les vidéos à importer ont été mises à jour</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Info</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Mise en ligne annulée</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Désolé, mais PeerTube ne gère pas les vidéos d'une taille > 8 Go</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Votre quota est dépassé avec cette vidéo (taille de la vidéo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>Contrasinal</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Conectar</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Envíenme un correo para restablecer o contrasinal</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Abrir conta</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
<source>Change the language</source>
<target>Cambiar o idioma</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Crear unha conta</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Trending</source>
<target>En voga</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Últimos engadidos</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Local</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Máis</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administración</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>Sin resultados.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- Acerca da instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Description</source>
<target>Descrición</target>
<source>Terms</source>
<target>Termos</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>O rexistro está aberto e</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- esta instancia proporciona unha cota inicial de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para os vídeos das súas usuarias.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- esta instancia non limita o espazo para os videos das súas usuarias.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- En este momento non está aberto o rexistro de novas usuarias.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Descrición curta</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Ruta ao cliente por omisión</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vídeos de moda</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vídeos engadidos recentemente</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vídeos en local</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Política para os vídeos con contido sensible</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Rexistro activado</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Rexistro limitado</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Usuarias</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Cota de vídeo por omisión para a usuaria</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importar</target>
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Importación de vídeo con un ficheiro torrent ou URI magnet activada</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administración</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Correo-e da Admin</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Usuarias</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Cota de vídeo por omisión para a usuaria</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>O seu alcume na Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica a conta na Twitter para o sitio web ou plataforma para a cal o contido foi publicado.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instancia na lista blanca por Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Recodificando</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Recodificación activada</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Si desactiva a recodificación moitos vídeos das súas usuarias non funcionarán!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Fíos de recodificación</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Algúns ficheiros non se federan (vista previa, comentarios). Recollémolos directamente desde a instancia de orixe e almacenámolos.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Tamaño da caché de vista previa</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Tamaño da caché de comentarios no vídeo</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalizacións</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Escribir código JavaScript directamente.<br />Exemplo: <pre>console.log('a miña instancia é tremenda');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Configuración avanzada</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Actualizar configuración</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Semella que a configuración non é válida. Por favor busque os erros potenciais nas diferentes pestanas.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Password</source>
<target>Password</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Accedi</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Inviami un email per resettare la password</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registrati</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Cambia lingua</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Il mio profilo pubblico
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Il mio account
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
I miei video
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Esci
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Crea un account</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Iscrizioni</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Panoramica</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Popolari</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Aggiunti di recente</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Locali</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Altro</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Amministrazione</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Mostra scorciatoie della tastiera</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>(Dis)attiva l'interfaccia sicura</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Mostra video privati e non elencati</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Nessun risultato.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- Riguardo all'istanza <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Annulla
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Invia</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Termini</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>È permessa la registrazione di nuovi utenti e</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- questa istanza fornisce una quota base di <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> per i video dei suoi utenti.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- questa istanza fornisce spazio illimitato per i video dei suoi utenti.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- La registrazione di nuovi utenti al momento non è permessa.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Breve descrizione</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Percorso predefinito del client</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Panoramica dei video</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Video popolari</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Video aggiunti di recente</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Video locali</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Policy su video che contengono contenuti sensibili</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registrazione abilitata</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>La registrazione richiede una verifica via email</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limite registrazioni</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Utenti</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Quota standard per i video dell'utente</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Limite giornaliero per il caricamento</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Carica</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>Importazione video con indirizzo HTTP (es. YouTube) abilitata</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Carica video con un file torrent o un URI magnete attivo</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Amministratore</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Email Amministratore</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Utenti</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Quota standard per i video dell'utente</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Limite giornaliero per il caricamento</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Il tuo username Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica l'account Twitter per il sito web o la piattaforma in cui il contenuto e' stato pubblicato.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Istanza inserita in white list da Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Trascrizione</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Trascrizione attivata</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Se disatitvi la trascrizione, molti video dai tuoi utenti non funzioneranno.</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Trascrizione thread</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Risoluzione <x id="INTERPOLATION" equiv-text="{{resolution}}"/> abilitata</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Alcuni file non sono federati (anteprime, sottotitoli). Li recuperiamo direttamente dall'istanza di origine e li mettiamo in cache.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Dimensione del cache per la previsualizzazione</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Dimensione </target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalizzazioni</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Scrivi direttamente codice JavaScript .<br />Esempio: <pre>console.log('La mia istanza spacca!');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Scrivi direttamente codice CSS .Esempio:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Precedi con <em>#custom-css</em> per sovrascrivere stili. Esempio:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Configurazione avanzata</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Aggiorna configurazione</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Sembra che la configurazione sia valida. Per favore cerca potenziali errori nelle altre tab</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>Motivo ban:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Azioni</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>motivo per essere in Blacklist:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Le mie impostazioni</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>La mia libreria</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>I miei canali</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>I miei video</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Le mie sottoscrizioni</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Le mie importazioni</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>Altro</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>Istanze silenziate</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Cambi di proprietario</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Quota video:</target>
<source>Profile</source>
<target>Profilo</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Impostazione video</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Zona pericolosa</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Invia</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Istanze silenziate</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Cambia password</target>
<source>Publish will be available when upload is finished</source>
<target>La pubblicazione sarà disponibile quando il caricamento sarà completato</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Pubblica</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
</trans-unit>
<trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
<source>Wait transcoding before publishing the video</source><target>Wait transcoding before publishing the video</target><context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source><target>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</target><context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Aggiungi un'altra descrizione</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Guarda il file dei sottotitoli</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Annulla creazione</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Annulla creazione</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source><target>Captions</target><context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Carica miniatura</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source><target>Upload preview</target><context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
</trans-unit>
<trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
<source>Short text to tell people how they can support you (membership platform...).</source><target>Short text to tell people how they can support you (membership platform...).</target><context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Impostazioni avanzate</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Annulla
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Condividi</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Errore durante la comunicazione con il server</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Nessuna descrizione</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Errore</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source><target>Success</target><context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Configurazione aggiornata.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Vuoi veramente eliminare <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Questo eliminerá anche tutti i video caricati su questo canale.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Per favore digita il nome del canale video per confermare</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>I miei video</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Canali</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>La mia libreria</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>I miei canali</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Le mie sottoscrizioni</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Altro</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Cambi di proprietario</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Caricamenti video</target>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Le mie impostazioni</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Errore</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Devi riconnetterti.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Informazioni</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source><target>Success</target><context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Username or password non corretti</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>L'email è richiesta.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>L'email deve essere valida.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>L'username è necessario.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>L'username deve essere almeno di 3 caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>L'username non può essere più di 20 caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>L'username dovrebbe essere solo in minuscolo e contenere solo alfanumerici.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>L'email è richiesta.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>L'email deve essere valida.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>La password deve essere lunga almeno 6 caratteri.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source><target>Display name must be at least 3 characters long.</target><context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source><target>Display name cannot be more than 120 characters long.</target><context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>La descrizione deve avere al minino 3 caratteri.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Il motivo per la segnalazione non può essere più lungo di 300 caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Il commento di moderazione è richiesto.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Il commento di moderazione non può essere più lungo di 300 caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>Il canale è richiesto.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Il nome deve essere al minimo lunguo di tre caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Il nome non deve superare i 20 caratteri.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Il nome deve contenire solo caratteri minuscoli ed alfanumerichi;</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
<source>Comment is required.</source>
<target>Un commento è necessario.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Iscritto</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>Iscritto a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Disiscritto</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Iscritto</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Disiscritto</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Moderatore</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Informazioni</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Caricamento annullato.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Ci dispiace ma PeerTube non può gestire video di dimensioni > 8GB</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>La tua quota è stata superata con questo video (dimensione del video: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, stai utilizzando: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>パスワード</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>ログイン</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>新しいパスワードをメールで送る</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>サインアップ</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
</trans-unit>
<trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
<source>Change the language</source><target>Change the language</target><context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
</source>
<target>マイアカウント</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
</source>
<target>マイビデオ</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
</source>
<target>ログアウト</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>アカウントを作成する</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>サブスクリプション</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>調査</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source><target>Trending</target><context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>最近追加された</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>地元</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>多くの</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>運営</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>結果がありません。</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
+ <source>
+ Cancel
+ </source>
+ <target>
+ キャンセル
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>差し出す</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Description</source>
<target>説明</target>
<source>Terms</source>
<target>条項</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>ユーザー登録が可能です</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>ユーザー登録は現在受け付けておりません</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>簡単な説明</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>ビデオの概要</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2">
<source>Signup enabled</source>
<target>サインアップが有効</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>サインアップには電子メールの確認が必要です</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>サインアップの制限</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>ユーザー</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Torrent ファイル または magnet リンクを使用して動画をインポートする</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>管理者</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>管理者の電子メール</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>ユーザー</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>あなたのTwitterユーザー名</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>トランスコード</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>トランスコードが有効になっています</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source><target>Transcoding threads</target><context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>カスタマイズ</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>高度な構成</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>設定を更新する</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>禁止理由:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>行動</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>私の輸入品</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>私の購読</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>所有権の変更</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
<source>Profile</source>
<target>プロフィール</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>ビデオ設定</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>危険区域</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">46</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>差し出す</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
<source>
Cancel
<source>Publish</source>
<target>出す</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- キャンセル
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>シェア</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>サーバーからのエラー</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>説明はありません</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>エラー</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>成功</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>構成が更新されました。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>チャンネル</target>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>私の輸入品</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>所有権の変更</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>エラー</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>再接続する必要があります。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>情報</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>成功</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>ユーザーネームまたはパスワードが違います。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>電子メールが必要です。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>電子メールは有効である必要があります。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>ユーザー名は必須です。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>ユーザー名は3文字以上でなければなりません。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>ユーザー名の長さは20文字を超えることはできません。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>ユーザー名は小文字の英数字でなければなりません。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>電子メールが必要です。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>電子メールは有効である必要があります。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>パスワードは6文字以上でなければなりません。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>購読する</target>
+ <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
+ <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> の登録が完了しました。</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
- <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
- <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> の登録が完了しました。</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>購読する</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>情報</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>アップロードのキャンセル</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>申し訳ありませんが、PeerTube は動画を処理出来ません。 > 8GB</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
<source>Video published.</source>
<target>ビデオが公開されました。</target>
</trans-unit>
<trans-unit id="ngb.datepicker.next-month">
<source>Next month</source>
- <target>la bavla'ima'i</target>
+ <target>lo bavla'ima'i</target>
<context-group name="null">
<context context-type="linenumber">27</context>
</context-group>
</context-group>
</trans-unit>
<trans-unit id="ngb.pagination.first">
- <source>««</source>
- <target>««</target>
- <context-group name="null">
+ <source>««</source><target>««</target><context-group name="null">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
</context-group>
</trans-unit>
<trans-unit id="ngb.pagination.previous">
- <source>«</source>
- <target>«</target>
- <context-group name="null">
+ <source>«</source><target>«</target><context-group name="null">
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
</context-group>
</trans-unit>
<trans-unit id="ngb.pagination.next">
- <source>»</source>
- <target>»</target>
- <context-group name="null">
+ <source>»</source><target>»</target><context-group name="null">
<context context-type="linenumber">29</context>
</context-group>
</trans-unit>
</context-group>
</trans-unit>
<trans-unit id="ngb.pagination.last">
- <source>»»</source>
- <target>»»</target>
- <context-group name="null">
+ <source>»»</source><target>»»</target><context-group name="null">
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
+ <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
+ <source>User registration is not allowed on this instance, but you can register on many others!</source>
+ <target>.i le samtcise'u cu curmi no nu cmiveigau .i ku'i do cmeveigau fo so'i drata ka'e</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c32ef07f8803a223a83ed17024b38e8d82292407">
+ <source>Password</source>
+ <target>lo lerpoijaspu</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
+ <source>I forgot my password</source>
+ <target>.i mi nalmo'i le mi lerpoijaspu</target>
+ <context-group name="null">
+ <context context-type="linenumber">44</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
+ <source>Login</source>
+ <target>co'a cmisau</target>
+ <context-group name="null">
+ <context context-type="linenumber">36</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
+ <source>Forgot your password</source>
+ <target>.i mi nalmo'i le mi lerpoijaspu</target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
+ <source>Email</source>
+ <target>lo ve samymri</target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
<source>Email address</source>
<target>lo ve samymri</target>
<source>Send me an email to reset my password</source>
<target>samymri fi mi te zu'e lo nu galfi le mi japyvla</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<context context-type="linenumber">55</context>
</context-group>
</trans-unit>
+ <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
+ <source>Signup</source>
+ <target>cmiveigau</target>
+ <context-group name="null">
+ <context context-type="linenumber">78</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
<source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
<target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> lo te facki</target>
<source>Change the language</source>
<target>galfi lo bangu</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
<target>
lo predatni be mi be'o poi gubni</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
<target>
lo mi pilno</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
<target>
lo mi vidvi</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>zbasu lo pilno</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>lo se jersi pe'a</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>lo cabna misno</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>lo diklo</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>lo drata</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>.i facki fi no da</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">27</context>
</context-group>
</trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- .i le vi samtcise'u cu sabji lo na'e se jimte ke vidvi datni canlu lo pilno be sy.</target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- .i ca na'e curmi lo nu zbasu lo pilno</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
- </context-group>
- </trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>
About PeerTube
<source>Short description</source>
<target>lo cmalu ve skicu</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>lo diklo vidvi</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>loi javni be tu'a lo vidvi poi vasru lo ganvi poi te kajde</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>la .djavascript.</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>lo mi se cuxna</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>lo mi te tivni</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>lo mi vidvi</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>lo se jersi pe'a be mi</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>lo se nerbei be mi</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
<trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
<source>Profile</source>
<target>lo predatni</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>lo se cuxna pe lo vidvi</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="73c1cefc348a6f361497210dea1ed79499fd1260">
<source>Cancel create</source>
<target>co'u zbasu</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>co'u vimcu</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Advanced settings</source>
<target>lo certu se cuxna</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>.i srera</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
<source>100MB</source>
<target>pa no no lo megbivysamsle</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
+ <source>Delete this report</source>
+ <target>vimcu le notci</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
+ <source>Do you really want to delete this abuse report?</source>
+ <target>.i .au ju'o pei vimcu le malpli notci</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
+ <source>Abuse deleted.</source>
+ <target>.i mo'u vimcu le malpli notci</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
<source>Password updated.</source>
<target>.i mo'u galfi lo japyvla</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
- <source>Create</source>
- <target>zbasu</target>
+ <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
+ <target>.i mo'u zbasu la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
+ <source>This name already exists on this instance.</source>
+ <target>.i le cmene xa'o zasti ci'e le mupli</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>.i .au ju'o pei do vimcu la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. .i la'e di'u vimcu ro lo vidvi ji'a poi se kibdu'a fi le vi te tivni</target>
+ <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
+ <source>Create</source>
+ <target>zbasu</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>.i .e'o ko ciska le cmene be le vidvi te zu'e lo nu birti</target>
+ <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
+ <target>.i mo'u galfi la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>lo mi vidvi</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
<source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
<target>.i .au ju'o pei do vimcu <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> lo vidvi</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>lo te tivni</target>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>lo mi te tivni</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>lo vidvi poi se nerbei</target>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>lo se jersi pe'a be mi</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>lo mi se cuxna</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>.i srera</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
<source>Your password has been successfully reset!</source>
<target>.i snada lo nu mo'u galfi le do japyvla</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
+ <source>The channel is required.</source>
+ <target>.i le vidvi te tivni cu sarcu</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
+ <source>Video channel is required.</source>
+ <target>.i le vidvi te tivni cu sarcu</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
</body>
</file></xliff>
\ No newline at end of file
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" xmlns:xyz="urn:appInfo:Items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" version="1.1">
<file source-language="en-US" datatype="plaintext" original="" target-language="nl-NL">
<body>
+ <trans-unit id="ngb.alert.close">
+ <source>Close</source>
+ <target>Sluiten</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.carousel.previous">
+ <source>Previous</source>
+ <target>Vorige</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.carousel.next">
+ <source>Next</source>
+ <target>Volgende</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.datepicker.previous-month">
+ <source>Previous month</source>
+ <target>Vorige maand</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.datepicker.next-month">
+ <source>Next month</source>
+ <target>Volgende maand</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.datepicker.select-month">
+ <source>Select month</source>
+ <target>Selecteer maand</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.datepicker.select-year">
+ <source>Select year</source>
+ <target>Selecteer jaar</target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.first">
+ <source>««</source>
+ <target>««</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.first-aria">
+ <source>First</source>
+ <target>Eerste</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.previous">
+ <source>«</source>
+ <target>«</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.previous-aria">
+ <source>Previous</source>
+ <target>Vorige</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.next">
+ <source>»</source>
+ <target>»</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.next-aria">
+ <source>Next</source>
+ <target>Volgende</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.last">
+ <source>»»</source>
+ <target>»»</target>
+ <context-group name="null">
+ <context context-type="linenumber">36</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.pagination.last-aria">
+ <source>Last</source>
+ <target>Laatste</target>
+ <context-group name="null">
+ <context context-type="linenumber">34</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.progressbar.value">
+ <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
+ <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.increment-hours">
+ <source>Increment hours</source>
+ <target>Verhoog uren</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.HH">
+ <source>HH</source>
+ <target>HH</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.hours">
+ <source>Hours</source>
+ <target>Uren</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.decrement-hours">
+ <source>Decrement hours</source>
+ <target>Verlaag uren</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.increment-minutes">
+ <source>Increment minutes</source>
+ <target>Verhoog minuten</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.MM">
+ <source>MM</source>
+ <target>MM</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.minutes">
+ <source>Minutes</source>
+ <target>Minuten</target>
+ <context-group name="null">
+ <context context-type="linenumber">33</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.decrement-minutes">
+ <source>Decrement minutes</source>
+ <target>Verlaag minuten</target>
+ <context-group name="null">
+ <context context-type="linenumber">38</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.increment-seconds">
+ <source>Increment seconds</source>
+ <target>Verhoog seconden</target>
+ <context-group name="null">
+ <context context-type="linenumber">47</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.SS">
+ <source>SS</source>
+ <target>SS</target>
+ <context-group name="null">
+ <context context-type="linenumber">50</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.seconds">
+ <source>Seconds</source>
+ <target>Seconden</target>
+ <context-group name="null">
+ <context context-type="linenumber">52</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.decrement-seconds">
+ <source>Decrement seconds</source>
+ <target>Verlaag seconden</target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.PM">
+ <source>PM</source>
+ <target>PM</target>
+ <context-group name="null">
+ <context context-type="linenumber">65</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ngb.timepicker.AM">
+ <source>AM</source>
+ <target>AM</target>
+ <context-group name="null">
+ <context context-type="linenumber">66</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
+ <source>Cancel</source>
+ <target>Annuleren</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
+ <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source>
+ <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
+ <source>Unlisted</source>
+ <target>Onvermeld</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
+ <source>Private</source>
+ <target>Privé</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
<source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> keer bekeken</target>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
+ <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
+ <source>
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/>
+ Subscribe
+ <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="<span>"/>
+ <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
+ <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </source>
+ <target>
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/>
+ Abonneer
+ <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="<span>"/>
+ <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
+ <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
+ <source>
+ Unsubscribe
+ </source>
+ <target>
+Abonnement opzeggen</target>
+ <context-group name="null">
+ <context context-type="linenumber">18</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
+ <source>Using an ActivityPub account</source>
+ <target>Een ActivityPub-account gebruiken</target>
+ <context-group name="null">
+ <context context-type="linenumber">36</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
+ <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
+ <target>Abonneer met een account op <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
+ <source>Subscribe with your local account</source>
+ <target>Abonneer met je lokale account</target>
+ <context-group name="null">
+ <context context-type="linenumber">40</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
+ <source>Subscribe with a Mastodon account:</source>
+ <target>Abonneer met een Mastodon-account</target>
+ <context-group name="null">
+ <context context-type="linenumber">43</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
+ <source>Using a syndication feed</source>
+ <target>Een syndicaatfeed gebruiken</target>
+ <context-group name="null">
+ <context context-type="linenumber">48</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
+ <source>Subscribe via RSS</source>
+ <target>Abonneren met RSS</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
+ <source>
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="<span>"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </source>
+ <target>
+<x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/>Extern abonneren<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="<span>"/>Externe interactie<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
+ <source>You can subscribe to the channel via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the channel URL in the search box and subscribe there.</source>
+ <target>Je kan op het kanaal abonneren via elke ActivityPub-mogelijke fediverse instantie. Bijvoorbeeld met Mastodon of Pleroma kan je de URL van het kanaal in de zoekbalk invullen en daar abonneren.</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
+ <source>You can interact with this via any ActivityPub-capable fediverse instance. For instance with Mastodon or Pleroma you can type the current URL in the search box and interact with it there.</source>
+ <target>Je kan hiermee interactie hebben via elke ActivityPub-mogelijke fediverse instantie. Bijvoorbeeld met Mastodon of Pleroma kan je de huidige URL in de zoekbalk typen en er daar interactie mee hebben.</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
<source>Video quota</source>
<target>Videoquotum</target>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
+ <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
+ <source>
+ Unlimited <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per day)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </source>
+ <target>
+Oneindig <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="<ng-container>"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per dag)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="</ng-container>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
+ <source>Ban</source>
+ <target>Verbannen</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
+ <source>Reason...</source>
+ <target>Reden...</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
+ <source>
+ A banned user will no longer be able to login.
+ </source>
+ <target>
+Een verbannen gebruiker kan niet langer inloggen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
+ <source>Ban this user</source>
+ <target>Verban deze gebruiker</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
<source>
Login
</source>
- <target>Aanmelden</target>
+ <target>
+Aanmelden</target>
<context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
+ <trans-unit id="ae3cb52bf2dee3101ee654812b5d16e8665a9453">
+ <source>Request new verification email.</source>
+ <target>Een nieuwe verificatie e-mail aanvragen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
<source>User</source>
<target>Gebruiker</target>
<source>
or create an account
</source>
- <target>of maak een account</target>
+ <target>
+of maak een account</target>
<context-group name="null">
<context context-type="linenumber">18</context>
</context-group>
<source>
or create an account on another instance
</source>
- <target>of maak een account aan op een andere server</target>
+ <target>
+of maak een account aan op een andere instantie</target>
<context-group name="null">
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
<source>User registration is not allowed on this instance, but you can register on many others!</source>
- <target>Registratie is niet mogelijk op deze instantie, maar je kan een account maken op een van de vele anderen!</target>
+ <target>Registratie is niet mogelijk op deze instantie, maar je kan wel registreren op een van de vele anderen!</target>
<context-group name="null">
<context context-type="linenumber">28</context>
</context-group>
<source>Password</source>
<target>Wachtwoord</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>I forgot my password</source>
- <target>Wachtwoord vergeten</target>
+ <target>Ik ben mijn wachtwoord vergeten</target>
<context-group name="null">
<context context-type="linenumber">44</context>
</context-group>
<source>Login</source>
<target>Aanmelden</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Forgot your password</source>
- <target>Wachtwoord vergeten</target>
+ <target>Jouw wachtwoord vergeten</target>
<context-group name="null">
<context context-type="linenumber">57</context>
</context-group>
<source>Send me an email to reset my password</source>
<target>Zend me een e-mail om een nieuw wachtwoord in te stellen</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>
Reset my password
</source>
- <target>Wachtwoord opnieuw instellen</target>
+ <target>
+Wachtwoord opnieuw instellen</target>
<context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
<source>
Create an account
</source>
- <target>Account maken</target>
+ <target>
+Account aanmaken</target>
<context-group name="null">
<context context-type="linenumber">3</context>
</context-group>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
- <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
- <source>Signup</source>
- <target>Registratie</target>
+ <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
+ <source>Example: jane_doe</source>
+ <target>Bijvoorbeeld: jane-doe</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">17</context>
</context-group>
</trans-unit>
- <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
- <source>Change the language</source>
- <target>Taal veranderen</target>
+ <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
+ <source>I am at least 16 years old and agree to the <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Terms</a> of this instance</source>
+ <target>Ik ben minstens 16 jaar oud en accepteer de <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Voorwaarden</a> van deze instantie</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
- <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
- <source>Create an account</source>
- <target>Account maken</target>
+ <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
+ <source>Signup</source>
+ <target>Registratie</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
- <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
- <source>Videos</source>
- <target>Video's</target>
+ <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
+ <source>Features found on this instance</source>
+ <target>Kenmerken van deze instantie</target>
<context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">67</context>
</context-group>
</trans-unit>
- <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
- <source>Trending</source>
- <target>Populair</target>
+ <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
+ <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> resultaten</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">5</context>
</context-group>
</trans-unit>
- <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
- <source>Recently added</source>
- <target>Recent toegevoegd</target>
+ <trans-unit id="4c3960fb1d9b07d1db3b5bda3ee40019211830dc">
+ <source>
+ for <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </source>
+ <target>
+voor <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
+ <source>
+ Filters
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/>
+ </source>
+ <target>
+ Filters
+ <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span>"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
+ <source>
+ No results found
+ </source>
+ <target>
+Geen resultaten gevonden</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
+ <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonnees</target>
+ <context-group name="null">
+ <context context-type="linenumber">44</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
+ <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> weergaven</target>
+ <context-group name="null">
+ <context context-type="linenumber">55</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
+ <source>Change the language</source>
+ <target>Taal veranderen</target>
+ <context-group name="null">
+ <context context-type="linenumber">86</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
+ <source>
+ My public profile
+ </source>
+ <target>
+Mijn openbare profiel</target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
+ <source>
+ My account
+ </source>
+ <target>
+Mijn account</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
+ <source>
+ My videos
+ </source>
+ <target>
+Mijn video's</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
+ <source>
+ Log out
+ </source>
+ <target>
+Uitloggen</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
+ <source>Create an account</source>
+ <target>Account maken</target>
+ <context-group name="null">
+ <context context-type="linenumber">37</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
+ <source>Videos</source>
+ <target>Video's</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
+ <source>Subscriptions</source>
+ <target>Abonnementen</target>
+ <context-group name="null">
+ <context context-type="linenumber">45</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
+ <source>Overview</source>
+ <target>Overzicht</target>
+ <context-group name="null">
+ <context context-type="linenumber">50</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
+ <source>Trending</source>
+ <target>Populair</target>
+ <context-group name="null">
+ <context context-type="linenumber">55</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
+ <source>Recently added</source>
+ <target>Recent toegevoegd</target>
+ <context-group name="null">
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Lokaal</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
+ <source>More</source>
+ <target>Meer</target>
+ <context-group name="null">
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administratie</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
+ <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
+ <source>Show keyboard shortcuts</source>
+ <target>Laat keyboard shortcuts zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">89</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
+ <source>Toggle dark interface</source>
+ <target>Schakel donkere interface aan of uit</target>
+ <context-group name="null">
+ <context context-type="linenumber">92</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Search...</source>
<target>Zoeken …</target>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
+ <trans-unit id="5d43539fc358c3a548b9d487be821db73e2702ff">
+ <source>Sort</source>
+ <target>Sorteren</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98acac685fc4b2d35e5d0cf3cd224d247a756c3e">
+ <source>Published date</source>
+ <target>Datum van publicatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
+ <source>Duration</source>
+ <target>Duratie</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
+ <source>Display sensitive content</source>
+ <target>Laat gevoelige inhoud zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">33</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
+ <source>Yes</source>
+ <target>Ja</target>
+ <context-group name="null">
+ <context context-type="linenumber">37</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd">
+ <source>No</source>
+ <target>Nee</target>
+ <context-group name="null">
+ <context context-type="linenumber">42</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
<source>Category</source>
<target>Categorie</target>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
+ <trans-unit id="c8d58c4fbe23e51af3dc8f58cb4a81eac20739e8">
+ <source>All of these tags</source>
+ <target>Al deze tags</target>
+ <context-group name="null">
+ <context context-type="linenumber">82</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="492d2bd18db0cba03f6d9e3b0c42b8639fbe51ab">
+ <source>One of these tags</source>
+ <target>Een van deze tags</target>
+ <context-group name="null">
+ <context context-type="linenumber">87</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
+ <source>Filter</source>
+ <target>Filter</target>
+ <context-group name="null">
+ <context context-type="linenumber">94</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
+ <source>Display unlisted and private videos</source>
+ <target>Laat onvermelde en privé-video's zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Geen resultaten.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+<x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
+ <source>
+ <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>
+ <x id="TAG_IMG" ctype="image" equiv-text="<img/>"/>
+
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ <x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>
+ <x id="TAG_IMG" ctype="image" equiv-text="<img/>"/>
+
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ <x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>Over de instantie <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
+ Cancel
+ </source>
+ <target>
+Annuleer</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Voorleggen</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Voorwaarden</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Een account aanmaken is mogelijk en</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>deze instantie voorziet een basis-opslagquotum van <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> voor de video's van haar gebruikers.</target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>deze instantie voorziet onbeperkte opslagruimte voor de video's van haar gebruikers.</target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>Een account maken is momenteel niet toegelaten op deze instantie.</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>
About PeerTube
</source>
- <target>Over PeerTube</target>
+ <target>
+Over PeerTube
+
+</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<source>
It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.
</source>
- <target>Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>AGPLv3<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.</target>
+ <target>
+Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>AGPLv3 licentie<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.</target>
<context-group name="null">
<context context-type="linenumber">8</context>
</context-group>
<source>
For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.
</source>
- <target>Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.</target>
+ <target>
+Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.</target>
<context-group name="null">
<context context-type="linenumber">12</context>
</context-group>
PeerTube uses the BitTorrent protocol to share bandwidth between users.
This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
</source>
- <target>PeerTube gebruikt het BitTorrent-protocol om bandbreedte tussen gebruikers te delen. Dat betekent ook dat jouw IP-adres bijgehouden wordt in de BitTorrent-tracker van de PeerTube-instantie zolang je de video aan het bekijken bent.</target>
+ <target>
+PeerTube gebruikt het BitTorrent-protocol om bandbreedte tussen gebruikers te delen. Dat betekent ook dat jouw IP-adres bijgehouden wordt in de BitTorrent-tracker van de PeerTube-instantie zolang je de video aan het bekijken bent.</target>
<context-group name="null">
<context context-type="linenumber">20</context>
</context-group>
In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video.
In practice, this is much more difficult because:
</source>
- <target>In theorie kan iemand met technische kennis een script maken dat bijhoudt welk IP-adres welke video aan het downloaden is. In de praktijk is dat wat moeilijker:</target>
+ <target>
+In theorie kan iemand met technische kennis een script maken dat bijhoudt welk IP-adres welke video aan het downloaden is. In de praktijk is dat wat moeilijker omdat:</target>
<context-group name="null">
<context context-type="linenumber">27</context>
</context-group>
An HTTP request has to be sent on each tracker for each video to spy.
If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
</source>
- <target>Voor elke video waarvan hij de kijkers wil bespioneren, moet hij een apart HTTP-request sturen. Om dat voor alle PeerTube-videos te doen, moeten er dus evenveel HTTP-requests als video's gebruikt worden (dat kan hoog oplopen).</target>
+ <target>
+Voor elke video waarvan hij de kijkers wil bespioneren, moet hij een apart HTTP-request sturen. Om dat voor alle PeerTube-videos te doen, moeten er dus evenveel HTTP-requests als video's gebruikt worden (dat kan hoog oplopen).</target>
<context-group name="null">
<context context-type="linenumber">33</context>
</context-group>
For each request sent, the tracker returns random peers at a limited number.
For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm
</source>
- <target>Voor elk request geeft de tracker een beperkt aantal willekeurige peers terug. Als er bijvoorbeeld 1000 peers beschikbaar zijn en de tracker steeds 20 peers teruggeeft, moeten er op zijn minst 50 requests gestuurd worden om alle peers te weten te komen.</target>
+ <target>
+Voor elk request geeft de tracker een beperkt aantal willekeurige peers terug. Als er bijvoorbeeld 1000 peers beschikbaar zijn en de tracker steeds 20 peers teruggeeft, moeten er op zijn minst 50 requests gestuurd worden om alle peers te weten te komen.</target>
<context-group name="null">
<context context-type="linenumber">38</context>
</context-group>
<source>
Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
</source>
- <target>Die requests moeten regelmatig herhaald worden om te kunnen achterhalen wie begint of stopt met een video te bekijken. Het is gemakkelijk om zulk gedrag te detecteren.</target>
+ <target>
+Die requests moeten regelmatig herhaald worden om te kunnen achterhalen wie begint of stopt met een video te kijken. Het is gemakkelijk om zulk gedrag te detecteren.</target>
<context-group name="null">
<context context-type="linenumber">43</context>
</context-group>
<source>
If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video
</source>
- <target>Als een IP-adres opgeslagen is in de tracker, betekent dat niet dat de persoon achter dat adres (als die persoon bestaat) de video bekeken heeft</target>
+ <target>
+Als een IP-adres opgeslagen is in de tracker, betekent dat niet dat de persoon achter dat adres (als die persoon bestaat) de video bekeken heeft</target>
<context-group name="null">
<context context-type="linenumber">47</context>
</context-group>
<source>
The IP address is a vague information : usually, it regularly changes and can represent many persons or entities
</source>
- <target>Een IP-adres is vage </target>
+ <target>
+Een IP-adres is vage informatie: Meestal veranderd het regelmatig en kan het meerdere personen en identiteiten representeren</target>
<context-group name="null">
<context context-type="linenumber">51</context>
</context-group>
</trans-unit>
+ <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
+ <source>
+ Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>), the protocol is different from classic BitTorrent.
+ When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
+ See <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> for more information
+ </source>
+ <target>
+Web peers zijn niet openbaar bereikbaar: omdat we WebRTC in de webbrowser gebruiken (<x id="START_LINK" ctype="x-a" equiv-text="<a>"/>met de WebTorrent-bibliotheek<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>), is het protocol anders dan in klassieke BitTorrent.
+ Wanneer je in een webbrowser zit, verstuur je een signaal die je IP adres bevat naar de tracker die willekeurig andere peers kiest om de informatie heen te sturen.
+ See <x id="START_LINK_1" ctype="x-a" equiv-text="<a>"/>dit document<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> voor meer informatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">55</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
+ <source>
+ The worst-case scenario of an average person spying on their friends is quite unlikely.
+ There are much more effective ways to get that kind of information.
+ </source>
+ <target>
+Het worst-case scenario dat kan gebeuren van een gemiddeld persoon die hun vrienden bespioneert is erg onwaarschijnlijk.
+Er zijn veel effectievere manieren om dat soort informatie te verkrijgen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">62</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
+ <source>How does PeerTube compare with YouTube?</source>
+ <target>Hoe is PeerTube vergeleken met YouTube?</target>
+ <context-group name="null">
+ <context context-type="linenumber">67</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2432705cbabcb92a8677338901dd5d655383ef4c">
+ <source>
+ The threats to privacy in YouTube are different from PeerTube's.
+ In YouTube's case, the platform gathers a huge amount of your personal information (not only your IP) to analyze them and track you.
+ Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
+ </source>
+ <target>
+De bedreigingen tegen privacy in YouTube zijn verschillend dan in PeerTube's geval.
+In YouTube's geval, verzamelt het platform een gigantisch aantal persoonlijke informatie (niet alleen je IP) om te analyseren en om je te tracken.
+Verder nog, YouTube is eigendom van Google/Alphabet, een bedrijf die je trackt over meerdere websites (via AdSense of Google Analytics).</target>
+ <context-group name="null">
+ <context context-type="linenumber">69</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3c2990d5e452bdf2317ff23745db70705d848d99">
+ <source>What can I do to limit the exposure of my IP address?</source>
+ <target>Wat kan ik doen om de blootstelling van mijn IP adress te verminderen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">75</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a545356de272b955258c2a2432b08ec637b65f7e">
<source>
Your IP address is public so every time you consult a website, there is a number of actors (in addition to the final website) seeing your IP in their connection logs: ISP/routers/trackers/CDN and more.
PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser.
Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense.
</source>
- <target>Je IP-adres is geen privé-gegeven. Elke keer je een website bezoekt, is er een aantal entiteiten (bovenop de website die je effectief bezoekt) die je IP zien in hun logs: ISP's, routers, trackers, CDN's en meer.
-PeerTube is transparant: we waarschuwen je dat je, als je je IP-adres privé wil afschermen, je een VPN of de Tor-Browser moet gebruiken.
-Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit geven.</target>
+ <target>
+Je IP-adres is openbaar dus elke keer dat je een website bezoekt, zijn er een aantal actoren (bovenop de website die je effectief bezoekt) die je IP zien in hun logs: ISP/routers/trackers/CDN en meer.
+PeerTube is daarover transparant: we waarschuwen je dat je, als je je IP-adres wil afschermen, je een VPN of de Tor-Browser moet gebruiken.
+Denken dat het P2P-mechanisme uit PeerTube halen je anonimiteit terug zou geven is onlogisch.</target>
<context-group name="null">
<context context-type="linenumber">77</context>
</context-group>
</trans-unit>
- <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
- <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
- <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target>
+ <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
+ <source>What will be done to mitigate this problem?</source>
+ <target>Wat zal worden gedaan om dit probleem te verminderen?</target>
<context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">83</context>
</context-group>
</trans-unit>
- <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
- <source>Video channels</source>
- <target>Videokanalen</target>
+ <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
+ <source>
+ PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
+ In the meantime, we want to test different ideas related to this issue:
+ </source>
+ <target>
+PeerTube is in haar ontwikkelingsfasen, en wilt de beste tegenmaatregelen mogelijk geven tegen de tijd dat de stabiele versie is gereleased.
+Ondertussen willen we verschillende ideeën testen die gerelateerd zijn aan dit probleem:</target>
<context-group name="null">
- <context context-type="linenumber">31</context>
+ <context context-type="linenumber">85</context>
</context-group>
</trans-unit>
- <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
- <source>Stats</source>
- <target>Statistieken</target>
+ <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
+ <source>Set a limit to the number of peers sent by the tracker</source>
+ <target>Zet een limiet op het aantal peers verzonden door de tracker</target>
<context-group name="null">
- <context context-type="linenumber">16</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
- <trans-unit id="8bc634cd9d8c9b684dbfaaf17a522f894bedbffc">
- <source>Joined <x id="INTERPOLATION" equiv-text="{{ account.createdAt | date }}"/></source>
- <target>Account aangemaakt op <x id="INTERPOLATION" equiv-text="{{ account.createdAt | date }}"/></target>
+ <trans-unit id="a6d732b614143f862e69798046dc0868716547e5">
+ <source>Set a limit on the request frequency received by the tracker (being tested)</source>
+ <target>Zet een limiet op de verzoekfrequentie verkregen door de tracker (wordt getest)</target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
- <trans-unit id="8fef247fd0c5bf790151f7661cafc4b7fd0397f3">
- <source><x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount }}"/> subscribers</source>
- <target><x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount }}"/> abonnees</target>
+ <trans-unit id="ba77e356eaa5c06caaf5c8734c361d1a5415fe1c">
+ <source>Ring a bell if there are unusual requests (being tested)</source>
+ <target>Laat iets horen als er ongebruikelijke requests zijn (wordt getest)</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">93</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="81861ff8a71c8a5881cdf66417f3bddb753f0e18">
+ <source>Disable P2P from the administration interface</source>
+ <target>Schakel P2P uit vanuit het administratieinterface</target>
+ <context-group name="null">
+ <context context-type="linenumber">94</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6">
+ <source>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</source>
+ <target>Een automatisch video-overbodigheidsprogramma: we zouden niet weten of het IP de video met opzet heeft gedownload, of als het een geautomatiseerd programma was.</target>
+ <context-group name="null">
+ <context context-type="linenumber">95</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
+ <source>Banned</source>
+ <target>Verbannen</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
+ <source>Muted</source>
+ <target>Gedempt</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
+ <source>Muted by your instance</source>
+ <target>Gedempt door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
+ <source>Instance muted</source>
+ <target>Instantie gedempt</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
+ <source>Instance muted by your instance</source>
+ <target>Instantie gedempt door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
+ <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6f5a458f827503ac7b8697688ecf3e0490818ee8">
+ <source>Video channels</source>
+ <target>Videokanalen</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="299f97b8ee9c62d45f2cc01961aa1e5101d6d05a">
+ <source>Stats</source>
+ <target>Statistieken</target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8bc634cd9d8c9b684dbfaaf17a522f894bedbffc">
+ <source>Joined <x id="INTERPOLATION" equiv-text="{{ account.createdAt | date }}"/></source>
+ <target>Account aangemaakt op <x id="INTERPOLATION" equiv-text="{{ account.createdAt | date }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8fef247fd0c5bf790151f7661cafc4b7fd0397f3">
+ <source><x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount }}"/> subscribers</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount }}"/> abonnees</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="f36bd6a1570cb9b0a5023870f35160957cad2a8f">
<source>Short description</source>
<target>Korte omschrijving</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Startpagina</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
+ <source>Videos Overview</source>
+ <target>Video-overzicht</target>
+ <context-group name="null">
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Populaire video's</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Recent toegevoegde video's</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Video's op deze instantie</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Beleid rond video's met gevoelige inhoud</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registratie mogelijk</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
+ <source>Signup requires email verification</source>
+ <target>E-mailverificatie nodig bij registratie</target>
+ <context-group name="null">
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Registratielimiet</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Gebruikers</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
- <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
- <source>Administrator</source>
- <target>Beheerder</target>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Standaard video-quotum voor gebruikers</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">109</context>
</context-group>
</trans-unit>
- <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
- <source>Admin email</source>
- <target>E-mail van beheerder</target>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Standaard dagelijks video-quotum voor gebruikers</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
+ <context context-type="linenumber">121</context>
</context-group>
</trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Gebruikers</target>
+ <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
+ <source>Import</source>
+ <target>Importeren</target>
<context-group name="null">
- <context context-type="linenumber">144</context>
+ <context context-type="linenumber">42</context>
</context-group>
</trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Standaard video-quotum voor gebruikers</target>
+ <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
+ <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
+ <target>Video-import met HTTP URL (d.w.z. YouTube) ingeschakeld</target>
<context-group name="null">
- <context context-type="linenumber">147</context>
+ <context context-type="linenumber">141</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
+ <source>Video import with a torrent file or a magnet URI enabled</source>
+ <target>Video-import met een torrentbestand of een magnet URL ingeschakeld</target>
+ <context-group name="null">
+ <context context-type="linenumber">148</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
+ <source>Administrator</source>
+ <target>Administrator</target>
+ <context-group name="null">
+ <context context-type="linenumber">155</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
+ <source>Admin email</source>
+ <target>E-mail van administrator</target>
+ <context-group name="null">
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Je Twitter-gebruikersnaam</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Geeft het Twitter-account aan voor de website of het platform waarop de inhoud gepubliceerd werd.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
- <target>Instantie ge-whitelist door Twitter</target>
+ <target>Instantie gewhitelist door Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transcoding</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transcoding ingeschakeld</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
- <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet overal werken!</target>
+ <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet werken!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Threads gebruikt voor transcoding</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
+ <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
+ <target>Resolutie <x id="INTERPOLATION" equiv-text="{{resolution}}"/> ingeschakeld</target>
+ <context-group name="null">
+ <context context-type="linenumber">252</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
+ <source>
+ Cache
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
+ </source>
+ <target>
+Cache
+
+ <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">260</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
+ <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
+ <target>Sommige bestanden zijn niet federaal (voorbeelden, ondertitelingen). We verkrijgen ze direct van hun afkomstige instantie en cachen ze.</target>
+ <context-group name="null">
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Cachegrootte voor previews</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
+ <source>Video captions cache size</source>
+ <target>Cachegrootte van video-ondertiteling</target>
+ <context-group name="null">
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Aanpassingen</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
- <target>Schrijf JavaScriptcode.<br />Voorbeeld: <pre>console.log('mijn instantie is fantastisch');</pre></target>
+ <target>Schrijf direct JavaScriptcode.<br />Bijvoorbeeld: <pre>console.log('mijn instantie is fantastisch');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Geavanceerde configuratie</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
- <target>Updateconfiguratie</target>
+ <target>Bijwerkingsconfiguratie</target>
+ <context-group name="null">
+ <context context-type="linenumber">340</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
+ <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
+ <target>Het lijkt erop dat de configuratie invalide is. Zoek alstublieft potentiële foutmeldingen op in andere tabbladen.</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>
Users
</source>
- <target>Gebruikers</target>
+ <target>
+Gebruikers</target>
<context-group name="null">
<context context-type="linenumber">3</context>
</context-group>
<source>
Manage follows
</source>
- <target>Volgers beheren</target>
+ <target>
+Volgers beheren</target>
<context-group name="null">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
+ <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
+ <source>
+ Moderation
+ </source>
+ <target>
+Moderatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
<source>
Jobs
</source>
- <target>Jobs</target>
+ <target>
+Banen</target>
<context-group name="null">
<context context-type="linenumber">15</context>
</context-group>
<source>
Configuration
</source>
- <target>Configuratie</target>
+ <target>
+Configuratie</target>
<context-group name="null">
<context context-type="linenumber">19</context>
</context-group>
<source>
It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers.
</source>
- <target>Het ziet ernaar uit dat je op een server bent zonder HTTPS. Op je webserver moet TLS geactiveerd zijn om servers te kunnen volgen.</target>
+ <target>
+Het ziet ernaar uit dat je op een server bent zonder HTTPS. Op je webserver moet TLS geactiveerd zijn om servers te kunnen volgen.</target>
<context-group name="null">
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit id="456c6383d8e7cd15aadbcdc196d4ae7a70092437">
<source>Add following</source>
- <target>Abonneren</target>
+ <target>Voeg volgend toe</target>
<context-group name="null">
<context context-type="linenumber">21</context>
</context-group>
</trans-unit>
+ <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
+ <source>Filter...</source>
+ <target>Filtreren...</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
<source>ID</source>
<target>ID</target>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
+ <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
+ <source>Accepted</source>
+ <target>Geaccepteerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">32</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
+ <source>Pending</source>
+ <target>In behandeling</target>
+ <context-group name="null">
+ <context context-type="linenumber">33</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
+ <source>Redundancy allowed</source>
+ <target>Overtolligheid toegelaten</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
<source>Manage follows</source>
<target>Abonnementen beheren</target>
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
+ <trans-unit id="f995df052a1dfc675c2a21926420a707d9601936">
+ <source>Following</source>
+ <target>Volgend</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246">
+ <source>Follow</source>
+ <target>Volg</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e">
+ <source>Followers</source>
+ <target>Volgers</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f">
<source>Jobs list</source>
- <target>Lijst van jobs</target>
+ <target>Banenlijst</target>
<context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
+ <trans-unit id="74c8f69ec23f41a429e241126ab4d25b9d12348e">
+ <source>Processed on</source>
+ <target>Behandeld op</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4fa08915c99629d38c9da8a08b1985a7f4e38e40">
+ <source>Finished on</source>
+ <target>Voltooid op</target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="31cf824034489eb42f6a388d5980b98b8e1de015">
<source>Create user</source>
<target>Gebruiker aanmaken</target>
</trans-unit>
<trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05">
<source>mail@example.com</source>
- <target>mail@example.org</target>
+ <target>mail@voorbeeld.org</target>
<context-group name="null">
<context context-type="linenumber">21</context>
</context-group>
<context context-type="linenumber">65</context>
</context-group>
</trans-unit>
+ <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
+ <source>Daily video quota</source>
+ <target>Dagelijks videoquotum</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
<source>Users list</source>
<target>Gebruikerslijst</target>
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
+ <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
+ <source>Batch actions</source>
+ <target>Batchacties</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
<source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Gebruikersnaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
+ <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
+ <source>(banned)</source>
+ <target>(verbannen)</target>
+ <context-group name="null">
+ <context context-type="linenumber">65</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
+ <source>Go to the account page</source>
+ <target>Ga naar accountpagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">133</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
+ <source>User's email must be verified to login</source>
+ <target>Gebruiker's e-mail moet geverifieerd zijn om in te loggen</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
+ <source>User's email is verified / User can login without email verification</source>
+ <target>Gebruiker's e-mail is geverifieerd / Gebruiker kan inloggen zonder e-mailverificatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">76</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
+ <source>Ban reason:</source>
+ <target>Reden van verbanning:</target>
+ <context-group name="null">
+ <context context-type="linenumber">95</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
+ <source>Moderation comment</source>
+ <target>Beheerdersopmerking</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
+ <source>
+ This comment can only be seen by you or the other moderators.
+ </source>
+ <target>
+Deze opmerking kan alleen door jou en andere beheerders gezien worden.</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
+ <source>Update this comment</source>
+ <target>Werk deze comment bij</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
<source>Reporter</source>
<target>Melder</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
+ <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
+ <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Status <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
<source>Go to the account</source>
<target>Naar account gaan</target>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
- <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
- <source>Blacklisted videos</source>
- <target>Video's op zwarte lijst</target>
+ <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
+ <source>Actions</source>
+ <target>Acties</target>
<context-group name="null">
- <context context-type="linenumber">7</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Mijn instellingen</target>
+ <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
+ <source>Reason:</source>
+ <target>Reden:</target>
<context-group name="null">
- <context context-type="linenumber">3</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Mijn video's</target>
+ <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
+ <source>Moderation comment:</source>
+ <target>Beheerderopmerking:</target>
<context-group name="null">
- <context context-type="linenumber">14</context>
+ <context context-type="linenumber">57</context>
</context-group>
</trans-unit>
- <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
- <source>Video quota:</source>
- <target>Videoquotum:</target>
+ <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
+ <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Videonaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">4</context>
+ <context context-type="linenumber">8</context>
</context-group>
</trans-unit>
- <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
- <source>Profile</source>
- <target>Profiel</target>
+ <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
+ <source>Sensitive</source>
+ <target>Gevoelig</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">9</context>
</context-group>
</trans-unit>
- <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
- <source>Video settings</source>
- <target>Video-instellingen</target>
+ <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
+ <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
+ <source>Blacklist reason:</source>
+ <target>Reden voor de zwarte lijst:</target>
+ <context-group name="null">
+ <context context-type="linenumber">43</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
+ <source>Moderation</source>
+ <target>Beheer</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
+ <source>Video abuses</source>
+ <target>Videomisbruik</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
+ <source>Blacklisted videos</source>
+ <target>Video's op zwarte lijst</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
+ <source>Muted accounts</source>
+ <target>Gedempte accounts</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
+ <source>Muted servers</source>
+ <target>Gedempte servers</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
+ <source>Account</source>
+ <target>Account</target>
+ <context-group name="null">
+ <context context-type="linenumber">12</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
+ <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Gedempt bij <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
+ <source>Unmute</source>
+ <target>Demping opheffen</target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
+ <source>Video quota:</source>
+ <target>Videoquotum:</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
+ <source>Profile</source>
+ <target>Profiel</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
+ <source>Video settings</source>
+ <target>Video-instellingen</target>
+ <context-group name="null">
+ <context context-type="linenumber">16</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
+ <source>Danger zone</source>
+ <target>Gevarenzone</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
+ <source>Change ownership</source>
+ <target>Verander eigenaar</target>
+ <context-group name="null">
+ <context context-type="linenumber">46</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
+ <source>Select the next owner</source>
+ <target>Selecteer de volgende eigenaar</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
+ <source>
+ Cancel
+ </source>
+ <target>
+Annuleren</target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
- <target>Video’s <x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> aantal keer bekeken</target>
+ <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
<context-group name="null">
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
+ <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
+ <source>Blacklisted</source>
+ <target>Op de zwarte lijst</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
<source>
Cancel
</source>
- <target>Annuleren</target>
+ <target>
+Annuleren</target>
<context-group name="null">
<context context-type="linenumber">30</context>
</context-group>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
+ <source>Example: my_channel</source>
+ <target>Bijvoorbeeld: mijn_kanaal</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
<source>Display name</source>
<target>Weergavenaam</target>
<trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a">
<source>Short text to tell people how they can support your channel (membership platform...).<br /><br />
When you will upload a video in this channel, the video support field will be automatically filled by this text.</source>
- <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschap…).<br/><br/>
-Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target>
+ <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatform…).<br /><br />
+Als je een video uploadt op dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target>
<context-group name="null">
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
+ <trans-unit id="38baeb215c17af9d9e295e371a57f4a48ab4c191">
+ <source>Target</source>
+ <target>Doelwit</target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
+ <source>You don't have any subscriptions yet.</source>
+ <target>Je hebt nog geen abonnementen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
<source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
<target>Gemaakt door <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
+ <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
+ <source>Accept ownership</source>
+ <target>Accepteer eigenaar</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4570c754149df06f31096510abfc925968c35562">
+ <source>Select the target channel</source>
+ <target>Selecteer het doelwitkanaal</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
+ <source>Initiator</source>
+ <target>Initiatiefnemer</target>
+ <context-group name="null">
+ <context context-type="linenumber">13</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
+ <source>
+ Created
+ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/>
+ </source>
+ <target>
+ Gecreëerd op
+ <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
+ <source>Status</source>
+ <target>Status</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
+ <source>Action</source>
+ <target>Actie</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
+ <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
+ <source>Refuse</source>
+ <target>Weigeren</target>
+ <context-group name="null">
+ <context context-type="linenumber">47</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Gedempte instanties</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Wachtwoord veranderen</target>
<context context-type="linenumber">30</context>
</context-group>
</trans-unit>
+ <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
+ <source>Current password</source>
+ <target>Huidige wachtwoord</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
<source>New password</source>
<target>Nieuw wachtwoord</target>
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
+ <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
+ <source>Use WebTorrent to exchange parts of the video with others</source>
+ <target>Gebruik WebTorrent om delen van de video over te maken naar anderen</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
- <source>Automatically plays video</source><target>Automatically plays video</target><context-group name="null">
+ <source>Automatically plays video</source>
+ <target>Video automatisch afspelen</target>
+ <context-group name="null">
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
</trans-unit>
<trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
<source>Update my profile</source>
- <target>Update mijn profiel</target>
+ <target>Werk mijn profiel bij</target>
<context-group name="null">
<context context-type="linenumber">27</context>
</context-group>
</trans-unit>
+ <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
+ <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
+ <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> abonnees</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5">
+ <source>Change the avatar</source>
+ <target>Verander de avatar</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
<source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
<target>(extensies: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximale grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
+ <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
+ <source>Once you delete your account, there is no going back. Please be certain.</source>
+ <target>Als je je account verwijdert, kan je niet meer terug.
+Wees alstublieft zeker.</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
+ <source>Delete your account</source>
+ <target>Verwijder jouw account</target>
+ <context-group name="null">
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
<source>
Sorry, but we couldn't find the page you were looking for.
</source>
- <target>Sorry, maar die pagina kon niet gevonden worden.</target>
+ <target>
+Sorry, maar die pagina kon niet gevonden worden.
+</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
+ <source>
+ Verify account email confirmation
+ </source>
+ <target>
+Verifieer e-mailbevestiging van account</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
+ <source>
+ Your email has been verified and you may now login. Redirecting...
+ </source>
+ <target>
+Jouw e-mail is geverifieerd en je mag nu inloggen.
+Je wordt doorverwezen...</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
+ <source>An error occurred. </source>
+ <target>Er is een probleem opgetreden.</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
+ <source>
+ Request email for account verification
+ </source>
+ <target>
+Vraag e-mail voor accountverificatie aan</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
+ <source>Send verification email</source>
+ <target>Verzend e-mail voor verificatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
+ <source>This instance does not require email verification.</source>
+ <target>Deze instantie heeft geen verificatie door e-mail nodig.</target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
<source>Support this channel</source>
<target>Ondersteun dit kanaal</target>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
+ <trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6">
+ <source>URL</source>
+ <target>URL</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bfe7f34fbd4c3afa5f84a5580e0fae942cad2333">
+ <source>You can import any URL <a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'>supported by youtube-dl</a> or URL that points to a raw MP4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source>
+ <target>Je kan elke URL importeren <a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'>ondersteunt door youtube-dl</a> of elke URL die naar een rauw MP4 bestand wijst. Je moet zeker weten dat je de diffusierechten hebt over de inhoud waar het naar wijst, anders kan het wettelijke problemen aan jou of je instantie geven.</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071">
<source>Channel</source>
<target>Kanaal</target>
</trans-unit>
<trans-unit id="3c78b53bca33467190c0b7a01320bc093a2b1427">
<source>Privacy</source>
- <target>Zichtbaarheid</target>
+ <target>Privacy</target>
<context-group name="null">
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
+ <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
+ <source>Sorry, but something went wrong</source>
+ <target>Sorry, er is iets fout gegaan</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
+ <source>
+ Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
+</source>
+ <target>
+Gefeliciteerd, de video achter<x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> zal worden geimporteerd! Je kan nu al informatie over deze video toevoegen.
+
+</target>
+ <context-group name="null">
+ <context context-type="linenumber">46</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
+ <source>Update</source>
+ <target>Bijwerken</target>
+ <context-group name="null">
+ <context context-type="linenumber">92</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9">
<source>Select the file to upload</source>
<target>Selecteer het bestand om te uploaden</target>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
+ <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
+ <source>Scheduled</source>
+ <target>Ingeroosterd</target>
+ <context-group name="null">
+ <context context-type="linenumber">25</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
<source>Publish will be available when upload is finished</source>
<target>Publiceren is mogelijk wanneer de upload voltooid is</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publiceren</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
- <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
- <source>Title</source>
- <target>Titel</target>
+ <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
+ <source>Select the torrent to import</source>
+ <target>Selecteer de torrent om te importeren</target>
<context-group name="null">
- <context context-type="linenumber">9</context>
+ <context context-type="linenumber">6</context>
</context-group>
</trans-unit>
- <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
- <source>Tags</source>
- <target>Tags</target>
+ <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
+ <source>Or</source>
+ <target>Of</target>
<context-group name="null">
- <context context-type="linenumber">191</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
- <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
- <source>Video descriptions are truncated by default and require manual action to expand them.</source>
- <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven, de kijker kan ze handmatig openvouwen.</target>
+ <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
+ <source>Paste magnet URI</source>
+ <target>Plak magnet URL</target>
<context-group name="null">
- <context context-type="linenumber">28</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5">
- <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source>
- <target>Publicatie uitstellen (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target>
+ <trans-unit id="1ce18c12c809a738f05f2290f46df0677f27ed70">
+ <source>You can import any torrent file that points to a mp4 file. You should make sure you have diffusion rights over the content it points to, otherwise it could cause legal trouble to yourself and your instance.</source>
+ <target>Je kan elk torrentbestand importeren die wijst naar een mp4 bestand. Je moet zeker weten dat je de diffusierechten over de inhoud waar het naar wijst hebt, anders kan het wettelijke problemen aan jezelf en je instantie geven.</target>
<context-group name="null">
- <context context-type="linenumber">105</context>
+ <context context-type="linenumber">17</context>
</context-group>
</trans-unit>
- <trans-unit id="5ef7108218e096d09f4ee8525a05a8c90d7b95ee">
- <source>This video contains mature or explicit content</source>
- <target>Deze video bevat expliciete inhoud of inhoud die enkel voor volwassenen geschikt is</target>
+ <trans-unit id="7cb3731472edd9edf6a6d036498c2c8388157266">
+ <source>
+ Congratulations, the video will be imported with BitTorrent! You can already add information about this video.
+</source>
+ <target>
+Gefeliciteerd, de video zal geimporteerd worden met BitTorrent!
+Je kan nu al informatie toevoegen over deze video.
+
+</target>
<context-group name="null">
- <context context-type="linenumber">119</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
- <trans-unit id="9daabdcaa2bbd83597099b10db22d056cf491644">
- <source>Some instances do not list videos containing mature or explicit content by default.</source>
- <target>Op sommige instanties worden expliciete video's standaard niet in zoekresultaten en in lijsten getoond.</target>
+ <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
+ <source>Import <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
+ <target>Importeer <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
- <source>Enable video comments</source>
- <target>Videoreacties toelaten</target>
+ <trans-unit id="e9cfe8bd050660077212af5c02f5be24821f28d5">
+ <source>Upload <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ videoName }}"/> Uploaden</target>
<context-group name="null">
- <context context-type="linenumber">125</context>
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3">
+ <source>Upload a file</source>
+ <target>Upload een bestand</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470">
+ <source>Import with URL</source>
+ <target>Importeer met URL</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="752c401d7dcd708944eef60e411187f71d882340">
+ <source>Import with torrent</source>
+ <target>Importeer met torrent</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="40fa23fe45af4ee2e72cdd3cc6bf6013f180aab0">
+ <source>Add caption</source>
+ <target>Voeg ondertiteling toe</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6bad752cfcac8f3572bdf2c619daec683d56d1a8">
+ <source>Select the caption file</source>
+ <target>Selecteer het ondertitelingsbestand</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
+ <source>
+ This will replace an existing caption!
+ </source>
+ <target>
+Dit zal een bestaande ondertiteling vervangen!</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
+ <source>Add this caption</source>
+ <target>Voeg deze ondertiteling toe</target>
+ <context-group name="null">
+ <context context-type="linenumber">40</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
+ <source>Title</source>
+ <target>Titel</target>
+ <context-group name="null">
+ <context context-type="linenumber">9</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
+ <source>Tags</source>
+ <target>Tags</target>
+ <context-group name="null">
+ <context context-type="linenumber">191</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
+ <source>Tags could be used to suggest relevant recommendations.</br>Press Enter to add a new tag.</source>
+ <target>Tags kunnen gebruikt worden om relevante aanraders te suggesteren. </br>Druk op Enter om een nieuwe tag toe te voegen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">18</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
+ <source>+ Tag</source>
+ <target>Tag</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
+ <source>Enter a new tag</source>
+ <target>Vul een nieuwe tag in</target>
+ <context-group name="null">
+ <context context-type="linenumber">21</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
+ <source>Video descriptions are truncated by default and require manual action to expand them.</source>
+ <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven en moeten handmatig opengevouwen worden.</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5">
+ <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source>
+ <target>Publicatie inroosteren op (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target>
+ <context-group name="null">
+ <context context-type="linenumber">105</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5ef7108218e096d09f4ee8525a05a8c90d7b95ee">
+ <source>This video contains mature or explicit content</source>
+ <target>Deze video bevat expliciete inhoud of inhoud die enkel voor volwassenen geschikt is</target>
+ <context-group name="null">
+ <context context-type="linenumber">119</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9daabdcaa2bbd83597099b10db22d056cf491644">
+ <source>Some instances do not list videos containing mature or explicit content by default.</source>
+ <target>Op sommige instanties worden expliciete video's standaard niet in zoekresultaten en in lijsten getoond.</target>
+ <context-group name="null">
+ <context context-type="linenumber">120</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
+ <source>Enable video comments</source>
+ <target>Videoreacties inschakelen</target>
+ <context-group name="null">
+ <context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
<source>Wait transcoding before publishing the video</source>
<target>Wacht tot het transcoderen voltooid is om de video te publiceren</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
+ <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
+ <target>Als je beslist om niet te wachten totdat de transcoding compleet is voordat je de video publiceert, kan de video onspeelbaar zijn totdat de transcoding eindigt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<context context-type="linenumber">4</context>
</context-group>
</trans-unit>
+ <trans-unit id="92bcfd1d237a2bfe48dc9f46d074ed26abc8df22">
+ <source>Add another caption</source>
+ <target>Voeg nog een ondertiteling toe</target>
+ <context-group name="null">
+ <context context-type="linenumber">147</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
+ <source>See the subtitle file</source>
+ <target>Zie het ondertitelingsbestand</target>
+ <context-group name="null">
+ <context context-type="linenumber">156</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
+ <source>Already uploaded ✔</source>
+ <target>Al geupload ✔</target>
+ <context-group name="null">
+ <context context-type="linenumber">160</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
+ <source>Will be created on update</source>
+ <target>Wordt gecreëerd bij bijwerking</target>
+ <context-group name="null">
+ <context context-type="linenumber">168</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
+ <source>Cancel create</source>
+ <target>Annuleer creatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">170</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
+ <source>Will be deleted on update</source>
+ <target>Wordt verwijdert bij bijwerking</target>
+ <context-group name="null">
+ <context context-type="linenumber">176</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
+ <source>Cancel deletion</source>
+ <target>Annuleer verwijdering</target>
+ <context-group name="null">
+ <context context-type="linenumber">178</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
+ <source>
+ No captions for now.
+ </source>
+ <target>
+Geen ondertiteling voor nu.</target>
+ <context-group name="null">
+ <context context-type="linenumber">183</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
+ <source>Captions</source>
+ <target>Ondertiteling</target>
+ <context-group name="null">
+ <context context-type="linenumber">140</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Thumbnail uploaden</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Voorvertoning uploaden</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
</trans-unit>
<trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
<source>Short text to tell people how they can support you (membership platform...).</source>
- <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (bv. door gelddonaties).</target>
+ <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatforms...).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Geavanceerde instellingen</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<source>
Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/>
</source>
+ <target>
+<x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> updaten</target>
<context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
+ <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
+ <source>Download video</source>
+ <target>Download video</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8d6a41c2703bed3edfc76e1df0b1ca203404c17c">
+ <source>Direct download</source>
+ <target>Directe download</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac3a02ecd20f41278f1ef7c03f45c1117b4b796d">
+ <source>Torrent (.torrent file)</source>
+ <target>Torrent (.torrent bestand)</target>
+ <context-group name="null">
+ <context context-type="linenumber">32</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2db8d7cf6a3071f4c1519ef2b5e2713d9ff4e87f">
+ <source>Torrent (magnet link)</source>
+ <target>Torrent (magnet link)</target>
+ <context-group name="null">
+ <context context-type="linenumber">37</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
+ <source>
+ Cancel
+ </source>
+ <target>
+Annuleren</target>
+ <context-group name="null">
+ <context context-type="linenumber">47</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
+ <source>Download</source>
+ <target>Downloaden</target>
+ <context-group name="null">
+ <context context-type="linenumber">84</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="11749f4fc0aa1b5e37f38575e4d4e3b1b7e0e96b">
+ <source>Report video</source>
+ <target>Rapporteer video</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
+ <source>Share</source>
+ <target>Deel</target>
+ <context-group name="null">
+ <context context-type="linenumber">74</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f">
+ <source>QR-Code</source>
+ <target>QR-Code</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d3b15c3bf4a7ea38d6002d2d2c4781642d30e79c">
+ <source>Embed</source>
+ <target>Inbedden</target>
+ <context-group name="null">
+ <context context-type="linenumber">34</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
+ <source>
+ The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites).
+ </source>
+ <target>
+Deze url is niet beveiligd (geen HTTPS), dus de ingebedde video werkt niet op HTTPS websites (web browsers blokkeren onbeveiligde HTTP verzoeken op HTTPS websites).</target>
+ <context-group name="null">
+ <context context-type="linenumber">45</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
+ <source>Close</source>
+ <target>Sluiten</target>
+ <context-group name="null">
+ <context context-type="linenumber">51</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
+ <source>Blacklist video</source>
+ <target>Video op de zwarte lijst zetten</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
+ <source>
+ The video is being imported, it will be available when the import is finished.
+ </source>
+ <target>
+De video wordt geimporteerd, hij zal beschikbaar worden wanneer de import klaar is.</target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9ed65ae88f6c982bc44d6fed2796e55f47dbf304">
+ <source>
+ The video is being transcoded, it may not work properly.
+ </source>
+ <target>
+De video wordt getranscode, hij kan misschien niet naar behoren werken.</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
+ <source>
+ This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
+ </source>
+ <target>
+Deze video wordt gepubliceerd op <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.</target>
+ <context-group name="null">
+ <context context-type="linenumber">19</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
+ <source>This video is blacklisted.</source>
+ <target>Deze video staat op de zwarte lijst.</target>
+ <context-group name="null">
+ <context context-type="linenumber">24</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
+ <source>
+ Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
+ </source>
+ <target>
+Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
+ <context-group name="null">
+ <context context-type="linenumber">37</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
+ <source>
+ Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
+ </source>
+ <target>
+Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
+ <context-group name="null">
+ <context context-type="linenumber">46</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
+ <source>Like this video</source>
+ <target>Like deze video</target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
+ <source>Dislike this video</source>
+ <target>Dislike deze video</target>
+ <context-group name="null">
+ <context context-type="linenumber">64</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
+ <source>Download the video</source>
+ <target>Download de video</target>
+ <context-group name="null">
+ <context context-type="linenumber">83</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f72992030f134408b675152c397f9d0ec00f3b2a">
+ <source>Report</source>
+ <target>Rapporteer</target>
+ <context-group name="null">
+ <context context-type="linenumber">88</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2f4894617d9c44010f87473e583bd4604b7d6ecf">
+ <source>Report this video</source>
+ <target>Rapporteer deze video</target>
+ <context-group name="null">
+ <context context-type="linenumber">87</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cd27f761b923a5bdb16ba9844da632edd878f1b1">
+ <source>Update this video</source>
+ <target>Werk deze video bij</target>
+ <context-group name="null">
+ <context context-type="linenumber">91</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="007ab5fa2aae8a7372307d3fc45a2dbcb11ffd61">
+ <source>Blacklist</source>
+ <target>Zet op de zwarte lijst</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="803c6317abd2dbafcc93226c4e273c62932e3037">
+ <source>Blacklist this video</source>
+ <target>Zet deze video op de zwarte lijst</target>
+ <context-group name="null">
+ <context context-type="linenumber">95</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="86f26b106c67be3c2e98b82766656e5d9da86dff">
<source>Unblacklist</source>
<target>Van zwarte lijst halen</target>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
- <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2">
- <source>Publication scheduled on </source>
- <target>Publicatie uitgesteld tot</target>
+ <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
+ <source>Unblacklist this video</source>
+ <target>Haal deze video van de zwarte lijst</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">99</context>
</context-group>
</trans-unit>
- <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
- <source>Display name is required.</source>
- <target>Een weergavenaam is verplicht</target>
+ <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
+ <source>Delete this video</source>
+ <target>Verwijder deze video</target>
+ <context-group name="null">
+ <context context-type="linenumber">103</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5cb397241041f7ad70997806227bafcdf7eb1b33">
+ <source>Go the channel page</source>
+ <target>Ga naar kanaalpagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">123</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
+ <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
+ <target>Door <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">134</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
+ <source>Show more</source>
+ <target>Laat meer zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">146</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5403a767248e304199592271bba3366d2ca3f903">
+ <source>Show less</source>
+ <target>Laat minder zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">152</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
+ <source>Friendly Reminder: </source>
+ <target>Vriendelijke Herinnering:</target>
+ <context-group name="null">
+ <context context-type="linenumber">208</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
+ <source>
+ the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
+ </source>
+ <target>
+ Uit het deelsysteem gebruikt voor deze video blijkt het dat sommige technische informatie over jouw systeem (zoals een openbaar IP adres) verstuurd kan worden naar andere peers.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">209</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
+ <source>More information</source>
+ <target>Meer informatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">212</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd499ca7913bb5408fd139a4cb4f863852d5f318">
+ <source>Get more information</source>
+ <target>Krijg meer informatie</target>
+ <context-group name="null">
+ <context context-type="linenumber">212</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="20fc98888baf65b5ba9fe9622dc036fa8dec6a5f">
+ <source>
+ OK
+ </source>
+ <target>
+ OK
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">215</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
+ <source>
+ Other videos
+ </source>
+ <target>
+ Andere videos
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
+ <source>
+ Comments
+ </source>
+ <target>
+ Reacties
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
+ <source>No comments.</source>
+ <target>Geen reacties</target>
+ <context-group name="null">
+ <context context-type="linenumber">17</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
+ <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
+ <target>Laat alle <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> antwoorden zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">54</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
+ <source>
+ Comments are disabled.
+ </source>
+ <target>
+ Reacties zijn uitgeschakeld.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">63</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
+ <source>Add comment...</source>
+ <target>Voeg reactie toe...</target>
+ <context-group name="null">
+ <context context-type="linenumber">6</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="26fa50ba8e69b53162b348d98e25f8b76c81343e">
+ <source>
+ Post comment
+ </source>
+ <target>
+ Post reactie.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">20</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
+ <source>You are one step away from commenting</source>
+ <target>Je bent een stap verwijderd van reageren</target>
+ <context-group name="null">
+ <context context-type="linenumber">28</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
+ <source>
+ If you have an account on this instance, you can login:
+ </source>
+ <target>
+ Als je een account hebt op deze instantie, kan je inloggen:
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">32</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
+ <source>login to comment</source>
+ <target>log in om te reageren</target>
+ <context-group name="null">
+ <context context-type="linenumber">35</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
+ <source>
+ Otherwise you can comment using an account on any ActivityPub-compatible instance.
+ On most platforms, you can find the video by typing its URL in the search bar and then comment it
+ from within the software's interface.
+ </source>
+ <target>
+ Anders kan je reageren door een account te gebruiken op welke ActivityPub-compatibele instatie dan ook.
+ Op de meeste platforms kan je de video vinden door zijn URL in de zoekbalk te typen en vervolgens het vanuit binnenin de software's interface te reageren.</target>
+ <context-group name="null">
+ <context context-type="linenumber">36</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
+ <source>
+ If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
+ </source>
+ <target>
+Als je een account op Mastodon of Pleroma hebt, kan je het direct openen vanuit hun interface:</target>
+ <context-group name="null">
+ <context context-type="linenumber">41</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
+ <source>Highlighted comment</source>
+ <target>Belichte reactie</target>
+ <context-group name="null">
+ <context context-type="linenumber">5</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6">
+ <source>Reply</source>
+ <target>Antwoord</target>
+ <context-group name="null">
+ <context context-type="linenumber">14</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
+ <source>No description</source>
+ <target>Geen beschrijving</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2f03e577e8f81a9f8be0095f93e1f9376c6eedc9">
+ <source>Published videos</source>
+ <target>Gepubliceerde videos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="369ef5e9c0dd1251abdbf699a5db408bca10777f">
+ <source>Published <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videos</source>
+ <target><x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> Videos gepubliceerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
+ <source>240p</source>
+ <target>240p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
+ <source>360p</source>
+ <target>360p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
+ <source>480p</source>
+ <target>480p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
+ <source>720p</source>
+ <target>720p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
+ <source>1080p</source>
+ <target>1080p</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
+ <source>Auto (via ffmpeg)</source>
+ <target>Auto (via ffmpeg)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
+ <source>Configuration updated.</source>
+ <target>Configuratie bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf">
+ <source>Unlimited</source>
+ <target>Oneindig</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
+ <source>100MB</source>
+ <target>100MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
+ <source>500MB</source>
+ <target>500MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
+ <source>1GB</source>
+ <target>1GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
+ <source>5GB</source>
+ <target>5GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
+ <source>20GB</source>
+ <target>20GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
+ <source>50GB</source>
+ <target>50GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
+ <source>10MB</source>
+ <target>10MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
+ <source>50MB</source>
+ <target>50MB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
+ <source>2GB</source>
+ <target>2GB</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
+ <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
+ <target><x id="INTERPOLATION" equiv-text="{{host}}"/> is niet valide</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e02f50674f1d96966384dc096beb42d4973997df">
+ <source>You need to specify hosts to follow.</source>
+ <target>Je moet de hosts specificeren om te volgen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c2a114eb000e7c38e8ad4b1768821bdf6e946d71">
+ <source>Hosts need to be unique.</source>
+ <target>Hosts moeten uniek zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a6718d6aaf5bcd1692eed48daa61d2bed62c1f50">
+ <source>If you confirm, you will send a follow request to:<x id="LINE_BREAK" ctype="lb" equiv-text="<br/>"/> - </source>
+ <target>Als je bevestigd, verzend je een volgverzoek naar:<x id="LINE_BREAK" ctype="lb" equiv-text="<br/>"/> - </target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1266acb081ef0324c4a38ae2d514dd75d8b38409">
+ <source>Follow new server(s)</source>
+ <target>Volg nieuwe server(s)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="950f5111d567e5c0e971f07c26e8c2be1d919a8e">
+ <source>Follow request(s) sent!</source>
+ <target>Volgverzoek(en) verstuurd!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5729c34a858c78daa1aa606f62a3665527cf97e6">
+ <source>Do you really want to unfollow <x id="INTERPOLATION" equiv-text="{{host}}"/>?</source>
+ <target>Wil je echt <x id="INTERPOLATION" equiv-text="{{host}}"/> onvolgen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a89875525c82ab81ffe32e481a5475b43d0c2902">
+ <source>Unfollow</source>
+ <target>Onvolgen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fb4e35e2b0ea2abc1f71295a4b34830e57c07bd0">
+ <source>You are not following <x id="INTERPOLATION" equiv-text="{{host}}"/> anymore.</source>
+ <target>Je volgt <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
+ <source>enabled</source>
+ <target>ingeschakeld</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
+ <source>disabled</source>
+ <target>uitgeschakeld</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1123807fc813c816404598147173403d00117557">
+ <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
+ <target>Overtolligheid voor<x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door jouw instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
+ <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door jouw instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
+ <source>Comment updated.</source>
+ <target>Reactie bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
+ <source>Delete this report</source>
+ <target>Verwijder deze rapportage</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
+ <source>Update moderation comment</source>
+ <target>Werk beheerder-reactie bij</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
+ <source>Mark as accepted</source>
+ <target>Markeer als geaccepteerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
+ <source>Mark as rejected</source>
+ <target>Markeer als afgewezen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
+ <source>Do you really want to delete this abuse report?</source>
+ <target>Wil je echt dit misbruiksrapportage verwijderen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
+ <source>Abuse deleted.</source>
+ <target>Misbruik verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
+ <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
+ <target>Wil je deze video echt verwijderen van je zwarte lijst? Hij zal weer beschikbaar zijn in de videolijst.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
+ <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
+ <target>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> verwijdert van de zwarte lijst.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="364463fab6c5714118d6449561a0f8de1cc10bfa">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> created.</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="964865a3cd90b4af99902f071644a4b2aede4c32">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> updated.</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9910122dfedd2eaa544a990f1430e5b82a76d99f">
+ <source>Update user</source>
+ <target>Werk gebruiker bij</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
+ <source>Unban</source>
+ <target>Onverban</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
+ <source>Set Email as Verified</source>
+ <target>Zet E-mail als Geverifieerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
+ <source>You cannot ban root.</source>
+ <target>Je kan root niet verbannen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
+ <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
+ <source>You cannot delete root.</source>
+ <target>Je kan root niet verwijderen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
+ <source>If you remove these users, you will not be able to create others with the same username!</source>
+ <target>Als jij deze gebruikers verwijdert, kan je niet meer anderen maken met dezelfde gebruikersnaam!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers'' gezet als geverifieerd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
+ <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
+ <source>Ownership accepted</source>
+ <target>Eigendom geaccepteerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
+ <source>Password updated.</source>
+ <target>Wachtwoord bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
+ <source>You current password is invalid.</source>
+ <target>Jouw huide wachtwoord is invalide.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
+ <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
+ <target>Weet je zeker dat je jouw account wil verwijderen? Dit verwijdert al jouw data, inclusief kanalen, videos etc.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e7d5b2de566e4c807c285daf8d8a78b5f7f33311">
+ <source>Type your username to confirm</source>
+ <target>Typ je gebruikersnaam in om te bevestigen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d8a8a7f7160939fb55e82bc01fe9f876f5f2e065">
+ <source>Delete my account</source>
+ <target>Verwijder mijn account</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8eb8b1a728159f43c31abf76c28ef3ff6c230af7">
+ <source>Your account is deleted.</source>
+ <target>Jouw account is verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
+ <source>Profile updated.</source>
+ <target>Profiel bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e003ad599ef836949b9f4dad3037a58ef3ff8d1">
+ <source>Avatar changed.</source>
+ <target>Avatar verandert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="214b802dfd6f544003147a7a68938ec1055c8f32">
+ <source>Information updated.</source>
+ <target>Informatie bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
+ <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> gecreëerd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
+ <source>This name already exists on this instance.</source>
+ <target>Deze naam bestaat al op deze instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
+ <source>Create</source>
+ <target>Creeër</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
+ <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Mijn video's</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
+ <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
+ <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijderen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83">
+ <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ec5852c869b2fb4ae0e564b51278d7be8013fc7">
+ <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoName}}"/>?</source>
+ <target>Weet jij zeker dat je<x id="INTERPOLATION" equiv-text="{{videoName}}"/> wilt verwijderen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d39a0bfa616a9a8473b2e379eefe17d8ed1af118">
+ <source>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> deleted.</source>
+ <target>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dd9f3264feed4935008861c15d81c947124e4ac3">
+ <source>Published</source>
+ <target>Gepubliceerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2">
+ <source>Publication scheduled on </source>
+ <target>Publicatie uitgesteld tot</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a7e91ebe1cf184db5f2bfecf9c16ff81c9e2c02">
+ <source>Waiting transcoding</source>
+ <target>Wachten op transcoding</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="21f1c9d5c67346c830aced4f670045fcf0aeb83a">
+ <source>To transcode</source>
+ <target>Om te transcoden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392">
+ <source>To import</source>
+ <target>Om te importeren</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
+ <source>Ownership change request sent.</source>
+ <target>Eigenaarsveranderingsaanvrag gestuurd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Mijn bibliotheek</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Mijn kanalen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Mijn abonnementen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Varia</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Veranderingen van eigenaar</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Mijn instellingen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
+ <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
+ <target>Een e-mail met verificatielink wordt verstuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
+ <source>Unable to find user id or verification string.</source>
+ <target>Niet in staat om gebruikersid of verificatiestring te vinden.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
+ <source>Subscribe to the account</source>
+ <target>Abonneer op het account</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
+ <source>Focus the search bar</source>
+ <target>Focus de zoekbalk</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
+ <source>Toggle the left menu</source>
+ <target>Schakel het linker menu aan of uit</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
+ <source>Go to the videos overview page</source>
+ <target>Ga naar de video-overzichtspagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
+ <source>Go to the trending videos page</source>
+ <target>Ga naar de trending videos pagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
+ <source>Go to the recently added videos page</source>
+ <target>Ga naar recent toegevoegde videos pagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
+ <source>Go to the local videos page</source>
+ <target>Ga naar de locale videos pagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
+ <source>Go to the videos upload page</source>
+ <target>Ga naar de videos uploadpagina</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
+ <source>Toggle Dark theme</source>
+ <target>Schakel donker thema aan of uit</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
+ <source>Go to my subscriptions</source>
+ <target>Ga naar mijn abonnementen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
+ <source>Go to my videos</source>
+ <target>Ga naar mijn videos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
+ <source>Go to my imports</source>
+ <target>Ga naar mijn imports</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
+ <source>Go to my channels</source>
+ <target>Ga naar mijn kanalen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
+ <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
+</source>
+ <target>Kan niet credenties van OAuth Client verkrijgen: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
+</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8d9b4f4b69108c3c9aa0f3b0dbde87786ba9b319">
+ <source>Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.</source>
+ <target>Weet zeker dat je correct PeerTube geconfigureerd hebt (config/directory), vooral de "webserver" sectie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Fout</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
+ <source>You need to reconnect.</source>
+ <target>Je moet opnieuw verbinden.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="68e710782ccb5398b3acb8844caf0b199da2c3da">
+ <source>Confirm</source>
+ <target>Bevestigen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
+ <source>Keyboard Shortcuts:</source>
+ <target>Keyboard Shortcuts:</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Success</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
+ <source>Incorrect username or password.</source>
+ <target>Incorrecte gebruikersnaam of wachtwoord.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
+ <source>You account is blocked.</source>
+ <target>Jouw account is geblokkeerd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
+ <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
+ <target>Een e-mail met de wachtwoord reset instructies wordt gestuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
+ <source>Your password has been successfully reset!</source>
+ <target>Jouw wachtwoord is succesvol gereset!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7fb1099e29660162f9154d5b2feee7743a423df6">
+ <source>Today</source>
+ <target>Vandaag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="02e0243b60007368f87dc01e083f232dd025096d">
+ <source>Last 7 days</source>
+ <target>Laatste 7 dagen </target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7668986b9f753fcd72ad4a00b1a0c4861d1f7fb8">
+ <source>Last 30 days</source>
+ <target>Laatste 30 dagen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a77b663fd9b94c38bc9c6493a51b5f3acacb9bca">
+ <source>Last 365 days</source>
+ <target>Laatste 365 dagen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d2f3bf121699ff08a25fa4859bfdf3996bf821cc">
+ <source>Short (< 4 min)</source>
+ <target>Kort (< 4 min)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ac0fa1039f09ec0d917303658c5bb1ee813a4225">
+ <source>Long (> 10 min)</source>
+ <target>Long (> 10 min)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f24d368d6be0fee70fb4503d2ad37a612e1b0889">
+ <source>Medium (4-10 min)</source>
+ <target>Middelmatig (4-10 min)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ed073fec00d699b7a97bb65b4f3a722b203c5bca">
+ <source>Relevance</source>
+ <target>Relevantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1aee80ab35aa99508802cdec6306e110b2feaf9e">
+ <source>Publish date</source>
+ <target>Publicatiedatum</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b7641aed03492978b4ec6843b1e53f30464294d9">
+ <source>Views</source>
+ <target>Weergaven</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7e892ba15f2c6c17e83510e273b3e10fc32ea016">
+ <source>Search</source>
+ <target>Zoeken</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b67c8e57904c67c4566610363b7f82c748d04323">
+ <source>Instance name is required.</source>
+ <target>Instantienaam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="10a248adb1ee12830355a04ac3cde2bad2d41d7d">
+ <source>Short description should not be longer than 250 characters.</source>
+ <target>Korte beschrijvingen moeten niet langer zijn dan 250 karakters.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="356e63270712273da168072ec0fc78a969919bf1">
+ <source>Twitter username is required.</source>
+ <target>Twitter gebruikersnaam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dbb2ef02020afc05e146855f2e1dd7c9522d49b6">
+ <source>Previews cache size is required.</source>
+ <target>Cachegrootte van voorvertoning is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="97836c6e698185b4ce357de9d4b2ab3e838f2459">
+ <source>Previews cache size must be greater than 1.</source>
+ <target>Cachegrootte van voorvertoning moet groter zijn dan 1.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e7393dc4a4aa12d005582eb9e1ddc7e5ca5bebd3">
+ <source>Previews cache size must be a number.</source>
+ <target>Cachegrootte van voorvertoning moet een nummer zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="545f5dea553b2d7c4a65920ccdcb1e9dbdc7f4d8">
+ <source>Captions cache size is required.</source>
+ <target>Cachegrootte van ondertiteling is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a8d7131c0ca1eefe7b058e6081236ca1be364e2c">
+ <source>Captions cache size must be greater than 1.</source>
+ <target>Cachegrootte van ondertiteling moet groter zijn dan 1.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c3decd47b03cf542df091c1a2fb25b756e59074e">
+ <source>Captions cache size must be a number.</source>
+ <target>Cachegrootte van ondertiteling moet een nummer zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2cdd5a8c604ef16c2f9a17ed81d73f4f9509e828">
+ <source>Signup limit is required.</source>
+ <target>Inschrijflimiet is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0ca9f7ec55c9896add6e82d2b52e9217e1140cf7">
+ <source>Signup limit must be greater than 1.</source>
+ <target>Inschrijflimiet moet groter zijn dan 1.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
+ <source>Signup limit must be a number.</source>
+ <target>Inschrijflimiet moet een nummer zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
+ <source>Admin email is required.</source>
+ <target>Administrator e-mail is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
+ <source>Admin email must be valid.</source>
+ <target>Administrator e-mail moet valide zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
+ <source>Transcoding threads is required.</source>
+ <target>Transcoding threads zijn vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
+ <source>Transcoding threads must be greater or equal to 0.</source>
+ <target>Transcoding threads moeten groter of gelijk zijn aan 0.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>E-mail is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>E-mail moet valide zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
+ <source>Username is required.</source>
+ <target>Gebruikersnaam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
+ <source>Password is required.</source>
+ <target>Wachtwoord is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
+ <source>Confirmation of the password is required.</source>
+ <target>Bevestiging van het wachtwoord is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
+ <source>Password must be at least 6 characters long.</source>
+ <target>Wachtwoord moet minstens 6 karakters lang zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0a154031f3e66985af96d5f903441cf84f0dc75e">
+ <source>Password cannot be more than 255 characters long.</source>
+ <target>Wachtwoord kan niet langer zijn dan 255 karakters.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2db8f1f93a5485c32267762a3bf4da499832e732">
+ <source>The new password and the confirmed password do not correspond.</source>
+ <target>Het nieuwe wachtwoord en het bevestigde wachtwoord zijn niet hetzelfde.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="abede840116d58f04a55d99a6cbd68da8a3e1bbf">
+ <source>Video quota is required.</source>
+ <target>Videoquotum is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="93a6dc1d3aa0d3201c86ef1ec8adf5cf0ada3c80">
+ <source>Quota must be greater than -1.</source>
+ <target>Quota moet groter zijn dan -1</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
+ <source>Daily upload limit is required.</source>
+ <target>Dagelijks uploadlimiet is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
+ <source>Daily upload limit must be greater than -1.</source>
+ <target>Dagelijks uploadlimiet moet groter zijn dan -1.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
+ <source>User role is required.</source>
+ <target>Gebruikersrol is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
+ <source>Display name is required.</source>
+ <target>Een weergavenaam is verplicht.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
+ <source>Description must be at least 3 characters long.</source>
+ <target>Beschrijvingen moeten minstens 3 karakters lang zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
+ <source>Description cannot be more than 1000 characters long.</source>
+ <target>Beschrijvingen mogen niet langer dan 1000 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
+ <source>You must to agree with the instance terms in order to registering on it.</source>
+ <target>Je moet akkoord gaan met de instantie's termijnen om erop te registreren.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
+ <source>Ban reason must be at least 3 characters long.</source>
+ <target>Verbanningsreden moet minstens 3 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
+ <source>Ban reason cannot be more than 250 characters long.</source>
+ <target>Verbanningsreden kan niet langer dan 250 tekens zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
+ <source>Report reason is required.</source>
+ <target>Rapportagereden is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="993f9f5703d449a1d467243db75253d288a2947e">
+ <source>Report reason must be at least 2 characters long.</source>
+ <target>Rapportagereden moet minstens 2 tekens zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
+ <source>Moderation comment is required.</source>
+ <target>Beheersreactie is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
+ <source>Moderation comment must be at least 2 characters long.</source>
+ <target>Beheersreactie moet minstens 2 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
+ <source>The channel is required.</source>
+ <target>Het kanaal is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
+ <source>Blacklist reason must be at least 2 characters long.</source>
+ <target>Zwartelijstreden moet minstens 2 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
+ <source>Blacklist reason cannot be more than 300 characters long.</source>
+ <target>Zwartelijstreden kan niet langer dan 300 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
+ <source>Video caption language is required.</source>
+ <target>Video ondertitelingstaal is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="82083ae96724851ff37e1c7e4e9f907c25677963">
+ <source>Video caption file is required.</source>
+ <target>Video ondertitelingsbestand is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
+ <source>The username is required.</source>
+ <target>De gebruikersnaam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
+ <source>You can only transfer ownership to a local account</source>
+ <target>Je kan alleen je eigendom transporteren naar een lokaal account</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
+ <source>Name is required.</source>
+ <target>Naam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
+ <source>Support text must be at least 3 characters long.</source>
+ <target>Supporttekst moet minstens 3 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
+ <source>Support text cannot be more than 1000 characters long.</source>
+ <target>Supporttekst mag niet meer zijn dan 1000 karakters.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
+ <source>Comment is required.</source>
+ <target>Reactie is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
+ <source>Comment must be at least 2 characters long.</source>
+ <target>Reactie moet minstens 2 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123">
+ <source>Comment cannot be more than 3000 characters long.</source>
+ <target>Reactie kan niet meer dan 3000 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cdc51eaeab88683610a28af8645cf91d136b39e1">
+ <source>Video name is required.</source>
+ <target>Videonaam is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c">
+ <source>Video name must be at least 3 characters long.</source>
+ <target>Videonaam moet minstens 3 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0320d0f7f8eec2341e27ca53d7875217a3d99695">
+ <source>Video name cannot be more than 120 characters long.</source>
+ <target>Videonaam kan niet meer dan 120 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a627c58cf1849d7d838696e7f36c1bae1a8b31a4">
+ <source>Video privacy is required.</source>
+ <target>Videoprivacy is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
+ <source>Video channel is required.</source>
+ <target>Videokanaal is vereist.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="af5e2d5f3ac817c735fb7ff9ca16322789f66fef">
+ <source>Video description must be at least 3 characters long.</source>
+ <target>Videobeschrijving moet minstens 3 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ce28a9403c2d7e5da2e59af27118f8b6d109e906">
+ <source>Video description cannot be more than 10000 characters long.</source>
+ <target>Videobeschrijving kan niet meer dan 10000 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1cffdc2e156716cd9880201d65ba457d11464f8">
+ <source>A tag should be more than 2 characters long.</source>
+ <target>Een tag moet minstens 2 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="34a0811f9a2a7366cc9efcdad52ea59b105326ea">
+ <source>A tag should be less than 30 characters long.</source>
+ <target>Een tag moet minder dan 30 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
+ <source>Video support must be at least 3 characters long.</source>
+ <target>Videosupport moet minstens 3 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
+ <source>Video support cannot be more than 1000 characters long.</source>
+ <target>Videosupport kan niet meer dan 1000 karakters zijn.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
+ <source>A date is required to schedule video update.</source>
+ <target>Een datum is vereist om videoupdates in te roosteren.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3b7ed22d0730d03b38c254332829d855ee7256c4">
+ <source>This file is too large.</source>
+ <target>Dit bestand is te groot.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4">
+ <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
+ <target>Alle onopgeslagen data zal verloren worden, weet je zeker dat je deze pagina wil verlaten?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a8059e31694578c1b0344a76a345357dd60e8f01">
+ <source>Warning</source>
+ <target>Waarschuwing</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8339364b054610983b7f2334bb807fff7613bddf">
+ <source>Sunday</source>
+ <target>Zondag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a43c57a7cbebf57eb33a2eae5e994c91d9887596">
+ <source>Monday</source>
+ <target>Maandag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="48a2a35957ce394eb2c59ae35c99642360af70ee">
+ <source>Tuesday</source>
+ <target>Dinsdag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b0af441f9ba8b82952b9ec10fb8c62e8fec67df9">
+ <source>Wednesday</source>
+ <target>Woensdag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="55c583b99c809818ec27df065ccf05357a6ac10b">
+ <source>Thursday</source>
+ <target>Donderdag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e91b54925dc5f490753f60f53ef6f8b4609e6215">
+ <source>Friday</source>
+ <target>Vrijdag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c0d2dd391a3eca8e841a5d0e035cd268280eb68e">
+ <source>Saturday</source>
+ <target>Zaterdag</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6549890cd0d6b59fb0e1aa383b00483a68a55eef">
+ <source>Sun</source>
+ <target>Zon</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3382aa5d7f520e197fb59a4995fe1beffca2d0ff">
+ <source>Mon</source>
+ <target>Maa</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f883ec926274974df0fc46c037cbffd6a863ebc9">
+ <source>Tue</source>
+ <target>Din</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="242b4f4b5651e24f9a9007ef153a57981e4b989d">
+ <source>Wed</source>
+ <target>Woe</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5a2c39d56b8f00a6a4670a63b53caacbda953be6">
+ <source>Thu</source>
+ <target>Don</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4cdf23d523a0e52e0dec9cd650ffd9bd6952792c">
+ <source>Fri</source>
+ <target>Vri</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1283d165a942d7f4c469ba34f99dbb9e927d0261">
+ <source>Sat</source>
+ <target>Zat</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2fba8448ff13105c57665a9a6ffcfe9615d855dd">
+ <source>Su</source>
+ <target>Zon</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="388144af7ac7651d2615b9be0e84f43ae71d9fb3">
+ <source>Mo</source>
+ <target>Ma</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d96313e42b5f0751ce2676a31d309b4d322ab462">
+ <source>Tu</source>
+ <target>Di</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="06cc3d39f78c0615b707cef39cd4875599611fef">
+ <source>We</source>
+ <target>Wo</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="790894436cca9d675d59be9a8aafd58acccde2cd">
+ <source>Th</source>
+ <target>Do</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="42dfe37169f8471367c31489155229bbe1747ea5">
+ <source>Fr</source>
+ <target>Vr</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1b64ea3e04ceeb512e8974eb0019dee4f211c7a0">
+ <source>Sa</source>
+ <target>Za</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
+ <source>January</source>
+ <target>Januari</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0393a96b58df82af39a2ec83deec624749e42036">
+ <source>February</source>
+ <target>Februari</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ea41ee3743ec5bdbbf863ab793bbdd6e6d9af96e">
+ <source>March</source>
+ <target>Maart</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b87ee784d9e93b5557aca9bdc9464dbd4328920a">
+ <source>April</source>
+ <target>April</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="862da1034ac2707cc44123ed963b2f42109b6b3e">
+ <source>May</source>
+ <target>Mei</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2f234249d4c3c39e27c0f05d4a6b73a7959caeb2">
+ <source>June</source>
+ <target>Juni</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="11447f95e83c8de675ab6c492150f88e4d9bd15e">
+ <source>July</source>
+ <target>July</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ddd9a3d59a8db4e822e54e9473c05b571aca9829">
+ <source>August</source>
+ <target>Augustus</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e21dc41f9b3fdaf35ab6b2d9e2e5e8a926fb1938">
+ <source>September</source>
+ <target>September</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71f49c502d13e22079a958a5532afa28dbe98b3b">
+ <source>October</source>
+ <target>Oktober</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="64b5ce921faa5e3d277d6d528ddcfc8c2bfe9f52">
+ <source>November</source>
+ <target>November</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2006e2aabb31714ebc684dc382539649f690ed5c">
+ <source>December</source>
+ <target>December</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8270e687cfb5624b3f6fbb7991a2e916c96464b7">
+ <source>Jan</source>
+ <target>Jan</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23544170afbb981dd52750b641576841cf5dcf60">
+ <source>Feb</source>
+ <target>Feb</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1f14355742459b7d6a0126a1564e1c18f39f86e7">
+ <source>Mar</source>
+ <target>Mar</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="964a5f032bc846d32806a4838580a4f81cf14463">
+ <source>Apr</source>
+ <target>Apr</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8f7274f606f71d9290ed01c5683092d701632d7f">
+ <source>Jun</source>
+ <target>Jun</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7c3d8318d6d8d9920ae0a80350616732c33a3211">
+ <source>Jul</source>
+ <target>Jul</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="be1335ffd1c606321e2c020b638dd3c84b434212">
+ <source>Aug</source>
+ <target>Aug</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4f739d03be1c936c58978739c317d91566348204">
+ <source>Sep</source>
+ <target>Sep</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="6607cacb987a588530a13de7018d959240d19153">
+ <source>Oct</source>
+ <target>Oct</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e597400ded12a366855615e18fcc8f9ac05b72e0">
+ <source>Nov</source>
+ <target>Nov</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="adf2dfa2a9cb490d6a4a74510b7b0846b62d429e">
+ <source>Dec</source>
+ <target>Dec</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
+ <source>Clear</source>
+ <target>Wissen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8fb519ba47ea7806beeacdcd44829d85a2aa0cc5">
+ <source>yy-mm-dd </source>
+ <target>jj-mm-dd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
+ <source>Transcode your videos in multiple resolutions</source>
+ <target>Transcodeer je videos in meerdere resoluties</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
+ <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
+ <target>HTTP import(Youtube, Vimeo, directe URL...)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
+ <source>Torrent import</source>
+ <target>Torrentimport</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
+ <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
+ <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="cf9ddbb55b25178660e09346209aedc10108aa24">
+ <source>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</source>
+ <target>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="10ffa5c3dbcee491d66f80d8d4dce3e119a6ec86">
+ <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of full HD videos</source>
+ <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan full HD videos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="344ddae9f45b344e98e7b28cd5e33243982700f8">
+ <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of HD videos</source>
+ <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan HD videos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="435c012df6dd990a1ccb7ee73dd79c488bde28b5">
+ <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of average quality videos</source>
+ <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan gemiddelde kwaliteit videos</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0b2054a863319d2cf59867addd125b6717cae41d">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> years ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> jaar geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e622d3813449fe36371ea258281059306819199d">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> months ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maanden geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2f8a5a5f7efb521d7d89dc659ff65dd13cb7b17b">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> month ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maand geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1d1a46543a29096d3c6676be2d561380a0bc94e1">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> weeks ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> weken geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e1db0b98b6cdf817508195f3649c48475c32ae7e">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> week ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> week geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a7654c3ece96e777527606f1c2870d6ee0b180f7">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> days ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dagen geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5b465235ae55091d32535e23dd180c407f1352d1">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> day ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dag geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dc7addf53bd6405a9c746db6dfca665c33679a84">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hours ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uren geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d54a610250ed38efccf0e3afdd0004f6ad83ea8d">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hour ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uur geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9704e5e3adce178c127ead05f7057d3fb827308a">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> min ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> min geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="7a158a7555a44ea7eff9fa4988df9aa24d262ceb">
+ <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec ago</source>
+ <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec geleden</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="457f161d3ca706b8de263b0cd58e493d54e7d4c5">
+ <source><x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> compatible that supports:</source>
+ <target><x id="START_LINK" ctype="x-a" equiv-text="<a>"/>Markeer<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> compatibele dat support:</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ab4426b60f13c00b61d6b714d390dc629f314980">
+ <source>Emphasis</source>
+ <target>Nadruk</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="dc60677d5a906e69f38a5cf9da7f2eb03931bea0">
+ <source>Links</source>
+ <target>Links</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="80220239e07f36ea8d5f10118dc52ce4b13bc15a">
+ <source>New lines</source>
+ <target>Nieuwe lijnen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b15e7bec5c7833d2d9634946ccbed68967b1bee1">
+ <source>Lists</source>
+ <target>Lijsten</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="b73f7f5060fb22a1e9ec462b1bb02493fa3ab866">
+ <source>Images</source>
+ <target>Afbeeldingen</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verbannen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verbannen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
+ <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
+ <target>Weet je zeker dat je <x id="INTERPOLATION" equiv-text="{{username}}"/> wilt onverbannen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> onverbannen.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
+ <source>If you remove this user, you will not be able to create another with the same username!</source>
+ <target>Als je deze gebruiker verwijdert, is het niet meer mogelijk om een andere te maken met dezelfde gebruikersnaam!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
+ <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> e-mail gezet als geverifieerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
+ <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt door de instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
+ <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door de instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
+ <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt door de instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
+ <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door de instantie.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
+ <source>Mute this account</source>
+ <target>Demp dit account</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
+ <source>Unmute this account</source>
+ <target>Dempt dit account niet meer</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
+ <source>Mute the instance</source>
+ <target>Demp de instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
+ <source>Unmute the instance</source>
+ <target>Demp de instantie niet meer</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
+ <source>Mute this account by your instance</source>
+ <target>Demp dit account door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
+ <source>Unmute this account by your instance</source>
+ <target>Demp dit account niet meer door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
+ <source>Mute the instance by your instance</source>
+ <target>Demp de instantie door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
+ <source>Unmute the instance by your instance</source>
+ <target>Demp de instantie niet meer door jouw instantie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
+ <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
+ <target>Verzoek te groot voor de server. Alstublieft bereikt de administrator als je de limietgrote wilt vergroten.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="58546fd4d14b2d9635ce3d28c216ac68587bb25b">
+ <source>Too many attempts, please try again after <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minutes.</source>
+ <target>Te vaak geprobeerd, probeer alstublieft weer na <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minuten.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ab783a52f2df9ff7a20139cab0da6d0764f3cc5d">
+ <source>Too many attempts, please try again later.</source>
+ <target>Te vaak geprobeerd, probeer alstublieft later.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0f286a597f0053c3578a52e044769c204ee516fc">
+ <source>Server error. Please retry later.</source>
+ <target>Serverfout. Probeer later alstublieft weer.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
+ <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Abonneer op <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Geabonneert</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
+ <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
+ <target>Ongeabonneert van <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Ongeabonneert</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
+ <source>Moderator</source>
+ <target>Beheerder</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
+ <source>Only I can see this video</source>
+ <target>Ik kan deze video alleen zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
+ <source>Only people with the private link can see this video</source>
+ <target>Alleen mensen met de privélink kunnen deze video zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
+ <source>Anyone can see this video</source>
+ <target>Iedereen kan deze video zien</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
+ <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
+ <target>Welkom! Check alstublieft nu jouw e-mails om jouw accont te verifieren en de inschrijving te voltooien</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
+ <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
+ <target>Je bent nu ingelogd als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
+ <source>Video to import updated.</source>
+ <target>Video naar import bijgewerkt.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c">
+ <source>Your video was uploaded to your account and is private.</source>
+ <target>Jouw video is geupload naar jouw account en is privé.
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
+ <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
+ <target>Maar geassocieerde data(tags, beschrijving...) zullen verloren raken, weet je zeker dat je deze pagina wilt verlaten?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="5af84926d631326e548573ebf0f6dff07845aeb4">
+ <source>Your video is not uploaded yet, are you sure you want to leave this page?</source>
+ <target>Jouw video is nog niet geupload, weet je zeker dat je deze pagina wilt verlaten?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
+ <source>Upload cancelled</source>
+ <target>Upload geannuleerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
+ <source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
+ <target>Jouw videoquotum is overschreden met deze video (videogrootte: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, gebruikt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quotum: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
+ <source>Your daily video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</source>
+ <target>Jouw dagelijkse videoquotum is overschreden met deze video (videogrootte: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, gebruikt: <x id="INTERPOLATION_1" equiv-text="{{quotaUsedDaily}}"/>, quotum: <x id="INTERPOLATION_2" equiv-text="{{quotaDaily}}"/>)</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
+ <source>Video published.</source>
+ <target>Video gepubliceerd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187">
+ <source>Video updated.</source>
+ <target>Video geupdate.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="aeb61b334cac080733c3e03766165a346bbf42fd">
+ <source> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> replies will be deleted too.</source>
+ <target> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> reacties zullen ook worden verwijdert.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
+ <source>Video blacklisted.</source>
+ <target>Video op de zwarte lijst.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
+ <source>Copied</source>
+ <target>Gekopieerd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="fa2601e52cbf5725a13d33fe14458823b882ea50">
+ <source>Video reported.</source>
+ <target>Video gerapporteerd.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
+ <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
+ <target>Start op <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
+ <source>Like the video</source>
+ <target>Like de video</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
+ <source>Dislike the video</source>
+ <target>Dislike de video</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
+ <source>Do you really want to delete this video?</source>
+ <target>Weet je zeker dat je de video wil verwijderen?</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
+ <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
+ <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="ed013c2c29216501c688e9cb5f3a1c9fd9147b71">
+ <source>This video contains mature or explicit content. Are you sure you want to watch it?</source>
+ <target>Deze video bevat volwassen of expliciete inhoud. Weet je zeker dat je hem wilt kijken?</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Je weergavenaam moet minstens 3 tekens lang zijn.</target>
+ <trans-unit id="5ba3d522e4146eefcbd5c222247c1e2423d27cd8">
+ <source>Mature or explicit content</source>
+ <target>Volwassen of expliciete content</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Je weergavenaam kan niet langer dan 120 tekens zijn.</target>
+ <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
+ <source>Videos from your subscriptions</source>
+ <target>Videos van jou abonnementen</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
+ <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
+ <source>You don't have notifications.</source>
+ <target>Avètz pas cap de notificacion.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publicat una <x id="START_LINK" ctype="x-a" equiv-text="<a>"/>nòva vidèo<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
+ <source>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </source>
+ <target>
+ <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a comentat vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">23</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
+ <source>
+ Your video <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> has been published
+ </source>
+ <target>
+ Vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="<a>"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/> es publicada
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
+ <source>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </source>
+ <target>
+ <x id="START_TAG_DIV" ctype="x-div" equiv-text="<div>"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="</div>"/>
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">57</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
<source>Unlisted</source>
<target>Pas listada</target>
<context context-type="linenumber">25</context>
</context-group>
</trans-unit>
+ <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
+ <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
+ <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
+ <context-group name="null">
+ <context context-type="linenumber">11</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
<source>
Login
<source>Password</source>
<target>Senhal</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Connexion</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Me mandar un corrièl per reïnicializar lo senhal</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Inscripcion</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Cambiar la lenga</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
+ <source>
+ Help to translate PeerTube!
+ </source>
+ <target>
+ Ajudatz a traduire PeerTube !
+ </target>
+ <context-group name="null">
+ <context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Mon perfil public
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Mon compte
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Mas vidèos
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Desconnexion
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Crear un compte</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Abonaments</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Apercebut</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Tendéncias</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Apondons recents</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Localas</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Mai</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administracion</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Mostrar los acorchis clavièr</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Passar a l’interfàcia escura</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
+ <source>View your notifications</source>
+ <target>Veire vòstras notificacions</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
+ <source>Notifications</source>
+ <target>Notificacions</target>
+ <context-group name="null">
+ <context context-type="linenumber">10</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
+ <source>Update your notification preferences</source>
+ <target>Actualizar vòstras preferéncias de notificacion</target>
+ <context-group name="null">
+ <context context-type="linenumber">15</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
+ <source>See all your notifications</source>
+ <target>Veire totas vòstras notificacions</target>
+ <context-group name="null">
+ <context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Mostrar las vidèos pas listadas e las privadas</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Cap de resultat</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
+ <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
+ <target>Contactar l’administrator de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
- <source>Description</source>
- <target>Descripcion</target>
+ <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
+ <source>Your name</source>
+ <target>Vòstre nom</target>
<context-group name="null">
- <context context-type="linenumber">27</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
- <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774">
- <source>Terms</source>
- <target>Tèrmes</target>
+ <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
+ <source>Your email</source>
+ <target>Vòstra adreça</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
- <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
- <source>User registration is allowed and</source>
- <target>Las inscripcions son autorizadas e</target>
+ <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
+ <source>Your message</source>
+ <target>Vòstre messatge</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
+ Cancel
+ </source>
<target>
- aquesta instància provesís un quòta de basa de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> d’espaci per las vidèos de sos utilizaires.
- </target>
+ Anullar
+ </target>
<context-group name="null">
- <context context-type="linenumber">27</context>
+ <context context-type="linenumber">26</context>
</context-group>
</trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- aquesta instància fornís un espaci sens limit per las vidèos de sos utilizaires.
- </target>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Mandar</target>
<context-group name="null">
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>Las inscriptions son pas pel moment possiblas</target>
+ <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
+ <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
+ <target>A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
<context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">4</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
+ <source>Description</source>
+ <target>Descripcion</target>
+ <context-group name="null">
+ <context context-type="linenumber">27</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774">
+ <source>Terms</source>
+ <target>Tèrmes</target>
+ <context-group name="null">
+ <context context-type="linenumber">39</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
+ <source>User registration is allowed and</source>
+ <target>Las inscripcions son autorizadas e</target>
+ <context-group name="null">
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Descripcion corta</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Rota del client per defaut</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Apercebuts de las vidèos</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vidèos a la mòda </target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vidèos ajustadas recentament</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vidèos localas</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Politica tocant las vidèos amb de contengut sensible</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Inscripcions activadas</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>L’inscripcion demanda una verificacion d’adreça electronica</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limit d’inscripcions</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Utilizaires</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Quòta per defaut per utilizaire</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importar</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>Import vidèo amb URL HTTP (per exemple YouTube) activat</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Import de vidèos via un fichièr torretn o un magnet URI activat</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrator</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Adreça de l’admin</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Utilizaires</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Quòta per defaut per utilizaire</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Vòstre nom d’utilizaire Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica lo compte Twitter del site o de la plataforma ont lo contengut foguèt publicat.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instàncias en lista blanca per Twitter</target>
- <context-group name="null">
- <context context-type="linenumber">198</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8b0ee765cc3fea9baef14bfb9d5288dfcbe386b6">
- <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
- If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
- Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted.</source>
- <target>Se vòstra instància es mesa en lista blanca per Twitter, un lector vidèo serà integrat pel fil Twitter sul partatge d’una vidèo PeerTube.<br />
- Se l’instància es pas en lista blanca, utilizam un imatge amb un ligam que mena a l’instància PeerTube.<br /><br />
- Clicatz aquesta bóstia, salvagardatz la configuracion e ensajatz amb l’URL d’una vidèo de vòstra instància (https://exemple.com/videos/watch/blabla) sus <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> per veire se vòstra instància es en lista blanca.</target>
<context-group name="null">
<context context-type="linenumber">199</context>
</context-group>
<source>Transcoding</source>
<target>Transcodatge</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transcodatge activat</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Se desactivatz lo transcodatge, un fum de vidèos de vòstres utilizaires foncionaràn pas !</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Transcodatge dels threads</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Resolucion <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Qualques fichièrs son pas federats (apercebuts, legendas). Los recuperam de l’instància d’origina estant e los metèm en cache.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Talha del cache d’apercebut</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Talha del cache per las legendas de las vidèos</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalizacions</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Escrivètz dirèctament de JavaScript còdi.<br />Exemple : <pre>console.log('mon instància es tròp crana');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Escrivètz dirèctament lo còdi CSS. Exemple :<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prefixatz amb <em>#custom-css</em> per subrecargar los estiles. Exemple :
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Configuracion avançada</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Actualizar la configuracion</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Sembla que la configuracion es invalida. Mercés de cercar d’errors possiblas pels diferents onglets.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>User's email must be verified to login</source>
<target>Lo corrièl de l’utilizaire deu èsser verificat abans la connexion</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
<source>User's email is verified / User can login without email verification</source>
<target>Lo corrièl de l’utilizaire es verificat / Pòt se connectar sens verificacion de l’adreça</target>
<context-group name="null">
- <context context-type="linenumber">74</context>
+ <context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>Rason del bandiment :</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Accions</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Rason de la mesa en lista negra :</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
- <source>Muted accounts</source>
- <target>Comptes muts</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
- <source>Muted servers</source>
- <target>Servidors muts</target>
- <context-group name="null">
- <context context-type="linenumber">11</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
- <source>Account</source>
- <target>Compte</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
- <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
- <target>Mut lo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
- <context-group name="null">
- <context context-type="linenumber">13</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
- <source>Unmute</source>
- <target>Restablir</target>
- <context-group name="null">
- <context context-type="linenumber">23</context>
- </context-group>
- </trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Mos paramètres</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Ma bibliotèca</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Mas cadenas</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Mas vidèos</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Mos abonaments</target>
+ <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
+ <source>Muted accounts</source>
+ <target>Comptes muts</target>
<context-group name="null">
- <context context-type="linenumber">16</context>
+ <context context-type="linenumber">2</context>
</context-group>
</trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Mas importacions</target>
+ <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
+ <source>Muted servers</source>
+ <target>Servidors muts</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>Divèrs</target>
+ <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
+ <source>Account</source>
+ <target>Compte</target>
<context-group name="null">
- <context context-type="linenumber">24</context>
+ <context context-type="linenumber">12</context>
</context-group>
</trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>Instàncias mudas</target>
+ <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
+ <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Mut lo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">2</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Cambiaments de proprietats</target>
+ <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
+ <source>Unmute</source>
+ <target>Restablir</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Profile</source>
<target>Perfil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Paramètres vidèo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Zòna perilhosa</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Mandar</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Instàncias mudas</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Cambiar lo senhal</target>
<context context-type="linenumber">4</context>
</context-group>
</trans-unit>
+ <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
+ <source>Web</source>
+ <target>Site web</target>
+ <context-group name="null">
+ <context context-type="linenumber">3</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
<source>
Sorry, but we couldn't find the page you were looking for.
<source>Publish will be available when upload is finished</source>
<target>La publicacion serà possibla un còp lo mandadís acabat</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publicar</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Esperar lo transcodatge abans de publicar la vidèo</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Se decidissètz d’esperar pas lo transcodatge abans de publicar la vidèo, serà pas legibla fins a la fin del transcodatge.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Ajustar una legenda mai</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Veire lo fichièr de sostítols</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>Ja enviada ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>Serà creada en actualizar</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Anullar la creacion</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>Serà suprimida en actualizar</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Anullar la supression</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
Encara cap de legendas.
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Legendas</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Enviar una vinheta d’apercebut</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Enviar un apercebut</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Pichon tèxte per explicar al monde cossí pòdon vos sosténer (plataforma pels sòcis...).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Paramètres avançats</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Anullar
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Partejar</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Error en recuperar las informacions de la seccion «A prepaus» del servidor</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Cap de descripcion</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Error</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Succès</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Configuracion actualizada.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
+ <source>Preferences saved</source>
+ <target>Preferéncias salvagardadas</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
<source>Profile updated.</source>
<target>Perfil actualizat</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Volètz vertadièrament suprimir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ? Aquò suprimarà tanben totas las vidèos enviadas a la cadena.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Tornatz picar lo nom de la cadena per confirmar</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Mas vidèos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Cadenas</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Ma bibliotèca</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Mas cadenas</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Mos abonaments</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
+ <source>My history</source>
+ <target>Mon istoric</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Divèrs</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Cambiaments de proprietats</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Mos paramètres</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Imports vidèo</target>
+ <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
+ <source>My notifications</source>
+ <target>Mas notificacions</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Error</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Vos cal vos reconnectar.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Succès</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Nom d’utilizaire o senhal incorrècte.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
- <source>Username is required.</source>
- <target>Lo nom d’utilizaire es requesit.</target>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>L’adreça electronica es requesida.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
- <source>Password is required.</source>
- <target>Lo senhal es requesit.</target>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>L’adreça electronica deu èsser valida.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
- <source>Confirmation of the password is required.</source>
- <target>La confirmacion del senhal es requesida.</target>
+ <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
+ <source>Your name is required.</source>
+ <target>Vòstre nom es requesit</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Lo nom d’utilizaire deu conténer almens 3 caractèrs.</target>
+ <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
+ <source>Username is required.</source>
+ <target>Lo nom d’utilizaire es requesit.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Lo nom d’utilizaire pòt pas conténer mai de 20 caractèrs.</target>
+ <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
+ <source>Password is required.</source>
+ <target>Lo senhal es requesit.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Lo nom d’utilizaire deu èsser alfanumeric e en minuscula. </target>
+ <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
+ <source>Confirmation of the password is required.</source>
+ <target>La confirmacion del senhal es requesida.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>L’adreça electronica es requesida.</target>
+ <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
+ <source>Username must be at least 1 character long.</source>
+ <target>Lo nom d’utilizaire deu almens conténer 1 caractèr.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>L’adreça electronica deu èsser valida.</target>
+ <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
+ <source>Username cannot be more than 50 characters long.</source>
+ <target>Lo nom d’utilizaire pòt pas conténer mai de 50 caractèrs.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>L’escais-nom deu almens conténer 3 caractèrs.</target>
+ <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
+ <source>Display name must be at least 1 character long.</source>
+ <target>Lo nom public deu almens conténer 1 caractèr.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>L’escais-nom pòt pas conténer mai de 120 caractèrs.</target>
+ <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
+ <source>Display name cannot be more than 50 characters long.</source>
+ <target>Lo nom public pòt pas conténer mai de 50 caractèrs.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>La rason del senhalament pòt pas conténer mai de 300 caractèrs.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Lo comentari de moderacion es requesit.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Lo comentari de moderacion pòt pas conténer mai de 300 caractèrs.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>La cadena es requesida.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Lo nom deu almens conténer 3 caractèrs.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Lo nom pòt pas conténer mai de 20 caractèrs.</target>
+ <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
+ <source>Name must be at least 1 character long.</source>
+ <target>Lo nom deu almens conténer 1 caractèr.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Lo nom deu èsser alfanumeric e en minuscula</target>
+ <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
+ <source>Name cannot be more than 50 characters long.</source>
+ <target>Lo nom pòt pas conténer mai de 50 caractèrs.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Abonat</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>S’abonèt a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Pas mai abonat</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Abonat</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Pas mai abonat</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Moderator</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Info</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Mandadís anullat</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>O planhèm mas PeerTube pòt pas gerir de vidèos de mai de 8 Go</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Vòstre quòta de vidèo es excedit amb aquesta vidèo (talha vidèo : <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizat : <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quòta : <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>Hasło</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Zaloguj się</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Wyślij mi wiadomość e-mail przywracającą hasło</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Zarejestruj się</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
<source>Change the language</source>
<target>Zmień język</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Mój profil publiczny
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Moje konto
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Moje filmy
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Wyloguj się
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Utwórz konto</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Subskrybcje</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Przegląd</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Na czasie</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Ostatnio dodane</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Lokalne</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Więcej</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administracja</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Toggle dark interface</source>
<target>Przełącz ciemny interfejs</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>No results.</source>
<target>Brak wyników.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- O instancji <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Anuluj
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Wyślij</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Zasady</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Rejestracja użytkowników jest dozwolona i</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- ta instancja oferuje podstawową powierzchnię <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> na filmy swoich użytkowników.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- ta instancja oferuje nieograniczoną powierzchnię na filmy dla swoich użytkowników.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Rejestracja użytkowników nie jest obecnie dozwolona.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Krótki opis</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source><target>Default client route</target><context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Przegląd Filmów</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Filmy na czasie</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Ostatnio dodane filmy</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Lokalne filmy</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Polityka dotycząca filmów zawierających wrażliwą zawartość</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Wymagana rejestracja</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Rejestracja wymaga weryfikacji emaila</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limit rejestracji</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Użytkownicy</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Domyślna powierzchnia na filmy dla użytkownika</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importuj</target>
<source>Administrator</source>
<target>Administrator</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>E-mail administratora</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Użytkownicy</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Domyślna powierzchnia na filmy dla użytkownika</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Twoja nazwa użytkownika na Twitterze</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Oznacza konto Twittera dla strony lub platformy na której została opublikowana zawartość.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instancja jest na białej liście Twittera</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transkodowanie</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transkodowanie jest włączone</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Jeżeli wyłączysz transkodowanie, wiele filmów od użytkowników może nie działać!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Wątki transkodowania</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Włączono rozdzielczość <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Rozmiar pamięci podręcznej podglądu</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Dostosowywanie</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Wprowadź kod JavaScript.<br />Przykład: <pre>console.log('moja instancja jest świetna');</pre></target>
<context-group name="null">
- <context context-type="linenumber">281</context>
+ <context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
<source>Advanced configuration</source>
<target>Zaawansowana konfiguracja</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Aktualizuj konfigurację</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Wygląda na to, że konfiguracja jest nieprawidłowa. Poszukaj możliwych błędów w innych kartach.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Actions</source>
<target>Akcje</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Moje ustawienia</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Moja biblioteka</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Moje kanały</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Moje filmy</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Moje subskrybcje</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Moje importy</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Powierzchnia na filmy:</target>
<source>Profile</source>
<target>Profil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Ustawienia wideo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Wyślij</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetlenia</target>
<source>Publish will be available when upload is finished</source>
<target>Opublikuj automatycznie po ukończeniu wysyłania</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Opublikuj</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
<source>Wait transcoding before publishing the video</source>
<target>Poczekaj na transkodowanie przed opublikowaniem filmu</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Upload thumbnail</source>
<target>Wyślij miniaturę</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Podgląd wysyłania</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Krótki tekst informujący innych, jak mogą Cię wesprzeć (platforma członkowska…).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Ustawienia zaawansowane</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Anuluj
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Udostępnij</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Błąd podczas uzyskiwania informacji z serwera</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Brak opisu</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Błąd</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Pomyślnie</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Zaktualizowano konfigurację.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Czy na pewno chcesz usunąć <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Skutkuje to usunięciem wszystkich filmów wysłanych na ten kanał.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Wprowadź nazwę kanału wideo, aby potwierdzić</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Moje filmy</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Kanały</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Moja biblioteka</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Moje kanały</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Moje subskrybcje</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Moje ustawienia</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Błąd</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Musisz połączyć się ponownie.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Informacja</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Pomyślnie</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
<source>Your password has been successfully reset!</source>
<target>Pomyślnie zresetowano hasło!</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>Adres e-mail jest wymagany.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>Adres e-mail musi być prawidłowy.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Nazwa użytkownika jest wymagana.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Nazwa użytkownika musi zawierać przynajmniej 3 znaki.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Nazwa użytkownika nie może być dłuższa niż 20 znaków.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Nazwa użytkownika może zawierać tylko małe znaki alfanumeryczne.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>Adres e-mail jest wymagany.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>Adres e-mail musi być prawidłowy.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Hasło musi składać się z przynajmniej 6 znaków.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Nazwa wyświetlana musi zawierać przynajmniej 3 znaki.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Nazwa wyświetlana nie może zawierać więcej niż 120 znaków.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Opis musi zawierać przynajmniej 3 znaki.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Przyczyna zgłoszenia nie może zawierać więcej niż 300 znaków.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
<source>The username is required.</source>
<target>Nazwa użytkownika jest wymagana.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Nazwa musi zawierać przynajmniej 3 znaki.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Nazwa nie może być dłuższa niż 20 znaków.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Nazwa może zawierać tylko małe znaki alfanumeryczne.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Tekst o wsparciu musi zawierać przynajmniej 3 znaki.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Informacja</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Anulowano wysyłanie</target>
<source>Password</source>
<target>Senha</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Entrar</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Me envie um e-mail para redefinir minha senha</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Inscrever-se</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Alterar o idioma</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Meu perfil público
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Minha conta
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Meus vídeos
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Sair
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Criar uma conta</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Inscrições</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Visão geral</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Tendências</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Adicionado recentemente</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Local</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Mais</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administração</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Toggle dark interface</source>
<target>Alternar interface escura</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>No results.</source>
<target>Nenhum resultado.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- Sobre a instância <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Cancelar
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Enviar</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Termos</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Registro de usuários não está permitida e</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- esta instância fornece uma cota base de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> espaço para os vídeos de seus usuários.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- esta instância fornece espaço ilimitado para os vídeos de seus usuários.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Registro de usuários atualmente não está permitido.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Descrição curta</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Rota padrão do cliente</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Visão geral dos vídeos</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Vídeos em Tendência</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Vídeos Adicionados Recentemente</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Vídeos locais</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Política sobre vídeos que possuem conteúdo sensível</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Inscrição permitida</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Inscrição requer verificação de email</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Limite de inscrições</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Usuários</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Cota padrão de vídeos do usuário</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Padrão de limite diário de upload</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importar</target>
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Importação de vídeo com um arquivo torrent ou URI magnética habilitada</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administrador</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Email de administrador</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Usuários</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Cota padrão de vídeos do usuário</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Padrão de limite diário de upload</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Seu nome de usuário no Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Indica a conta Twitter do sítio web ou plataforma em que o conteúdo foi publicado.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instância listada como permitida pelo Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Transcodificação</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Transcodificação ativada</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Se você desativar a transcodificação, muitos vídeos dos seus usuários não funcionarão!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Threads de transcodificação</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Resolução <x id="INTERPOLATION" equiv-text="{{resolution}}"/> habilitada</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Alguns arquivos não são federados (pré-visualizações, legendas ocultas). Nós as obtivemos diretamente da instância de origem e a colocamos em cache.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Tamanho do cache de pré-visualizações</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Tamanho do cache de legendas ocultas de vídeos</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Personalizações</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Escreva diretamente código JavaScript.<br />Exemplo: <pre>console.log('minha instância é demais');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Escreva código CSS diretamente. Exemplo:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Preceda com <em>#custom-css</em> para sobrescrever estilos. Exemplo:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Configurações avançadas</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Atualizar configuração</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Aparentemente a configuração está valida. Por favor procure potenciais erros nas diferentes abas.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>Motivo do banimento:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Ações</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Motivo da lista negra:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Minhas configurações</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Minha biblioteca</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Meus canais</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Meus vídeos</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Minhas inscrições</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Minhas importações</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Mudanças de dono</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Cota de vídeo:</target>
<source>Profile</source>
<target>Perfil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Configurações de vídeo</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Zona perigosa</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Enviar</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target>
<context context-type="linenumber">30</context>
</context-group>
</trans-unit>
+ <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
+ <source>Current password</source>
+ <target>Senha atual</target>
+ <context-group name="null">
+ <context context-type="linenumber">7</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
<source>New password</source>
<target>Nova senha</target>
<source>Publish will be available when upload is finished</source>
<target>A publicação estará disponível quando o envio terminar</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publicar</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Aguarde a transcodificação antes de publicar o vídeo</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Se você decidir não aguardar a transcodificação antes de publicar o vídeo, ele poderá não ser reproduzido até que a transcodificação termine.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Adicionar outra legenda oculta</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Veja o arquivo de legenda</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Cancelar criação</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Cancelar exclusão</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Legendas ocultas</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Enviar miniatura</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Enviar pré-visualização</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Texto curto para dizer às pessoas como elas podem apoiar você (plataforma de membros, etc.).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Configurações avançadas</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Cancelar
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Compartilhar</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Erro ao obter detalhes do servidor</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Nenhuma descrição</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Erro</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Sucesso</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Configuração atualizada.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Você realmente deseja excluir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Isso também excluirá todos os vídeos enviados neste canal.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Por favor, digite o nome do canal de vídeo para confirmar</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Meus vídeos</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Canais</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Minha biblioteca</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Importações de vídeos</target>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Meus canais</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Minhas inscrições</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Mudanças de dono</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Minhas configurações</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Erro</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>você precisa se reconectar.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Info</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Sucesso</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Nome de usuário ou senha incorretos.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>E-mail é necessário.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>E-mail deve ser válido.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Nome de usuário é necessário.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Nome de usuário deve ter pelo menos 3 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Nome de usuário não pode ter mais que 20 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Nome de usuário deve ter apenas caracteres alfanuméricos minúsculos.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>E-mail é necessário.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>E-mail deve ser válido.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Senha deve ter pelo menos 6 caracteres.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Nome de exibição deve ter pelo menos 3 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Nome de exibição não pode ter mais que 120 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Descrição deve ter pelo menos 3 caracteres.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Motivo da denúncia não pode ter mais que 300 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Comentário de moderação é obrigatório.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Comentário de moderação não pode ter mais de 300 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>O canal é obrigatório.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Nome deve ter pelo menos 3 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Nome não pode ter mais de 20 caracteres.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Nome deve ser apenas caracteres alfanuméricos minúsculos.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Texto de apoio deve ter pelo menos 3 caracteres.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Inscrito</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>Inscrito em <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Desinscrito</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Inscrito</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Desinscrito</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
<source>Only I can see this video</source>
<target>Apenas eu posso ver este vídeo</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Info</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Envio cancelado</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Lamentamos, mas o PeerTube não consegue lidar com vídeos> 8GB</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Sua quota de vídeos é excedida com este vídeo (tamanho do vídeo: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, utilizado: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>Пароль</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Авторизация</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Отправить пароль на электронную почту</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Зарегистрироваться</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Изменить язык</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Мой побличный профиль
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Моя учетная запись
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Мои видео
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Выйти
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Создать учетную запись</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Подписки</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Общий вид</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Тенденции</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Недавно добавленный </target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Локальный</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Больше</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Администрация</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Toggle dark interface</source>
<target>Изменить интерфейс</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>No results.</source>
<target>Нет результатов</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
- <source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>
- О <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> Инстанци
-</target>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Отправить</target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Условия пользователя </target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Создания учетной записи разрешено и</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- этот сервер предоставляет <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> места для видео для пользователей.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- этот сервер предоставляет неограниченное место для пользователей.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Создание учетной записи не разрешено в данный момент.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>Краткое описание</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Default client route</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Все видео</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Тенденции видео</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Недавно добавленное видео</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Местное видео</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Политика касательно видео содержащих нежелательный контент</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Регистрация активирована</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Для регистрации нужно подтвержение через электронную почту</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Лимит регистрации</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Пользователи</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Квота видео по умолчанию на одного пользователя</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Ежедневный лимит загрузок по умолчанию на одгого пользователя</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Импортировать</target>
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Импорт видео с помощью файла торент или magnet URI активирован</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Администратор</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Электронная почта администратора</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Пользователи</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Квота видео по умолчанию на одного пользователя</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Ежедневный лимит загрузок по умолчанию на одгого пользователя</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Ваше имя пользователя в Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Показывает учетнаю запись в Twitter сайта или платформы с которых было опубликован контент</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Сервер имеет аккредитацию Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Транскодирование</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Транскодирование активировано</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Если вы дезактивируете транскодирование, многие видео пользователей перестанут работать</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Количество threads для транскодирования</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Разрешение <x id="INTERPOLATION" equiv-text="{{resolution}}"/> активировано</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Некоторые миниатюры не федератные (миниатюры, названия). Они взяты непосредственно из их оригинального сервера и мы их не храним.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Размер кеша предпросмотра</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Размер кеша предпросмотра надписей</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Персонализация</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>Ява Скрипт</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Напишите непосредственно код Ява Скрипта .<br />Пример : <pre>console.log('мой сервер крут');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Напишите непосредственно код CSS. Пример:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Начните с <em>#custom-css</em> чтоб получить приоритет. Пример:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Продвинутая конфигурация</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Обновить конфигурацию</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Конфигурация неудачная. Пожалуйста, найдите потенциальную ошибку в разных окнах. </target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>Причины бана:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Действия</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Дата <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Причина блокирования:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Мои настройки</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Моя библиотека</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Мои каналы</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Мои видео</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Мои подписки</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Мои импортированные видео</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Смена собственника</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>Квота видео</target>
<source>Profile</source>
<target>Профиль</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Настройки видео</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Орасная зона</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Отправить</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> просмотры</target>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Мои видео</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Моя библиотека</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Мои каналы</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Мои подписки</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Смена собственника</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Мои настройки</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
<source>Transcoding threads is required.</source>
<target>Транскодирование потоки требуется.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Имя пользователя должно быть длиной не менее 3-х символов.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Пароль должен быть длиной не менее 6 символов.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Отображаемое имя должно иметь длину не менее 3-х символов.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Описание должно быть длиной не менее 3-х символов.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Длина имени должна быть не менее 3 символов.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Текст поддержки должен содержать не менее 3 символов.</target>
<source>Password</source>
<target>Lösenord</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>Logga in</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>Skicka ett e-postmeddelande för att återställa mitt lösenord</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>Registrering</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>Ändra språk</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
Min offentliga profil
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
Mitt konto
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
Mina videor
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
Logga ut
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>Skapa ett konto</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>Prenumerationer</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>Översikt</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>Populärt</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>Nyligen tillagt</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>Lokalt</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>Mer</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>Administration</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>Visa kortkommandon</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>Växla mörkt gränssnitt</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>Visa olistade och privata videor</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>Inga resultat.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- Om instansen <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ Avbryt
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>Skicka</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>Villkor</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>Användarregistrering är tillåten och</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- den här instansen tillhandahåller en grundkvot på <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> utrymme för sina användares videor.
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- den här instansen tillhandahåller obegränsat utrymme för sina användares videor.
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- Användarregistrering tillåts inte för tillfället.
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
</context-group>
</trans-unit>
<trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
- <source>Muted</source><target>Muted</target><context-group name="null">
+ <source>Muted</source>
+ <target>Ignorerad</target>
+ <context-group name="null">
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
- <source>Muted by your instance</source><target>Muted by your instance</target><context-group name="null">
+ <source>Muted by your instance</source>
+ <target>Ignorerad av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
- <source>Instance muted</source><target>Instance muted</target><context-group name="null">
+ <source>Instance muted</source>
+ <target>Instans ignorerad</target>
+ <context-group name="null">
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
- <source>Instance muted by your instance</source><target>Instance muted by your instance</target><context-group name="null">
+ <source>Instance muted by your instance</source>
+ <target>Instans ignorerad av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<source>Short description</source>
<target>Kort beskrivning</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>Klientens standardrouting</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>Videoöversikt</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>Populära videor</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>Nyligen tillagda videor</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>Lokala videor</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>Policy för videor med känsligt innehåll</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>Registrering aktiverad</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>Registrering kräver e-postverifikation</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>Registreringsgräns</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>Användare</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>Standardkvot för användares videor</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>Standarduppladdningsgräns för användare</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>Importera</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>Videoimport med HTTP-URL tillåten (t.ex. YouTube)</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>Videoimport med torrentfil eller magnet-URI är tillåten</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>Administratör</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>Administratörens e-postadress</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>Användare</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>Standardkvot för användares videor</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>Standarduppladdningsgräns för användare</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>Ditt användarnamn på Twitter</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>Webbplatsens eller plattformens Twitterkonto, på vilken innehållet publicerades.</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>Instans vitlistad av Twitter</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>Omkodning</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>Omkodning aktiverad</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>Om du avaktiverar omkodning, kommer många av dina användares videor inte fungera!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>Omkodningstrådar</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>Upplösningen <x id="INTERPOLATION" equiv-text="{{resolution}}"/> tillåten</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>Vissa filer är inte federerade (till exempel förhandsvisningar och undertexter). Vi kan hämta dem direkt från ursprungsinstansen och cachelagra dem.</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>Förhandsvisningens cachestorlek</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>Undertexternas cachestorlek</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>Anpassningar</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>Skriv direkt med JavaScript-kod.<br />Exempel: <pre>console.log('min instans är fantastisk');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- Skriv CSS-kod direkt. Exempel:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Lägg till <em>#custom-css</em> först för att åsidosätta stilmallen. Exempel:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>Avancerade inställningar</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>Uppdatera inställningar</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>Det verkar som att konfigurationen inte stämmer. Sök efter eventuella fel i de olika flikarna.</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<context context-type="linenumber">133</context>
</context-group>
</trans-unit>
+ <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
+ <source>User's email must be verified to login</source>
+ <target>Användarens e-post måste verifieras innan inloggning</target>
+ <context-group name="null">
+ <context context-type="linenumber">72</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
+ <source>User's email is verified / User can login without email verification</source>
+ <target>Användarens e-post har verifierats / Användaren behöver inte verifiera sin e-post för att logga in</target>
+ <context-group name="null">
+ <context context-type="linenumber">76</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>Blockeringsanledning:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>Åtgärder</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>Anledning för svartlistning:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
</context-group>
</trans-unit>
<trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
- <source>Muted accounts</source><target>Muted accounts</target><context-group name="null">
+ <source>Muted accounts</source>
+ <target>Ignorerade konton</target>
+ <context-group name="null">
<context context-type="linenumber">2</context>
</context-group>
</trans-unit>
<trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
- <source>Muted servers</source><target>Muted servers</target><context-group name="null">
+ <source>Muted servers</source>
+ <target>Ignorerade servrar</target>
+ <context-group name="null">
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
</context-group>
</trans-unit>
<trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
- <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source><target>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target><context-group name="null">
+ <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
+ <target>Ignorerad på <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
+ <context-group name="null">
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
- <source>Unmute</source><target>Unmute</target><context-group name="null">
- <context context-type="linenumber">23</context>
- </context-group>
- </trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>Mina inställningar</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>Mitt bibliotek</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>Mina kanaler</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>Mina videor</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>Mina prenumerationer</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>Mina importeringar</target>
+ <source>Unmute</source>
+ <target>Sluta ignorera</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>Diverse</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source><target>Muted instances</target><context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>Ändringar av ägarskap</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Profile</source>
<target>Profil</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>Videoinställningar</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>Riskzon</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>Skicka</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>Ignorerade instanser</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>Ändra lösenord</target>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
+ <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
+ <source>Sorry, but something went wrong</source>
+ <target>Någonting har tyvärr gått fel</target>
+ <context-group name="null">
+ <context context-type="linenumber">49</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
<source>
Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
<source>Publish will be available when upload is finished</source>
<target>Du kan publicera när uppladdningen är klar</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>Publisera</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>Publicera video när omkodningen är avklarad</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>Om du väljer att inte vänta på omkodningen innan publicering, kommer videon inte gå att spela förrän omkodningen är färdig.</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>Lägg till ännu en text</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>Se undertextfilen</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>Redan uppladdad ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>Kommer skapas vid uppdatering</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>Avbryt skapande</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>Kommer raderas vid uppdatering</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>Avbryt radering</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
Inga undertexter för tillfället.
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>Texter</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>Ladda upp miniatyrbild</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>Ladda upp förhandsvisning</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>Kort text för att berätta hur andra kan stödja dig (medlemsplattform …).</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>Avancerade inställningar</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- Avbryt
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>Dela</target>
the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.
</source>
<target>
- den här videons delningssystem medför att en del teknisk information om ditt system (såsom publik IP-adress) kan skickas till andra serventer.
+ den här videons delningssystem gör att en del teknisk information om ditt system (som publik IP-adress) kan skickas till andra serventer.
</target>
<context-group name="null">
<context context-type="linenumber">209</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>Kan inte hämta information om instansen från servern</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>Ingen beskrivning</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>Fel</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>Åtgärden lyckades</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>Konfigurering uppdaterad.</target>
</context-group>
</trans-unit>
<trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
+ <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av din instans.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
- <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</target><context-group name="null">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
+ <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av din instans.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
+ <source>Set Email as Verified</source>
+ <target>Markera e-post som verifierad</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
<source>You cannot ban root.</source>
<target>Du kan inte blockera root.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
+ <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
+ <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användares e-post har markerats som verifierade.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
+ <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
- <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</target><context-group name="null">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
+ <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>Vill du verkligen radera <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Det kommer radera samtliga videor som laddats upp till kanalen.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>Fyll i kanalens namn för att bekräfta</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>Mina videor</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>Kanaler</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>Mitt bibliotek</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>Mina kanaler</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>Videoimporteringar</target>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>Mina prenumerationer</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>Diverse</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>Ändringar av ägarskap</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>Mina inställningar</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>Fel</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>Du måste återansluta.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>Information</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>Åtgärden lyckades</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>Felaktigt användarnamn eller lösenord.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>E-postadress måste uppges.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>E-postadressen måste vara giltig.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>Användarnamn måste fyllas i.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>Användarnamnet måste innehålla minst tre tecken.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>Användarnamnet får inte vara mer än 20 tecken långt.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>Användarnamnet får endast bestå av små bokstäver och siffror.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>E-postadress måste uppges.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>E-postadressen måste vara giltig.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>Lösenordet måste innehålla minst sex tecken.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>Visningsnamnet måste innehålla minst tre tecken.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>Visningsnamnet får inte vara mer än 120 tecken långt.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>Beskrivningen måste innehålla minst tre tecken.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>Orsak för rapportering får inte vara mer än 300 tecken lång.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>Moderationskommentar krävs.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>Moderationskommentaren får inte vara mer än 300 tecken lång.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>Kanalen måste anges.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>Namnet måste innehålla minst tre tecken.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>Namnet får inte vara mer än 20 tecken långt.</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>Namnet kan endast bestå av små bokstäver och siffror</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>Supporttexten måste innehålla minst tre tecken.</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
+ <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
+ <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/>s e-post har markerats som verifierad.</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
+ <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
- <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</target><context-group name="null">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
+ <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
+ <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras av instansen.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
- <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</target><context-group name="null">
+ <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
+ <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av instansen.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
- <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</target><context-group name="null">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
+ <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras av instansen.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
- <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</target><context-group name="null">
+ <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
+ <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av instansen.</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
- <source>Mute this account</source><target>Mute this account</target><context-group name="null">
+ <source>Mute this account</source>
+ <target>Ignorera det här kontot</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
- <source>Unmute this account</source><target>Unmute this account</target><context-group name="null">
+ <source>Unmute this account</source>
+ <target>Sluta ignorera det här kontot</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
- <source>Mute the instance</source><target>Mute the instance</target><context-group name="null">
+ <source>Mute the instance</source>
+ <target>Ignorera instansen</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
- <source>Unmute the instance</source><target>Unmute the instance</target><context-group name="null">
+ <source>Unmute the instance</source>
+ <target>Sluta ignorera instansen</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
- <source>Mute this account by your instance</source><target>Mute this account by your instance</target><context-group name="null">
+ <source>Mute this account by your instance</source>
+ <target>Ignorera det här kontot av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
- <source>Unmute this account by your instance</source><target>Unmute this account by your instance</target><context-group name="null">
+ <source>Unmute this account by your instance</source>
+ <target>Sluta ignorera det här kontot av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
- <source>Mute the instance by your instance</source><target>Mute the instance by your instance</target><context-group name="null">
+ <source>Mute the instance by your instance</source>
+ <target>Ignorera instansen av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
- <source>Unmute the instance by your instance</source><target>Unmute the instance by your instance</target><context-group name="null">
+ <source>Unmute the instance by your instance</source>
+ <target>Sluta ignorera instansen av din instans</target>
+ <context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>Prenumererar</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>Prenumererar på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>Prenumeration avbruten</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>Prenumererar</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>Prenumeration avbruten</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>Moderator</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>Information</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>Uppladdningen avbröts</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>Vi ber om ursäkt, PeerTube kan tyvärr inte hantera videor större än 8GB</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>Den här videon kommer överskrida din videokvot (videostorlek: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, använt: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, kvot: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>கடவுச்சொல்</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
<source>Login</source>
<target>உள்நுழை</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Change the language</source>
<target>மொழியை மாற்று</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
வெளியேறு
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>கணக்கை உருவாக்கு</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>சமீபத்தியவை</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>மேலும்</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>No results.</source>
<target>முடிவுகள் இல்லை.</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
<source>Users</source>
<target>பயணர்கள்</target>
<context-group name="null">
- <context context-type="linenumber">144</context>
+ <context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
<source>Your Twitter username</source>
<target>உங்கள் Twitter பயணர்பெயர்</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Password</source>
<target>密码</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>登录</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>发送密码重置邮件</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>注册</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>更改语言</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
我的公开个人资料
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
我的帐户
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
我的视频
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
注销
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>创建帐户</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>订阅内容</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>总览</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>时下流行</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>最近添加</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>本地</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>更多</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>管理</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>显示键盘快捷键</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>切换夜间模式</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>显示不公开和私享视频</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>没有结果。</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
+ Cancel
+ </source>
<target>
- 关于实例 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
-</target>
+ 取消
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>提交</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>条款</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>当前开放注册,并且</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>
- 本实例为用户上传的视频提供 <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 的基本存储空间。
- </target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>
- 本实例为用户上传的视频提供无限制的存储空间。
- </target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>
- 当前不开放注册。
- </target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>简介</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>首页默认内容</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>视频总览</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>时下流行的视频</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>最近添加的视频</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>本地视频</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>针对包含敏感内容视频的策略</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>开放注册</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>注册需要验证电子邮件地址</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>注册限制</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>用户</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>用户默认视频存储空间大小</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>用户默认单日上传限额</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>导入</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>允许通过 HTTP URL(例如 YouTube)导入视频</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>允许通过种子文件或磁力链导入视频</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>管理员</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>管理员电子邮件地址</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>用户</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>用户默认视频存储空间大小</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>用户默认单日上传限额</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>您的 Twitter 用户名</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>显示此内容所在的发布平台对应的 Twitter 帐户。</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>实例已进入 Twitter 白名单</target>
<context-group name="null">
- <context context-type="linenumber">198</context>
+ <context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
<source>Transcoding</source>
<target>转码</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>启用转码</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>如果禁用转码,用户上传的视频很有可能无法正常播放!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>转码线程数</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>启用 <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 分辨率</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>部分文件不会自动同步(如预览图、字幕)。我们会直接从源实例拉取并进行缓存。</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>预览图缓存大小</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>视频字幕缓存大小</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>自定义</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>在此处直接输入 JavaScript 代码。<br />示例:<pre>console.log('我的实例太棒了');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- 在此处直接输入 CSS 代码。示例:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- 您可以通过插入 <em>#custom-css</em> 来覆盖样式设置。示例:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>高级设置</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>更新设置</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>设置信息不合法。请检查各选项卡中的设置是否存在错误。</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>Ban reason:</source>
<target>封禁理由:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>操作</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>黑名单理由:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>我的设置</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>我的库</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>我的频道</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>我的视频</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>我的订阅</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>我的导入</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>杂项</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>已屏蔽的实例</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>视频转移</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>视频存储空间:</target>
<source>Profile</source>
<target>个人资料</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>视频设置</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>危险选项</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>提交</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>已屏蔽的实例</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>更改密码</target>
<source>Publish will be available when upload is finished</source>
<target>上传完毕后即可发布</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>发布</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>等待转码完毕后再发布视频</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>如果您选择不等待转码就发布视频,则视频在转码完毕前很有可能无法正常播放。</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>添加字幕</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>查看字幕文件</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>已上传 ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>将在更新时创建</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>取消创建</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>将在更新时删除</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>取消删除</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
当前没有字幕。
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>字幕</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>上传缩略图</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>上传预览图</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>用一段简短的文字告知观众支持您的频道的方法(赞助社区等)。</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>高级设置</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- 取消
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>分享</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>从服务器获取关于信息时发生错误</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>没有说明</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>错误</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>成功</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>设置已更新。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>您确定要删除 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 吗?这将同时删除上传至该频道的所有视频。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>输入视频频道的显示名以确认操作</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>视频频道 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>视频频道 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>我的视频</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>é¢\91é\81\93</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>æ\88\91ç\9a\84åº\93</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>导入的视频</target>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>我的频道</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>我的订阅</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>杂项</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>视频转移</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>我的设置</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>错误</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>请重新进行授权。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>提示</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>成功</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>用户名或密码不正确。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>请输入电子邮件地址。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>请输入合法的电子邮件地址。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>请输入用户名。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>用户名应至少 3 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>用户名不能超过 20 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>用户名只能使用小写字母和数字。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>请输入电子邮件地址。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>请输入合法的电子邮件地址。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>密码应至少 6 个字符。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>显示名称应至少 3 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>显示名称不能超过 120 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>说明应至少 3 个字符。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>举报理由不能超过 300 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>请输入运营备注信息。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>运营备注信息不能超过 300 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>必须指定频道。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>频道用户名应至少 3 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>频道用户名不能超过 20 个字符。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>频道用户名只能使用小写字母和数字。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>支持信息应至少 3 个字符。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>已订阅</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>成功订阅 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>已退订</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>已订阅</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>已退订</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>监察员</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>提示</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>上传已取消</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>非常抱歉,PeerTube 不支持 8GB 以上的视频</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>此视频已超出您的视频存储总空间(视频大小:<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>,当前已使用:<x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,总空间:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<source>Password</source>
<target>密碼</target>
<context-group name="null">
- <context context-type="linenumber">12</context>
+ <context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
<source>Login</source>
<target>登入</target>
<context-group name="null">
- <context context-type="linenumber">38</context>
+ <context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
<source>Send me an email to reset my password</source>
<target>傳送電子郵件給我以重設我的密碼</target>
<context-group name="null">
- <context context-type="linenumber">75</context>
+ <context context-type="linenumber">80</context>
</context-group>
</trans-unit>
<trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
<source>Signup</source>
<target>註冊</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">78</context>
</context-group>
</trans-unit>
<trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
<source>Change the language</source>
<target>變更語言</target>
<context-group name="null">
- <context context-type="linenumber">88</context>
+ <context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
我的公開個人資料
</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
我的帳號
</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
我的影片
</target>
<context-group name="null">
- <context context-type="linenumber">26</context>
+ <context context-type="linenumber">24</context>
</context-group>
</trans-unit>
<trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
登出
</target>
<context-group name="null">
- <context context-type="linenumber">30</context>
+ <context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
<source>Create an account</source>
<target>建立帳號</target>
<context-group name="null">
- <context context-type="linenumber">39</context>
+ <context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
<source>Subscriptions</source>
<target>訂閱</target>
<context-group name="null">
- <context context-type="linenumber">47</context>
+ <context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
<source>Overview</source>
<target>概覽</target>
<context-group name="null">
- <context context-type="linenumber">52</context>
+ <context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
<source>Trending</source>
<target>趨勢</target>
<context-group name="null">
- <context context-type="linenumber">57</context>
+ <context context-type="linenumber">55</context>
</context-group>
</trans-unit>
<trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
<source>Recently added</source>
<target>最近新增</target>
<context-group name="null">
- <context context-type="linenumber">62</context>
+ <context context-type="linenumber">60</context>
</context-group>
</trans-unit>
<trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
<source>Local</source>
<target>本地</target>
<context-group name="null">
- <context context-type="linenumber">67</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
<source>More</source>
<target>更多</target>
<context-group name="null">
- <context context-type="linenumber">72</context>
+ <context context-type="linenumber">70</context>
</context-group>
</trans-unit>
<trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
<source>Administration</source>
<target>管理</target>
<context-group name="null">
- <context context-type="linenumber">76</context>
+ <context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
<source>Show keyboard shortcuts</source>
<target>顯示鍵盤快捷鍵</target>
<context-group name="null">
- <context context-type="linenumber">91</context>
+ <context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
<source>Toggle dark interface</source>
<target>切換至暗色介面</target>
<context-group name="null">
- <context context-type="linenumber">94</context>
+ <context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
<source>Display unlisted and private videos</source>
<target>顯示未列出與私密影片</target>
<context-group name="null">
- <context context-type="linenumber">11</context>
+ <context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
<source>No results.</source>
<target>沒有結果</target>
<context-group name="null">
- <context context-type="linenumber">17</context>
+ <context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
- <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
+ <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
<source>
- About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
-</source>
- <target>關於 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 實體</target>
+ Cancel
+ </source>
+ <target>
+ 取消
+ </target>
<context-group name="null">
- <context context-type="linenumber">1</context>
+ <context context-type="linenumber">26</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
+ <source>Submit</source>
+ <target>遞交</target>
+ <context-group name="null">
+ <context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
<source>Terms</source>
<target>條款</target>
<context-group name="null">
- <context context-type="linenumber">44</context>
+ <context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
<source>User registration is allowed and</source>
<target>允許使用者註冊與</target>
<context-group name="null">
- <context context-type="linenumber">25</context>
- </context-group>
- </trans-unit>
- <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
- <source>
- this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
- </source>
- <target>此實體提供了基本配額 <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 空間給它的使用者的影片。</target>
- <context-group name="null">
- <context context-type="linenumber">27</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
- <source>
- this instance provides unlimited space for the videos of its users.
- </source>
- <target>此實體提供了無限的影片空間給它的使用者。</target>
- <context-group name="null">
- <context context-type="linenumber">31</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
- <source>
- User registration is currently not allowed.
- </source>
- <target>目前不允許使用者註冊。</target>
- <context-group name="null">
- <context context-type="linenumber">36</context>
+ <context context-type="linenumber">29</context>
</context-group>
</trans-unit>
<trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
<source>Short description</source>
<target>短描述</target>
<context-group name="null">
- <context context-type="linenumber">22</context>
+ <context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
<source>Default client route</source>
<target>預設客戶端路由</target>
<context-group name="null">
- <context context-type="linenumber">55</context>
+ <context context-type="linenumber">48</context>
</context-group>
</trans-unit>
<trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
<source>Videos Overview</source>
<target>影片概覽</target>
<context-group name="null">
- <context context-type="linenumber">58</context>
+ <context context-type="linenumber">51</context>
</context-group>
</trans-unit>
<trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
<source>Videos Trending</source>
<target>影片趨勢</target>
<context-group name="null">
- <context context-type="linenumber">59</context>
+ <context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
<source>Videos Recently Added</source>
<target>最近新增的影片</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
<source>Local videos</source>
<target>本地影片</target>
<context-group name="null">
- <context context-type="linenumber">61</context>
+ <context context-type="linenumber">54</context>
</context-group>
</trans-unit>
<trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
<source>Policy on videos containing sensitive content</source>
<target>包含敏感內容的影片政策</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
<source>Signup enabled</source>
<target>已啟用註冊</target>
<context-group name="null">
- <context context-type="linenumber">93</context>
+ <context context-type="linenumber">84</context>
</context-group>
</trans-unit>
<trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
<source>Signup requires email verification</source>
<target>註冊需要電子郵件驗證</target>
<context-group name="null">
- <context context-type="linenumber">100</context>
+ <context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
<source>Signup limit</source>
<target>限制註冊</target>
+ <context-group name="null">
+ <context context-type="linenumber">96</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
+ <source>Users</source>
+ <target>使用者</target>
<context-group name="null">
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
+ <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
+ <source>User default video quota</source>
+ <target>使用者預設影片配額</target>
+ <context-group name="null">
+ <context context-type="linenumber">109</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
+ <source>User default daily upload limit</source>
+ <target>預設使用者每日上傳限制</target>
+ <context-group name="null">
+ <context context-type="linenumber">121</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
<source>Import</source>
<target>匯入</target>
<source>Video import with HTTP URL (i.e. YouTube) enabled</source>
<target>以 HTTP URL 匯入影片(如 YouTube)已啟用</target>
<context-group name="null">
- <context context-type="linenumber">120</context>
+ <context context-type="linenumber">141</context>
</context-group>
</trans-unit>
<trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
<source>Video import with a torrent file or a magnet URI enabled</source>
<target>已啟用種子檔案或磁力連結匯入影片</target>
<context-group name="null">
- <context context-type="linenumber">127</context>
+ <context context-type="linenumber">148</context>
</context-group>
</trans-unit>
<trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
<source>Administrator</source>
<target>管理員</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">155</context>
</context-group>
</trans-unit>
<trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
<source>Admin email</source>
<target>管理電子郵件</target>
<context-group name="null">
- <context context-type="linenumber">134</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
- <source>Users</source>
- <target>使用者</target>
- <context-group name="null">
- <context context-type="linenumber">144</context>
- </context-group>
- </trans-unit>
- <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
- <source>User default video quota</source>
- <target>使用者預設影片配額</target>
- <context-group name="null">
- <context context-type="linenumber">147</context>
- </context-group>
- </trans-unit>
- <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
- <source>User default daily upload limit</source>
- <target>預設使用者每日上傳限制</target>
- <context-group name="null">
- <context context-type="linenumber">161</context>
+ <context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
<source>Your Twitter username</source>
<target>您的 Twitter 使用者名稱</target>
<context-group name="null">
- <context context-type="linenumber">181</context>
+ <context context-type="linenumber">184</context>
</context-group>
</trans-unit>
<trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
<source>Indicates the Twitter account for the website or platform on which the content was published.</source>
<target>指示發佈影片的網頁或平臺的 Twitter 帳號</target>
<context-group name="null">
- <context context-type="linenumber">184</context>
+ <context context-type="linenumber">187</context>
</context-group>
</trans-unit>
<trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
<source>Instance whitelisted by Twitter</source>
<target>由 Twitter 列入白名單的實體</target>
- <context-group name="null">
- <context context-type="linenumber">198</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8b0ee765cc3fea9baef14bfb9d5288dfcbe386b6">
- <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
- If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
- Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted.</source>
- <target>如果您的實體在 Twitter 的白名單裡面,PeerTube 的影片分享將會在 Twitter 的推文中嵌入影片播放器。<br />
- 如果實體不在白名單中,我們會使用一張圖片連結卡片並重新導向至您的 PeerTube 實體。<br /><br />
- 在此勾選框打勾,儲存設定並使用您實體的影片 URL (https://example.com/videos/watch/blabla)在 <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> 上測試以檢視您的實體是否在白名單內。</target>
<context-group name="null">
<context context-type="linenumber">199</context>
</context-group>
<source>Transcoding</source>
<target>轉換編碼</target>
<context-group name="null">
- <context context-type="linenumber">210</context>
+ <context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
<source>Transcoding enabled</source>
<target>轉換編碼已啟用</target>
<context-group name="null">
- <context context-type="linenumber">215</context>
+ <context context-type="linenumber">221</context>
</context-group>
</trans-unit>
<trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
<source>If you disable transcoding, many videos from your users will not work!</source>
<target>若您停用轉換編碼,從您的使用者們而來的許多影片將會無法運作!</target>
<context-group name="null">
- <context context-type="linenumber">216</context>
+ <context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
<source>Transcoding threads</source>
<target>轉換編碼執行緒</target>
<context-group name="null">
- <context context-type="linenumber">223</context>
+ <context context-type="linenumber">237</context>
</context-group>
</trans-unit>
<trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
<source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
<target>解析度 <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 已啟用</target>
<context-group name="null">
- <context context-type="linenumber">239</context>
+ <context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
<x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="<my-help>"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="</my-help>"/>
</target>
<context-group name="null">
- <context context-type="linenumber">244</context>
+ <context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
<source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
<target>有一些檔案並未聯盟化(預覽、字幕)。我們會直接從原始實體擷取它們並快取。</target>
<context-group name="null">
- <context context-type="linenumber">249</context>
+ <context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
<source>Previews cache size</source>
<target>預覽快取大小</target>
<context-group name="null">
- <context context-type="linenumber">254</context>
+ <context context-type="linenumber">271</context>
</context-group>
</trans-unit>
<trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
<source>Video captions cache size</source>
<target>影片字幕快取大小</target>
<context-group name="null">
- <context context-type="linenumber">265</context>
+ <context context-type="linenumber">280</context>
</context-group>
</trans-unit>
<trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
<source>Customizations</source>
<target>自訂</target>
<context-group name="null">
- <context context-type="linenumber">275</context>
+ <context context-type="linenumber">289</context>
</context-group>
</trans-unit>
<trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
<source>JavaScript</source>
<target>JavaScript</target>
<context-group name="null">
- <context context-type="linenumber">278</context>
+ <context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
<source>Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre></source>
<target>直接編寫 JavaScript 程式碼。<br />範例:<pre>console.log('my instance is amazing');</pre></target>
- <context-group name="null">
- <context context-type="linenumber">281</context>
- </context-group>
- </trans-unit>
- <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
- <source>
- Write directly CSS code. Example:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- Prepend with <em>#custom-css</em> to override styles. Example:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </source>
- <target>
- 直接撰寫 CSS 程式碼。範例:<br />
- <pre>
- body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- background-color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
-
- 附加 <em>#custom-css</em> 以覆寫樣式。範例:
- <pre>
- #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
- color: red;
- <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
- </pre>
- </target>
<context-group name="null">
<context context-type="linenumber">297</context>
</context-group>
<source>Advanced configuration</source>
<target>進階設定</target>
<context-group name="null">
- <context context-type="linenumber">207</context>
+ <context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
<source>Update configuration</source>
<target>更新設定</target>
<context-group name="null">
- <context context-type="linenumber">325</context>
+ <context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
<source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
<target>設定似乎無效。請在不同的分頁中搜尋潛在的錯誤。</target>
<context-group name="null">
- <context context-type="linenumber">326</context>
+ <context context-type="linenumber">341</context>
</context-group>
</trans-unit>
<trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
<source>User's email must be verified to login</source>
<target>使用者的電子郵件必須驗證過才能登入</target>
<context-group name="null">
- <context context-type="linenumber">70</context>
+ <context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
<source>User's email is verified / User can login without email verification</source>
<target>使用者的電子郵件已驗證/使用者可以不透過電子郵件驗證登入</target>
<context-group name="null">
- <context context-type="linenumber">74</context>
+ <context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
<source>Ban reason:</source>
<target>阻擋理由:</target>
<context-group name="null">
- <context context-type="linenumber">92</context>
+ <context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
<source>Actions</source>
<target>動作</target>
<context-group name="null">
- <context context-type="linenumber">33</context>
+ <context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
<source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></source>
<target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="<p-sortIcon>"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="</p-sortIcon>"/></target>
<context-group name="null">
- <context context-type="linenumber">10</context>
+ <context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
<source>Blacklist reason:</source>
<target>黑名單理由:</target>
<context-group name="null">
- <context context-type="linenumber">41</context>
+ <context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
- <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
- <source>My settings</source>
- <target>我的設定</target>
- <context-group name="null">
- <context context-type="linenumber">3</context>
- </context-group>
- </trans-unit>
- <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
- <source>My library</source>
- <target>我的媒體庫</target>
- <context-group name="null">
- <context context-type="linenumber">7</context>
- </context-group>
- </trans-unit>
- <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
- <source>My channels</source>
- <target>我的頻道</target>
- <context-group name="null">
- <context context-type="linenumber">12</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
- <source>My videos</source>
- <target>我的影片</target>
- <context-group name="null">
- <context context-type="linenumber">14</context>
- </context-group>
- </trans-unit>
- <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
- <source>My subscriptions</source>
- <target>我的訂閱</target>
- <context-group name="null">
- <context context-type="linenumber">16</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
- <source>My imports</source>
- <target>我的匯入</target>
- <context-group name="null">
- <context context-type="linenumber">18</context>
- </context-group>
- </trans-unit>
- <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
- <source>Misc</source>
- <target>雜項</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
- <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
- <source>Muted instances</source>
- <target>已靜音的實體</target>
- <context-group name="null">
- <context context-type="linenumber">2</context>
- </context-group>
- </trans-unit>
- <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
- <source>Ownership changes</source>
- <target>所有權變更</target>
- <context-group name="null">
- <context context-type="linenumber">33</context>
- </context-group>
- </trans-unit>
<trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
<source>Video quota:</source>
<target>影片配額:</target>
<source>Profile</source>
<target>簡介</target>
<context-group name="null">
- <context context-type="linenumber">8</context>
+ <context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
<source>Video settings</source>
<target>影片設定</target>
<context-group name="null">
- <context context-type="linenumber">15</context>
+ <context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
<source>Danger zone</source>
<target>危險區域</target>
<context-group name="null">
- <context context-type="linenumber">18</context>
+ <context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
- <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
- <source>Submit</source>
- <target>遞交</target>
- <context-group name="null">
- <context context-type="linenumber">24</context>
- </context-group>
- </trans-unit>
<trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
<source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
<target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target>
<context context-type="linenumber">47</context>
</context-group>
</trans-unit>
+ <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
+ <source>Muted instances</source>
+ <target>已靜音的實體</target>
+ <context-group name="null">
+ <context context-type="linenumber">2</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
<source>Change password</source>
<target>變更密碼</target>
<source>Publish will be available when upload is finished</source>
<target>上傳完成時將可發佈</target>
<context-group name="null">
- <context context-type="linenumber">53</context>
+ <context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
<source>Publish</source>
<target>發佈</target>
<context-group name="null">
- <context context-type="linenumber">60</context>
+ <context context-type="linenumber">65</context>
</context-group>
</trans-unit>
<trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
<source>Wait transcoding before publishing the video</source>
<target>正等待發佈影片前的轉換編碼</target>
<context-group name="null">
- <context context-type="linenumber">130</context>
+ <context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
<source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
<target>如果您決定不要等待在發佈影片前的轉換編碼,它可能會在轉換編碼結束前都無法播放。</target>
<context-group name="null">
- <context context-type="linenumber">131</context>
+ <context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
<source>Add another caption</source>
<target>新增其他字幕</target>
<context-group name="null">
- <context context-type="linenumber">146</context>
+ <context context-type="linenumber">147</context>
</context-group>
</trans-unit>
<trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
<source>See the subtitle file</source>
<target>檢視字幕檔案</target>
<context-group name="null">
- <context context-type="linenumber">155</context>
+ <context context-type="linenumber">156</context>
</context-group>
</trans-unit>
<trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
<source>Already uploaded ✔</source>
<target>已上傳 ✔</target>
<context-group name="null">
- <context context-type="linenumber">159</context>
+ <context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
<source>Will be created on update</source>
<target>將在更新時建立</target>
<context-group name="null">
- <context context-type="linenumber">167</context>
+ <context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
<source>Cancel create</source>
<target>取消建立</target>
<context-group name="null">
- <context context-type="linenumber">169</context>
+ <context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
<source>Will be deleted on update</source>
<target>將在更新時刪除</target>
<context-group name="null">
- <context context-type="linenumber">175</context>
+ <context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
<source>Cancel deletion</source>
<target>取消刪除</target>
<context-group name="null">
- <context context-type="linenumber">177</context>
+ <context context-type="linenumber">178</context>
</context-group>
</trans-unit>
<trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
現在沒有字幕。
</target>
<context-group name="null">
- <context context-type="linenumber">182</context>
+ <context context-type="linenumber">183</context>
</context-group>
</trans-unit>
<trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
<source>Captions</source>
<target>字幕</target>
<context-group name="null">
- <context context-type="linenumber">139</context>
+ <context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
<source>Upload thumbnail</source>
<target>上傳縮圖</target>
<context-group name="null">
- <context context-type="linenumber">195</context>
+ <context context-type="linenumber">196</context>
</context-group>
</trans-unit>
<trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
<source>Upload preview</source>
<target>上傳預覽</target>
<context-group name="null">
- <context context-type="linenumber">202</context>
+ <context context-type="linenumber">203</context>
</context-group>
</trans-unit>
<trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
<source>Short text to tell people how they can support you (membership platform...).</source>
<target>告訴人們他們可以如何支援您(成員平臺等)的短文</target>
<context-group name="null">
- <context context-type="linenumber">209</context>
+ <context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
<source>Advanced settings</source>
<target>進階設定</target>
<context-group name="null">
- <context context-type="linenumber">190</context>
+ <context context-type="linenumber">191</context>
</context-group>
</trans-unit>
<trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
<context context-type="linenumber">3</context>
</context-group>
</trans-unit>
- <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
- <source>
- Cancel
- </source>
- <target>
- 取消
- </target>
- <context-group name="null">
- <context context-type="linenumber">19</context>
- </context-group>
- </trans-unit>
<trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
<source>Share</source>
<target>分享</target>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
- <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
- <source>Error getting about from server</source>
- <target>取得關於伺服器的錯誤</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
<source>No description</source>
<target>沒有描述</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
- <source>Error</source>
- <target>錯誤</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
<source>240p</source>
<target>240p</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
- <source>Success</source>
- <target>成功</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
<source>Configuration updated.</source>
<target>設定已更新。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814">
- <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source>
- <target>您真的想要刪除 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 嗎?這也會刪除所有上傳到這個頻道的影片。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
- <source>Please type the name of the video channel to confirm</source>
- <target>請輸入影片頻道的名稱以確認</target>
+ <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
+ <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
+ <target>影片頻道 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
- <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
- <target>影片頻道 <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target>
+ <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
+ <source>My videos</source>
+ <target>我的影片</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19">
- <source>Channels</source>
- <target>頻道</target>
+ <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
+ <source>My library</source>
+ <target>我的媒體庫</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d">
- <source>Video imports</source>
- <target>影片匯入</target>
+ <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
+ <source>My channels</source>
+ <target>我的頻道</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
+ <source>My subscriptions</source>
+ <target>我的訂閱</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
+ <source>Misc</source>
+ <target>雜項</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
+ <source>Ownership changes</source>
+ <target>所有權變更</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
+ <source>My settings</source>
+ <target>我的設定</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
+ <source>Error</source>
+ <target>錯誤</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
<source>You need to reconnect.</source>
<target>您需要重新連線。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
+ <source>Info</source>
+ <target>資訊</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
+ <source>Success</source>
+ <target>成功</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
<source>Incorrect username or password.</source>
<target>不正確的使用者名稱或密碼。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
+ <source>Email is required.</source>
+ <target>電子郵件必填。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
+ <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
+ <source>Email must be valid.</source>
+ <target>電子郵件必須為有效電子郵件。</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
<source>Username is required.</source>
<target>使用者名稱必填。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
- <source>Username must be at least 3 characters long.</source>
- <target>使用者名稱必須至少 3 個字元長。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
- <source>Username cannot be more than 20 characters long.</source>
- <target>使用者名稱不能多於 20 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
- <source>Username should be only lowercase alphanumeric characters.</source>
- <target>使用者名稱應該僅有小寫英數字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
- <source>Email is required.</source>
- <target>電子郵件必填。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
- <source>Email must be valid.</source>
- <target>電子郵件必須為有效電子郵件。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
<source>Password must be at least 6 characters long.</source>
<target>密碼必須至少 6 個字元長。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
- <source>Display name must be at least 3 characters long.</source>
- <target>顯示名稱必須至少 3 個字元長。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
- <source>Display name cannot be more than 120 characters long.</source>
- <target>顯示名稱不能多於 120 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
<source>Description must be at least 3 characters long.</source>
<target>描述必須至少 3 個字元長。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
- <source>Report reason cannot be more than 300 characters long.</source>
- <target>回報理由不能多於 300 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
<source>Moderation comment is required.</source>
<target>管理評論必填。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
- <source>Moderation comment cannot be more than 300 characters long.</source>
- <target>管理評論無法多於 300 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
<source>The channel is required.</source>
<target>頻道必填。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
- <source>Name must be at least 3 characters long.</source>
- <target>名稱必須至少 3 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
- <source>Name cannot be more than 20 characters long.</source>
- <target>名稱不能超過 20 個字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
- <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
- <source>Name should be only lowercase alphanumeric characters.</source>
- <target>名稱應該只有小寫英數字元。</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
<source>Support text must be at least 3 characters long.</source>
<target>支援文字必須至少 3 個字元長。</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
- <source>Subscribed</source>
- <target>已訂閱</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
<source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
<target>訂閱 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
- <source>Unsubscribed</source>
- <target>已取消訂閱</target>
+ <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
+ <source>Subscribed</source>
+ <target>已訂閱</target>
<context-group name="null">
<context context-type="linenumber">1</context>
</context-group>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
+ <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
+ <source>Unsubscribed</source>
+ <target>已取消訂閱</target>
+ <context-group name="null">
+ <context context-type="linenumber">1</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
<source>Moderator</source>
<target>主持人</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
- <source>Info</source>
- <target>資訊</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
<source>Upload cancelled</source>
<target>已取消上傳</target>
<context context-type="linenumber">1</context>
</context-group>
</trans-unit>
- <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
- <source>We are sorry but PeerTube cannot handle videos > 8GB</source>
- <target>我們很抱歉,但 PeerTube 無法處理大於 8GB 的影片</target>
- <context-group name="null">
- <context context-type="linenumber">1</context>
- </context-group>
- </trans-unit>
<trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
<source>Your video quota is exceeded with this video (video size: <x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>, quota: <x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</source>
<target>您的影片配額已因此影片超過(影片大小:<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,配額:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
<body>
<trans-unit id="Afar">
<source>Afar</source>
- <target>Afar</target>
+ <target>Ver</target>
</trans-unit>
<trans-unit id="Abkhazian">
<source>Abkhazian</source>
<source>Avaric</source>
<target>Avaars</target>
</trans-unit>
+ <trans-unit id="Kotava">
+ <source>Kotava</source>
+ <target>Kotava</target>
+ </trans-unit>
<trans-unit id="Aymara">
<source>Aymara</source>
<target>Aymara</target>
<source>English</source>
<target>Engels</target>
</trans-unit>
+ <trans-unit id="Esperanto">
+ <source>Esperanto</source>
+ <target>Esperanto</target>
+ </trans-unit>
<trans-unit id="Estonian">
<source>Estonian</source>
<target>Ests</target>
<source>Javanese</source>
<target>Javaans</target>
</trans-unit>
+ <trans-unit id="Lojban">
+ <source>Lojban</source>
+ <target>Lojban</target>
+ </trans-unit>
<trans-unit id="Japanese">
<source>Japanese</source>
<target>Japans</target>
<source>Nyanja</source>
<target>Nyanja</target>
</trans-unit>
+ <trans-unit id="Occitan">
+ <source>Occitan</source>
+ <target>Occitan</target>
+ </trans-unit>
<trans-unit id="Ojibwa">
<source>Ojibwa</source>
<target>Ojibwe</target>
<source>Tigrinya</source>
<target>Tigrinya</target>
</trans-unit>
+ <trans-unit id="Klingon">
+ <source>Klingon</source>
+ <target>Klingon</target>
+ </trans-unit>
<trans-unit id="Tonga (Tonga Islands)">
<source>Tonga (Tonga Islands)</source>
<target>Tongaans</target>
<source>Speed</source>
<target>Snelheid</target>
</trans-unit>
+ <trans-unit id="Subtitles/CC">
+ <source>Subtitles/CC</source>
+ <target>Ondertiteling/CC</target>
+ </trans-unit>
<trans-unit id="peers">
<source>peers</source>
<target>peers</target>
-{"Music":"Hudba","Films":"Filmy","Vehicles":"Auta","Art":"Umění","Sports":"Sport","Travels":"Cestování","Gaming":"Hry","People":"Lidé","Comedy":"Komedie","Entertainment":"Zábava","News & Politics":"Zprávy a politika","How To":"Jak na to","Education":"Výukové","Activism":"Aktivismus","Science & Technology":"Věda a technologie","Animals":"Zvířata","Kids":"Děti","Food":"Jídlo a vaření","Attribution":"Uveďte autora","Attribution - Share Alike":"Uveďte autora - Zachovejte licenci","Attribution - No Derivatives":"Uveďte autora - Nezpracovávejte","Attribution - Non Commercial":"Uveďte autora - Nešiřte dílo komerčně","Attribution - Non Commercial - Share Alike":"Uveďte autora - Nešiřte dílo komerčně - Zachovejte licenci","Attribution - Non Commercial - No Derivatives":"Uveďte autora - Nešiřte dílo komerčně - Nezpracovávejte","Public Domain Dedication":"Volné dílo","Public":"Veřejné","Unlisted":"Nezobrazeno","Private":"Soukromé","Published":"Publikované","Pending":"Čekající","Success":"Úspěch","Failed":"Neúspěch","Misc":"Různé","Unknown":"Neznámé","Afar":"Afarština","Abkhazian":"Abcházština","Afrikaans":"Afrikánština","Akan":"Akanština","Amharic":"Amharština","Arabic":"Arabština","Aragonese":"Aragonština","American Sign Language":"Americká znaková řeč","Assamese":"Ásámština","Avaric":"Avarština","Kotava":"Kotava","Aymara":"Ajmarština","Azerbaijani":"Ázerbájdžánština","Bashkir":"Baškirština","Bambara":"Bambarština","Belarusian":"Běloruština","Bengali":"Bengálština","British Sign Language":"Britská znaková řeč","Bislama":"Bislamština","Tibetan":"Tibetština","Bosnian":"Bosenština","Breton":"Bretonština","Bulgarian":"Bulharština","Brazilian Sign Language":"Brazilská znaková řeč","Catalan":"Katalánština","Czech":"Čeština","Chamorro":"Chamorro","Chechen":"Čečenština","Chuvash":"Čuvaština","Cornish":"Kornština","Corsican":"Korsičtina","Cree":"Kríjština","Czech Sign Language":"Česká znaková řeč","Chinese Sign Language":"Čínská znaková řeč","Welsh":"Velština","Danish":"Dánština","German":"Němčina","Dhivehi":"Maledivština","Danish Sign Language":"Dánská znaková řeč","Dzongkha":"Dzongkä","Modern Greek (1453-)":"Moderní řečtina","English":"Angličtina","Esperanto":"Esperanto","Estonian":"Estonština","Basque":"Baskičtina","Ewe":"Eveština","Faroese":"Faerština","Persian":"Perština","Fijian":"Fidžijština","Finnish":"Finština","French":"Francouzština","Western Frisian":"Západofríština","French Sign Language":"Francouzská znaková řeč","Fulah":"Fulbština","Scottish Gaelic":"Skotská gaelština","Irish":"Irština","Galician":"Galicijština","Manx":"Manština","Guarani":"Guaranština","German Sign Language":"Německá znaková řeč","Gujarati":"Gudžarátština","Haitian":"Haitská kreolština","Hausa":"Hauština","Serbo-Croatian":"Srcbochorvatšinta","Hebrew":"Hebrejština","Herero":"Herero","Hindi":"Hindština","Hiri Motu":"Hiri Motu","Croatian":"Chorvatština","Hungarian":"Maďarština","Armenian":"Arménština","Igbo":"Igboština","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitutština","Indonesian":"Indonéština","Inupiaq":"Inupiaq","Icelandic":"Islandština","Italian":"Italština","Javanese":"Javánština","Lojban":"Lojban","Japanese":"Japonština","Japanese Sign Language":"Japonská znaková řeč","Kalaallisut":"Grónština","Kannada":"Kannadština","Kashmiri":"Kašmírština","Georgian":"Gruzínština","Kanuri":"Kanurijština","Kazakh":"Kazaština","Khmer":"Khmerština","Kikuyu":"Kikujština","Kinyarwanda":"Rwandština","Kirghiz":"Kyrgyzština","Komi":"Komi","Kongo":"Konžština","Korean":"Korejština","Kuanyama":"Kuanyama","Kurdish":"Kurdština","Lao":"Laoština","Latvian":"Lotyština","Limburgan":"Limburština","Lingala":"Ngalština","Lithuanian":"Litevština","Luxembourgish":"Lucemburština","Luba-Katanga":"Luba-Katanga","Ganda":"Gandština","Marshallese":"Maršálština","Malayalam":"Malajálamština","Marathi":"Maráthština","Macedonian":"Makedonština","Malagasy":"Malgaština","Maltese":"Maltština","Mongolian":"Mongolština","Maori":"Maorština","Malay (macrolanguage)":"Malajština","Burmese":"Barmština","Nauru":"Naurština","Navajo":"Navažština","South Ndebele":"Jižní ndebelština","North Ndebele":"Severní ndebelština","Ndonga":"Ndondština","Nepali (macrolanguage)":"Nepálština","Dutch":"Dánština","Norwegian Nynorsk":"Norština Nynorsk","Norwegian Bokmål":"Norština Bokmål","Norwegian":"Norština ","Nyanja":"Čičevština","Occitan":"Okcitánština","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Urijština","Oromo":"Oromština","Ossetian":"Osetština","Panjabi":"Paňdžábština","Pakistan Sign Language":"Pakistánská znaková řeč","Polish":"Polština","Portuguese":"Portugalština","Pushto":"Paštština","Quechua":"Kečuánština","Romansh":"Rétorománština","Romanian":"Rumunština","Russian Sign Language":"Ruská znaková řeč","Rundi":"Kirundi","Russian":"Ruština","Sango":"Sango","Saudi Arabian Sign Language":"Saudská arabská znaková řeč","South African Sign Language":"Jihoafrická znaková řeč","Sinhala":"Sinhálština","Slovak":"Slovenština","Slovenian":"Slovinština","Northern Sami":"Severní sámština","Samoan":"Samojština","Shona":"Shona","Sindhi":"Sindhština","Somali":"Somálština","Southern Sotho":"Jižní sotština","Spanish":"Španělština","Albanian":"Albánština","Sardinian":"Sardínština","Serbian":"Srbština","Swati":"Swati","Sundanese":"Sundština","Swahili (macrolanguage)":"Svahilština","Swedish":"Švédština","Swedish Sign Language":"Švédská znaková řeč","Tahitian":"Tahitština","Tamil":"Tamilština","Tatar":"Tatarština","Telugu":"Telugština","Tajik":"Tádžičtina","Tagalog":"Tagalog","Thai":"Thajština","Tigrinya":"Tigrinya","Klingon":"Klingonština","Tonga (Tonga Islands)":"Tongánština","Tswana":"Setswanština","Tsonga":"Tsongština","Turkmen":"Turkmenština","Turkish":"Turečtina","Twi":"Twi","Uighur":"Ujgurština","Ukrainian":"Ukrajinština","Urdu":"Urdština","Uzbek":"Uzbečtina","Venda":"Vendština","Vietnamese":"Vietnamština","Walloon":"Valonština","Wolof":"Wolof ","Xhosa":"Xhoština","Yiddish":"Jidiš","Yoruba":"Jorubština","Zhuang":"Čuangština","Chinese":"Čínština","Zulu":"Zuluština"}
\ No newline at end of file
+{"Music":"Hudba","Films":"Filmy","Vehicles":"Auta","Art":"Umění","Sports":"Sport","Travels":"Cestování","Gaming":"Hry","People":"Lidé","Comedy":"Komedie","Entertainment":"Zábava","News & Politics":"Zprávy a politika","How To":"Jak na to","Education":"Výukové","Activism":"Aktivismus","Science & Technology":"Věda a technologie","Animals":"Zvířata","Kids":"Děti","Food":"Jídlo a vaření","Attribution":"Uveďte autora","Attribution - Share Alike":"Uveďte autora - Zachovejte licenci","Attribution - No Derivatives":"Uveďte autora - Nezpracovávejte","Attribution - Non Commercial":"Uveďte autora - Nešiřte dílo komerčně","Attribution - Non Commercial - Share Alike":"Uveďte autora - Nešiřte dílo komerčně - Zachovejte licenci","Attribution - Non Commercial - No Derivatives":"Uveďte autora - Nešiřte dílo komerčně - Nezpracovávejte","Public Domain Dedication":"Volné dílo","Public":"Veřejné","Unlisted":"Nezobrazeno","Private":"Soukromé","Published":"Publikované","To transcode":"K transkódování","To import":"To import","Pending":"Čekající","Success":"Úspěch","Failed":"Neúspěch","Misc":"Různé","Unknown":"Neznámé","Afar":"Afarština","Abkhazian":"Abcházština","Afrikaans":"Afrikánština","Akan":"Akanština","Amharic":"Amharština","Arabic":"Arabština","Aragonese":"Aragonština","American Sign Language":"Americká znaková řeč","Assamese":"Ásámština","Avaric":"Avarština","Kotava":"Kotava","Aymara":"Ajmarština","Azerbaijani":"Ázerbájdžánština","Bashkir":"Baškirština","Bambara":"Bambarština","Belarusian":"Běloruština","Bengali":"Bengálština","British Sign Language":"Britská znaková řeč","Bislama":"Bislamština","Tibetan":"Tibetština","Bosnian":"Bosenština","Breton":"Bretonština","Bulgarian":"Bulharština","Brazilian Sign Language":"Brazilská znaková řeč","Catalan":"Katalánština","Czech":"Čeština","Chamorro":"Chamorro","Chechen":"Čečenština","Chuvash":"Čuvaština","Cornish":"Kornština","Corsican":"Korsičtina","Cree":"Kríjština","Czech Sign Language":"Česká znaková řeč","Chinese Sign Language":"Čínská znaková řeč","Welsh":"Velština","Danish":"Dánština","German":"Němčina","Dhivehi":"Maledivština","Danish Sign Language":"Dánská znaková řeč","Dzongkha":"Dzongkä","Modern Greek (1453-)":"Moderní řečtina","English":"Angličtina","Esperanto":"Esperanto","Estonian":"Estonština","Basque":"Baskičtina","Ewe":"Eveština","Faroese":"Faerština","Persian":"Perština","Fijian":"Fidžijština","Finnish":"Finština","French":"Francouzština","Western Frisian":"Západofríština","French Sign Language":"Francouzská znaková řeč","Fulah":"Fulbština","Scottish Gaelic":"Skotská gaelština","Irish":"Irština","Galician":"Galicijština","Manx":"Manština","Guarani":"Guaranština","German Sign Language":"Německá znaková řeč","Gujarati":"Gudžarátština","Haitian":"Haitská kreolština","Hausa":"Hauština","Serbo-Croatian":"Srcbochorvatšinta","Hebrew":"Hebrejština","Herero":"Herero","Hindi":"Hindština","Hiri Motu":"Hiri Motu","Croatian":"Chorvatština","Hungarian":"Maďarština","Armenian":"Arménština","Igbo":"Igboština","Sichuan Yi":"Nuosu","Inuktitut":"Inuktitutština","Indonesian":"Indonéština","Inupiaq":"Inupiaq","Icelandic":"Islandština","Italian":"Italština","Javanese":"Javánština","Lojban":"Lojban","Japanese":"Japonština","Japanese Sign Language":"Japonská znaková řeč","Kalaallisut":"Grónština","Kannada":"Kannadština","Kashmiri":"Kašmírština","Georgian":"Gruzínština","Kanuri":"Kanurijština","Kazakh":"Kazaština","Khmer":"Khmerština","Kikuyu":"Kikujština","Kinyarwanda":"Rwandština","Kirghiz":"Kyrgyzština","Komi":"Komi","Kongo":"Konžština","Korean":"Korejština","Kuanyama":"Kuanyama","Kurdish":"Kurdština","Lao":"Laoština","Latvian":"Lotyština","Limburgan":"Limburština","Lingala":"Ngalština","Lithuanian":"Litevština","Luxembourgish":"Lucemburština","Luba-Katanga":"Luba-Katanga","Ganda":"Gandština","Marshallese":"Maršálština","Malayalam":"Malajálamština","Marathi":"Maráthština","Macedonian":"Makedonština","Malagasy":"Malgaština","Maltese":"Maltština","Mongolian":"Mongolština","Maori":"Maorština","Malay (macrolanguage)":"Malajština","Burmese":"Barmština","Nauru":"Naurština","Navajo":"Navažština","South Ndebele":"Jižní ndebelština","North Ndebele":"Severní ndebelština","Ndonga":"Ndondština","Nepali (macrolanguage)":"Nepálština","Dutch":"Dánština","Norwegian Nynorsk":"Norština Nynorsk","Norwegian Bokmål":"Norština Bokmål","Norwegian":"Norština ","Nyanja":"Čičevština","Occitan":"Okcitánština","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Urijština","Oromo":"Oromština","Ossetian":"Osetština","Panjabi":"Paňdžábština","Pakistan Sign Language":"Pakistánská znaková řeč","Polish":"Polština","Portuguese":"Portugalština","Pushto":"Paštština","Quechua":"Kečuánština","Romansh":"Rétorománština","Romanian":"Rumunština","Russian Sign Language":"Ruská znaková řeč","Rundi":"Kirundi","Russian":"Ruština","Sango":"Sango","Saudi Arabian Sign Language":"Saudská arabská znaková řeč","South African Sign Language":"Jihoafrická znaková řeč","Sinhala":"Sinhálština","Slovak":"Slovenština","Slovenian":"Slovinština","Northern Sami":"Severní sámština","Samoan":"Samojština","Shona":"Shona","Sindhi":"Sindhština","Somali":"Somálština","Southern Sotho":"Jižní sotština","Spanish":"Španělština","Albanian":"Albánština","Sardinian":"Sardínština","Serbian":"Srbština","Swati":"Swati","Sundanese":"Sundština","Swahili (macrolanguage)":"Svahilština","Swedish":"Švédština","Swedish Sign Language":"Švédská znaková řeč","Tahitian":"Tahitština","Tamil":"Tamilština","Tatar":"Tatarština","Telugu":"Telugština","Tajik":"Tádžičtina","Tagalog":"Tagalog","Thai":"Thajština","Tigrinya":"Tigrinya","Klingon":"Klingonština","Tonga (Tonga Islands)":"Tongánština","Tswana":"Setswanština","Tsonga":"Tsongština","Turkmen":"Turkmenština","Turkish":"Turečtina","Twi":"Twi","Uighur":"Ujgurština","Ukrainian":"Ukrajinština","Urdu":"Urdština","Uzbek":"Uzbečtina","Venda":"Vendština","Vietnamese":"Vietnamština","Walloon":"Valonština","Wolof":"Wolof ","Xhosa":"Xhoština","Yiddish":"Jidiš","Yoruba":"Jorubština","Zhuang":"Čuangština","Chinese":"Čínština","Zulu":"Zuluština"}
\ No newline at end of file
-{"Music":"Musiques","Films":"Films","Vehicles":"Transport","Art":"Art","Sports":"Sports","Travels":"Voyages","Gaming":"Jeux vidéos","People":"Personnalités","Comedy":"Humour","Entertainment":"Divertissement","News & Politics":"Actualité & Politique","How To":"Tutoriels","Education":"Éducation","Activism":"Militantisme","Science & Technology":"Science & Technologie","Animals":"Animaux","Kids":"Enfants","Food":"Cuisine","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Partage dans les mêmes conditions","Attribution - No Derivatives":"Attribution - Pas d’œuvre dérivée","Attribution - Non Commercial":"Attribution - Utilisation non commerciale","Attribution - Non Commercial - Share Alike":"Attribution - Utilisation non commerciale - Partage dans les mêmes conditions","Attribution - Non Commercial - No Derivatives":"Attribution - Utilisation non commerciale - Pas d’œuvre dérivée","Public Domain Dedication":"Domaine public","Public":"Publique","Unlisted":"Non listée","Private":"Privée","Published":"Publiée","To transcode":"À transcoder","To import":"À importer","Pending":"En cours","Success":"Succès","Failed":"Échoué","Misc":"Divers","Unknown":"Inconnu","Afar":"Afar","Abkhazian":"Abkhaze","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharique","Arabic":"Arabe","Aragonese":"Aragonais","American Sign Language":"Langue des signes américaine","Assamese":"Assamais","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azéri","Bashkir":"Bachkir","Bambara":"Bambara","Belarusian":"Biélorusse","Bengali":"Bengali","British Sign Language":"Langue des signes britannique","Bislama":"Bichlamar","Tibetan":"Tibétain","Bosnian":"Bosniaque","Breton":"Breton","Bulgarian":"Bulgare","Brazilian Sign Language":"Langue des signes brésilienne","Catalan":"Catalan","Czech":"Tchèque","Chamorro":"Chamorro","Chechen":"Tchétchène","Chuvash":"Tchouvache","Cornish":"Cornique","Corsican":"Corse","Cree":"Cree","Czech Sign Language":"Langue des signes tchèque","Chinese Sign Language":"Langue des signes chinoise","Welsh":"Gallois","Danish":"Danois","German":"Allemand","Dhivehi":"Maldivien","Danish Sign Language":"Langue des signes danoise","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grec moderne (après 1453)","English":"Anglais","Esperanto":"Espéranto","Estonian":"Estonien","Basque":"Basque","Ewe":"Éwé","Faroese":"Féroïen","Persian":"Persan","Fijian":"Fidjien","Finnish":"Finnois","French":"Français","Western Frisian":"Frison occidental","French Sign Language":"Langue des signes française","Fulah":"Peul","Scottish Gaelic":"Gaélique","Irish":"Irlandais","Galician":"Galicien","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Langue des signes allemande","Gujarati":"Goudjrati","Haitian":"Haïtien","Hausa":"Haoussa","Serbo-Croatian":"Serbo-croate","Hebrew":"Hébreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croate","Hungarian":"Hongrois","Armenian":"Arménien","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonésien","Inupiaq":"Inupiaq","Icelandic":"Islandais","Italian":"Italien","Javanese":"Javanais","Lojban":"Lojban","Japanese":"Japonais","Japanese Sign Language":"Langue des signes japonaise","Kalaallisut":"Groenlandais","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Géorgien","Kanuri":"Kanouri","Kazakh":"Kazakh","Khmer":"Khmer central","Kikuyu":"Kikuyu","Kinyarwanda":"Rwanda","Kirghiz":"Kirghiz","Komi":"Kom","Kongo":"Kongo","Korean":"Coréen","Kuanyama":"Kuanyama","Kurdish":"Kurde","Lao":"Lao","Latvian":"Letton","Limburgan":"Limbourgeois","Lingala":"Lingala","Lithuanian":"Lituanien","Luxembourgish":"Luxembourgeois","Luba-Katanga":"Luba-katanga","Ganda":"Ganda","Marshallese":"Marshall","Malayalam":"Malayalam","Marathi":"Marathe","Macedonian":"Macédonien","Malagasy":"Malgache","Maltese":"Maltais","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malais","Burmese":"Birman","Nauru":"Nauruan","Navajo":"Navaho","South Ndebele":"Ndébélé du Sud","North Ndebele":"Ndébélé du Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Népalais","Dutch":"Néerlandais","Norwegian Nynorsk":"Norvégien nynorsk","Norwegian Bokmål":"Norvégien bokmål","Norwegian":"Norvégien","Nyanja":"Chichewa","Occitan":"Occitane","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Galla","Ossetian":"Ossète","Panjabi":"Pendjabi","Pakistan Sign Language":"Langue des signes pakistanaise","Polish":"Polonais","Portuguese":"Portugais","Pushto":"Pachto","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Roumain","Russian Sign Language":"Langue des signes russe","Rundi":"Rundi","Russian":"Russe","Sango":"Sango","Saudi Arabian Sign Language":"Langue des signes saoudienne","South African Sign Language":"Langue des signes sud-africaine","Sinhala":"Singhalais","Slovak":"Slovaque","Slovenian":"Slovène","Northern Sami":"Sami du Nord","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho du Sud","Spanish":"Espagnol","Albanian":"Albanais","Sardinian":"Sarde","Serbian":"Serbe","Swati":"Swati","Sundanese":"Soundanais","Swahili (macrolanguage)":"Swahili","Swedish":"Suédois","Swedish Sign Language":"Langue des signes suédoise","Tahitian":"Tahitien","Tamil":"Tamoul","Tatar":"Tatar","Telugu":"Télougou","Tajik":"Tadjik","Tagalog":"Tagalog","Thai":"Thaï","Tigrinya":"Tigrigna","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongan (Îles Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turkmène","Turkish":"Turc","Twi":"Twi","Uighur":"Ouïgour","Ukrainian":"Ukrainien","Urdu":"Ourdou","Uzbek":"Ouszbek","Venda":"Venda","Vietnamese":"Vietnamien","Walloon":"Wallon","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinois","Zulu":"Zoulou"}
\ No newline at end of file
+{"Music":"Musiques","Films":"Films","Vehicles":"Transport","Art":"Art","Sports":"Sports","Travels":"Voyages","Gaming":"Jeux vidéos","People":"Personnalités","Comedy":"Humour","Entertainment":"Divertissement","News & Politics":"Actualité & Politique","How To":"Tutoriels","Education":"Éducation","Activism":"Militantisme","Science & Technology":"Science & Technologie","Animals":"Animaux","Kids":"Enfants","Food":"Cuisine","Attribution":"Attribution","Attribution - Share Alike":"Attribution - Partage dans les mêmes conditions","Attribution - No Derivatives":"Attribution - Pas d’œuvre dérivée","Attribution - Non Commercial":"Attribution - Utilisation non commerciale","Attribution - Non Commercial - Share Alike":"Attribution - Utilisation non commerciale - Partage dans les mêmes conditions","Attribution - Non Commercial - No Derivatives":"Attribution - Utilisation non commerciale - Pas d’œuvre dérivée","Public Domain Dedication":"Domaine public","Public":"Publique","Unlisted":"Non listée","Private":"Privée","Published":"Publiée","To transcode":"À transcoder","To import":"À importer","Pending":"En cours","Success":"Succès","Failed":"Échoué","This video does not exist.":"Cette vidéo n'existe pas.","We cannot fetch the video. Please try again later.":"Nous ne pouvons pas récupérer la vidéo. Merci de réessayer plus tard.","Sorry":"Désolé","This video is not available because the remote instance is not responding.":"Cette vidéo n'est pas disponible car l'instance distante ne répond pas.","Misc":"Divers","Unknown":"Inconnu","Afar":"Afar","Abkhazian":"Abkhaze","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharique","Arabic":"Arabe","Aragonese":"Aragonais","American Sign Language":"Langue des signes américaine","Assamese":"Assamais","Avaric":"Avar","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azéri","Bashkir":"Bachkir","Bambara":"Bambara","Belarusian":"Biélorusse","Bengali":"Bengali","British Sign Language":"Langue des signes britannique","Bislama":"Bichlamar","Tibetan":"Tibétain","Bosnian":"Bosniaque","Breton":"Breton","Bulgarian":"Bulgare","Brazilian Sign Language":"Langue des signes brésilienne","Catalan":"Catalan","Czech":"Tchèque","Chamorro":"Chamorro","Chechen":"Tchétchène","Chuvash":"Tchouvache","Cornish":"Cornique","Corsican":"Corse","Cree":"Cree","Czech Sign Language":"Langue des signes tchèque","Chinese Sign Language":"Langue des signes chinoise","Welsh":"Gallois","Danish":"Danois","German":"Allemand","Dhivehi":"Maldivien","Danish Sign Language":"Langue des signes danoise","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Grec moderne (après 1453)","English":"Anglais","Esperanto":"Espéranto","Estonian":"Estonien","Basque":"Basque","Ewe":"Éwé","Faroese":"Féroïen","Persian":"Persan","Fijian":"Fidjien","Finnish":"Finnois","French":"Français","Western Frisian":"Frison occidental","French Sign Language":"Langue des signes française","Fulah":"Peul","Scottish Gaelic":"Gaélique","Irish":"Irlandais","Galician":"Galicien","Manx":"Manx","Guarani":"Guarani","German Sign Language":"Langue des signes allemande","Gujarati":"Goudjrati","Haitian":"Haïtien","Hausa":"Haoussa","Serbo-Croatian":"Serbo-croate","Hebrew":"Hébreu","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri motu","Croatian":"Croate","Hungarian":"Hongrois","Armenian":"Arménien","Igbo":"Igbo","Sichuan Yi":"Yi de Sichuan","Inuktitut":"Inuktitut","Indonesian":"Indonésien","Inupiaq":"Inupiaq","Icelandic":"Islandais","Italian":"Italien","Javanese":"Javanais","Lojban":"Lojban","Japanese":"Japonais","Japanese Sign Language":"Langue des signes japonaise","Kalaallisut":"Groenlandais","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Géorgien","Kanuri":"Kanouri","Kazakh":"Kazakh","Khmer":"Khmer central","Kikuyu":"Kikuyu","Kinyarwanda":"Rwanda","Kirghiz":"Kirghiz","Komi":"Kom","Kongo":"Kongo","Korean":"Coréen","Kuanyama":"Kuanyama","Kurdish":"Kurde","Lao":"Lao","Latvian":"Letton","Limburgan":"Limbourgeois","Lingala":"Lingala","Lithuanian":"Lituanien","Luxembourgish":"Luxembourgeois","Luba-Katanga":"Luba-katanga","Ganda":"Ganda","Marshallese":"Marshall","Malayalam":"Malayalam","Marathi":"Marathe","Macedonian":"Macédonien","Malagasy":"Malgache","Maltese":"Maltais","Mongolian":"Mongol","Maori":"Maori","Malay (macrolanguage)":"Malais","Burmese":"Birman","Nauru":"Nauruan","Navajo":"Navaho","South Ndebele":"Ndébélé du Sud","North Ndebele":"Ndébélé du Nord","Ndonga":"Ndonga","Nepali (macrolanguage)":"Népalais","Dutch":"Néerlandais","Norwegian Nynorsk":"Norvégien nynorsk","Norwegian Bokmål":"Norvégien bokmål","Norwegian":"Norvégien","Nyanja":"Chichewa","Occitan":"Occitane","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya","Oromo":"Galla","Ossetian":"Ossète","Panjabi":"Pendjabi","Pakistan Sign Language":"Langue des signes pakistanaise","Polish":"Polonais","Portuguese":"Portugais","Pushto":"Pachto","Quechua":"Quechua","Romansh":"Romanche","Romanian":"Roumain","Russian Sign Language":"Langue des signes russe","Rundi":"Rundi","Russian":"Russe","Sango":"Sango","Saudi Arabian Sign Language":"Langue des signes saoudienne","South African Sign Language":"Langue des signes sud-africaine","Sinhala":"Singhalais","Slovak":"Slovaque","Slovenian":"Slovène","Northern Sami":"Sami du Nord","Samoan":"Samoan","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somali","Southern Sotho":"Sotho du Sud","Spanish":"Espagnol","Albanian":"Albanais","Sardinian":"Sarde","Serbian":"Serbe","Swati":"Swati","Sundanese":"Soundanais","Swahili (macrolanguage)":"Swahili","Swedish":"Suédois","Swedish Sign Language":"Langue des signes suédoise","Tahitian":"Tahitien","Tamil":"Tamoul","Tatar":"Tatar","Telugu":"Télougou","Tajik":"Tadjik","Tagalog":"Tagalog","Thai":"Thaï","Tigrinya":"Tigrigna","Klingon":"Klingon","Tonga (Tonga Islands)":"Tongan (Îles Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turkmène","Turkish":"Turc","Twi":"Twi","Uighur":"Ouïgour","Ukrainian":"Ukrainien","Urdu":"Ourdou","Uzbek":"Ouszbek","Venda":"Venda","Vietnamese":"Vietnamien","Walloon":"Wallon","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Chinois","Zulu":"Zoulou"}
\ No newline at end of file
<source>Entertainment</source>
<target>Entertainment</target>
</trans-unit>
+ <trans-unit id="News & Politics">
+ <source>News & Politics</source>
+ <target>Nieuws en Politiek</target>
+ </trans-unit>
<trans-unit id="How To">
<source>How To</source>
<target>Tutorials</target>
</trans-unit>
<trans-unit id="Science & Technology">
<source>Science & Technology</source>
- <target>Wetenschap & technologie</target>
+ <target>Wetenschap en technologie</target>
</trans-unit>
<trans-unit id="Animals">
<source>Animals</source>
</trans-unit>
<trans-unit id="Attribution - Share Alike">
<source>Attribution - Share Alike</source>
- <target>Naamsvermelding – Gelijk Delen</target>
+ <target>Naamsvermelding – Gelijken Delen</target>
</trans-unit>
<trans-unit id="Attribution - No Derivatives">
<source>Attribution - No Derivatives</source>
<source>Private</source>
<target>Privé</target>
</trans-unit>
+ <trans-unit id="Published">
+ <source>Published</source>
+ <target>Gepubliceerd</target>
+ </trans-unit>
+ <trans-unit id="To transcode">
+ <source>To transcode</source>
+ <target>Transcoden</target>
+ </trans-unit>
+ <trans-unit id="To import">
+ <source>To import</source>
+ <target>Importeren</target>
+ </trans-unit>
+ <trans-unit id="Pending">
+ <source>Pending</source>
+ <target>In behandeling</target>
+ </trans-unit>
+ <trans-unit id="Success">
+ <source>Success</source>
+ <target>Success</target>
+ </trans-unit>
+ <trans-unit id="Failed">
+ <source>Failed</source>
+ <target>Gefaald</target>
+ </trans-unit>
<trans-unit id="Misc">
<source>Misc</source>
- <target>Diverse</target>
+ <target>Varia</target>
</trans-unit>
<trans-unit id="Unknown">
<source>Unknown</source>
// .catch(err => console.error('Cannot register service worker.', err))
// }
- if (navigator.serviceWorker) {
+ if (navigator.serviceWorker && typeof navigator.serviceWorker.getRegistrations === 'function') {
navigator.serviceWorker.getRegistrations()
.then(registrations => {
for (const registration of registrations) {
// now beware node-sass requires interpolation
// for css custom properties #{$var}
--mainColor: #{$orange-color};
- --mainHoverColor: #{$orange-hoover-color};
+ --mainHoverColor: #{$orange-hover-color};
--mainBackgroundColor: #{$bg-color};
--mainForegroundColor: #{$fg-color};
--menuBackgroundColor: #{$menu-background};
font-weight: $font-semibold;
}
- .close {
+ my-global-icon {
@include icon(24px);
position: relative;
top: 3px;
float: right;
- background-image: url('../assets/images/global/cross.svg');
margin: 0;
padding: 0;
color: var(--mainForegroundColor) !important;
}
}
+
+ .nav-pills .nav-link.active {
+ color: #000 !important;
+ }
}
.nav-tabs .nav-link.active {
table {
.action-button-edit, .action-button-delete {
&:hover, &:active, &:focus, &[disabled], &.disabled {
- background-color: $grey-color !important;
+ background-color: $grey-background-color !important;
}
}
}
}
}
}
-}
\ No newline at end of file
+}
hyphens: auto;
}
+@mixin apply-svg-color ($color) {
+ /deep/ svg {
+ path[fill="#000000"], g[fill="#000000"], rect[fill="#000000"], circle[fill="#000000"] {
+ fill: $color;
+ }
+
+ path[stroke="#000000"], g[stroke="#000000"], rect[stroke="#000000"], circle[stroke="#000000"] {
+ stroke: $color;
+ }
+ }
+}
+
@mixin peertube-input-text($width) {
display: inline-block;
height: $button-height;
border-radius: 3px;
padding-left: 15px;
padding-right: 15px;
+ font-size: 15px;
&::placeholder {
color: var(--inputPlaceholderColor);
color: #fff;
background-color: #C6C6C6;
}
+
+ my-global-icon {
+ @include apply-svg-color(#fff)
+ }
}
@mixin grey-button {
&, &:active, &:focus {
- background-color: $grey-color;
- color: #585858;
+ background-color: $grey-background-color;
+ color: $grey-foreground-color;
}
&:hover, &:active, &:focus, &[disabled], &.disabled {
- color: #585858;
- background-color: $grey-hoover-color;
+ color: $grey-foreground-color;
+ background-color: $grey-background-hover-color;
}
&[disabled], &.disabled {
cursor: default;
}
+
+ my-global-icon {
+ @include apply-svg-color($grey-foreground-color)
+ }
}
@mixin peertube-button {
@include peertube-button;
}
+@mixin button-with-icon($width: 20px, $margin-right: 3px, $top: -1px) {
+ my-global-icon {
+ position: relative;
+ width: $width;
+ margin-right: $margin-right;
+ top: $top;
+ }
+}
+
@mixin peertube-button-file ($width) {
position: relative;
overflow: hidden;
color: transparent;
text-shadow: 0 0 0 #000;
}
+
+ option {
+ color: #000;
+ }
}
}
}
}
-@mixin create-button ($imageUrl) {
+@mixin create-button {
@include peertube-button-link;
@include orange-button;
-
- .icon.icon-add {
- @include icon(20px);
-
- position: relative;
- top: -1px;
- margin-right: 5px;
- background-image: url($imageUrl);
- }
+ @include button-with-icon(20px, 5px, -1px);
}
@mixin row-blocks {
$font-semibold: 600;
$font-bold: 700;
-$grey-color: #E5E5E5;
-$grey-hoover-color: #EFEFEF;;
+$grey-background-color: #E5E5E5;
+$grey-background-hover-color: #EFEFEF;
+$grey-foreground-color: #585858;
+$grey-foreground-hover-color: #303030;
+
$orange-color: #F1680D;
-$orange-hoover-color: #F97D46;
+$orange-hover-color: #F97D46;
$bg-color: #fff;
$fg-color: #000;
p-table {
.ui-table-caption {
border: none !important;
- background-color: #fff !important;
+ background-color: var(--mainBackgroundColor) !important;
.caption {
height: 40px;
}
th {
- background-color: #fff !important;
+ background-color: var(--mainBackgroundColor) !important;
outline: 0;
}
&.pi-sort-up {
@extend .glyphicon-triangle-top;
+
+ color: var(--mainForegroundColor) !important;
}
&.pi-sort-down {
@extend .glyphicon-triangle-bottom;
+
+ color: var(--mainForegroundColor) !important;
}
}
}
height: auto !important;
a {
- color: #000 !important;
+ color: var(--mainForegroundColor) !important;
font-weight: $font-semibold !important;
margin: 0 5px !important;
outline: 0 !important;
@extend .glyphicon-chevron-right;
@include glyphicon-light;
+ color: #000 !important;
text-align: right;
.pi.pi-chevron-right {
@extend .glyphicon-chevron-left;
@include glyphicon-light;
+ color: #000 !important;
text-align: left;
.pi.pi-chevron-left {
.pi.pi-chevron-up {
@extend .glyphicon-chevron-up;
@include glyphicon-light;
+
+ color: #000 !important;
}
.pi.pi-chevron-down {
@extend .glyphicon-chevron-down;
@include glyphicon-light;
+
+ color: #000 !important;
}
}
}
+.ui-chkbox {
-.ui-chkbox-box {
- &.ui-state-active {
- border-color: var(--mainColor) !important;
- background-color: var(--mainColor) !important;
+ &, .ui-chkbox-box {
+ width: 18px !important;
+ height: 18px !important;
}
- .ui-chkbox-icon {
- position: relative;
- overflow: visible !important;
-
- &:after {
- content: '';
- position: absolute;
- top: 1px;
- left: 7px;
- width: 5px;
- height: 13px;
- opacity: 0;
- transform: rotate(45deg) scale(0);
- border-right: 2px solid var(--mainBackgroundColor);
- border-bottom: 2px solid var(--mainBackgroundColor);
+ .ui-chkbox-box {
+ &.ui-state-active {
+ border-color: var(--mainColor) !important;
+ background-color: var(--mainColor) !important;
}
- &.pi-check:after {
- opacity: 1;
- transform: rotate(45deg) scale(1);
+ .ui-chkbox-icon {
+ position: relative;
+ overflow: visible !important;
+
+ &:after {
+ content: '';
+ position: absolute;
+ top: 1px;
+ left: 6px;
+ width: 5px;
+ height: 12px;
+ opacity: 0;
+ transform: rotate(45deg) scale(0);
+ border-right: 2px solid var(--mainBackgroundColor);
+ border-bottom: 2px solid var(--mainBackgroundColor);
+ }
+
+ &.pi-check:after {
+ opacity: 1;
+ transform: rotate(45deg) scale(1);
+ }
}
}
}
}
p-toast {
+ .ui-toast {
+ // Modal is 10005
+ z-index: 10010 !important;
+ }
+
.ui-toast-message {
font-family: $main-fonts;
}
}
}
+
+.ui-widget {
+ font-family: $main-fonts !important;
+}
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex">
+ <meta property="og:platform" content="PeerTube" />
<link rel="icon" type="image/png" href="/client/assets/images/favicon.png" />
</head>
<body>
<div id="error-block">
- <h1 id="error-title">Sorry</h1>
+ <h1 id="error-title"></h1>
<div id="error-content"></div>
</div>
// For google bot that uses Chrome 41 and does not understand fetch
import 'whatwg-fetch'
-// FIXME: something weird with our path definition in tsconfig and typings
-// @ts-ignore
-import * as vjs from 'video.js'
-
import * as Channel from 'jschannel'
import { peertubeTranslate, ResultList, VideoDetails } from '../../../../shared'
-import { addContextMenu, getServerTranslations, getVideojsOptions, loadLocaleInVideoJS } from '../../assets/player/peertube-player'
import { PeerTubeResolution } from '../player/definitions'
import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings'
import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
+import {
+ P2PMediaLoaderOptions,
+ PeertubePlayerManager,
+ PeertubePlayerManagerOptions,
+ PlayerMode
+} from '../../assets/player/peertube-player-manager'
+import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
/**
* Embed API exposes control of the embed player to the outside world via
}
private setResolution (resolutionId: number) {
- if (resolutionId === -1 && this.embed.player.peertube().isAutoResolutionForbidden()) return
+ if (resolutionId === -1 && this.embed.player.webtorrent().isAutoResolutionForbidden()) return
// Auto resolution
if (resolutionId === -1) {
- this.embed.player.peertube().enableAutoResolution()
+ this.embed.player.webtorrent().enableAutoResolution()
return
}
- this.embed.player.peertube().disableAutoResolution()
- this.embed.player.peertube().updateResolution(resolutionId)
+ this.embed.player.webtorrent().disableAutoResolution()
+ this.embed.player.webtorrent().updateResolution(resolutionId)
}
/**
// PeerTube specific capabilities
- this.embed.player.peertube().on('autoResolutionUpdate', () => this.loadResolutions())
- this.embed.player.peertube().on('videoFileUpdate', () => this.loadResolutions())
+ if (this.embed.player.webtorrent) {
+ this.embed.player.webtorrent().on('autoResolutionUpdate', () => this.loadWebTorrentResolutions())
+ this.embed.player.webtorrent().on('videoFileUpdate', () => this.loadWebTorrentResolutions())
+ }
}
- private loadResolutions () {
+ private loadWebTorrentResolutions () {
let resolutions = []
- let currentResolutionId = this.embed.player.peertube().getCurrentResolutionId()
+ let currentResolutionId = this.embed.player.webtorrent().getCurrentResolutionId()
- for (const videoFile of this.embed.player.peertube().videoFiles) {
+ for (const videoFile of this.embed.player.webtorrent().videoFiles) {
let label = videoFile.resolution.label
if (videoFile.fps && videoFile.fps >= 50) {
label += videoFile.fps
subtitle: string
enableApi = false
startTime: number | string = 0
+ mode: PlayerMode
scope = 'peertube'
static async main () {
element.parentElement.removeChild(element)
}
- displayError (text: string) {
+ displayError (text: string, translations?: { [ id: string ]: string }) {
// Remove video element
if (this.videoElement) this.removeElement(this.videoElement)
- document.title = 'Sorry - ' + text
+ const translatedText = peertubeTranslate(text, translations)
+ const translatedSorry = peertubeTranslate('Sorry', translations)
+
+ document.title = translatedSorry + ' - ' + translatedText
const errorBlock = document.getElementById('error-block')
errorBlock.style.display = 'flex'
+ const errorTitle = document.getElementById('error-title')
+ errorTitle.innerHTML = peertubeTranslate('Sorry', translations)
+
const errorText = document.getElementById('error-content')
- errorText.innerHTML = text
+ errorText.innerHTML = translatedText
}
- videoNotFound () {
+ videoNotFound (translations?: { [ id: string ]: string }) {
const text = 'This video does not exist.'
- this.displayError(text)
+ this.displayError(text, translations)
}
- videoFetchError () {
+ videoFetchError (translations?: { [ id: string ]: string }) {
const text = 'We cannot fetch the video. Please try again later.'
- this.displayError(text)
+ this.displayError(text, translations)
}
getParamToggle (params: URLSearchParams, name: string, defaultValue?: boolean) {
this.scope = this.getParamString(params, 'scope', this.scope)
this.subtitle = this.getParamString(params, 'subtitle')
this.startTime = this.getParamString(params, 'start')
+
+ this.mode = this.getParamString(params, 'mode') === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
} catch (err) {
console.error('Cannot get params from URL.', err)
}
const urlParts = window.location.pathname.split('/')
const videoId = urlParts[ urlParts.length - 1 ]
- const [ , serverTranslations, videoResponse, captionsResponse ] = await Promise.all([
- loadLocaleInVideoJS(window.location.origin, vjs, navigator.language),
- getServerTranslations(window.location.origin, navigator.language),
+ const [ serverTranslations, videoResponse, captionsResponse ] = await Promise.all([
+ PeertubePlayerManager.getServerTranslations(window.location.origin, navigator.language),
this.loadVideoInfo(videoId),
this.loadVideoCaptions(videoId)
])
if (!videoResponse.ok) {
- if (videoResponse.status === 404) return this.videoNotFound()
+ if (videoResponse.status === 404) return this.videoNotFound(serverTranslations)
- return this.videoFetchError()
+ return this.videoFetchError(serverTranslations)
}
const videoInfo: VideoDetails = await videoResponse.json()
this.loadParams()
- const videojsOptions = getVideojsOptions({
- autoplay: this.autoplay,
- controls: this.controls,
- muted: this.muted,
- loop: this.loop,
- startTime: this.startTime,
- subtitle: this.subtitle,
-
- videoCaptions,
- inactivityTimeout: 1500,
- videoViewUrl: this.getVideoUrl(videoId) + '/views',
- playerElement: this.videoElement,
- videoFiles: videoInfo.files,
- videoDuration: videoInfo.duration,
- enableHotkeys: true,
- peertubeLink: true,
- poster: window.location.origin + videoInfo.previewPath,
- theaterMode: false
- })
+ const options: PeertubePlayerManagerOptions = {
+ common: {
+ autoplay: this.autoplay,
+ controls: this.controls,
+ muted: this.muted,
+ loop: this.loop,
+ captions: videoCaptions.length !== 0,
+ startTime: this.startTime,
+ subtitle: this.subtitle,
+
+ videoCaptions,
+ inactivityTimeout: 1500,
+ videoViewUrl: this.getVideoUrl(videoId) + '/views',
+
+ playerElement: this.videoElement,
+ onPlayerElementChange: (element: HTMLVideoElement) => this.videoElement = element,
+
+ videoDuration: videoInfo.duration,
+ enableHotkeys: true,
+ peertubeLink: true,
+ poster: window.location.origin + videoInfo.previewPath,
+ theaterMode: false,
+
+ serverUrl: window.location.origin,
+ language: navigator.language,
+ embedUrl: window.location.origin + videoInfo.embedPath
+ },
+
+ webtorrent: {
+ videoFiles: videoInfo.files
+ }
+ }
- this.playerOptions = videojsOptions
- this.player = vjs(this.videoContainerId, videojsOptions, () => {
- this.player.on('customError', (event: any, data: any) => this.handleError(data.err))
+ if (this.mode === 'p2p-media-loader') {
+ const hlsPlaylist = videoInfo.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
+
+ Object.assign(options, {
+ p2pMediaLoader: {
+ playlistUrl: hlsPlaylist.playlistUrl,
+ segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
+ redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
+ trackerAnnounce: videoInfo.trackerUrls,
+ videoFiles: videoInfo.files
+ } as P2PMediaLoaderOptions
+ })
+ }
- window[ 'videojsPlayer' ] = this.player
+ this.player = await PeertubePlayerManager.initialize(this.mode, options)
- if (this.controls) {
- this.player.dock({
- title: videoInfo.name,
- description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
- })
- }
+ this.player.on('customError', (event: any, data: any) => this.handleError(data.err, serverTranslations))
- addContextMenu(this.player, window.location.origin + videoInfo.embedPath)
+ window[ 'videojsPlayer' ] = this.player
- this.initializeApi()
- })
+ if (this.controls) {
+ this.player.dock({
+ title: videoInfo.name,
+ description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
+ })
+ }
+
+ this.initializeApi()
}
- private handleError (err: Error) {
+ private handleError (err: Error, translations?: { [ id: string ]: string }) {
if (err.message.indexOf('from xs param') !== -1) {
this.player.dispose()
this.videoElement = null
- this.displayError('This video is not available because the remote instance is not responding.')
+ this.displayError('This video is not available because the remote instance is not responding.', translations)
return
}
}
"compilerOptions": {
"outDir": "../out-tsc/app",
"baseUrl": "./",
- "module": "es2015",
+ "module": "esnext",
"types": [],
"lib": [
"es2017",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
+ "module": "esnext",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noImplicitAny": true,
# yarn lockfile v1
-"@angular-devkit/architect@0.11.1":
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.11.1.tgz#fb8429b583d4d7efafe5ff551ffdd30a705b9ab0"
- integrity sha512-MdcZ5KclwL2SBXCQSn8uI2hakBX58EyuAwFWsM/pKrNt9j8RqIk93l4amd2OkaMtZRFP5zWodyf/3qOwacjuQg==
+"@angular-devkit/architect@0.13.1":
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.1.tgz#39597ce94f72d89bdd89ee567cb937cff4c13b98"
+ integrity sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw==
dependencies:
- "@angular-devkit/core" "7.1.1"
+ "@angular-devkit/core" "7.3.1"
rxjs "6.3.3"
-"@angular-devkit/build-angular@~0.11.1":
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.11.1.tgz#a828797d9177227aee70a65bb06d4b189b1404cd"
- integrity sha512-hA/3GVMmRwOPXWhImrBG9gZTdERr937NMuedKhTXuNj6TNMNjk9XQ+q2erd0LZVbgfhL/nC0wHnpy0dUWXu8jA==
- dependencies:
- "@angular-devkit/architect" "0.11.1"
- "@angular-devkit/build-optimizer" "0.11.1"
- "@angular-devkit/build-webpack" "0.11.1"
- "@angular-devkit/core" "7.1.1"
- "@ngtools/webpack" "7.1.1"
- ajv "6.5.3"
- autoprefixer "9.3.1"
+"@angular-devkit/build-angular@~0.13.1":
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.13.1.tgz#369febda48dd40e47a4f0077064e792612a8e1c1"
+ integrity sha512-vkKwMVQ+NNCcVR3HFMffS+Mq4b2afXeUjI+02N38hBuFTppnC83uivUB6Uu2NUk5NTSQA4BnJlG5CbMs6N4QYg==
+ dependencies:
+ "@angular-devkit/architect" "0.13.1"
+ "@angular-devkit/build-optimizer" "0.13.1"
+ "@angular-devkit/build-webpack" "0.13.1"
+ "@angular-devkit/core" "7.3.1"
+ "@ngtools/webpack" "7.3.1"
+ ajv "6.7.0"
+ autoprefixer "9.4.6"
circular-dependency-plugin "5.0.2"
clean-css "4.2.1"
- copy-webpack-plugin "4.5.4"
- file-loader "2.0.0"
+ copy-webpack-plugin "4.6.0"
+ file-loader "3.0.1"
glob "7.1.3"
- istanbul "0.4.5"
istanbul-instrumenter-loader "3.0.1"
karma-source-map-support "1.3.0"
- less "3.8.1"
+ less "3.9.0"
less-loader "4.1.0"
- license-webpack-plugin "2.0.2"
- loader-utils "1.1.0"
- mini-css-extract-plugin "0.4.4"
+ license-webpack-plugin "2.1.0"
+ loader-utils "1.2.3"
+ mini-css-extract-plugin "0.5.0"
minimatch "3.0.4"
- opn "5.3.0"
+ opn "5.4.0"
parse5 "4.0.0"
- portfinder "1.0.17"
- postcss "7.0.5"
- postcss-import "12.0.0"
+ postcss "7.0.14"
+ postcss-import "12.0.1"
postcss-loader "3.0.0"
- raw-loader "0.5.1"
+ raw-loader "1.0.0"
rxjs "6.3.3"
sass-loader "7.1.0"
- semver "5.5.1"
+ semver "5.6.0"
source-map-loader "0.2.4"
- source-map-support "0.5.9"
- speed-measure-webpack-plugin "1.2.3"
+ source-map-support "0.5.10"
+ speed-measure-webpack-plugin "1.3.0"
stats-webpack-plugin "0.7.0"
style-loader "0.23.1"
stylus "0.54.5"
stylus-loader "3.0.2"
- terser-webpack-plugin "1.1.0"
- tree-kill "1.2.0"
- webpack "4.23.1"
- webpack-dev-middleware "3.4.0"
- webpack-dev-server "3.1.10"
- webpack-merge "4.1.4"
+ terser-webpack-plugin "1.2.2"
+ tree-kill "1.2.1"
+ webpack "4.29.0"
+ webpack-dev-middleware "3.5.1"
+ webpack-dev-server "3.1.14"
+ webpack-merge "4.2.1"
webpack-sources "1.3.0"
webpack-subresource-integrity "1.1.0-rc.6"
optionalDependencies:
- node-sass "4.10.0"
+ node-sass "4.11.0"
-"@angular-devkit/build-optimizer@0.11.1":
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.11.1.tgz#1079737a44b26b39e35cea7f966a39cd11bbbf48"
- integrity sha512-pyFP6ykZf8Iq8nRkgP2XKq8knpIG6ye0qYklnBC9815AC5RAO126Y4fmtd6tnH+5p1mQxnt5HegG0j5xOCgDRw==
+"@angular-devkit/build-optimizer@0.13.1":
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.13.1.tgz#56151179bd6427918ba8e0f5a7e581e5daa00294"
+ integrity sha512-LmvHiI3H451aVWY5Ac6Fqz0i1eX/mUfWN+uJvo8NaL6Jc0HKYX2o3l4ODr8UUECWWctUC9AMD522ZMwAvnvsKQ==
dependencies:
- loader-utils "1.1.0"
+ loader-utils "1.2.3"
source-map "0.5.6"
- typescript "3.1.6"
- webpack-sources "1.2.0"
+ typescript "3.2.4"
+ webpack-sources "1.3.0"
-"@angular-devkit/build-webpack@0.11.1":
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.11.1.tgz#bd98ff3dea633c5b77671b471e72cf6c91f6c679"
- integrity sha512-p7fPHOi2Wfq2VPtnRVowg3n99MujghpOp6zW0gBJQD1TQhGVzPK6AX42S0NA4d05ahNBCDU2n7Y+5TjNJRIGJw==
+"@angular-devkit/build-webpack@0.13.1":
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.13.1.tgz#98d666765705e9379c9b2e0a3b6dfcd0347a2a32"
+ integrity sha512-OGwC7bAl3u+w7Glw+OqIrN7OD1BkDXgrWbeQSpKAmsx6VdNPCnI4NPS+JldWNp70LVlE2nQlJUhtEqMVfBMnlg==
dependencies:
- "@angular-devkit/architect" "0.11.1"
- "@angular-devkit/core" "7.1.1"
+ "@angular-devkit/architect" "0.13.1"
+ "@angular-devkit/core" "7.3.1"
rxjs "6.3.3"
-"@angular-devkit/core@7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.1.1.tgz#ce0a674f16188072988502cc3f073b15efcfe194"
- integrity sha512-rODqECpOiV6vX+L1qd63GLiF3SG+V1O+d8WYtnKPOxnsMM9yWpWmqmroHtXfisjucu/zwoqj8HoO/noJZCfynw==
+"@angular-devkit/core@7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.1.tgz#d92f6545796579cabdcfc29579a2c977f7a96c6c"
+ integrity sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ==
dependencies:
- ajv "6.5.3"
+ ajv "6.7.0"
chokidar "2.0.4"
fast-json-stable-stringify "2.0.0"
rxjs "6.3.3"
source-map "0.7.3"
-"@angular-devkit/schematics@7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.1.1.tgz#328ec6071c5ef3b1588a9f4bc97f5edfc3620b09"
- integrity sha512-yjzTw8ZWMPg0Fc9VQCHNpUCAH7aiNxrUDs0IbhdC0CyKTBoqH+cx2xP4Z6ECf4uNwceLKJlE0l3ot42Ypnlziw==
+"@angular-devkit/schematics@7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.1.tgz#7dc704005b966ea6c1ee62f380120183bb76eee6"
+ integrity sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==
dependencies:
- "@angular-devkit/core" "7.1.1"
+ "@angular-devkit/core" "7.3.1"
rxjs "6.3.3"
-"@angular/animations@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.1.1.tgz#8fecbd19417364946a9ea40c8fdf32462110232f"
- integrity sha512-iTNxhPPraCZsE4rgM23lguT1kDV4mfYAr+Bsi5J0+v9ZJA+VaKvi6eRW8ZGrx4/rDz6hzTnBn1jgPppHFbsOcw==
+"@angular/animations@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.4.tgz#4d0a0b9f14d6bfc38ca773613b61729d020435e6"
+ integrity sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==
dependencies:
tslib "^1.9.0"
-"@angular/cli@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.1.1.tgz#c5dd2b92c5c3391f20262b5e530813e4e2d31777"
- integrity sha512-lPVKsk035T5Ls0Mf83OngrNoLZu/ucZSjRLN/GWZK1O/YYVmb/dTgVl/a7HC+G480tWQ34nlqnCRbrP7sE9v7g==
- dependencies:
- "@angular-devkit/architect" "0.11.1"
- "@angular-devkit/core" "7.1.1"
- "@angular-devkit/schematics" "7.1.1"
- "@schematics/angular" "7.1.1"
- "@schematics/update" "0.11.1"
- inquirer "6.2.0"
- opn "5.3.0"
- semver "5.5.1"
+"@angular/cli@~7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.1.tgz#a18acdec84deb03a1fae79cae415bbc8f9c87ffa"
+ integrity sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==
+ dependencies:
+ "@angular-devkit/architect" "0.13.1"
+ "@angular-devkit/core" "7.3.1"
+ "@angular-devkit/schematics" "7.3.1"
+ "@schematics/angular" "7.3.1"
+ "@schematics/update" "0.13.1"
+ "@yarnpkg/lockfile" "1.1.0"
+ ini "1.3.5"
+ inquirer "6.2.1"
+ npm-package-arg "6.1.0"
+ opn "5.4.0"
+ pacote "9.4.0"
+ semver "5.6.0"
symbol-observable "1.2.0"
-"@angular/common@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.1.1.tgz#f78f884614ef81ab2fd648f1aa3e83aae370a6c8"
- integrity sha512-SngekFx9v39sjgi9pON0Wehxpu+NdUk7OEebw4Fa8dKqTgydTkuhmnNH+9WQe264asoeCt51oufPRjIqMLNohA==
+"@angular/common@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.4.tgz#9f1ed530e5dc7613a263e015c203ead390d50336"
+ integrity sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==
dependencies:
tslib "^1.9.0"
-"@angular/compiler-cli@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.1.1.tgz#c5f6225fb72b56f42fa78c332fdee9755c64604e"
- integrity sha512-4NXlkDhOEQgaP3Agigqw93CvXJvsfnXa0xiglq9e/wjL+6XbtM9WcDb5lfRQz41N9RSkO3pEHGvKMweKZGgogA==
+"@angular/compiler-cli@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz#3de23fd5f558a859a444c58dab18f2981c9c2937"
+ integrity sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==
dependencies:
canonical-path "1.0.0"
chokidar "^1.4.2"
tslib "^1.9.0"
yargs "9.0.1"
-"@angular/compiler@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.1.1.tgz#4efbcad27ab43d4cd36d936a8df2e073f6d02d0a"
- integrity sha512-oJvBe8XZ+DXF/W/DxWBTbBcixJTuPeZWdkcZIGWhJoQP7K5GnGnj8ffP9Lp6Dh4TKv85awtC6OfIKhbHxa650Q==
+"@angular/compiler@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.4.tgz#133eb97fc3169ec9ff84f134eb9e3497fa37537e"
+ integrity sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==
dependencies:
tslib "^1.9.0"
-"@angular/core@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.1.1.tgz#9748b0103cd86226554e1ccbd0f43dd8c46f1ed1"
- integrity sha512-Osig5SRgDRQ+Hec/liN7nq/BCJieB+4/pqRh9rFbOXezb2ptgRZqdXOXN8P17i4AwPVf308Mh55V0niJ5Eu3Rw==
+"@angular/core@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.4.tgz#a6c84940c8edcfa37158f666a1f99c6e4a97bf95"
+ integrity sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==
dependencies:
tslib "^1.9.0"
-"@angular/forms@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.1.1.tgz#d16ef10a901c007062fd19144cd77917ef55ee24"
- integrity sha512-yCWuPjpu23Wc3XUw7v/ACNn/e249oT0bYlM8aaMQ1F5OwrmmC4NJC12Rpl9Ihza61RIHIKzNcHVEgzc7WhcSag==
+"@angular/forms@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.4.tgz#be89cf83ad16fa3c813c12e4cff85da5409cf7a0"
+ integrity sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==
dependencies:
tslib "^1.9.0"
-"@angular/http@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.1.1.tgz#f19f17ad42e7f3cdabcf1250ca757640d0f02219"
- integrity sha512-pRk+c/kz9aJ8te5xzCxlPLpFnwB0d/E9YkOo3/ydaXF9vZw13RTzk00YyzJ41PDzJf8oPDdXtueTQ+vtJ7Srtw==
+"@angular/http@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.4.tgz#fc151ac15c8c7542cb7242a430ad2319655c2ff5"
+ integrity sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==
dependencies:
tslib "^1.9.0"
-"@angular/language-service@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.1.1.tgz#6bbe35b2430ad54618a1803f881efb5894b296c9"
- integrity sha512-X+5g20PMtNRGZIa3svMv4PLJdJehn4wqrS8nwOtzH5XkSn5vA3IxjsJVdSzAy2AN0/sKKJK5jmQorPtKO4saJg==
+"@angular/language-service@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.4.tgz#db72460040b070410cbff678410c142f4d682af8"
+ integrity sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw==
-"@angular/platform-browser-dynamic@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.1.tgz#6945298446173338782f437a996226110cda0d3e"
- integrity sha512-ZIu48Vn4S6gjD7CMbGlKGaPQ8v9rYkWzlNYi4vTYzgiqKKNC3hqLsVESU3mSvr5oeQBxSIBidTdHSyafHFrA2w==
+"@angular/platform-browser-dynamic@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz#24dce1bb0d9dab541b3b1b3eda3084a732f11b64"
+ integrity sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==
dependencies:
tslib "^1.9.0"
-"@angular/platform-browser@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.1.1.tgz#a6bd408f656dc43ee5a2d8af3dfaa786c7c1dfca"
- integrity sha512-I6OPjecynGJSbPtzu0gvEgSmIR6X6/xEAhg4L9PycW1ryjzptTC9klWRTWIqsIBqMxhVnY44uKLeRNrDwMOwyA==
+"@angular/platform-browser@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.4.tgz#2cf5305878d0620d6b8c02eff00ac3ca8dbc5970"
+ integrity sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==
dependencies:
tslib "^1.9.0"
-"@angular/router@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.1.1.tgz#80a4cdffc03a529b73485c2ad63a30ec435364ea"
- integrity sha512-jbnqEq/1iDBkeH8Vn13hauGPTzhwllWM+MLfmdNGTiMzGRx4pmkWa57seDOeBF/GNYBL9JjkWTCrkKFAc2FJKw==
+"@angular/router@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.4.tgz#83f1997c2a4e6acda93b991b8d7f3dad2b3f91f0"
+ integrity sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==
dependencies:
tslib "^1.9.0"
-"@angular/service-worker@~7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.1.1.tgz#c9e6f0265d7e102d8271483519cf09a180f0e08b"
- integrity sha512-xX00x0XMW47jEfYTZLwdJCqkmPE7+mdtlSeOGpjaKv6Y2hqZodz80RYgH5JltM4RKEzOvQolR6KmdKcw1ANs9Q==
+"@angular/service-worker@~7.2.4":
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.4.tgz#d16d6d08c0d5c29c93e9f80cddc4013c9b8859fb"
+ integrity sha512-IYsHshkgCYYmWLwtP7wwk8tfwphE4IJrkUitEu+ST6x+er/K9LyLo09WQeEZHIwDaPm9icoqc3TJJdXI46mrmg==
dependencies:
tslib "^1.9.0"
dependencies:
tslib "^1.9.0"
-"@ngtools/webpack@7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.1.1.tgz#c418e1cb0d70a77d06e8c32500fe2e92e606ea52"
- integrity sha512-XW/YDjiDZlwOYK4YvGAIKIVEkqtdwPLwTWAmDbnfpEHQc8UALsBrzGdjze0jSfXQdQxkbmXo0aolZgNc7uL/wQ==
+"@ngtools/webpack@7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.3.1.tgz#4ff68007fd68fdc26f22e19115182f96fb6f7335"
+ integrity sha512-EGQRjgDf5XP+Fm1MdZNRFiPd9e1vhl11BhjkwqkAsewic4eoz6fqXfj/Osz1hQy8xU+2dPPf/byQ/+nY3E02Zg==
dependencies:
- "@angular-devkit/core" "7.1.1"
+ "@angular-devkit/core" "7.3.1"
enhanced-resolve "4.1.0"
rxjs "6.3.3"
- tree-kill "1.2.0"
- webpack-sources "1.2.0"
+ tree-kill "1.2.1"
+ webpack-sources "1.3.0"
"@ngx-loading-bar/core@3.0.0", "@ngx-loading-bar/core@^3.0.0":
version "3.0.0"
tslib "^1.9.0"
yargs "10.0.3"
-"@schematics/angular@7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.1.1.tgz#4ee17a17d221eaf48009db0b991766d1074d0b4f"
- integrity sha512-jMaj8y3rNTQQXuH38uoWfAOmwYjtzqo1RelNfACnT54mfO/Dat+k7WasBLHWuvzvnN4/Ga3kXL7sJpkeMciiIg==
+"@schematics/angular@7.3.1":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.1.tgz#6fcd7004210fa9305310c3109c084df5c5521776"
+ integrity sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==
dependencies:
- "@angular-devkit/core" "7.1.1"
- "@angular-devkit/schematics" "7.1.1"
- typescript "3.1.6"
+ "@angular-devkit/core" "7.3.1"
+ "@angular-devkit/schematics" "7.3.1"
+ typescript "3.2.4"
-"@schematics/update@0.11.1":
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.11.1.tgz#5129a800043dc38ee1f1c879865e0df82ddac7ed"
- integrity sha512-IzPXamoMpDb2eY2zSW4fPuuH+7RfJLte9XVzQM2y3ZTBhlJQFLqx7qJtOXdcXUboonC6o61KCayNDERFnDUdPg==
+"@schematics/update@0.13.1":
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.1.tgz#481475aee18b4a9472a06512b2e4d6429af68231"
+ integrity sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==
dependencies:
- "@angular-devkit/core" "7.1.1"
- "@angular-devkit/schematics" "7.1.1"
+ "@angular-devkit/core" "7.3.1"
+ "@angular-devkit/schematics" "7.3.1"
"@yarnpkg/lockfile" "1.1.0"
ini "1.3.5"
- pacote "9.1.1"
+ pacote "9.4.0"
rxjs "6.3.3"
- semver "5.5.1"
+ semver "5.6.0"
semver-intersect "1.4.0"
+"@streamroot/videojs-hlsjs-plugin@^1.0.7":
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/@streamroot/videojs-hlsjs-plugin/-/videojs-hlsjs-plugin-1.0.7.tgz#581aecdf6a966162b404c60bd3ab8264eb89d334"
+ integrity sha512-7oAIOhEFxkfLOYWDfg7Oh3+OrnoTElRvUE3Jblg2B+SHmnrw4YXQnAwYJ0AHjNIBKoHnQubzZGttLaHAFJVspQ==
+
"@types/bittorrent-protocol@*":
version "2.2.2"
resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83"
resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47"
integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ==
+"@types/hls.js@^0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@types/hls.js/-/hls.js-0.12.0.tgz#33f73e542201a766fa56792cb81fe9f97d7097ed"
+ integrity sha512-hJ7eJAQVEazAANK4Ay0YbXlZF36SDy9c8kcHTF7//77ylgV6hV/JrlwhVmobsSacr5aZcbw5MbZ2bSHbS36eOQ==
+
"@types/jasmine@*":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.1.tgz#b6c4f356013364e98b583647c7b3b6de6fccd2cc"
resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14"
integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg==
+"@types/source-list-map@*":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
"@types/video.js@^7.2.5":
version "7.2.5"
resolved "https://registry.yarnpkg.com/@types/video.js/-/video.js-7.2.5.tgz#20896c81141d3517c3a89bb6eb97c6a191aa5d4c"
integrity sha512-5WUDOme0q81d58nEqf7qnz7B2Jc4jlA7/MQGOgoqI5VE6oied0KUfk5x/XqPSZSAHNwDDREAkrcK8JXcB+iruQ==
+"@types/webpack-sources@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92"
+ integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==
+ dependencies:
+ "@types/node" "*"
+ "@types/source-list-map" "*"
+ source-map "^0.6.1"
+
"@types/webtorrent@^0.98.4":
version "0.98.4"
resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4"
url-toolkit "^2.1.3"
video.js "^6.8.0 || ^7.0.0"
-"@webassemblyjs/ast@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a"
- integrity sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==
- dependencies:
- "@webassemblyjs/helper-module-context" "1.7.10"
- "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
- "@webassemblyjs/wast-parser" "1.7.10"
-
"@webassemblyjs/ast@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
"@webassemblyjs/helper-wasm-bytecode" "1.7.11"
"@webassemblyjs/wast-parser" "1.7.11"
-"@webassemblyjs/floating-point-hex-parser@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9"
- integrity sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==
-
"@webassemblyjs/floating-point-hex-parser@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
-"@webassemblyjs/helper-api-error@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198"
- integrity sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==
-
"@webassemblyjs/helper-api-error@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
-"@webassemblyjs/helper-buffer@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b"
- integrity sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==
-
"@webassemblyjs/helper-buffer@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
-"@webassemblyjs/helper-code-frame@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz#0ab7e22fad0241a173178c73976fc0edf50832ce"
- integrity sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==
- dependencies:
- "@webassemblyjs/wast-printer" "1.7.10"
-
"@webassemblyjs/helper-code-frame@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
dependencies:
"@webassemblyjs/wast-printer" "1.7.11"
-"@webassemblyjs/helper-fsm@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64"
- integrity sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==
-
"@webassemblyjs/helper-fsm@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
-"@webassemblyjs/helper-module-context@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755"
- integrity sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==
-
"@webassemblyjs/helper-module-context@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
-"@webassemblyjs/helper-wasm-bytecode@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0"
- integrity sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==
-
"@webassemblyjs/helper-wasm-bytecode@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
-"@webassemblyjs/helper-wasm-section@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz#c0ea3703c615d7bc3e3507c3b7991c8767b2f20e"
- integrity sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-buffer" "1.7.10"
- "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
- "@webassemblyjs/wasm-gen" "1.7.10"
-
"@webassemblyjs/helper-wasm-section@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
"@webassemblyjs/helper-wasm-bytecode" "1.7.11"
"@webassemblyjs/wasm-gen" "1.7.11"
-"@webassemblyjs/ieee754@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz#62c1728b7ef0f66ef8221e2966a0afd75db430df"
- integrity sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
"@webassemblyjs/ieee754@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.10.tgz#167e0bb4b06d7701585772a73fba9f4df85439f6"
- integrity sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==
- dependencies:
- "@xtuc/long" "4.2.1"
-
"@webassemblyjs/leb128@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
dependencies:
"@xtuc/long" "4.2.1"
-"@webassemblyjs/utf8@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a"
- integrity sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==
-
"@webassemblyjs/utf8@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
-"@webassemblyjs/wasm-edit@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz#83fe3140f5a58f5a30b914702be9f0e59a399092"
- integrity sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-buffer" "1.7.10"
- "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
- "@webassemblyjs/helper-wasm-section" "1.7.10"
- "@webassemblyjs/wasm-gen" "1.7.10"
- "@webassemblyjs/wasm-opt" "1.7.10"
- "@webassemblyjs/wasm-parser" "1.7.10"
- "@webassemblyjs/wast-printer" "1.7.10"
-
"@webassemblyjs/wasm-edit@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
"@webassemblyjs/wasm-parser" "1.7.11"
"@webassemblyjs/wast-printer" "1.7.11"
-"@webassemblyjs/wasm-gen@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz#4de003806ae29c97ab3707782469b53299570174"
- integrity sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
- "@webassemblyjs/ieee754" "1.7.10"
- "@webassemblyjs/leb128" "1.7.10"
- "@webassemblyjs/utf8" "1.7.10"
-
"@webassemblyjs/wasm-gen@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
"@webassemblyjs/leb128" "1.7.11"
"@webassemblyjs/utf8" "1.7.11"
-"@webassemblyjs/wasm-opt@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz#d151e31611934a556c82789fdeec41a814993c2a"
- integrity sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-buffer" "1.7.10"
- "@webassemblyjs/wasm-gen" "1.7.10"
- "@webassemblyjs/wasm-parser" "1.7.10"
-
"@webassemblyjs/wasm-opt@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
"@webassemblyjs/wasm-gen" "1.7.11"
"@webassemblyjs/wasm-parser" "1.7.11"
-"@webassemblyjs/wasm-parser@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz#0367be7bf8f09e3e6abc95f8e483b9206487ec65"
- integrity sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-api-error" "1.7.10"
- "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
- "@webassemblyjs/ieee754" "1.7.10"
- "@webassemblyjs/leb128" "1.7.10"
- "@webassemblyjs/utf8" "1.7.10"
-
"@webassemblyjs/wasm-parser@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
"@webassemblyjs/leb128" "1.7.11"
"@webassemblyjs/utf8" "1.7.11"
-"@webassemblyjs/wast-parser@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz#058f598b52f730b23fc874d4775b6286b6247264"
- integrity sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/floating-point-hex-parser" "1.7.10"
- "@webassemblyjs/helper-api-error" "1.7.10"
- "@webassemblyjs/helper-code-frame" "1.7.10"
- "@webassemblyjs/helper-fsm" "1.7.10"
- "@xtuc/long" "4.2.1"
-
"@webassemblyjs/wast-parser@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
"@webassemblyjs/helper-fsm" "1.7.11"
"@xtuc/long" "4.2.1"
-"@webassemblyjs/wast-printer@1.7.10":
- version "1.7.10"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz#d817909d2450ae96c66b7607624d98a33b84223b"
- integrity sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/wast-parser" "1.7.10"
- "@xtuc/long" "4.2.1"
-
"@webassemblyjs/wast-printer@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-abbrev@1.0.x:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
- integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU=
-
accepts@~1.3.4, accepts@~1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
mime-types "~2.1.18"
negotiator "0.6.1"
-acorn-dynamic-import@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
- integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==
- dependencies:
- acorn "^5.0.0"
+acorn-dynamic-import@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
+ integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
acorn-globals@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
-acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2, acorn@^5.7.3:
+acorn@^5.5.3, acorn@^5.7.3:
version "5.7.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==
+acorn@^6.0.5:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818"
+ integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==
+
addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=
-ajv@6.5.3:
- version "6.5.3"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9"
- integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==
+ajv@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96"
+ integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==
dependencies:
fast-deep-equal "^2.0.1"
fast-json-stable-stringify "^2.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+ansi-regex@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
+ integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
-async@1.x, async@^1.5.2:
+async@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-autoprefixer@9.3.1:
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e"
- integrity sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q==
+autoprefixer@9.4.6:
+ version "9.4.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.6.tgz#0ace275e33b37de16b09a5547dbfe73a98c1d446"
+ integrity sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==
dependencies:
- browserslist "^4.3.3"
- caniuse-lite "^1.0.30000898"
+ browserslist "^4.4.1"
+ caniuse-lite "^1.0.30000929"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
- postcss "^7.0.5"
+ postcss "^7.0.13"
postcss-value-parser "^3.3.1"
awesome-typescript-loader@5.2.1:
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
binary-extensions@^1.0.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
unordered-array-remove "^1.0.2"
xtend "^4.0.0"
-bittorrent-tracker@^9.0.0:
+bittorrent-tracker@^9.0.0, bittorrent-tracker@^9.10.1:
version "9.10.1"
resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11"
integrity sha512-n5zTL/g6Wt0rb2EnkiyiaGYhth7I/N0/xMqGUpvGX/7g1scDGBVPhJnXR8lfp3/OMj681fv40o4q/otECMtZSA==
dependencies:
minimist "^1.2.0"
-bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.2:
+bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
dependencies:
pako "~1.0.5"
-browserslist@^4.3.3:
- version "4.3.5"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7"
- integrity sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==
+browserslist@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062"
+ integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==
dependencies:
- caniuse-lite "^1.0.30000912"
- electron-to-chromium "^1.3.86"
- node-releases "^1.0.5"
+ caniuse-lite "^1.0.30000929"
+ electron-to-chromium "^1.3.103"
+ node-releases "^1.1.3"
browserstack@^1.5.1:
version "1.5.1"
unique-filename "^1.1.0"
y18n "^4.0.0"
-cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0:
+cacache@^11.0.1, cacache@^11.0.2:
version "11.3.1"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f"
integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==
unique-filename "^1.1.0"
y18n "^4.0.0"
+cacache@^11.3.2:
+ version "11.3.2"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
+ integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
+ dependencies:
+ bluebird "^3.5.3"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.3"
+ graceful-fs "^4.1.15"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
+
cache-base@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
-caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000912:
- version "1.0.30000914"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000914.tgz#f802b4667c24d0255f54a95818dcf8e1aa41f624"
- integrity sha512-qqj0CL1xANgg6iDOybiPTIxtsmAnfIky9mBC35qgWrnK4WwmhqfpmkDYMYgwXJ8LRZ3/2jXlCntulO8mBaAgSg==
+caniuse-lite@^1.0.30000929:
+ version "1.0.30000935"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59"
+ integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==
canonical-path@1.0.0:
version "1.0.0"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
-commander@~2.13.0:
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
- integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
-
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-copy-webpack-plugin@4.5.4:
- version "4.5.4"
- resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27"
- integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==
+copy-webpack-plugin@4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
+ integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
dependencies:
cacache "^10.0.4"
find-cache-dir "^1.0.0"
dependencies:
ms "^2.1.1"
+debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
-detect-node@^2.0.3:
+detect-node@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
-electron-to-chromium@^1.3.86:
- version "1.3.88"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz#f36ab32634f49ef2b0fdc1e82e2d1cc17feb29e7"
- integrity sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A==
+electron-to-chromium@^1.3.103:
+ version "1.3.113"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9"
+ integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==
elliptic@^6.0.0:
version "6.4.1"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-escodegen@1.8.x:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
- integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=
- dependencies:
- esprima "^2.7.1"
- estraverse "^1.9.1"
- esutils "^2.0.2"
- optionator "^0.8.1"
- optionalDependencies:
- source-map "~0.2.0"
-
escodegen@^1.9.1:
version "1.11.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
esrecurse "^4.1.0"
estraverse "^4.1.1"
-esprima@2.7.x, esprima@^2.7.1:
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
- integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
-
esprima@^3.1.3, esprima@~3.1.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
dependencies:
estraverse "^4.1.0"
-estraverse@^1.9.1:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
- integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=
-
estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-eventemitter3@^3.0.0:
+eventemitter3@3.1.0, eventemitter3@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
+events@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
+ integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
+
eventsource@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
dependencies:
escape-string-regexp "^1.0.5"
-file-loader@2.0.0, file-loader@^2.0.0:
+file-loader@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
+ integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
+ dependencies:
+ loader-utils "^1.0.2"
+ schema-utils "^1.0.0"
+
+file-loader@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde"
integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==
resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
-get-browser-rtc@^1.0.0:
+get-browser-rtc@^1.0.0, get-browser-rtc@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9"
integrity sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^5.0.15:
- version "5.0.15"
- resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
- integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
global-modules-path@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931"
lodash "~4.17.10"
minimatch "~3.0.2"
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
duplexer "^0.1.1"
pify "^3.0.0"
-handle-thing@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
- integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=
+handle-thing@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
+ integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
-handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.3:
+handlebars@^4.0.11, handlebars@^4.0.3:
version "4.0.12"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+hls.js@^0.12.2:
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.12.2.tgz#64a969a78cc25991ed5de19357b1dc3f178ac23b"
+ integrity sha512-lQBSXggw9OzEuaUllUBoSxPcf7neFgnEiDRfCdCNdIPtUeV7vXZ0OeASx6EWtZTBiqSSPigoOX1Y+AR5dA1Feg==
+ dependencies:
+ eventemitter3 "3.1.0"
+ url-toolkit "^2.1.6"
+
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-inquirer@6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8"
- integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==
+inquirer@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52"
+ integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.0"
run-async "^2.2.0"
rxjs "^6.1.0"
string-width "^2.1.0"
- strip-ansi "^4.0.0"
+ strip-ansi "^5.0.0"
through "^2.3.6"
internal-ip@^3.0.1:
dependencies:
handlebars "^4.0.11"
-istanbul@0.4.5:
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
- integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=
- dependencies:
- abbrev "1.0.x"
- async "1.x"
- escodegen "1.8.x"
- esprima "2.7.x"
- glob "^5.0.15"
- handlebars "^4.0.1"
- js-yaml "3.x"
- mkdirp "0.5.x"
- nopt "3.x"
- once "1.x"
- resolve "1.1.x"
- supports-color "^3.1.0"
- which "^1.1.1"
- wordwrap "^1.0.0"
-
jasmine-core@^3.1.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.3.0.tgz#dea1cdc634bc93c7e0d4ad27185df30fa971b10e"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
+js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
loader-utils "^1.1.0"
pify "^3.0.0"
-less@3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d"
- integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==
+less@3.9.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474"
+ integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==
dependencies:
clone "^2.1.2"
optionalDependencies:
prelude-ls "~1.1.2"
type-check "~0.3.2"
-license-webpack-plugin@2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz#9d34b521cb7fca8527945310b05be6ef0248b687"
- integrity sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA==
+license-webpack-plugin@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.0.tgz#83acaa6e89c3c5316effdd80cb4ec9c5cd8efc2f"
+ integrity sha512-vDiBeMWxjE9n6TabQ9J4FH8urFdsRK0Nvxn1cit9biCiR9aq1zBR0X2BlAkEiIG6qPamLeU0GzvIgLkrFc398A==
dependencies:
+ "@types/webpack-sources" "^0.1.5"
webpack-sources "^1.2.0"
lie@~3.1.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979"
integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==
-loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
- integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=
+loader-utils@1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
+ integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
dependencies:
- big.js "^3.1.3"
+ big.js "^5.2.2"
emojis-list "^2.0.0"
- json5 "^0.5.0"
+ json5 "^1.0.1"
loader-utils@^0.2.16:
version "0.2.17"
json5 "^0.5.0"
object-assign "^4.0.1"
+loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
pseudomap "^1.0.2"
yallist "^2.1.2"
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
lru@^3.0.0, lru@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5"
resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.2.0.tgz#c8e0785fd17f741f4408b49466889274a9e36447"
integrity sha512-LVHw0U6IPJjwk9i9f7Xe26NqaUHTNlIt4SSWoEfYFROeVKHN6MIjOhbRheI3dg8Jbq5WCuMFQ0QU3EgZpmzFPg==
+m3u8-parser@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.3.0.tgz#4b4e988f87b6d8b2401d209a1d17798285a9da04"
+ integrity sha512-bVbjuBMoVIgFL1vpXVIxjeaoB5TPDJRb0m5qiTdM738SGqv/LAmsnVVPlKjM4fulm/rr1XZsKM+owHm+zvqxYA==
+ dependencies:
+ global "^4.3.2"
+
magic-string@^0.25.0:
version "0.25.1"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e"
dependencies:
dom-walk "^0.1.0"
-mini-css-extract-plugin@0.4.4:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d"
- integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==
+mini-css-extract-plugin@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
+ integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==
dependencies:
loader-utils "^1.1.0"
schema-utils "^1.0.0"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
semver "^5.3.0"
tar "^4"
-node-releases@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d"
- integrity sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ==
+node-releases@^1.1.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.7.tgz#b09a10394d0ed8f7778f72bb861dde68b146303b"
+ integrity sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==
dependencies:
semver "^5.3.0"
-node-sass@4.10.0, node-sass@^4.9.3:
+node-sass@4.11.0:
+ version "4.11.0"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
+ integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==
+ dependencies:
+ async-foreach "^0.1.3"
+ chalk "^1.1.1"
+ cross-spawn "^3.0.0"
+ gaze "^1.0.0"
+ get-stdin "^4.0.1"
+ glob "^7.0.3"
+ in-publish "^2.0.0"
+ lodash.assign "^4.2.0"
+ lodash.clonedeep "^4.3.2"
+ lodash.mergewith "^4.6.0"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ nan "^2.10.0"
+ node-gyp "^3.8.0"
+ npmlog "^4.0.0"
+ request "^2.88.0"
+ sass-graph "^2.2.4"
+ stdout-stream "^1.4.0"
+ "true-case-path" "^1.0.2"
+
+node-sass@^4.9.3:
version "4.10.0"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4"
integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==
stdout-stream "^1.4.0"
"true-case-path" "^1.0.2"
-"nopt@2 || 3", nopt@3.x:
+"nopt@2 || 3":
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e"
integrity sha1-xVyK42juvbysplQloNfh+aGSoD4=
-npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
+npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
-npm-pick-manifest@^2.1.0:
+npm-pick-manifest@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40"
integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==
dependencies:
isobject "^3.0.1"
-obuf@^1.0.0, obuf@^1.1.1:
+obuf@^1.0.0, obuf@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=
-once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
-opn@5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
- integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==
- dependencies:
- is-wsl "^1.1.0"
-
-opn@^5.1.0:
+opn@5.4.0, opn@^5.1.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035"
integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
+p2p-media-loader-core@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/p2p-media-loader-core/-/p2p-media-loader-core-0.4.0.tgz#767d56785545bc9c0d8c1a04eb7b67a33e40d0c8"
+ integrity sha512-llcFqEDs19o916g2OSIPHPjZweO5caHUm/7P18Qu+qb3swYQYSPNwMLoHnpXROHiH5I+00K8w5enz31oUwiCgA==
+ dependencies:
+ bittorrent-tracker "^9.10.1"
+ debug "^4.1.1"
+ events "^3.0.0"
+ get-browser-rtc "^1.0.2"
+ sha.js "^2.4.11"
+
+p2p-media-loader-hlsjs@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-0.4.0.tgz#1b90c88580503d4c3d8017c813abe41803b613ed"
+ integrity sha512-IWRs/aGasKD//+dtQkYWAjD/cQx3LMaLkMn0EzLhLpeBj4SLNjlbwOPlbx36M4i39X04Y3WZe9YUeIciId3G5Q==
+ dependencies:
+ events "^3.0.0"
+ m3u8-parser "^4.3.0"
+ p2p-media-loader-core "^0.4.0"
+
package-json-versionify@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
dependencies:
browserify-package-json "^1.0.0"
-pacote@9.1.1:
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.1.tgz#25091f75a25021de8be8d34cc6408728fca3579b"
- integrity sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA==
+pacote@9.4.0:
+ version "9.4.0"
+ resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.4.0.tgz#af979abdeb175cd347c3e33be3241af1ed254807"
+ integrity sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==
dependencies:
- bluebird "^3.5.2"
- cacache "^11.2.0"
+ bluebird "^3.5.3"
+ cacache "^11.3.2"
figgy-pudding "^3.5.1"
get-stream "^4.1.0"
glob "^7.1.3"
- lru-cache "^4.1.3"
+ lru-cache "^5.1.1"
make-fetch-happen "^4.0.1"
minimatch "^3.0.4"
minipass "^2.3.5"
normalize-package-data "^2.4.0"
npm-package-arg "^6.1.0"
npm-packlist "^1.1.12"
- npm-pick-manifest "^2.1.0"
+ npm-pick-manifest "^2.2.3"
npm-registry-fetch "^3.8.0"
osenv "^0.1.5"
promise-inflight "^1.0.1"
safe-buffer "^5.1.2"
semver "^5.6.0"
ssri "^6.0.1"
- tar "^4.4.6"
+ tar "^4.4.8"
unique-filename "^1.1.1"
which "^1.3.1"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f"
integrity sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8=
-portfinder@1.0.17:
- version "1.0.17"
- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a"
- integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==
- dependencies:
- async "^1.5.2"
- debug "^2.2.0"
- mkdirp "0.5.x"
-
portfinder@^1.0.9:
version "1.0.20"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
-postcss-import@12.0.0:
- version "12.0.0"
- resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.0.tgz#149f96a4ef0b27525c419784be8517ebd17e92c5"
- integrity sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ==
+postcss-import@12.0.1:
+ version "12.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
+ integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
dependencies:
postcss "^7.0.1"
postcss-value-parser "^3.2.3"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-postcss@7.0.5:
- version "7.0.5"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55"
- integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==
+postcss@7.0.14, postcss@^7.0.13:
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
+ integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
dependencies:
- chalk "^2.4.1"
+ chalk "^2.4.2"
source-map "^0.6.1"
- supports-color "^5.5.0"
+ supports-color "^6.1.0"
postcss@^6.0.1, postcss@^6.0.23:
version "6.0.23"
source-map "^0.6.1"
supports-color "^5.4.0"
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5:
+postcss@^7.0.0, postcss@^7.0.1:
version "7.0.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2"
integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==
inherits "^2.0.3"
pump "^2.0.0"
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
-punycode@^1.2.4, punycode@^1.4.1:
+punycode@1.3.2, punycode@^1.2.4, punycode@^1.4.1, punycode@^2.1.0, punycode@^2.1.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-punycode@^2.1.0, punycode@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
purify-css@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/purify-css/-/purify-css-1.2.5.tgz#c4b9ec90735765f3e247ba6a3b49f132f3482500"
iconv-lite "0.4.23"
unpipe "1.0.0"
-raw-loader@0.5.1, raw-loader@^0.5.1:
+raw-loader@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405"
+ integrity sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==
+ dependencies:
+ loader-utils "^1.1.0"
+ schema-utils "^1.0.0"
+
+raw-loader@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
normalize-package-data "^2.3.2"
path-type "^2.0.0"
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.3, readable-stream@^2.3.4, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.3, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.2, readable-stream@^2.3.3, readable-stream@^2.3.4, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@1.1.7, resolve@1.1.x:
+resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
dependencies:
semver "^5.0.0"
-"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@5.6.0, semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
-semver@5.5.1:
- version "5.5.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
- integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==
-
semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
-sha.js@^2.4.0, sha.js@^2.4.8:
+sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@0.5.9, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6:
- version "0.5.9"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
- integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
+source-map-support@0.5.10, source-map-support@~0.5.9:
+ version "0.5.10"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
+ integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
dependencies:
source-map "^0.5.6"
+source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+ integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map-url@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
- integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50=
- dependencies:
- amdefine ">=0.0.4"
-
sourcemap-codec@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
-spdy-transport@^2.0.18:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b"
- integrity sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
dependencies:
- debug "^2.6.8"
- detect-node "^2.0.3"
+ debug "^4.1.0"
+ detect-node "^2.0.4"
hpack.js "^2.1.6"
- obuf "^1.1.1"
- readable-stream "^2.2.9"
- safe-buffer "^5.0.1"
- wbuf "^1.7.2"
+ obuf "^1.1.2"
+ readable-stream "^3.0.6"
+ wbuf "^1.7.3"
-spdy@^3.4.1:
- version "3.4.7"
- resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
- integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=
+spdy@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
+ integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
dependencies:
- debug "^2.6.8"
- handle-thing "^1.2.5"
+ debug "^4.1.0"
+ handle-thing "^2.0.0"
http-deceiver "^1.2.7"
- safe-buffer "^5.0.1"
select-hose "^2.0.0"
- spdy-transport "^2.0.18"
+ spdy-transport "^3.0.0"
-speed-measure-webpack-plugin@1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz#de170b5cefbfa1c039d95e639edd3ad50cfc7c48"
- integrity sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw==
+speed-measure-webpack-plugin@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.0.tgz#c7ffafef513df3d63d5d546c8fc1986dfc4969aa"
+ integrity sha512-b9Yd0TrzceMVYSbuamM1sFsGM1oVfyFTM22gOoyLhymNvBVApuYpkdFOgYkKJpN/KhTpcCYcTGHg7X+FJ33Vvw==
dependencies:
chalk "^2.0.1"
dependencies:
ansi-regex "^3.0.0"
+strip-ansi@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f"
+ integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==
+ dependencies:
+ ansi-regex "^4.0.0"
+
strip-bom@3.0.0, strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-supports-color@^3.1.0, supports-color@^3.1.2:
+supports-color@^3.1.2:
version "3.2.3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
dependencies:
has-flag "^3.0.0"
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
symbol-observable@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
fstream "^1.0.2"
inherits "2"
-tar@^4, tar@^4.4.6:
+tar@^4, tar@^4.4.8:
version "4.4.8"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
safe-buffer "^5.1.2"
yallist "^3.0.2"
-terser-webpack-plugin@1.1.0, terser-webpack-plugin@^1.1.0:
+terser-webpack-plugin@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz#9bff3a891ad614855a7dde0d707f7db5a927e3d9"
+ integrity sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==
+ dependencies:
+ cacache "^11.0.2"
+ find-cache-dir "^2.0.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ terser "^3.16.1"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+terser-webpack-plugin@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528"
integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==
webpack-sources "^1.1.0"
worker-farm "^1.5.2"
+terser@^3.16.1:
+ version "3.16.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493"
+ integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==
+ dependencies:
+ commander "~2.17.1"
+ source-map "~0.6.1"
+ source-map-support "~0.5.9"
+
terser@^3.8.1:
version "3.11.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0"
dependencies:
punycode "^2.1.0"
-tree-kill@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36"
- integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==
+tree-kill@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
+ integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68"
integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==
+typescript@3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d"
+ integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==
+
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==
-uglify-es@^3.3.4:
- version "3.3.9"
- resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
- integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==
- dependencies:
- commander "~2.13.0"
- source-map "~0.6.1"
-
uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4:
version "3.4.9"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
commander "~2.17.1"
source-map "~0.6.1"
-uglifyjs-webpack-plugin@^1.2.4:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
- integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==
- dependencies:
- cacache "^10.0.4"
- find-cache-dir "^1.0.0"
- schema-utils "^0.4.5"
- serialize-javascript "^1.4.0"
- source-map "^0.6.1"
- uglify-es "^3.3.4"
- webpack-sources "^1.1.0"
- worker-farm "^1.5.2"
-
uint64be@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5"
querystringify "^2.0.0"
requires-port "^1.0.0"
-url-toolkit@^2.1.1, url-toolkit@^2.1.3:
+url-toolkit@^2.1.1, url-toolkit@^2.1.3, url-toolkit@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2"
integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw==
global "^4.3.2"
video.js "^6 || ^7"
+videojs-contrib-quality-levels@^2.0.9:
+ version "2.0.9"
+ resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.0.9.tgz#b5d533d5092a6fc7d29eae1b43e4597d89bd527b"
+ integrity sha512-HJeaJJQdSufi9Y5T7jlyyhkeq+mWPCog86q6ypoTi66boBMMJTo2abiOSHS9KaOGAJjH72gfvrjVY5FRdjlxYA==
+ dependencies:
+ global "^4.3.2"
+ video.js "^6 || ^7"
+
videojs-dock@^2.0.2:
version "2.1.4"
resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.4.tgz#0ebd198b5d48990e3523fdc87dbfdb9fe96f804c"
graceful-fs "^4.1.2"
neo-async "^2.5.0"
-wbuf@^1.1.0, wbuf@^1.7.2:
+wbuf@^1.1.0, wbuf@^1.7.3:
version "1.7.3"
resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
range-parser "^1.0.3"
webpack-log "^2.0.0"
-webpack-dev-server@3.1.10:
- version "3.1.10"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b"
- integrity sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==
+webpack-dev-middleware@3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.5.1.tgz#9265b7742ef50f54f54c1d9af022fc17c1be9b88"
+ integrity sha512-4dwCh/AyMOYAybggUr8fiCkRnjVDp+Cqlr9c+aaNB3GJYgRGYQWJ1YX/WAKUNA9dPNHZ6QSN2lYDKqjKSI8Vqw==
+ dependencies:
+ memory-fs "~0.4.1"
+ mime "^2.3.1"
+ range-parser "^1.0.3"
+ webpack-log "^2.0.0"
+
+webpack-dev-server@3.1.14:
+ version "3.1.14"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469"
+ integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==
dependencies:
ansi-html "0.0.7"
bonjour "^3.5.0"
portfinder "^1.0.9"
schema-utils "^1.0.0"
selfsigned "^1.9.1"
+ semver "^5.6.0"
serve-index "^1.7.2"
sockjs "0.3.19"
sockjs-client "1.3.0"
- spdy "^3.4.1"
+ spdy "^4.0.0"
strip-ansi "^3.0.0"
supports-color "^5.1.0"
+ url "^0.11.0"
webpack-dev-middleware "3.4.0"
webpack-log "^2.0.0"
yargs "12.0.2"
ansi-colors "^3.0.0"
uuid "^3.3.2"
-webpack-merge@4.1.4:
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b"
- integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==
+webpack-merge@4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
+ integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==
dependencies:
lodash "^4.17.5"
-webpack-sources@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2"
- integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==
- dependencies:
- source-list-map "^2.0.0"
- source-map "~0.6.1"
-
webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
dependencies:
webpack-core "^0.6.8"
-webpack@4.23.1:
- version "4.23.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.23.1.tgz#db7467b116771ae020c58bdfe2a0822785bb8239"
- integrity sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==
- dependencies:
- "@webassemblyjs/ast" "1.7.10"
- "@webassemblyjs/helper-module-context" "1.7.10"
- "@webassemblyjs/wasm-edit" "1.7.10"
- "@webassemblyjs/wasm-parser" "1.7.10"
- acorn "^5.6.2"
- acorn-dynamic-import "^3.0.0"
- ajv "^6.1.0"
- ajv-keywords "^3.1.0"
- chrome-trace-event "^1.0.0"
- enhanced-resolve "^4.1.0"
- eslint-scope "^4.0.0"
- json-parse-better-errors "^1.0.2"
- loader-runner "^2.3.0"
- loader-utils "^1.1.0"
- memory-fs "~0.4.1"
- micromatch "^3.1.8"
- mkdirp "~0.5.0"
- neo-async "^2.5.0"
- node-libs-browser "^2.0.0"
- schema-utils "^0.4.4"
- tapable "^1.1.0"
- uglifyjs-webpack-plugin "^1.2.4"
- watchpack "^1.5.0"
- webpack-sources "^1.3.0"
-
-webpack@^4.17.1:
- version "4.26.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.26.1.tgz#ff3a9283d363c07b3494dfa702d08f4f2ef6cb39"
- integrity sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug==
+webpack@4.29.0:
+ version "4.29.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750"
+ integrity sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==
dependencies:
"@webassemblyjs/ast" "1.7.11"
"@webassemblyjs/helper-module-context" "1.7.11"
"@webassemblyjs/wasm-edit" "1.7.11"
"@webassemblyjs/wasm-parser" "1.7.11"
- acorn "^5.6.2"
- acorn-dynamic-import "^3.0.0"
+ acorn "^6.0.5"
+ acorn-dynamic-import "^4.0.0"
ajv "^6.1.0"
ajv-keywords "^3.1.0"
chrome-trace-event "^1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
-which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1:
+which@1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
string-width "^1.0.2 || 2"
-wordwrap@^1.0.0, wordwrap@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
- integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-
wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
worker-farm@^1.5.2:
version "1.6.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
tmp: 'storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
avatars: 'storage/avatars/'
videos: 'storage/videos/'
+ playlists: 'storage/playlists/'
redundancy: 'storage/redundancy/'
logs: 'storage/logs/'
previews: 'storage/previews/'
480p: false
720p: false
1080p: false
+ # /!\ EXPERIMENTAL /!\
+ # /!\ Requires ffmpeg >= 3.4
+ # Generate HLS playlist/segments. Better playback than with WebTorrent:
+ # * Resolution change is smoother
+ # * Faster playback in particular with long videos
+ # * More stable playback (less bugs/infinite loading)
+ # /!\ Multiply videos storage by two /!\
+ hls:
+ enabled: false
import:
# Add ability for your users to import remote videos (from YouTube, torrent...)
tmp: '/var/www/peertube/storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
avatars: '/var/www/peertube/storage/avatars/'
videos: '/var/www/peertube/storage/videos/'
+ playlists: '/var/www/peertube/storage/playlists/'
redundancy: '/var/www/peertube/storage/videos/'
logs: '/var/www/peertube/storage/logs/'
previews: '/var/www/peertube/storage/previews/'
480p: false
720p: false
1080p: false
+ # /!\ EXPERIMENTAL /!\
+ # /!\ Requires ffmpeg >= 3.4
+ # Generate HLS playlist/segments. Better playback than with WebTorrent:
+ # * Resolution change is smoother
+ # * Faster playback in particular with long videos
+ # * More stable playback (less bugs/infinite loading)
+ # /!\ Multiply videos storage by two /!\
+ hls:
+ enabled: false
import:
# Add ability for your users to import remote videos (from YouTube, torrent...)
tmp: 'test1/tmp/'
avatars: 'test1/avatars/'
videos: 'test1/videos/'
+ playlists: 'test1/playlists/'
redundancy: 'test1/redundancy/'
logs: 'test1/logs/'
previews: 'test1/previews/'
tmp: 'test2/tmp/'
avatars: 'test2/avatars/'
videos: 'test2/videos/'
+ playlists: 'test2/playlists/'
redundancy: 'test2/redundancy/'
logs: 'test2/logs/'
previews: 'test2/previews/'
tmp: 'test3/tmp/'
avatars: 'test3/avatars/'
videos: 'test3/videos/'
+ playlists: 'test3/playlists/'
redundancy: 'test3/redundancy/'
logs: 'test3/logs/'
previews: 'test3/previews/'
tmp: 'test4/tmp/'
avatars: 'test4/avatars/'
videos: 'test4/videos/'
+ playlists: 'test4/playlists/'
redundancy: 'test4/redundancy/'
logs: 'test4/logs/'
previews: 'test4/previews/'
tmp: 'test5/tmp/'
avatars: 'test5/avatars/'
videos: 'test5/videos/'
+ playlists: 'test5/playlists/'
redundancy: 'test5/redundancy/'
logs: 'test5/logs/'
previews: 'test5/previews/'
tmp: 'test6/tmp/'
avatars: 'test6/avatars/'
videos: 'test6/videos/'
+ playlists: 'test6/playlists/'
redundancy: 'test6/redundancy/'
logs: 'test6/logs/'
previews: 'test6/previews/'
480p: true
720p: true
1080p: true
+ hls:
+ enabled: true
import:
videos:
{
"name": "peertube",
"description": "Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.",
- "version": "1.1.0",
+ "version": "1.2.0",
"private": true,
"licence": "AGPLv3",
"engines": {
if [ ! -f "./client/dist/en_US/index.html" ]; then
echo "client/dist/en_US/index.html does not exist, compile client files..."
- npm run build:client
+ npm run build:client -- --light
fi
npm run watch:server
}
function get (url: string, headers: any = {}) {
- return doRequest({
+ return doRequest<any>({
uri: url,
json: true,
headers: Object.assign(headers, {
'Speed': 'Speed',
'Subtitles/CC': 'Subtitles/CC',
'peers': 'peers',
+ 'peer': 'peer',
'Go to the video page': 'Go to the video page',
'Settings': 'Settings',
'Uses P2P, others may know you are watching this video.': 'Uses P2P, others may know you are watching this video.',
'Copy the video URL': 'Copy the video URL',
'Copy the video URL at the current time': 'Copy the video URL at the current time',
- 'Copy embed code': 'Copy embed code'
+ 'Copy embed code': 'Copy embed code',
+ 'Total downloaded: ': 'Total downloaded: ',
+ 'Total uploaded: ': 'Total uploaded: '
}
const playerTranslations = {
target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'),
.concat(values(VIDEO_PRIVACIES))
.concat(values(VIDEO_STATES))
.concat(values(VIDEO_IMPORT_STATES))
+ .concat([
+ 'This video does not exist.',
+ 'We cannot fetch the video. Please try again later.',
+ 'Sorry',
+ 'This video is not available because the remote instance is not responding.'
+ ])
.forEach(v => serverKeys[v] = v)
// More keys
function handleError (err: any) {
console.error(err)
process.exit(-1)
-}
\ No newline at end of file
+}
import { getServerActor } from '../server/helpers/utils'
import { AccountModel } from '../server/models/account/account'
import { VideoChannelModel } from '../server/models/video/video-channel'
+import { VideoStreamingPlaylistModel } from '../server/models/video/video-streaming-playlist'
run()
.then(() => process.exit(0))
console.log('Updating video and torrent files.')
- const videos = await VideoModel.list()
+ const videos = await VideoModel.listLocal()
for (const video of videos) {
- if (video.isOwned() === false) continue
-
- console.log('Updated video ' + video.uuid)
+ console.log('Updating video ' + video.uuid)
video.url = getVideoActivityPubUrl(video)
await video.save()
console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid)
await video.createTorrentAndSetInfoHash(file)
}
+
+ for (const playlist of video.VideoStreamingPlaylists) {
+ playlist.playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
+ playlist.segmentsSha256Url = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid)
+
+ await playlist.save()
+ }
}
}
import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos'
import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub'
import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers'
-import { buildAnnounceWithVideoAudience, buildDislikeActivity, buildLikeActivity } from '../../lib/activitypub/send'
+import { buildAnnounceWithVideoAudience, buildLikeActivity } from '../../lib/activitypub/send'
import { audiencify, getAudience } from '../../lib/activitypub/audience'
import { buildCreateActivity } from '../../lib/activitypub/send/send-create'
import {
asyncMiddleware,
- videosShareValidator,
executeIfActivityPub,
localAccountValidator,
localVideoChannelValidator,
- videosCustomGetValidator
+ videosCustomGetValidator,
+ videosShareValidator
} from '../../middlewares'
-import {
- getAccountVideoRateValidator,
- videoCommentGetValidator,
- videosGetValidator
-} from '../../middlewares/validators'
+import { getAccountVideoRateValidator, videoCommentGetValidator, videosGetValidator } from '../../middlewares/validators'
import { AccountModel } from '../../models/account/account'
import { ActorModel } from '../../models/activitypub/actor'
import { ActorFollowModel } from '../../models/activitypub/actor-follow'
getVideoSharesActivityPubUrl
} from '../../lib/activitypub'
import { VideoCaptionModel } from '../../models/video/video-caption'
-import { videoRedundancyGetValidator } from '../../middlewares/validators/redundancy'
+import { videoFileRedundancyGetValidator, videoPlaylistRedundancyGetValidator } from '../../middlewares/validators/redundancy'
import { getServerActor } from '../../helpers/utils'
import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
+import { buildDislikeActivity } from '../../lib/activitypub/send/send-dislike'
const activityPubClientRouter = express.Router()
activityPubClientRouter.get('/videos/watch/:id',
executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))),
- executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+ executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
executeIfActivityPub(asyncMiddleware(videoController))
)
activityPubClientRouter.get('/videos/watch/:id/activity',
- executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+ executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
executeIfActivityPub(asyncMiddleware(videoController))
)
activityPubClientRouter.get('/videos/watch/:id/announces',
)
activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?',
- executeIfActivityPub(asyncMiddleware(videoRedundancyGetValidator)),
+ executeIfActivityPub(asyncMiddleware(videoFileRedundancyGetValidator)),
+ executeIfActivityPub(asyncMiddleware(videoRedundancyController))
+)
+activityPubClientRouter.get('/redundancy/video-playlists/:streamingPlaylistType/:videoId',
+ executeIfActivityPub(asyncMiddleware(videoPlaylistRedundancyGetValidator)),
executeIfActivityPub(asyncMiddleware(videoRedundancyController))
)
const url = getRateUrl(rateType, byActor, accountVideoRate.Video)
const APObject = rateType === 'like'
? buildLikeActivity(url, byActor, accountVideoRate.Video)
- : buildCreateActivity(url, byActor, buildDislikeActivity(url, byActor, accountVideoRate.Video))
+ : buildDislikeActivity(url, byActor, accountVideoRate.Video)
return activityPubResponse(activityPubContextify(APObject), res)
}
}
async function videoController (req: express.Request, res: express.Response) {
- const video: VideoModel = res.locals.video
+ // We need more attributes
+ const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id)
if (video.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(video.url)
import { VideoModel } from '../../models/video/video'
import { buildNSFWFilter, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
import { VideoChannelModel } from '../../models/video/video-channel'
+import { JobQueue } from '../../lib/job-queue'
+import { logger } from '../../helpers/logger'
const accountsRouter = express.Router()
function getAccount (req: express.Request, res: express.Response, next: express.NextFunction) {
const account: AccountModel = res.locals.account
+ if (account.isOutdated()) {
+ JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: account.Actor.url } })
+ .catch(err => logger.error('Cannot create AP refresher job for actor %s.', account.Actor.url, { err }))
+ }
+
return res.json(account.toFormattedJSON())
}
import * as express from 'express'
-import { omit, snakeCase } from 'lodash'
+import { snakeCase } from 'lodash'
import { ServerConfig, UserRight } from '../../../shared'
import { About } from '../../../shared/models/server/about.model'
import { CustomConfig } from '../../../shared/models/server/custom-config.model'
requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
},
transcoding: {
+ hls: {
+ enabled: CONFIG.TRANSCODING.HLS.ENABLED
+ },
enabledResolutions
},
import: {
user: {
videoQuota: CONFIG.USER.VIDEO_QUOTA,
videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
+ },
+ trending: {
+ videos: {
+ intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS
+ }
}
}
'480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ],
'720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ],
'1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ]
+ },
+ hls: {
+ enabled: CONFIG.TRANSCODING.HLS.ENABLED
}
},
import: {
import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../../initializers/constants'
import { cacheRoute } from '../../../middlewares/cache'
+import { VideoFileModel } from '../../../models/video/video-file'
const statsRouter = express.Router()
asyncMiddleware(getStats)
)
-async function getStats (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function getStats (req: express.Request, res: express.Response) {
const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats()
const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats()
const { totalUsers } = await UserModel.getStats()
const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats()
+ const { totalLocalVideoFilesSize } = await VideoFileModel.getStats()
const videosRedundancyStats = await Promise.all(
CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.map(r => {
const data: ServerStats = {
totalLocalVideos,
totalLocalVideoViews,
- totalVideos,
+ totalLocalVideoFilesSize,
totalLocalVideoComments,
+ totalVideos,
totalVideoComments,
totalUsers,
totalInstanceFollowers,
import { myVideosHistoryRouter } from './my-history'
import { myNotificationsRouter } from './my-notifications'
import { Notifier } from '../../../lib/notifier'
+import { mySubscriptionsRouter } from './my-subscriptions'
const auditLogger = auditLoggerFactory('users')
const usersRouter = express.Router()
usersRouter.use('/', myNotificationsRouter)
+usersRouter.use('/', mySubscriptionsRouter)
usersRouter.use('/', myBlocklistRouter)
usersRouter.use('/', myVideosHistoryRouter)
usersRouter.use('/', meRouter)
return res.status(204).end()
}
-async function blockUser (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function blockUser (req: express.Request, res: express.Response) {
const user: UserModel = res.locals.user
const reason = req.body.reason
return res.status(204).end()
}
-function getUser (req: express.Request, res: express.Response, next: express.NextFunction) {
+function getUser (req: express.Request, res: express.Response) {
return res.json((res.locals.user as UserModel).toFormattedJSON())
}
-async function autocompleteUsers (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function autocompleteUsers (req: express.Request, res: express.Response) {
const resultList = await UserModel.autoComplete(req.query.search as string)
return res.json(resultList)
}
-async function listUsers (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function listUsers (req: express.Request, res: express.Response) {
const resultList = await UserModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.search)
return res.json(getFormattedObjects(resultList.data, resultList.total))
}
-async function removeUser (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function removeUser (req: express.Request, res: express.Response) {
const user: UserModel = res.locals.user
await user.destroy()
return res.sendStatus(204)
}
-async function updateUser (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function updateUser (req: express.Request, res: express.Response) {
const body: UserUpdate = req.body
const userToUpdate = res.locals.user as UserModel
const oldUserAuditView = new UserAuditView(userToUpdate.toFormattedJSON())
const roleChanged = body.role !== undefined && body.role !== userToUpdate.role
+ if (body.password !== undefined) userToUpdate.password = body.password
if (body.email !== undefined) userToUpdate.email = body.email
if (body.emailVerified !== undefined) userToUpdate.emailVerified = body.emailVerified
if (body.videoQuota !== undefined) userToUpdate.videoQuota = body.videoQuota
const user = await userToUpdate.save()
// Destroy user token to refresh rights
- if (roleChanged) await deleteUserToken(userToUpdate.id)
+ if (roleChanged || body.password !== undefined) await deleteUserToken(userToUpdate.id)
auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView)
- // Don't need to send this update to followers, these attributes are not propagated
+ // Don't need to send this update to followers, these attributes are not federated
return res.sendStatus(204)
}
const verificationString = await Redis.Instance.setResetPasswordVerificationString(user.id)
const url = CONFIG.WEBSERVER.URL + '/reset-password?userId=' + user.id + '&verificationString=' + verificationString
- await Emailer.Instance.addForgetPasswordEmailJob(user.email, url)
+ await Emailer.Instance.addPasswordResetEmailJob(user.email, url)
return res.status(204).end()
}
asyncMiddleware,
asyncRetryTransactionMiddleware,
authenticate,
- commonVideosFiltersValidator,
paginationValidator,
setDefaultPagination,
setDefaultSort,
- userSubscriptionAddValidator,
- userSubscriptionGetValidator,
usersUpdateMeValidator,
usersVideoRatingValidator
} from '../../../middlewares'
-import {
- areSubscriptionsExistValidator,
- deleteMeValidator,
- userSubscriptionsSortValidator,
- videoImportsSortValidator,
- videosSortValidator
-} from '../../../middlewares/validators'
+import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators'
import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
import { UserModel } from '../../../models/account/user'
import { VideoModel } from '../../../models/video/video'
import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type'
-import { buildNSFWFilter, createReqFiles } from '../../../helpers/express-utils'
+import { createReqFiles } from '../../../helpers/express-utils'
import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model'
import { updateAvatarValidator } from '../../../middlewares/validators/avatar'
import { updateActorAvatarFile } from '../../../lib/avatar'
import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
import { VideoImportModel } from '../../../models/video/video-import'
-import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
-import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
-import { JobQueue } from '../../../lib/job-queue'
-import { logger } from '../../../helpers/logger'
import { AccountModel } from '../../../models/account/account'
const auditLogger = auditLoggerFactory('users-me')
asyncRetryTransactionMiddleware(updateMyAvatar)
)
-// ##### Subscriptions part #####
-
-meRouter.get('/me/subscriptions/videos',
- authenticate,
- paginationValidator,
- videosSortValidator,
- setDefaultSort,
- setDefaultPagination,
- commonVideosFiltersValidator,
- asyncMiddleware(getUserSubscriptionVideos)
-)
-
-meRouter.get('/me/subscriptions/exist',
- authenticate,
- areSubscriptionsExistValidator,
- asyncMiddleware(areSubscriptionsExist)
-)
-
-meRouter.get('/me/subscriptions',
- authenticate,
- paginationValidator,
- userSubscriptionsSortValidator,
- setDefaultSort,
- setDefaultPagination,
- asyncMiddleware(getUserSubscriptions)
-)
-
-meRouter.post('/me/subscriptions',
- authenticate,
- userSubscriptionAddValidator,
- asyncMiddleware(addUserSubscription)
-)
-
-meRouter.get('/me/subscriptions/:uri',
- authenticate,
- userSubscriptionGetValidator,
- getUserSubscription
-)
-
-meRouter.delete('/me/subscriptions/:uri',
- authenticate,
- userSubscriptionGetValidator,
- asyncRetryTransactionMiddleware(deleteUserSubscription)
-)
-
// ---------------------------------------------------------------------------
export {
// ---------------------------------------------------------------------------
-async function areSubscriptionsExist (req: express.Request, res: express.Response) {
- const uris = req.query.uris as string[]
- const user = res.locals.oauth.token.User as UserModel
-
- const handles = uris.map(u => {
- let [ name, host ] = u.split('@')
- if (host === CONFIG.WEBSERVER.HOST) host = null
-
- return { name, host, uri: u }
- })
-
- const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
-
- const existObject: { [id: string ]: boolean } = {}
- for (const handle of handles) {
- const obj = results.find(r => {
- const server = r.ActorFollowing.Server
-
- return r.ActorFollowing.preferredUsername === handle.name &&
- (
- (!server && !handle.host) ||
- (server.host === handle.host)
- )
- })
-
- existObject[handle.uri] = obj !== undefined
- }
-
- return res.json(existObject)
-}
-
-async function addUserSubscription (req: express.Request, res: express.Response) {
- const user = res.locals.oauth.token.User as UserModel
- const [ name, host ] = req.body.uri.split('@')
-
- const payload = {
- name,
- host,
- followerActorId: user.Account.Actor.id
- }
-
- JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
- .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
-
- return res.status(204).end()
-}
-
-function getUserSubscription (req: express.Request, res: express.Response) {
- const subscription: ActorFollowModel = res.locals.subscription
-
- return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
-}
-
-async function deleteUserSubscription (req: express.Request, res: express.Response) {
- const subscription: ActorFollowModel = res.locals.subscription
-
- await sequelizeTypescript.transaction(async t => {
- return subscription.destroy({ transaction: t })
- })
-
- return res.type('json').status(204).end()
-}
-
-async function getUserSubscriptions (req: express.Request, res: express.Response) {
- const user = res.locals.oauth.token.User as UserModel
- const actorId = user.Account.Actor.id
-
- const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
-
- return res.json(getFormattedObjects(resultList.data, resultList.total))
-}
-
-async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
- const user = res.locals.oauth.token.User as UserModel
- const resultList = await VideoModel.listForApi({
- start: req.query.start,
- count: req.query.count,
- sort: req.query.sort,
- includeLocalVideos: false,
- categoryOneOf: req.query.categoryOneOf,
- licenceOneOf: req.query.licenceOneOf,
- languageOneOf: req.query.languageOneOf,
- tagsOneOf: req.query.tagsOneOf,
- tagsAllOf: req.query.tagsAllOf,
- nsfw: buildNSFWFilter(res, req.query.nsfw),
- filter: req.query.filter as VideoFilter,
- withFiles: false,
- followerActorId: user.Account.Actor.id,
- user
- })
-
- return res.json(getFormattedObjects(resultList.data, resultList.total))
-}
-
async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
const user = res.locals.oauth.token.User as UserModel
const resultList = await VideoModel.listUserVideosForApi(
return res.sendStatus(204)
}
-async function updateMe (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function updateMe (req: express.Request, res: express.Response) {
const body: UserUpdateMe = req.body
const user: UserModel = res.locals.oauth.token.user
--- /dev/null
+import * as express from 'express'
+import 'multer'
+import { getFormattedObjects } from '../../../helpers/utils'
+import { CONFIG, sequelizeTypescript } from '../../../initializers'
+import {
+ asyncMiddleware,
+ asyncRetryTransactionMiddleware,
+ authenticate,
+ commonVideosFiltersValidator,
+ paginationValidator,
+ setDefaultPagination,
+ setDefaultSort,
+ userSubscriptionAddValidator,
+ userSubscriptionGetValidator
+} from '../../../middlewares'
+import { areSubscriptionsExistValidator, userSubscriptionsSortValidator, videosSortValidator } from '../../../middlewares/validators'
+import { UserModel } from '../../../models/account/user'
+import { VideoModel } from '../../../models/video/video'
+import { buildNSFWFilter } from '../../../helpers/express-utils'
+import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
+import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
+import { JobQueue } from '../../../lib/job-queue'
+import { logger } from '../../../helpers/logger'
+
+const mySubscriptionsRouter = express.Router()
+
+mySubscriptionsRouter.get('/me/subscriptions/videos',
+ authenticate,
+ paginationValidator,
+ videosSortValidator,
+ setDefaultSort,
+ setDefaultPagination,
+ commonVideosFiltersValidator,
+ asyncMiddleware(getUserSubscriptionVideos)
+)
+
+mySubscriptionsRouter.get('/me/subscriptions/exist',
+ authenticate,
+ areSubscriptionsExistValidator,
+ asyncMiddleware(areSubscriptionsExist)
+)
+
+mySubscriptionsRouter.get('/me/subscriptions',
+ authenticate,
+ paginationValidator,
+ userSubscriptionsSortValidator,
+ setDefaultSort,
+ setDefaultPagination,
+ asyncMiddleware(getUserSubscriptions)
+)
+
+mySubscriptionsRouter.post('/me/subscriptions',
+ authenticate,
+ userSubscriptionAddValidator,
+ asyncMiddleware(addUserSubscription)
+)
+
+mySubscriptionsRouter.get('/me/subscriptions/:uri',
+ authenticate,
+ userSubscriptionGetValidator,
+ getUserSubscription
+)
+
+mySubscriptionsRouter.delete('/me/subscriptions/:uri',
+ authenticate,
+ userSubscriptionGetValidator,
+ asyncRetryTransactionMiddleware(deleteUserSubscription)
+)
+
+// ---------------------------------------------------------------------------
+
+export {
+ mySubscriptionsRouter
+}
+
+// ---------------------------------------------------------------------------
+
+async function areSubscriptionsExist (req: express.Request, res: express.Response) {
+ const uris = req.query.uris as string[]
+ const user = res.locals.oauth.token.User as UserModel
+
+ const handles = uris.map(u => {
+ let [ name, host ] = u.split('@')
+ if (host === CONFIG.WEBSERVER.HOST) host = null
+
+ return { name, host, uri: u }
+ })
+
+ const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
+
+ const existObject: { [id: string ]: boolean } = {}
+ for (const handle of handles) {
+ const obj = results.find(r => {
+ const server = r.ActorFollowing.Server
+
+ return r.ActorFollowing.preferredUsername === handle.name &&
+ (
+ (!server && !handle.host) ||
+ (server.host === handle.host)
+ )
+ })
+
+ existObject[handle.uri] = obj !== undefined
+ }
+
+ return res.json(existObject)
+}
+
+async function addUserSubscription (req: express.Request, res: express.Response) {
+ const user = res.locals.oauth.token.User as UserModel
+ const [ name, host ] = req.body.uri.split('@')
+
+ const payload = {
+ name,
+ host,
+ followerActorId: user.Account.Actor.id
+ }
+
+ JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
+ .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
+
+ return res.status(204).end()
+}
+
+function getUserSubscription (req: express.Request, res: express.Response) {
+ const subscription: ActorFollowModel = res.locals.subscription
+
+ return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
+}
+
+async function deleteUserSubscription (req: express.Request, res: express.Response) {
+ const subscription: ActorFollowModel = res.locals.subscription
+
+ await sequelizeTypescript.transaction(async t => {
+ return subscription.destroy({ transaction: t })
+ })
+
+ return res.type('json').status(204).end()
+}
+
+async function getUserSubscriptions (req: express.Request, res: express.Response) {
+ const user = res.locals.oauth.token.User as UserModel
+ const actorId = user.Account.Actor.id
+
+ const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
+
+ return res.json(getFormattedObjects(resultList.data, resultList.total))
+}
+
+async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
+ const user = res.locals.oauth.token.User as UserModel
+ const resultList = await VideoModel.listForApi({
+ start: req.query.start,
+ count: req.query.count,
+ sort: req.query.sort,
+ includeLocalVideos: false,
+ categoryOneOf: req.query.categoryOneOf,
+ licenceOneOf: req.query.licenceOneOf,
+ languageOneOf: req.query.languageOneOf,
+ tagsOneOf: req.query.tagsOneOf,
+ tagsAllOf: req.query.tagsAllOf,
+ nsfw: buildNSFWFilter(res, req.query.nsfw),
+ filter: req.query.filter as VideoFilter,
+ withFiles: false,
+ followerActorId: user.Account.Actor.id,
+ user
+ })
+
+ return res.json(getFormattedObjects(resultList.data, resultList.total))
+}
import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger'
import { resetSequelizeInstance } from '../../helpers/database-utils'
import { UserModel } from '../../models/account/user'
+import { JobQueue } from '../../lib/job-queue'
const auditLogger = auditLoggerFactory('channels')
const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR })
async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) {
const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id)
+ if (videoChannelWithVideos.isOutdated()) {
+ JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: videoChannelWithVideos.Actor.url } })
+ .catch(err => logger.error('Cannot create AP refresher job for actor %s.', videoChannelWithVideos.Actor.url, { err }))
+ }
+
return res.json(videoChannelWithVideos.toFormattedJSON())
}
import { logger } from '../../../helpers/logger'
import { getFormattedObjects } from '../../../helpers/utils'
import { sequelizeTypescript } from '../../../initializers'
-import { sendVideoAbuse } from '../../../lib/activitypub/send'
import {
asyncMiddleware,
asyncRetryTransactionMiddleware,
import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger'
import { UserModel } from '../../../models/account/user'
import { Notifier } from '../../../lib/notifier'
+import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag'
const auditLogger = auditLoggerFactory('abuse')
const abuseVideoRouter = express.Router()
import { sequelizeTypescript } from '../../../initializers'
import { Notifier } from '../../../lib/notifier'
import { VideoModel } from '../../../models/video/video'
+import { sendCreateVideo, sendDeleteVideo, sendUpdateVideo } from '../../../lib/activitypub/send'
+import { federateVideoIfNeeded } from '../../../lib/activitypub'
const blacklistRouter = express.Router()
const toCreate = {
videoId: videoInstance.id,
+ unfederated: body.unfederate === true,
reason: body.reason
}
const blacklist = await VideoBlacklistModel.create(toCreate)
blacklist.Video = videoInstance
+ if (body.unfederate === true) {
+ await sendDeleteVideo(videoInstance, undefined)
+ }
+
Notifier.Instance.notifyOnVideoBlacklist(blacklist)
logger.info('Video %s blacklisted.', res.locals.video.uuid)
const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel
const video: VideoModel = res.locals.video
- await sequelizeTypescript.transaction(t => {
- return videoBlacklist.destroy({ transaction: t })
+ await sequelizeTypescript.transaction(async t => {
+ const unfederated = videoBlacklist.unfederated
+ await videoBlacklist.destroy({ transaction: t })
+
+ // Re federate the video
+ if (unfederated === true) {
+ await federateVideoIfNeeded(video, true, t)
+ }
})
Notifier.Instance.notifyOnVideoUnblacklist(video)
licence: body.licence || importData.licence,
language: body.language || undefined,
commentsEnabled: body.commentsEnabled || true,
+ downloadEnabled: body.downloadEnabled || true,
waitTranscoding: body.waitTranscoding || false,
state: VideoState.TO_IMPORT,
nsfw: body.nsfw || importData.nsfw || false,
fetchRemoteVideoDescription,
getVideoActivityPubUrl
} from '../../../lib/activitypub'
-import { sendCreateView } from '../../../lib/activitypub/send'
import { JobQueue } from '../../../lib/job-queue'
import { Redis } from '../../../lib/redis'
import {
setDefaultPagination,
setDefaultSort,
videosAddValidator,
+ videosCustomGetValidator,
videosGetValidator,
videosRemoveValidator,
videosSortValidator,
import { move } from 'fs-extra'
import { watchingRouter } from './watching'
import { Notifier } from '../../../lib/notifier'
+import { sendView } from '../../../lib/activitypub/send/send-view'
const auditLogger = auditLoggerFactory('videos')
const videosRouter = express.Router()
)
videosRouter.get('/:id',
optionalAuthenticate,
- asyncMiddleware(videosGetValidator),
+ asyncMiddleware(videosCustomGetValidator('only-video-with-rights')),
asyncMiddleware(checkVideoFollowConstraints),
- getVideo
+ asyncMiddleware(getVideo)
)
videosRouter.post('/:id/views',
asyncMiddleware(videosGetValidator),
licence: videoInfo.licence,
language: videoInfo.language,
commentsEnabled: videoInfo.commentsEnabled || false,
+ downloadEnabled: videoInfo.downloadEnabled || true,
waitTranscoding: videoInfo.waitTranscoding || false,
state: CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED,
nsfw: videoInfo.nsfw || false,
if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support)
if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description)
if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled)
- if (videoInfoToUpdate.originallyPublishedAt !== undefined &&
- videoInfoToUpdate.originallyPublishedAt !== null) {
+ if (videoInfoToUpdate.downloadEnabled !== undefined) videoInstance.set('downloadEnabled', videoInfoToUpdate.downloadEnabled)
+
+ if (videoInfoToUpdate.originallyPublishedAt !== undefined && videoInfoToUpdate.originallyPublishedAt !== null) {
videoInstance.set('originallyPublishedAt', videoInfoToUpdate.originallyPublishedAt)
}
}
const isNewVideo = wasPrivateVideo && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE
- await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t)
+
+ // Don't send update if the video was unfederated
+ if (!videoInstanceUpdated.VideoBlacklist || videoInstanceUpdated.VideoBlacklist.unfederated === false) {
+ await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t)
+ }
auditLogger.update(
getAuditIdFromRes(res),
return res.type('json').status(204).end()
}
-function getVideo (req: express.Request, res: express.Response) {
- const videoInstance = res.locals.video
+async function getVideo (req: express.Request, res: express.Response) {
+ // We need more attributes
+ const userId: number = res.locals.oauth ? res.locals.oauth.token.User.id : null
+ const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id, undefined, userId)
- if (videoInstance.isOutdated()) {
- JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoInstance.url } })
- .catch(err => logger.error('Cannot create AP refresher job for video %s.', videoInstance.url, { err }))
+ if (video.isOutdated()) {
+ JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: video.url } })
+ .catch(err => logger.error('Cannot create AP refresher job for video %s.', video.url, { err }))
}
- return res.json(videoInstance.toFormattedDetailsJSON())
+ return res.json(video.toFormattedDetailsJSON())
}
async function viewVideo (req: express.Request, res: express.Response) {
])
const serverActor = await getServerActor()
- await sendCreateView(serverActor, videoInstance, undefined)
+ await sendView(serverActor, videoInstance, undefined)
return res.status(204).end()
}
import * as cors from 'cors'
import * as express from 'express'
-import { CONFIG, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers'
+import { CONFIG, HLS_PLAYLIST_DIRECTORY, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers'
import { VideosPreviewCache } from '../lib/cache'
import { cacheRoute } from '../middlewares/cache'
import { asyncMiddleware, videosGetValidator } from '../middlewares'
asyncMiddleware(downloadVideoFile)
)
+// HLS
+staticRouter.use(
+ STATIC_PATHS.PLAYLISTS.HLS,
+ cors(),
+ express.static(HLS_PLAYLIST_DIRECTORY, { fallthrough: false }) // 404 if the file does not exist
+)
+
// Thumbnails path for express
const thumbnailsPhysicalPath = CONFIG.STORAGE.THUMBNAILS_DIR
staticRouter.use(
import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
import { VideoFileModel } from '../models/video/video-file'
import { parse } from 'url'
+import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
const TrackerServer = bitTorrentTracker.Server
udp: false,
ws: false,
dht: false,
- filter: function (infoHash, params, cb) {
+ filter: async function (infoHash, params, cb) {
let ip: string
if (params.type === 'ws') {
const key = ip + '-' + infoHash
- peersIps[ip] = peersIps[ip] ? peersIps[ip] + 1 : 1
- peersIpInfoHash[key] = peersIpInfoHash[key] ? peersIpInfoHash[key] + 1 : 1
+ peersIps[ ip ] = peersIps[ ip ] ? peersIps[ ip ] + 1 : 1
+ peersIpInfoHash[ key ] = peersIpInfoHash[ key ] ? peersIpInfoHash[ key ] + 1 : 1
- if (peersIpInfoHash[key] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) {
+ if (peersIpInfoHash[ key ] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) {
return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`))
}
- VideoFileModel.isInfohashExists(infoHash)
- .then(exists => {
- if (exists === false) return cb(new Error(`Unknown infoHash ${infoHash}`))
+ try {
+ const videoFileExists = await VideoFileModel.doesInfohashExist(infoHash)
+ if (videoFileExists === true) return cb()
- return cb()
- })
+ const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExist(infoHash)
+ if (playlistExists === true) return cb()
+
+ return cb(new Error(`Unknown infoHash ${infoHash}`))
+ } catch (err) {
+ logger.error('Error in tracker filter.', { err })
+ return cb(err)
+ }
}
})
'https://w3id.org/security/v1',
{
RsaSignature2017: 'https://w3id.org/security#RsaSignature2017',
- pt: 'https://joinpeertube.org/ns',
+ pt: 'https://joinpeertube.org/ns#',
sc: 'http://schema.org#',
Hashtag: 'as:Hashtag',
uuid: 'sc:identifier',
size: 'sc:Number',
fps: 'sc:Number',
commentsEnabled: 'sc:Boolean',
+ downloadEnabled: 'sc:Boolean',
waitTranscoding: 'sc:Boolean',
expires: 'sc:expires',
support: 'sc:Text',
- CacheFile: 'pt:CacheFile'
+ CacheFile: 'pt:CacheFile',
+ Infohash: 'pt:Infohash'
},
{
likes: {
return signJsonLDObject(byActor, activity) as Promise<Activity>
}
-function getAPUrl (activity: string | { id: string }) {
+function getAPId (activity: string | { id: string }) {
if (typeof activity === 'string') return activity
return activity.id
export {
checkUrlsSameHost,
- getAPUrl,
+ getAPId,
activityPubContextify,
activityPubCollectionPagination,
buildSignedActivity
'channel-uuid',
'channel-name',
'support',
- 'commentsEnabled'
+ 'commentsEnabled',
+ 'downloadEnabled'
]
class VideoAuditView extends EntityAuditView {
constructor (private video: VideoDetails) {
return truncate(str, options)
}
-function sha256 (str: string, encoding: HexBase64Latin1Encoding = 'hex') {
+function sha256 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
return createHash('sha256').update(str).digest(encoding)
}
+function sha1 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
+ return createHash('sha1').update(str).digest(encoding)
+}
+
function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
return function promisified (): Promise<A> {
return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
sanitizeHost,
buildPath,
peertubeTruncate,
+
sha256,
+ sha1,
promisify0,
promisify1,
import * as validator from 'validator'
import { Activity, ActivityType } from '../../../../shared/models/activitypub'
-import {
- isActorAcceptActivityValid,
- isActorDeleteActivityValid,
- isActorFollowActivityValid,
- isActorRejectActivityValid,
- isActorUpdateActivityValid
-} from './actor'
-import { isAnnounceActivityValid } from './announce'
-import { isActivityPubUrlValid } from './misc'
-import { isDislikeActivityValid, isLikeActivityValid } from './rate'
-import { isUndoActivityValid } from './undo'
-import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
-import {
- isVideoFlagValid,
- isVideoTorrentDeleteActivityValid,
- sanitizeAndCheckVideoTorrentCreateActivity,
- sanitizeAndCheckVideoTorrentUpdateActivity
-} from './videos'
+import { sanitizeAndCheckActorObject } from './actor'
+import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
+import { isDislikeActivityValid } from './rate'
+import { sanitizeAndCheckVideoCommentObject } from './video-comments'
+import { sanitizeAndCheckVideoTorrentObject } from './videos'
import { isViewActivityValid } from './view'
import { exists } from '../misc'
-import { isCacheFileCreateActivityValid, isCacheFileUpdateActivityValid } from './cache-file'
+import { isCacheFileObjectValid } from './cache-file'
+import { isFlagActivityValid } from './flag'
function isRootActivityValid (activity: any) {
return Array.isArray(activity['@context']) && (
Reject: checkRejectActivity,
Announce: checkAnnounceActivity,
Undo: checkUndoActivity,
- Like: checkLikeActivity
+ Like: checkLikeActivity,
+ View: checkViewActivity,
+ Flag: checkFlagActivity,
+ Dislike: checkDislikeActivity
}
function isActivityValid (activity: any) {
// ---------------------------------------------------------------------------
+function checkViewActivity (activity: any) {
+ return isBaseActivityValid(activity, 'View') &&
+ isViewActivityValid(activity)
+}
+
+function checkFlagActivity (activity: any) {
+ return isBaseActivityValid(activity, 'Flag') &&
+ isFlagActivityValid(activity)
+}
+
+function checkDislikeActivity (activity: any) {
+ return isBaseActivityValid(activity, 'Dislike') &&
+ isDislikeActivityValid(activity)
+}
+
function checkCreateActivity (activity: any) {
- return isViewActivityValid(activity) ||
- isDislikeActivityValid(activity) ||
- sanitizeAndCheckVideoTorrentCreateActivity(activity) ||
- isVideoFlagValid(activity) ||
- isVideoCommentCreateActivityValid(activity) ||
- isCacheFileCreateActivityValid(activity)
+ return isBaseActivityValid(activity, 'Create') &&
+ (
+ isViewActivityValid(activity.object) ||
+ isDislikeActivityValid(activity.object) ||
+ isFlagActivityValid(activity.object) ||
+
+ isCacheFileObjectValid(activity.object) ||
+ sanitizeAndCheckVideoCommentObject(activity.object) ||
+ sanitizeAndCheckVideoTorrentObject(activity.object)
+ )
}
function checkUpdateActivity (activity: any) {
- return isCacheFileUpdateActivityValid(activity) ||
- sanitizeAndCheckVideoTorrentUpdateActivity(activity) ||
- isActorUpdateActivityValid(activity)
+ return isBaseActivityValid(activity, 'Update') &&
+ (
+ isCacheFileObjectValid(activity.object) ||
+ sanitizeAndCheckVideoTorrentObject(activity.object) ||
+ sanitizeAndCheckActorObject(activity.object)
+ )
}
function checkDeleteActivity (activity: any) {
- return isVideoTorrentDeleteActivityValid(activity) ||
- isActorDeleteActivityValid(activity) ||
- isVideoCommentDeleteActivityValid(activity)
+ // We don't really check objects
+ return isBaseActivityValid(activity, 'Delete') &&
+ isObjectValid(activity.object)
}
function checkFollowActivity (activity: any) {
- return isActorFollowActivityValid(activity)
+ return isBaseActivityValid(activity, 'Follow') &&
+ isObjectValid(activity.object)
}
function checkAcceptActivity (activity: any) {
- return isActorAcceptActivityValid(activity)
+ return isBaseActivityValid(activity, 'Accept')
}
function checkRejectActivity (activity: any) {
- return isActorRejectActivityValid(activity)
+ return isBaseActivityValid(activity, 'Reject')
}
function checkAnnounceActivity (activity: any) {
- return isAnnounceActivityValid(activity)
+ return isBaseActivityValid(activity, 'Announce') &&
+ isObjectValid(activity.object)
}
function checkUndoActivity (activity: any) {
- return isUndoActivityValid(activity)
+ return isBaseActivityValid(activity, 'Undo') &&
+ (
+ checkFollowActivity(activity.object) ||
+ checkLikeActivity(activity.object) ||
+ checkDislikeActivity(activity.object) ||
+ checkAnnounceActivity(activity.object) ||
+ checkCreateActivity(activity.object)
+ )
}
function checkLikeActivity (activity: any) {
- return isLikeActivityValid(activity)
+ return isBaseActivityValid(activity, 'Like') &&
+ isObjectValid(activity.object)
}
return isBaseActivityValid(activity, 'Delete')
}
-function isActorFollowActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Follow') &&
- isActivityPubUrlValid(activity.object)
-}
-
-function isActorAcceptActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Accept')
-}
-
-function isActorRejectActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Reject')
-}
-
-function isActorUpdateActivityValid (activity: any) {
- normalizeActor(activity.object)
+function sanitizeAndCheckActorObject (object: any) {
+ normalizeActor(object)
- return isBaseActivityValid(activity, 'Update') &&
- isActorObjectValid(activity.object)
+ return isActorObjectValid(object)
}
function normalizeActor (actor: any) {
isActorObjectValid,
isActorFollowingCountValid,
isActorFollowersCountValid,
- isActorFollowActivityValid,
- isActorAcceptActivityValid,
- isActorRejectActivityValid,
isActorDeleteActivityValid,
- isActorUpdateActivityValid,
+ sanitizeAndCheckActorObject,
isValidActorHandle
}
+++ /dev/null
-import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
-
-function isAnnounceActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Announce') &&
- (
- isActivityPubUrlValid(activity.object) ||
- (activity.object && isActivityPubUrlValid(activity.object.id))
- )
-}
-
-export {
- isAnnounceActivityValid
-}
-import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
+import { isActivityPubUrlValid } from './misc'
import { isRemoteVideoUrlValid } from './videos'
-import { isDateValid, exists } from '../misc'
+import { exists, isDateValid } from '../misc'
import { CacheFileObject } from '../../../../shared/models/activitypub/objects'
-function isCacheFileCreateActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- isCacheFileObjectValid(activity.object)
-}
-
-function isCacheFileUpdateActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Update') &&
- isCacheFileObjectValid(activity.object)
-}
-
function isCacheFileObjectValid (object: CacheFileObject) {
return exists(object) &&
object.type === 'CacheFile' &&
isDateValid(object.expires) &&
isActivityPubUrlValid(object.object) &&
- isRemoteVideoUrlValid(object.url)
+ (isRemoteVideoUrlValid(object.url) || isPlaylistRedundancyUrlValid(object.url))
}
+// ---------------------------------------------------------------------------
+
export {
- isCacheFileUpdateActivityValid,
- isCacheFileCreateActivityValid,
isCacheFileObjectValid
}
+
+// ---------------------------------------------------------------------------
+
+function isPlaylistRedundancyUrlValid (url: any) {
+ return url.type === 'Link' &&
+ (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
+ isActivityPubUrlValid(url.href)
+}
--- /dev/null
+import { isActivityPubUrlValid } from './misc'
+import { isVideoAbuseReasonValid } from '../video-abuses'
+
+function isFlagActivityValid (activity: any) {
+ return activity.type === 'Flag' &&
+ isVideoAbuseReasonValid(activity.content) &&
+ isActivityPubUrlValid(activity.object)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ isFlagActivityValid
+}
return (activity['@context'] === undefined || Array.isArray(activity['@context'])) &&
activity.type === type &&
isActivityPubUrlValid(activity.id) &&
- exists(activity.actor) &&
- (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) &&
- (
- activity.to === undefined ||
- (Array.isArray(activity.to) && activity.to.every(t => isActivityPubUrlValid(t)))
- ) &&
+ isObjectValid(activity.actor) &&
+ isUrlCollectionValid(activity.to) &&
+ isUrlCollectionValid(activity.cc)
+}
+
+function isUrlCollectionValid (collection: any) {
+ return collection === undefined ||
+ (Array.isArray(collection) && collection.every(t => isActivityPubUrlValid(t)))
+}
+
+function isObjectValid (object: any) {
+ return exists(object) &&
(
- activity.cc === undefined ||
- (Array.isArray(activity.cc) && activity.cc.every(t => isActivityPubUrlValid(t)))
+ isActivityPubUrlValid(object) || isActivityPubUrlValid(object.id)
)
}
isUrlValid,
isActivityPubUrlValid,
isBaseActivityValid,
- setValidAttributedTo
+ setValidAttributedTo,
+ isObjectValid
}
-import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
-
-function isLikeActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Like') &&
- isActivityPubUrlValid(activity.object)
-}
+import { isActivityPubUrlValid, isObjectValid } from './misc'
function isDislikeActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- activity.object.type === 'Dislike' &&
- isActivityPubUrlValid(activity.object.actor) &&
- isActivityPubUrlValid(activity.object.object)
+ return activity.type === 'Dislike' &&
+ isActivityPubUrlValid(activity.actor) &&
+ isObjectValid(activity.object)
}
// ---------------------------------------------------------------------------
export {
- isLikeActivityValid,
isDislikeActivityValid
}
+++ /dev/null
-import { isActorFollowActivityValid } from './actor'
-import { isBaseActivityValid } from './misc'
-import { isDislikeActivityValid, isLikeActivityValid } from './rate'
-import { isAnnounceActivityValid } from './announce'
-import { isCacheFileCreateActivityValid } from './cache-file'
-
-function isUndoActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Undo') &&
- (
- isActorFollowActivityValid(activity.object) ||
- isLikeActivityValid(activity.object) ||
- isDislikeActivityValid(activity.object) ||
- isAnnounceActivityValid(activity.object) ||
- isCacheFileCreateActivityValid(activity.object)
- )
-}
-
-export {
- isUndoActivityValid
-}
import { exists, isArray, isDateValid } from '../misc'
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
-function isVideoCommentCreateActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- sanitizeAndCheckVideoCommentObject(activity.object)
-}
-
function sanitizeAndCheckVideoCommentObject (comment: any) {
if (!comment || comment.type !== 'Note') return false
) // Only accept public comments
}
-function isVideoCommentDeleteActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Delete')
-}
-
// ---------------------------------------------------------------------------
export {
- isVideoCommentCreateActivityValid,
- isVideoCommentDeleteActivityValid,
sanitizeAndCheckVideoCommentObject
}
import * as validator from 'validator'
import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
import { peertubeTruncate } from '../../core-utils'
-import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
+import { exists, isArray, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
import {
isVideoDurationValid,
isVideoNameValid,
} from '../videos'
import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc'
import { VideoState } from '../../../../shared/models/videos'
-import { isVideoAbuseReasonValid } from '../video-abuses'
-
-function sanitizeAndCheckVideoTorrentCreateActivity (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- sanitizeAndCheckVideoTorrentObject(activity.object)
-}
function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) {
return isBaseActivityValid(activity, 'Update') &&
sanitizeAndCheckVideoTorrentObject(activity.object)
}
-function isVideoTorrentDeleteActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Delete')
-}
-
-function isVideoFlagValid (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- activity.object.type === 'Flag' &&
- isVideoAbuseReasonValid(activity.object.content) &&
- isActivityPubUrlValid(activity.object.object)
-}
-
function isActivityPubVideoDurationValid (value: string) {
// https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
return exists(value) &&
// Default attributes
if (!isVideoStateValid(video.state)) video.state = VideoState.PUBLISHED
if (!isBooleanValid(video.waitTranscoding)) video.waitTranscoding = false
+ if (!isBooleanValid(video.downloadEnabled)) video.downloadEnabled = true
return isActivityPubUrlValid(video.id) &&
isVideoNameValid(video.name) &&
isVideoViewsValid(video.views) &&
isBooleanValid(video.sensitive) &&
isBooleanValid(video.commentsEnabled) &&
+ isBooleanValid(video.downloadEnabled) &&
isDateValid(video.published) &&
isDateValid(video.updated) &&
(!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) &&
ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mediaType || url.mimeType) !== -1 &&
validator.isLength(url.href, { min: 5 }) &&
validator.isInt(url.height + '', { min: 0 })
+ ) ||
+ (
+ (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
+ isActivityPubUrlValid(url.href) &&
+ isArray(url.tag)
)
}
// ---------------------------------------------------------------------------
export {
- sanitizeAndCheckVideoTorrentCreateActivity,
sanitizeAndCheckVideoTorrentUpdateActivity,
- isVideoTorrentDeleteActivityValid,
isRemoteStringIdentifierValid,
- isVideoFlagValid,
sanitizeAndCheckVideoTorrentObject,
isRemoteVideoUrlValid
}
-import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
+import { isActivityPubUrlValid } from './misc'
function isViewActivityValid (activity: any) {
- return isBaseActivityValid(activity, 'Create') &&
- activity.object.type === 'View' &&
- isActivityPubUrlValid(activity.object.actor) &&
- isActivityPubUrlValid(activity.object.object)
+ return activity.type === 'View' &&
+ isActivityPubUrlValid(activity.actor) &&
+ isActivityPubUrlValid(activity.object)
}
+
// ---------------------------------------------------------------------------
export {
return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
}
+function isArrayOf (value: any, validator: (value: any) => boolean) {
+ return isArray(value) && value.every(v => validator(v))
+}
+
function isDateValid (value: string) {
return exists(value) && validator.isISO8601(value)
}
export {
exists,
+ isArrayOf,
isNotEmptyIntArray,
isArray,
isIdValid,
function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
- .map(m => `(${m})`)
- .join('|')
+ .map(m => `(${m})`)
+ .join('|')
return isFileValid(files, videoFileTypesRegex, 'videofile', null)
}
import * as ffmpeg from 'fluent-ffmpeg'
-import { join } from 'path'
+import { dirname, join } from 'path'
import { getTargetBitrate, VideoResolution } from '../../shared/models/videos'
import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers/constants'
import { processImage } from './image-utils'
return resolutionsEnabled
}
-async function getVideoFileResolution (path: string) {
+async function getVideoFileSize (path: string) {
const videoStream = await getVideoFileStream(path)
return {
- videoFileResolution: Math.min(videoStream.height, videoStream.width),
- isPortraitMode: videoStream.height > videoStream.width
+ width: videoStream.width,
+ height: videoStream.height
+ }
+}
+
+async function getVideoFileResolution (path: string) {
+ const size = await getVideoFileSize(path)
+
+ return {
+ videoFileResolution: Math.min(size.height, size.width),
+ isPortraitMode: size.height > size.width
}
}
async function getVideoFileFPS (path: string) {
const videoStream = await getVideoFileStream(path)
- for (const key of [ 'r_frame_rate' , 'avg_frame_rate' ]) {
+ for (const key of [ 'avg_frame_rate', 'r_frame_rate' ]) {
const valuesText: string = videoStream[key]
if (!valuesText) continue
type TranscodeOptions = {
inputPath: string
outputPath: string
- resolution?: VideoResolution
+ resolution: VideoResolution
isPortraitMode?: boolean
+
+ hlsPlaylist?: {
+ videoFilename: string
+ }
}
function transcode (options: TranscodeOptions) {
command = command.withFPS(fps)
}
+ if (options.hlsPlaylist) {
+ const videoPath = `${dirname(options.outputPath)}/${options.hlsPlaylist.videoFilename}`
+
+ command = command.outputOption('-hls_time 4')
+ .outputOption('-hls_list_size 0')
+ .outputOption('-hls_playlist_type vod')
+ .outputOption('-hls_segment_filename ' + videoPath)
+ .outputOption('-hls_segment_type fmp4')
+ .outputOption('-f hls')
+ .outputOption('-hls_flags single_file')
+ }
+
command
.on('error', (err, stdout, stderr) => {
logger.error('Error in transcoding job.', { stdout, stderr })
// ---------------------------------------------------------------------------
export {
+ getVideoFileSize,
getVideoFileResolution,
getDurationFromVideoFile,
generateImageFromVideoFile,
function doRequest <T> (
requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean }
-): Bluebird<{ response: request.RequestResponse, body: any }> {
+): Bluebird<{ response: request.RequestResponse, body: T }> {
if (requestOptions.activityPub === true) {
if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {}
requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER
import { Instance as ParseTorrent } from 'parse-torrent'
import { remove } from 'fs-extra'
import * as memoizee from 'memoizee'
-import { isArray } from './custom-validators/misc'
function deleteFileAsync (path: string) {
remove(path)
import { VideoModel } from '../models/video/video'
-type VideoFetchType = 'all' | 'only-video' | 'id' | 'none'
+type VideoFetchType = 'all' | 'only-video' | 'only-video-with-rights' | 'id' | 'none'
function fetchVideo (id: number | string, fetchType: VideoFetchType, userId?: number) {
if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId)
+ if (fetchType === 'only-video-with-rights') return VideoModel.loadWithRights(id)
+
if (fetchType === 'only-video') return VideoModel.load(id)
if (fetchType === 'id' || fetchType === 'none') return VideoModel.loadOnlyId(id)
'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max',
'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address',
'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache',
- 'storage.redundancy', 'storage.tmp',
+ 'storage.redundancy', 'storage.tmp', 'storage.playlists',
'log.level',
'user.video_quota', 'user.video_quota_daily',
'cache.previews.size', 'admin.email', 'contact_form.enabled',
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 315
+const LAST_MIGRATION_VERSION = 340
// ---------------------------------------------------------------------------
AVATARS_DIR: buildPath(config.get<string>('storage.avatars')),
LOG_DIR: buildPath(config.get<string>('storage.logs')),
VIDEOS_DIR: buildPath(config.get<string>('storage.videos')),
+ PLAYLISTS_DIR: buildPath(config.get<string>('storage.playlists')),
REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')),
THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')),
PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')),
get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') },
get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') },
get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') }
+ },
+ HLS: {
+ get ENABLED () { return config.get<boolean>('transcoding.hls.enabled') }
}
},
IMPORT: {
BLOCKED_REASON: { min: 3, max: 250 } // Length
},
VIDEO_ABUSES: {
- REASON: { min: 2, max: 300 }, // Length
- MODERATION_COMMENT: { min: 2, max: 300 } // Length
+ REASON: { min: 2, max: 3000 }, // Length
+ MODERATION_COMMENT: { min: 2, max: 3000 } // Length
},
VIDEO_BLACKLIST: {
REASON: { min: 2, max: 300 } // Length
TORRENTS: '/static/torrents/',
WEBSEED: '/static/webseed/',
REDUNDANCY: '/static/redundancy/',
+ PLAYLISTS: {
+ HLS: '/static/playlists/hls'
+ },
AVATARS: '/static/avatars/',
VIDEO_CAPTIONS: '/static/video-captions/'
}
}
}
+const HLS_PLAYLIST_DIRECTORY = join(CONFIG.STORAGE.PLAYLISTS_DIR, 'hls')
+const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls')
+
const MEMOIZE_TTL = {
OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours
}
CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000
MEMOIZE_TTL.OVERVIEWS_SAMPLE = 1
ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms'
+
+ RATES_LIMIT.LOGIN.MAX = 20
}
updateWebserverUrls()
export {
API_VERSION,
+ HLS_REDUNDANCY_DIRECTORY,
AVATARS_SIZE,
ACCEPT_HEADERS,
BCRYPT_SALT_SIZE,
PRIVATE_RSA_KEY_SIZE,
ROUTE_CACHE_LIFETIME,
SORTABLE_COLUMNS,
+ HLS_PLAYLIST_DIRECTORY,
FEEDS,
JOB_TTL,
NSFW_POLICY_TYPES,
'video/quicktime': '.mov',
'video/x-msvideo': '.avi',
'video/x-flv': '.flv',
- 'video/x-matroska': '.mkv'
+ 'video/x-matroska': '.mkv',
+ 'application/octet-stream': '.mkv',
+ 'video/avi': '.avi'
})
}
import { ServerBlocklistModel } from '../models/server/server-blocklist'
import { UserNotificationModel } from '../models/account/user-notification'
import { UserNotificationSettingModel } from '../models/account/user-notification-setting'
+import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
AccountBlocklistModel,
ServerBlocklistModel,
UserNotificationModel,
- UserNotificationSettingModel
+ UserNotificationSettingModel,
+ VideoStreamingPlaylistModel
])
// Check extensions exist in the database
import { ApplicationModel } from '../models/application/application'
import { OAuthClientModel } from '../models/oauth/oauth-client'
import { applicationExist, clientsExist, usersExist } from './checker-after-init'
-import { CACHE, CONFIG, LAST_MIGRATION_VERSION } from './constants'
+import { CACHE, CONFIG, HLS_PLAYLIST_DIRECTORY, LAST_MIGRATION_VERSION } from './constants'
import { sequelizeTypescript } from './database'
import { remove, ensureDir } from 'fs-extra'
tasks.push(ensureDir(dir))
}
+ // Playlist directories
+ tasks.push(ensureDir(HLS_PLAYLIST_DIRECTORY))
+
return Promise.all(tasks)
}
--- /dev/null
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+
+ {
+ const data = {
+ type: Sequelize.BOOLEAN,
+ allowNull: false,
+ defaultValue: false
+ }
+
+ await utils.queryInterface.addColumn('videoBlacklist', 'unfederated', data)
+ }
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
--- /dev/null
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+
+ {
+ const data = {
+ type: Sequelize.STRING(3000),
+ allowNull: false,
+ defaultValue: null
+ }
+
+ await utils.queryInterface.changeColumn('videoAbuse', 'reason', data)
+ }
+
+ {
+ const data = {
+ type: Sequelize.STRING(3000),
+ allowNull: true,
+ defaultValue: null
+ }
+
+ await utils.queryInterface.changeColumn('videoAbuse', 'moderationComment', data)
+ }
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
--- /dev/null
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+
+ {
+ const query = `
+ CREATE TABLE IF NOT EXISTS "videoStreamingPlaylist"
+(
+ "id" SERIAL,
+ "type" INTEGER NOT NULL,
+ "playlistUrl" VARCHAR(2000) NOT NULL,
+ "p2pMediaLoaderInfohashes" VARCHAR(255)[] NOT NULL,
+ "segmentsSha256Url" VARCHAR(255) NOT NULL,
+ "videoId" INTEGER NOT NULL REFERENCES "video" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ PRIMARY KEY ("id")
+);`
+ await utils.sequelize.query(query)
+ }
+
+ {
+ const data = {
+ type: Sequelize.INTEGER,
+ allowNull: true,
+ defaultValue: null
+ }
+
+ await utils.queryInterface.changeColumn('videoRedundancy', 'videoFileId', data)
+ }
+
+ {
+ const query = 'ALTER TABLE "videoRedundancy" ADD COLUMN "videoStreamingPlaylistId" INTEGER NULL ' +
+ 'REFERENCES "videoStreamingPlaylist" ("id") ON DELETE CASCADE ON UPDATE CASCADE'
+
+ await utils.sequelize.query(query)
+ }
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
--- /dev/null
+import * as Sequelize from 'sequelize'
+import { Migration } from '../../models/migrations'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+ const data = {
+ type: Sequelize.BOOLEAN,
+ allowNull: false,
+ defaultValue: true
+ } as Migration.Boolean
+ await utils.queryInterface.addColumn('video', 'downloadEnabled', data)
+
+ data.defaultValue = null
+ return utils.queryInterface.changeColumn('video', 'downloadEnabled', data)
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
const query = 'UPDATE video SET "originallyPublishedAt" = video."publishedAt"'
await utils.sequelize.query(query)
}
-
- // Sequelize does not alter the column with NOW as default value
- {
- const data = {
- type: Sequelize.DATE,
- allowNull: false,
- defaultValue: Sequelize.NOW
- }
- await utils.queryInterface.changeColumn('video', 'originallyPublishedAt', data)
- }
-
}
function down (options) {
import * as uuidv4 from 'uuid/v4'
import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub'
import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects'
-import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor'
import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils'
recurseIfNeeded = true,
updateCollections = false
) {
- const actorUrl = getAPUrl(activityActor)
+ const actorUrl = getAPId(activityActor)
let created = false
let actor = await fetchActorByUrl(actorUrl, fetchType)
return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
}
+async function refreshActorIfNeeded (
+ actorArg: ActorModel,
+ fetchedType: ActorFetchByUrlType
+): Promise<{ actor: ActorModel, refreshed: boolean }> {
+ if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
+
+ // We need more attributes
+ const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
+
+ try {
+ let actorUrl: string
+ try {
+ actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
+ } catch (err) {
+ logger.warn('Cannot get actor URL from webfinger, keeping the old one.', err)
+ actorUrl = actor.url
+ }
+
+ const { result, statusCode } = await fetchRemoteActor(actorUrl)
+
+ if (statusCode === 404) {
+ logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
+ actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
+ return { actor: undefined, refreshed: false }
+ }
+
+ if (result === undefined) {
+ logger.warn('Cannot fetch remote actor in refresh actor.')
+ return { actor, refreshed: false }
+ }
+
+ return sequelizeTypescript.transaction(async t => {
+ updateInstanceWithAnother(actor, result.actor)
+
+ if (result.avatarName !== undefined) {
+ await updateActorAvatarInstance(actor, result.avatarName, t)
+ }
+
+ // Force update
+ actor.setDataValue('updatedAt', new Date())
+ await actor.save({ transaction: t })
+
+ if (actor.Account) {
+ actor.Account.set('name', result.name)
+ actor.Account.set('description', result.summary)
+
+ await actor.Account.save({ transaction: t })
+ } else if (actor.VideoChannel) {
+ actor.VideoChannel.set('name', result.name)
+ actor.VideoChannel.set('description', result.summary)
+ actor.VideoChannel.set('support', result.support)
+
+ await actor.VideoChannel.save({ transaction: t })
+ }
+
+ return { refreshed: true, actor }
+ })
+ } catch (err) {
+ logger.warn('Cannot refresh actor.', { err })
+ return { actor, refreshed: false }
+ }
+}
+
export {
getOrCreateActorAndServerAndModel,
buildActorInstance,
fetchActorTotalItems,
fetchAvatarIfExists,
updateActorInstance,
+ refreshActorIfNeeded,
updateActorAvatarInstance,
addFetchOutboxJob
}
logger.info('Fetching remote actor %s.', actorUrl)
- const requestResult = await doRequest(options)
+ const requestResult = await doRequest<ActivityPubActor>(options)
normalizeActor(requestResult.body)
- const actorJSON: ActivityPubActor = requestResult.body
+ const actorJSON = requestResult.body
if (isActorObjectValid(actorJSON) === false) {
- logger.debug('Remote actor JSON is not valid.', { actorJSON: actorJSON })
+ logger.debug('Remote actor JSON is not valid.', { actorJSON })
return { result: undefined, statusCode: requestResult.response.statusCode }
}
return videoChannelCreated
}
-
-async function refreshActorIfNeeded (
- actorArg: ActorModel,
- fetchedType: ActorFetchByUrlType
-): Promise<{ actor: ActorModel, refreshed: boolean }> {
- if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
-
- // We need more attributes
- const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
-
- try {
- const actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
- const { result, statusCode } = await fetchRemoteActor(actorUrl)
-
- if (statusCode === 404) {
- logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
- actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
- return { actor: undefined, refreshed: false }
- }
-
- if (result === undefined) {
- logger.warn('Cannot fetch remote actor in refresh actor.')
- return { actor, refreshed: false }
- }
-
- return sequelizeTypescript.transaction(async t => {
- updateInstanceWithAnother(actor, result.actor)
-
- if (result.avatarName !== undefined) {
- await updateActorAvatarInstance(actor, result.avatarName, t)
- }
-
- // Force update
- actor.setDataValue('updatedAt', new Date())
- await actor.save({ transaction: t })
-
- if (actor.Account) {
- actor.Account.set('name', result.name)
- actor.Account.set('description', result.summary)
-
- await actor.Account.save({ transaction: t })
- } else if (actor.VideoChannel) {
- actor.VideoChannel.set('name', result.name)
- actor.VideoChannel.set('description', result.summary)
- actor.VideoChannel.set('support', result.support)
-
- await actor.VideoChannel.save({ transaction: t })
- }
-
- return { refreshed: true, actor }
- })
- } catch (err) {
- logger.warn('Cannot refresh actor.', { err })
- return { actor, refreshed: false }
- }
-}
-import { CacheFileObject } from '../../../shared/index'
+import { ActivityPlaylistUrlObject, ActivityVideoUrlObject, CacheFileObject } from '../../../shared/index'
import { VideoModel } from '../../models/video/video'
import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
import { Transaction } from 'sequelize'
+import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) {
- const url = cacheFileObject.url
+ if (cacheFileObject.url.mediaType === 'application/x-mpegURL') {
+ const url = cacheFileObject.url
+
+ const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS)
+ if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url)
+
+ return {
+ expiresOn: new Date(cacheFileObject.expires),
+ url: cacheFileObject.id,
+ fileUrl: url.href,
+ strategy: null,
+ videoStreamingPlaylistId: playlist.id,
+ actorId: byActor.id
+ }
+ }
+
+ const url = cacheFileObject.url
const videoFile = video.VideoFiles.find(f => {
return f.resolution === url.height && f.fps === url.fps
})
return {
expiresOn: new Date(cacheFileObject.expires),
url: cacheFileObject.id,
- fileUrl: cacheFileObject.url.href,
+ fileUrl: url.href,
strategy: null,
videoFileId: videoFile.id,
actorId: byActor.id
import { ActorModel } from '../../../models/activitypub/actor'
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
import { addFetchOutboxJob } from '../actor'
-import { Notifier } from '../../notifier'
async function processAcceptActivity (activity: ActivityAccept, targetActor: ActorModel, inboxActor?: ActorModel) {
if (inboxActor === undefined) throw new Error('Need to accept on explicit inbox.')
-import { ActivityCreate, CacheFileObject, VideoAbuseState, VideoTorrentObject } from '../../../../shared'
-import { DislikeObject, VideoAbuseObject, ViewObject } from '../../../../shared/models/activitypub/objects'
+import { ActivityCreate, CacheFileObject, VideoTorrentObject } from '../../../../shared'
import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object'
import { retryTransactionWrapper } from '../../../helpers/database-utils'
import { logger } from '../../../helpers/logger'
import { sequelizeTypescript } from '../../../initializers'
-import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
import { ActorModel } from '../../../models/activitypub/actor'
-import { VideoAbuseModel } from '../../../models/video/video-abuse'
import { addVideoComment, resolveThread } from '../video-comments'
import { getOrCreateVideoAndAccountAndChannel } from '../videos'
import { forwardVideoRelatedActivity } from '../send/utils'
-import { Redis } from '../../redis'
import { createOrUpdateCacheFile } from '../cache-file'
-import { getVideoDislikeActivityPubUrl } from '../url'
import { Notifier } from '../../notifier'
+import { processViewActivity } from './process-view'
+import { processDislikeActivity } from './process-dislike'
+import { processFlagActivity } from './process-flag'
async function processCreateActivity (activity: ActivityCreate, byActor: ActorModel) {
const activityObject = activity.object
const activityType = activityObject.type
if (activityType === 'View') {
- return processCreateView(byActor, activity)
- } else if (activityType === 'Dislike') {
- return retryTransactionWrapper(processCreateDislike, byActor, activity)
- } else if (activityType === 'Video') {
+ return processViewActivity(activity, byActor)
+ }
+
+ if (activityType === 'Dislike') {
+ return retryTransactionWrapper(processDislikeActivity, activity, byActor)
+ }
+
+ if (activityType === 'Flag') {
+ return retryTransactionWrapper(processFlagActivity, activity, byActor)
+ }
+
+ if (activityType === 'Video') {
return processCreateVideo(activity)
- } else if (activityType === 'Flag') {
- return retryTransactionWrapper(processCreateVideoAbuse, byActor, activityObject as VideoAbuseObject)
- } else if (activityType === 'Note') {
- return retryTransactionWrapper(processCreateVideoComment, byActor, activity)
- } else if (activityType === 'CacheFile') {
- return retryTransactionWrapper(processCacheFile, byActor, activity)
+ }
+
+ if (activityType === 'Note') {
+ return retryTransactionWrapper(processCreateVideoComment, activity, byActor)
+ }
+
+ if (activityType === 'CacheFile') {
+ return retryTransactionWrapper(processCacheFile, activity, byActor)
}
logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id })
return video
}
-async function processCreateDislike (byActor: ActorModel, activity: ActivityCreate) {
- const dislike = activity.object as DislikeObject
- const byAccount = byActor.Account
-
- if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
-
- const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
-
- return sequelizeTypescript.transaction(async t => {
- const rate = {
- type: 'dislike' as 'dislike',
- videoId: video.id,
- accountId: byAccount.id
- }
-
- const [ , created ] = await AccountVideoRateModel.findOrCreate({
- where: rate,
- defaults: Object.assign({}, rate, { url: getVideoDislikeActivityPubUrl(byActor, video) }),
- transaction: t
- })
- if (created === true) await video.increment('dislikes', { transaction: t })
-
- if (video.isOwned() && created === true) {
- // Don't resend the activity to the sender
- const exceptions = [ byActor ]
-
- await forwardVideoRelatedActivity(activity, t, exceptions, video)
- }
- })
-}
-
-async function processCreateView (byActor: ActorModel, activity: ActivityCreate) {
- const view = activity.object as ViewObject
-
- const options = {
- videoObject: view.object,
- fetchType: 'only-video' as 'only-video'
- }
- const { video } = await getOrCreateVideoAndAccountAndChannel(options)
-
- await Redis.Instance.addVideoView(video.id)
-
- if (video.isOwned()) {
- // Don't resend the activity to the sender
- const exceptions = [ byActor ]
- await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
- }
-}
-
-async function processCacheFile (byActor: ActorModel, activity: ActivityCreate) {
+async function processCacheFile (activity: ActivityCreate, byActor: ActorModel) {
const cacheFile = activity.object as CacheFileObject
const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFile.object })
}
}
-async function processCreateVideoAbuse (byActor: ActorModel, videoAbuseToCreateData: VideoAbuseObject) {
- logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object)
-
- const account = byActor.Account
- if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
-
- const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoAbuseToCreateData.object })
-
- return sequelizeTypescript.transaction(async t => {
- const videoAbuseData = {
- reporterAccountId: account.id,
- reason: videoAbuseToCreateData.content,
- videoId: video.id,
- state: VideoAbuseState.PENDING
- }
-
- const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
- videoAbuseInstance.Video = video
-
- Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
-
- logger.info('Remote abuse for video uuid %s created', videoAbuseToCreateData.object)
- })
-}
-
-async function processCreateVideoComment (byActor: ActorModel, activity: ActivityCreate) {
+async function processCreateVideoComment (activity: ActivityCreate, byActor: ActorModel) {
const commentObject = activity.object as VideoCommentObject
const byAccount = byActor.Account
--- /dev/null
+import { ActivityCreate, ActivityDislike } from '../../../../shared'
+import { DislikeObject } from '../../../../shared/models/activitypub/objects'
+import { retryTransactionWrapper } from '../../../helpers/database-utils'
+import { sequelizeTypescript } from '../../../initializers'
+import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
+import { ActorModel } from '../../../models/activitypub/actor'
+import { getOrCreateVideoAndAccountAndChannel } from '../videos'
+import { forwardVideoRelatedActivity } from '../send/utils'
+import { getVideoDislikeActivityPubUrl } from '../url'
+
+async function processDislikeActivity (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
+ return retryTransactionWrapper(processDislike, activity, byActor)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ processDislikeActivity
+}
+
+// ---------------------------------------------------------------------------
+
+async function processDislike (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
+ const dislikeObject = activity.type === 'Dislike' ? activity.object : (activity.object as DislikeObject).object
+ const byAccount = byActor.Account
+
+ if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
+
+ const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislikeObject })
+
+ return sequelizeTypescript.transaction(async t => {
+ const rate = {
+ type: 'dislike' as 'dislike',
+ videoId: video.id,
+ accountId: byAccount.id
+ }
+
+ const [ , created ] = await AccountVideoRateModel.findOrCreate({
+ where: rate,
+ defaults: Object.assign({}, rate, { url: getVideoDislikeActivityPubUrl(byActor, video) }),
+ transaction: t
+ })
+ if (created === true) await video.increment('dislikes', { transaction: t })
+
+ if (video.isOwned() && created === true) {
+ // Don't resend the activity to the sender
+ const exceptions = [ byActor ]
+
+ await forwardVideoRelatedActivity(activity, t, exceptions, video)
+ }
+ })
+}
--- /dev/null
+import { ActivityCreate, ActivityFlag, VideoAbuseState } from '../../../../shared'
+import { VideoAbuseObject } from '../../../../shared/models/activitypub/objects'
+import { retryTransactionWrapper } from '../../../helpers/database-utils'
+import { logger } from '../../../helpers/logger'
+import { sequelizeTypescript } from '../../../initializers'
+import { ActorModel } from '../../../models/activitypub/actor'
+import { VideoAbuseModel } from '../../../models/video/video-abuse'
+import { getOrCreateVideoAndAccountAndChannel } from '../videos'
+import { Notifier } from '../../notifier'
+import { getAPId } from '../../../helpers/activitypub'
+
+async function processFlagActivity (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
+ return retryTransactionWrapper(processCreateVideoAbuse, activity, byActor)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ processFlagActivity
+}
+
+// ---------------------------------------------------------------------------
+
+async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
+ const flag = activity.type === 'Flag' ? activity : (activity.object as VideoAbuseObject)
+
+ logger.debug('Reporting remote abuse for video %s.', getAPId(flag.object))
+
+ const account = byActor.Account
+ if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
+
+ const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: flag.object })
+
+ return sequelizeTypescript.transaction(async t => {
+ const videoAbuseData = {
+ reporterAccountId: account.id,
+ reason: flag.content,
+ videoId: video.id,
+ state: VideoAbuseState.PENDING
+ }
+
+ const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
+ videoAbuseInstance.Video = video
+
+ Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
+
+ logger.info('Remote abuse for video uuid %s created', flag.object)
+ })
+}
import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
import { sendAccept } from '../send'
import { Notifier } from '../../notifier'
+import { getAPId } from '../../../helpers/activitypub'
async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) {
- const activityObject = activity.object
+ const activityObject = getAPId(activity.object)
return retryTransactionWrapper(processFollow, byActor, activityObject)
}
import { forwardVideoRelatedActivity } from '../send/utils'
import { getOrCreateVideoAndAccountAndChannel } from '../videos'
import { getVideoLikeActivityPubUrl } from '../url'
+import { getAPId } from '../../../helpers/activitypub'
async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) {
return retryTransactionWrapper(processLikeVideo, byActor, activity)
// ---------------------------------------------------------------------------
async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) {
- const videoUrl = activity.object
+ const videoUrl = getAPId(activity.object)
const byAccount = byActor.Account
if (!byAccount) throw new Error('Cannot create like with the non account actor ' + byActor.url)
}
}
+ if (activityToUndo.type === 'Dislike') {
+ return retryTransactionWrapper(processUndoDislike, byActor, activity)
+ }
+
if (activityToUndo.type === 'Follow') {
return retryTransactionWrapper(processUndoFollow, byActor, activityToUndo)
}
}
async function processUndoDislike (byActor: ActorModel, activity: ActivityUndo) {
- const dislike = activity.object.object as DislikeObject
+ const dislike = activity.object.type === 'Dislike'
+ ? activity.object
+ : activity.object.object as DislikeObject
const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
--- /dev/null
+import { ActorModel } from '../../../models/activitypub/actor'
+import { getOrCreateVideoAndAccountAndChannel } from '../videos'
+import { forwardVideoRelatedActivity } from '../send/utils'
+import { Redis } from '../../redis'
+import { ActivityCreate, ActivityView, ViewObject } from '../../../../shared/models/activitypub'
+
+async function processViewActivity (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
+ return processCreateView(activity, byActor)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ processViewActivity
+}
+
+// ---------------------------------------------------------------------------
+
+async function processCreateView (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
+ const videoObject = activity.type === 'View' ? activity.object : (activity.object as ViewObject).object
+
+ const options = {
+ videoObject: videoObject,
+ fetchType: 'only-video' as 'only-video'
+ }
+ const { video } = await getOrCreateVideoAndAccountAndChannel(options)
+
+ await Redis.Instance.addVideoView(video.id)
+
+ if (video.isOwned()) {
+ // Don't resend the activity to the sender
+ const exceptions = [ byActor ]
+ await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
+ }
+}
import { Activity, ActivityType } from '../../../../shared/models/activitypub'
-import { checkUrlsSameHost, getAPUrl } from '../../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../../helpers/activitypub'
import { logger } from '../../../helpers/logger'
import { ActorModel } from '../../../models/activitypub/actor'
import { processAcceptActivity } from './process-accept'
import { processUndoActivity } from './process-undo'
import { processUpdateActivity } from './process-update'
import { getOrCreateActorAndServerAndModel } from '../actor'
+import { processDislikeActivity } from './process-dislike'
+import { processFlagActivity } from './process-flag'
+import { processViewActivity } from './process-view'
const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: ActorModel, inboxActor?: ActorModel) => Promise<any> } = {
Create: processCreateActivity,
Reject: processRejectActivity,
Announce: processAnnounceActivity,
Undo: processUndoActivity,
- Like: processLikeActivity
+ Like: processLikeActivity,
+ Dislike: processDislikeActivity,
+ Flag: processFlagActivity,
+ View: processViewActivity
}
async function processActivities (
const actorsCache: { [ url: string ]: ActorModel } = {}
for (const activity of activities) {
- if (!options.signatureActor && [ 'Create', 'Announce', 'Like' ].indexOf(activity.type) === -1) {
+ if (!options.signatureActor && [ 'Create', 'Announce', 'Like' ].includes(activity.type) === false) {
logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type)
continue
}
- const actorUrl = getAPUrl(activity.actor)
+ const actorUrl = getAPId(activity.actor)
// When we fetch remote data, we don't have signature
if (options.signatureActor && actorUrl !== options.signatureActor.url) {
import { VideoPrivacy } from '../../../../shared/models/videos'
import { ActorModel } from '../../../models/activitypub/actor'
import { VideoModel } from '../../../models/video/video'
-import { VideoAbuseModel } from '../../../models/video/video-abuse'
import { VideoCommentModel } from '../../../models/video/video-comment'
-import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
import { broadcastToActors, broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
import { audiencify, getActorsInvolvedInVideo, getAudience, getAudienceFromFollowersOf, getVideoCommentAudience } from '../audience'
import { logger } from '../../../helpers/logger'
return broadcastToFollowers(createActivity, byActor, [ byActor ], t)
}
-async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) {
- if (!video.VideoChannel.Account.Actor.serverId) return // Local
-
- const url = getVideoAbuseActivityPubUrl(videoAbuse)
-
- logger.info('Creating job to send video abuse %s.', url)
-
- // Custom audience, we only send the abuse to the origin instance
- const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
- const createActivity = buildCreateActivity(url, byActor, videoAbuse.toActivityPubObject(), audience)
-
- return unicastTo(createActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
-}
-
-async function sendCreateCacheFile (byActor: ActorModel, fileRedundancy: VideoRedundancyModel) {
+async function sendCreateCacheFile (byActor: ActorModel, video: VideoModel, fileRedundancy: VideoRedundancyModel) {
logger.info('Creating job to send file cache of %s.', fileRedundancy.url)
- const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(fileRedundancy.VideoFile.Video.id)
- const redundancyObject = fileRedundancy.toActivityPubObject()
-
return sendVideoRelatedCreateActivity({
byActor,
video,
url: fileRedundancy.url,
- object: redundancyObject
+ object: fileRedundancy.toActivityPubObject()
})
}
return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl)
}
-async function sendCreateView (byActor: ActorModel, video: VideoModel, t: Transaction) {
- logger.info('Creating job to send view of %s.', video.url)
-
- const url = getVideoViewActivityPubUrl(byActor, video)
- const viewActivity = buildViewActivity(url, byActor, video)
-
- return sendVideoRelatedCreateActivity({
- // Use the server actor to send the view
- byActor,
- video,
- url,
- object: viewActivity,
- transaction: t
- })
-}
-
-async function sendCreateDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
- logger.info('Creating job to dislike %s.', video.url)
-
- const url = getVideoDislikeActivityPubUrl(byActor, video)
- const dislikeActivity = buildDislikeActivity(url, byActor, video)
-
- return sendVideoRelatedCreateActivity({
- byActor,
- video,
- url,
- object: dislikeActivity,
- transaction: t
- })
-}
-
function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate {
if (!audience) audience = getAudience(byActor)
)
}
-function buildDislikeActivity (url: string, byActor: ActorModel, video: VideoModel) {
- return {
- id: url,
- type: 'Dislike',
- actor: byActor.url,
- object: video.url
- }
-}
-
-function buildViewActivity (url: string, byActor: ActorModel, video: VideoModel) {
- return {
- id: url,
- type: 'View',
- actor: byActor.url,
- object: video.url
- }
-}
-
// ---------------------------------------------------------------------------
export {
sendCreateVideo,
- sendVideoAbuse,
buildCreateActivity,
- sendCreateView,
- sendCreateDislike,
- buildDislikeActivity,
sendCreateVideoComment,
sendCreateCacheFile
}
--- /dev/null
+import { Transaction } from 'sequelize'
+import { ActorModel } from '../../../models/activitypub/actor'
+import { VideoModel } from '../../../models/video/video'
+import { getVideoDislikeActivityPubUrl } from '../url'
+import { logger } from '../../../helpers/logger'
+import { ActivityAudience, ActivityDislike } from '../../../../shared/models/activitypub'
+import { sendVideoRelatedActivity } from './utils'
+import { audiencify, getAudience } from '../audience'
+
+async function sendDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
+ logger.info('Creating job to dislike %s.', video.url)
+
+ const activityBuilder = (audience: ActivityAudience) => {
+ const url = getVideoDislikeActivityPubUrl(byActor, video)
+
+ return buildDislikeActivity(url, byActor, video, audience)
+ }
+
+ return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
+}
+
+function buildDislikeActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityDislike {
+ if (!audience) audience = getAudience(byActor)
+
+ return audiencify(
+ {
+ id: url,
+ type: 'Dislike' as 'Dislike',
+ actor: byActor.url,
+ object: video.url
+ },
+ audience
+ )
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ sendDislike,
+ buildDislikeActivity
+}
--- /dev/null
+import { ActorModel } from '../../../models/activitypub/actor'
+import { VideoModel } from '../../../models/video/video'
+import { VideoAbuseModel } from '../../../models/video/video-abuse'
+import { getVideoAbuseActivityPubUrl } from '../url'
+import { unicastTo } from './utils'
+import { logger } from '../../../helpers/logger'
+import { ActivityAudience, ActivityFlag } from '../../../../shared/models/activitypub'
+import { audiencify, getAudience } from '../audience'
+
+async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) {
+ if (!video.VideoChannel.Account.Actor.serverId) return // Local user
+
+ const url = getVideoAbuseActivityPubUrl(videoAbuse)
+
+ logger.info('Creating job to send video abuse %s.', url)
+
+ // Custom audience, we only send the abuse to the origin instance
+ const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
+ const flagActivity = buildFlagActivity(url, byActor, videoAbuse, audience)
+
+ return unicastTo(flagActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
+}
+
+function buildFlagActivity (url: string, byActor: ActorModel, videoAbuse: VideoAbuseModel, audience: ActivityAudience): ActivityFlag {
+ if (!audience) audience = getAudience(byActor)
+
+ const activity = Object.assign(
+ { id: url, actor: byActor.url },
+ videoAbuse.toActivityPubObject()
+ )
+
+ return audiencify(activity, audience)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ sendVideoAbuse
+}
import {
ActivityAnnounce,
ActivityAudience,
- ActivityCreate,
+ ActivityCreate, ActivityDislike,
ActivityFollow,
ActivityLike,
ActivityUndo
import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
import { audiencify, getAudience } from '../audience'
-import { buildCreateActivity, buildDislikeActivity } from './send-create'
+import { buildCreateActivity } from './send-create'
import { buildFollowActivity } from './send-follow'
import { buildLikeActivity } from './send-like'
import { VideoShareModel } from '../../../models/video/video-share'
import { buildAnnounceWithVideoAudience } from './send-announce'
import { logger } from '../../../helpers/logger'
import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
+import { buildDislikeActivity } from './send-dislike'
async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
const me = actorFollow.ActorFollower
const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
const dislikeActivity = buildDislikeActivity(dislikeUrl, byActor, video)
- const createDislikeActivity = buildCreateActivity(dislikeUrl, byActor, dislikeActivity)
- return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: createDislikeActivity, transaction: t })
+ return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: dislikeActivity, transaction: t })
}
async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) {
logger.info('Creating job to undo cache file %s.', redundancyModel.url)
- const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id)
+ const videoId = redundancyModel.getVideo().id
+ const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject())
return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t })
function undoActivityData (
url: string,
byActor: ActorModel,
- object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce,
+ object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
audience?: ActivityAudience
): ActivityUndo {
if (!audience) audience = getAudience(byActor)
byActor: ActorModel,
video: VideoModel,
url: string,
- activity: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce,
+ activity: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
transaction: Transaction
}) {
const activityBuilder = (audience: ActivityAudience) => {
async function sendUpdateCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel) {
logger.info('Creating job to update cache file %s.', redundancyModel.url)
- const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id)
+ const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.getVideo().id)
const activityBuilder = (audience: ActivityAudience) => {
const redundancyObject = redundancyModel.toActivityPubObject()
--- /dev/null
+import { Transaction } from 'sequelize'
+import { ActivityAudience, ActivityView } from '../../../../shared/models/activitypub'
+import { ActorModel } from '../../../models/activitypub/actor'
+import { VideoModel } from '../../../models/video/video'
+import { getVideoLikeActivityPubUrl } from '../url'
+import { sendVideoRelatedActivity } from './utils'
+import { audiencify, getAudience } from '../audience'
+import { logger } from '../../../helpers/logger'
+
+async function sendView (byActor: ActorModel, video: VideoModel, t: Transaction) {
+ logger.info('Creating job to send view of %s.', video.url)
+
+ const activityBuilder = (audience: ActivityAudience) => {
+ const url = getVideoLikeActivityPubUrl(byActor, video)
+
+ return buildViewActivity(url, byActor, video, audience)
+ }
+
+ return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
+}
+
+function buildViewActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityView {
+ if (!audience) audience = getAudience(byActor)
+
+ return audiencify(
+ {
+ id: url,
+ type: 'View' as 'View',
+ actor: byActor.url,
+ object: video.url
+ },
+ audience
+ )
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ sendView
+}
import { getOrCreateActorAndServerAndModel } from './actor'
import { logger } from '../../helpers/logger'
import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
-import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) {
if (video.privacy === VideoPrivacy.PRIVATE) return undefined
})
if (!body || !body.actor) throw new Error('Body or body actor is invalid')
- const actorUrl = getAPUrl(body.actor)
+ const actorUrl = getAPId(body.actor)
if (checkUrlsSameHost(shareUrl, actorUrl) !== true) {
throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`)
}
const serverActor = await getServerActor()
const serverShareUrl = getVideoAnnounceActivityPubUrl(serverActor, video)
- return VideoShareModel.findOrCreate({
+ const [ serverShare ] = await VideoShareModel.findOrCreate({
defaults: {
actorId: serverActor.id,
videoId: video.id,
url: serverShareUrl
},
transaction: t
- }).then(([ serverShare, created ]) => {
- if (created) return sendVideoAnnounce(serverActor, serverShare, video, t)
-
- return undefined
})
+
+ return sendVideoAnnounce(serverActor, serverShare, video, t)
}
async function shareByVideoChannel (video: VideoModel, t: Transaction) {
const videoChannelShareUrl = getVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video)
- return VideoShareModel.findOrCreate({
+ const [ videoChannelShare ] = await VideoShareModel.findOrCreate({
defaults: {
actorId: video.VideoChannel.actorId,
videoId: video.id,
url: videoChannelShareUrl
},
transaction: t
- }).then(([ videoChannelShare, created ]) => {
- if (created) return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
-
- return undefined
})
+
+ return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
}
async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) {
import { VideoAbuseModel } from '../../models/video/video-abuse'
import { VideoCommentModel } from '../../models/video/video-comment'
import { VideoFileModel } from '../../models/video/video-file'
+import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
+import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
function getVideoActivityPubUrl (video: VideoModel) {
return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid
return `${CONFIG.WEBSERVER.URL}/redundancy/videos/${videoFile.Video.uuid}/${videoFile.resolution}${suffixFPS}`
}
+function getVideoCacheStreamingPlaylistActivityPubUrl (video: VideoModel, playlist: VideoStreamingPlaylistModel) {
+ return `${CONFIG.WEBSERVER.URL}/redundancy/video-playlists/${playlist.getStringType()}/${video.uuid}`
+}
+
function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) {
return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '/comments/' + videoComment.id
}
export {
getVideoActivityPubUrl,
+ getVideoCacheStreamingPlaylistActivityPubUrl,
getVideoChannelActivityPubUrl,
getAccountActivityPubUrl,
getVideoAbuseActivityPubUrl,
import { Transaction } from 'sequelize'
import { AccountModel } from '../../models/account/account'
import { VideoModel } from '../../models/video/video'
-import { sendCreateDislike, sendLike, sendUndoDislike, sendUndoLike } from './send'
+import { sendLike, sendUndoDislike, sendUndoLike } from './send'
import { VideoRateType } from '../../../shared/models/videos'
import * as Bluebird from 'bluebird'
import { getOrCreateActorAndServerAndModel } from './actor'
import { logger } from '../../helpers/logger'
import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
import { doRequest } from '../../helpers/requests'
-import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
import { ActorModel } from '../../models/activitypub/actor'
import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from './url'
+import { sendDislike } from './send/send-dislike'
async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRateType) {
let rateCounts = 0
})
if (!body || !body.actor) throw new Error('Body or body actor is invalid')
- const actorUrl = getAPUrl(body.actor)
+ const actorUrl = getAPId(body.actor)
if (checkUrlsSameHost(actorUrl, rateUrl) !== true) {
throw new Error(`Rate url ${rateUrl} has not the same host than actor url ${actorUrl}`)
}
// Like
if (likes > 0) await sendLike(actor, video, t)
// Dislike
- if (dislikes > 0) await sendCreateDislike(actor, video, t)
+ if (dislikes > 0) await sendDislike(actor, video, t)
}
function getRateUrl (rateType: VideoRateType, actor: ActorModel, video: VideoModel) {
import * as sequelize from 'sequelize'
import * as magnetUtil from 'magnet-uri'
import * as request from 'request'
-import { ActivityIconObject, ActivityUrlObject, ActivityVideoUrlObject, VideoState } from '../../../shared/index'
+import {
+ ActivityIconObject,
+ ActivityPlaylistSegmentHashesObject,
+ ActivityPlaylistUrlObject,
+ ActivityUrlObject,
+ ActivityVideoUrlObject,
+ VideoState
+} from '../../../shared/index'
import { VideoTorrentObject } from '../../../shared/models/activitypub/objects'
import { VideoPrivacy } from '../../../shared/models/videos'
import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos'
import { addVideoShares, shareVideoByServerAndChannel } from './share'
import { AccountModel } from '../../models/account/account'
import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video'
-import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub'
+import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
import { Notifier } from '../notifier'
+import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
+import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
+import { FilteredModelAttributes } from 'sequelize-typescript/lib/models/Model'
async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) {
// If the video is not private and published, we federate it
}
async function getOrCreateVideoAndAccountAndChannel (options: {
- videoObject: VideoTorrentObject | string,
+ videoObject: { id: string } | string,
syncParam?: SyncParam,
fetchType?: VideoFetchByUrlType,
allowRefresh?: boolean // true by default
const allowRefresh = options.allowRefresh !== false
// Get video url
- const videoUrl = getAPUrl(options.videoObject)
+ const videoUrl = getAPId(options.videoObject)
let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType)
if (videoFromDatabase) {
}
if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions)
- else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoFromDatabase.url } })
+ else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: videoFromDatabase.url } })
}
return { video: videoFromDatabase, created: false }
options.video.set('support', videoData.support)
options.video.set('nsfw', videoData.nsfw)
options.video.set('commentsEnabled', videoData.commentsEnabled)
+ options.video.set('downloadEnabled', videoData.downloadEnabled)
options.video.set('waitTranscoding', videoData.waitTranscoding)
options.video.set('state', videoData.state)
options.video.set('duration', videoData.duration)
options.video.VideoFiles = await Promise.all(upsertTasks)
}
+ {
+ const streamingPlaylistAttributes = streamingPlaylistActivityUrlToDBAttributes(options.video, options.videoObject)
+ const newStreamingPlaylists = streamingPlaylistAttributes.map(a => new VideoStreamingPlaylistModel(a))
+
+ // Remove video files that do not exist anymore
+ const destroyTasks = options.video.VideoStreamingPlaylists
+ .filter(f => !newStreamingPlaylists.find(newPlaylist => newPlaylist.hasSameUniqueKeysThan(f)))
+ .map(f => f.destroy(sequelizeOptions))
+ await Promise.all(destroyTasks)
+
+ // Update or add other one
+ const upsertTasks = streamingPlaylistAttributes.map(a => {
+ return VideoStreamingPlaylistModel.upsert<VideoStreamingPlaylistModel>(a, { returning: true, transaction: t })
+ .then(([ streamingPlaylist ]) => streamingPlaylist)
+ })
+
+ options.video.VideoStreamingPlaylists = await Promise.all(upsertTasks)
+ }
+
{
// Update Tags
const tags = options.videoObject.tag.map(tag => tag.name)
// ---------------------------------------------------------------------------
-function isActivityVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject {
+function isAPVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject {
const mimeTypes = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
const urlMediaType = url.mediaType || url.mimeType
return mimeTypes.indexOf(urlMediaType) !== -1 && urlMediaType.startsWith('video/')
}
+function isAPStreamingPlaylistUrlObject (url: ActivityUrlObject): url is ActivityPlaylistUrlObject {
+ const urlMediaType = url.mediaType || url.mimeType
+
+ return urlMediaType === 'application/x-mpegURL'
+}
+
+function isAPPlaylistSegmentHashesUrlObject (tag: any): tag is ActivityPlaylistSegmentHashesObject {
+ const urlMediaType = tag.mediaType || tag.mimeType
+
+ return tag.name === 'sha256' && tag.type === 'Link' && urlMediaType === 'application/json'
+}
+
async function createVideo (videoObject: VideoTorrentObject, channelActor: ActorModel, waitThumbnail = false) {
logger.debug('Adding remote video %s.', videoObject.id)
const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t }))
await Promise.all(videoFilePromises)
+ const videoStreamingPlaylists = streamingPlaylistActivityUrlToDBAttributes(videoCreated, videoObject)
+ const playlistPromises = videoStreamingPlaylists.map(p => VideoStreamingPlaylistModel.create(p, { transaction: t }))
+ await Promise.all(playlistPromises)
+
// Process tags
- const tags = videoObject.tag.map(t => t.name)
+ const tags = videoObject.tag
+ .filter(t => t.type === 'Hashtag')
+ .map(t => t.name)
const tagInstances = await TagModel.findOrCreateTags(tags, t)
await videoCreated.$set('Tags', tagInstances, sequelizeOptions)
support,
nsfw: videoObject.sensitive,
commentsEnabled: videoObject.commentsEnabled,
+ downloadEnabled: videoObject.downloadEnabled,
waitTranscoding: videoObject.waitTranscoding,
state: videoObject.state,
channelId: videoChannel.id,
}
function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
- const fileUrls = videoObject.url.filter(u => isActivityVideoUrlObject(u)) as ActivityVideoUrlObject[]
+ const fileUrls = videoObject.url.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[]
if (fileUrls.length === 0) {
throw new Error('Cannot find video files for ' + video.url)
}
- const attributes: VideoFileModel[] = []
+ const attributes: FilteredModelAttributes<VideoFileModel>[] = []
for (const fileUrl of fileUrls) {
// Fetch associated magnet uri
const magnet = videoObject.url.find(u => {
size: fileUrl.size,
videoId: video.id,
fps: fileUrl.fps || -1
- } as VideoFileModel
+ }
+
+ attributes.push(attribute)
+ }
+
+ return attributes
+}
+
+function streamingPlaylistActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
+ const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u)) as ActivityPlaylistUrlObject[]
+ if (playlistUrls.length === 0) return []
+
+ const attributes: FilteredModelAttributes<VideoStreamingPlaylistModel>[] = []
+ for (const playlistUrlObject of playlistUrls) {
+ const p2pMediaLoaderInfohashes = playlistUrlObject.tag
+ .filter(t => t.type === 'Infohash')
+ .map(t => t.name)
+ if (p2pMediaLoaderInfohashes.length === 0) {
+ logger.warn('No infohashes found in AP playlist object.', { playlistUrl: playlistUrlObject })
+ continue
+ }
+
+ const segmentsSha256UrlObject = playlistUrlObject.tag
+ .find(t => {
+ return isAPPlaylistSegmentHashesUrlObject(t)
+ }) as ActivityPlaylistSegmentHashesObject
+ if (!segmentsSha256UrlObject) {
+ logger.warn('No segment sha256 URL found in AP playlist object.', { playlistUrl: playlistUrlObject })
+ continue
+ }
+
+ const attribute = {
+ type: VideoStreamingPlaylistType.HLS,
+ playlistUrl: playlistUrlObject.href,
+ segmentsSha256Url: segmentsSha256UrlObject.href,
+ p2pMediaLoaderInfohashes,
+ videoId: video.id
+ }
+
attributes.push(attribute)
}
import * as express from 'express'
import * as Bluebird from 'bluebird'
import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n'
-import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, STATIC_PATHS } from '../initializers'
+import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE } from '../initializers'
import { join } from 'path'
import { escapeHTML } from '../helpers/core-utils'
import { VideoModel } from '../models/video/video'
// Schema.org
tagsString += `<script type="application/ld+json">${JSON.stringify(schemaTags)}</script>`
- // SEO
- tagsString += `<link rel="canonical" href="${videoUrl}" />`
+ // SEO, use origin video url so Google does not index remote videos
+ tagsString += `<link rel="canonical" href="${video.url}" />`
return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.OPENGRAPH_AND_OEMBED, tagsString)
}
return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
}
- addForgetPasswordEmailJob (to: string, resetPasswordUrl: string) {
+ addPasswordResetEmailJob (to: string, resetPasswordUrl: string) {
const text = `Hi dear user,\n\n` +
- `It seems you forgot your password on ${CONFIG.WEBSERVER.HOST}! ` +
+ `A reset password procedure for your account ${to} has been requested on ${CONFIG.WEBSERVER.HOST} ` +
`Please follow this link to reset it: ${resetPasswordUrl}\n\n` +
`If you are not the person who initiated this request, please ignore this email.\n\n` +
`Cheers,\n` +
--- /dev/null
+import { VideoModel } from '../models/video/video'
+import { basename, join, dirname } from 'path'
+import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
+import { close, ensureDir, move, open, outputJSON, pathExists, read, readFile, remove, writeFile } from 'fs-extra'
+import { getVideoFileSize } from '../helpers/ffmpeg-utils'
+import { sha256 } from '../helpers/core-utils'
+import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
+import { logger } from '../helpers/logger'
+import { doRequest, doRequestAndSaveToFile } from '../helpers/requests'
+import { generateRandomString } from '../helpers/utils'
+import { flatten, uniq } from 'lodash'
+
+async function updateMasterHLSPlaylist (video: VideoModel) {
+ const directory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
+ const masterPlaylists: string[] = [ '#EXTM3U', '#EXT-X-VERSION:3' ]
+ const masterPlaylistPath = join(directory, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
+
+ for (const file of video.VideoFiles) {
+ // If we did not generated a playlist for this resolution, skip
+ const filePlaylistPath = join(directory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
+ if (await pathExists(filePlaylistPath) === false) continue
+
+ const videoFilePath = video.getVideoFilePath(file)
+
+ const size = await getVideoFileSize(videoFilePath)
+
+ const bandwidth = 'BANDWIDTH=' + video.getBandwidthBits(file)
+ const resolution = `RESOLUTION=${size.width}x${size.height}`
+
+ let line = `#EXT-X-STREAM-INF:${bandwidth},${resolution}`
+ if (file.fps) line += ',FRAME-RATE=' + file.fps
+
+ masterPlaylists.push(line)
+ masterPlaylists.push(VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
+ }
+
+ await writeFile(masterPlaylistPath, masterPlaylists.join('\n') + '\n')
+}
+
+async function updateSha256Segments (video: VideoModel) {
+ const json: { [filename: string]: { [range: string]: string } } = {}
+
+ const playlistDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
+
+ // For all the resolutions available for this video
+ for (const file of video.VideoFiles) {
+ const rangeHashes: { [range: string]: string } = {}
+
+ const videoPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution))
+ const playlistPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
+
+ // Maybe the playlist is not generated for this resolution yet
+ if (!await pathExists(playlistPath)) continue
+
+ const playlistContent = await readFile(playlistPath)
+ const ranges = getRangesFromPlaylist(playlistContent.toString())
+
+ const fd = await open(videoPath, 'r')
+ for (const range of ranges) {
+ const buf = Buffer.alloc(range.length)
+ await read(fd, buf, 0, range.length, range.offset)
+
+ rangeHashes[`${range.offset}-${range.offset + range.length - 1}`] = sha256(buf)
+ }
+ await close(fd)
+
+ const videoFilename = VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution)
+ json[videoFilename] = rangeHashes
+ }
+
+ const outputPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
+ await outputJSON(outputPath, json)
+}
+
+function getRangesFromPlaylist (playlistContent: string) {
+ const ranges: { offset: number, length: number }[] = []
+ const lines = playlistContent.split('\n')
+ const regex = /^#EXT-X-BYTERANGE:(\d+)@(\d+)$/
+
+ for (const line of lines) {
+ const captured = regex.exec(line)
+
+ if (captured) {
+ ranges.push({ length: parseInt(captured[1], 10), offset: parseInt(captured[2], 10) })
+ }
+ }
+
+ return ranges
+}
+
+function downloadPlaylistSegments (playlistUrl: string, destinationDir: string, timeout: number) {
+ let timer
+
+ logger.info('Importing HLS playlist %s', playlistUrl)
+
+ return new Promise<string>(async (res, rej) => {
+ const tmpDirectory = join(CONFIG.STORAGE.TMP_DIR, await generateRandomString(10))
+
+ await ensureDir(tmpDirectory)
+
+ timer = setTimeout(() => {
+ deleteTmpDirectory(tmpDirectory)
+
+ return rej(new Error('HLS download timeout.'))
+ }, timeout)
+
+ try {
+ // Fetch master playlist
+ const subPlaylistUrls = await fetchUniqUrls(playlistUrl)
+
+ const subRequests = subPlaylistUrls.map(u => fetchUniqUrls(u))
+ const fileUrls = uniq(flatten(await Promise.all(subRequests)))
+
+ logger.debug('Will download %d HLS files.', fileUrls.length, { fileUrls })
+
+ for (const fileUrl of fileUrls) {
+ const destPath = join(tmpDirectory, basename(fileUrl))
+
+ await doRequestAndSaveToFile({ uri: fileUrl }, destPath)
+ }
+
+ clearTimeout(timer)
+
+ await move(tmpDirectory, destinationDir, { overwrite: true })
+
+ return res()
+ } catch (err) {
+ deleteTmpDirectory(tmpDirectory)
+
+ return rej(err)
+ }
+ })
+
+ function deleteTmpDirectory (directory: string) {
+ remove(directory)
+ .catch(err => logger.error('Cannot delete path on HLS download error.', { err }))
+ }
+
+ async function fetchUniqUrls (playlistUrl: string) {
+ const { body } = await doRequest<string>({ uri: playlistUrl })
+
+ if (!body) return []
+
+ const urls = body.split('\n')
+ .filter(line => line.endsWith('.m3u8') || line.endsWith('.mp4'))
+ .map(url => {
+ if (url.startsWith('http://') || url.startsWith('https://')) return url
+
+ return `${dirname(playlistUrl)}/${url}`
+ })
+
+ return uniq(urls)
+ }
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ updateMasterHLSPlaylist,
+ updateSha256Segments,
+ downloadPlaylistSegments
+}
+
+// ---------------------------------------------------------------------------
import * as Bull from 'bull'
import { logger } from '../../../helpers/logger'
import { fetchVideoByUrl } from '../../../helpers/video'
-import { refreshVideoIfNeeded } from '../../activitypub'
+import { refreshVideoIfNeeded, refreshActorIfNeeded } from '../../activitypub'
+import { ActorModel } from '../../../models/activitypub/actor'
export type RefreshPayload = {
- videoUrl: string
- type: 'video'
+ type: 'video' | 'actor'
+ url: string
}
async function refreshAPObject (job: Bull.Job) {
const payload = job.data as RefreshPayload
- logger.info('Processing AP refresher in job %d for video %s.', job.id, payload.videoUrl)
+ logger.info('Processing AP refresher in job %d for %s.', job.id, payload.url)
- if (payload.type === 'video') return refreshAPVideo(payload.videoUrl)
+ if (payload.type === 'video') return refreshVideo(payload.url)
+ if (payload.type === 'actor') return refreshActor(payload.url)
}
// ---------------------------------------------------------------------------
export {
+ refreshActor,
refreshAPObject
}
// ---------------------------------------------------------------------------
-async function refreshAPVideo (videoUrl: string) {
+async function refreshVideo (videoUrl: string) {
const fetchType = 'all' as 'all'
const syncParam = { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true }
await refreshVideoIfNeeded(refreshOptions)
}
}
+
+async function refreshActor (actorUrl: string) {
+ const fetchType = 'all' as 'all'
+ const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
+
+ if (actor) {
+ await refreshActorIfNeeded(actor, fetchType)
+ }
+
+}
import { JobQueue } from '../job-queue'
import { federateVideoIfNeeded } from '../../activitypub'
import { retryTransactionWrapper } from '../../../helpers/database-utils'
-import { sequelizeTypescript } from '../../../initializers'
+import { sequelizeTypescript, CONFIG } from '../../../initializers'
import * as Bluebird from 'bluebird'
import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils'
-import { importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding'
+import { generateHlsPlaylist, importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding'
import { Notifier } from '../../notifier'
export type VideoFilePayload = {
videoUUID: string
- isNewVideo?: boolean
resolution?: VideoResolution
+ isNewVideo?: boolean
isPortraitMode?: boolean
+ generateHlsPlaylist?: boolean
}
export type VideoFileImportPayload = {
return undefined
}
- // Transcoding in other resolution
- if (payload.resolution) {
+ if (payload.generateHlsPlaylist) {
+ await generateHlsPlaylist(video, payload.resolution, payload.isPortraitMode || false)
+
+ await retryTransactionWrapper(onHlsPlaylistGenerationSuccess, video)
+ } else if (payload.resolution) { // Transcoding in other resolution
await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false)
- await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video)
+ await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video, payload)
} else {
await optimizeVideofile(video)
- await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload.isNewVideo)
+ await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload)
}
return video
}
-async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) {
+async function onHlsPlaylistGenerationSuccess (video: VideoModel) {
+ if (video === undefined) return undefined
+
+ await sequelizeTypescript.transaction(async t => {
+ // Maybe the video changed in database, refresh it
+ let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
+ // Video does not exist anymore
+ if (!videoDatabase) return undefined
+
+ // If the video was not published, we consider it is a new one for other instances
+ await federateVideoIfNeeded(videoDatabase, false, t)
+ })
+}
+
+async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload?: VideoFilePayload) {
if (video === undefined) return undefined
const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => {
return { videoDatabase, videoPublished }
})
- if (videoPublished) {
+ // don't notify prior to scheduled video update
+ if (videoPublished && !videoDatabase.ScheduleVideoUpdate) {
Notifier.Instance.notifyOnNewVideo(videoDatabase)
Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
}
+
+ await createHlsJobIfEnabled(payload)
}
-async function onVideoFileOptimizerSuccess (videoArg: VideoModel, isNewVideo: boolean) {
+async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: VideoFilePayload) {
if (videoArg === undefined) return undefined
// Outside the transaction (IO on disk)
logger.info('No transcoding jobs created for video %s (no resolutions).', videoDatabase.uuid, { privacy: videoDatabase.privacy })
}
- await federateVideoIfNeeded(videoDatabase, isNewVideo, t)
+ await federateVideoIfNeeded(videoDatabase, payload.isNewVideo, t)
return { videoDatabase, videoPublished }
})
- if (isNewVideo) Notifier.Instance.notifyOnNewVideo(videoDatabase)
- if (videoPublished) Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
+ // don't notify prior to scheduled video update
+ if (!videoDatabase.ScheduleVideoUpdate) {
+ if (payload.isNewVideo) Notifier.Instance.notifyOnNewVideo(videoDatabase)
+ if (videoPublished) Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
+ }
+
+ await createHlsJobIfEnabled(Object.assign({}, payload, { resolution: videoDatabase.getOriginalFile().resolution }))
}
// ---------------------------------------------------------------------------
processVideoFile,
processVideoFileImport
}
+
+// ---------------------------------------------------------------------------
+
+function createHlsJobIfEnabled (payload?: VideoFilePayload) {
+ // Generate HLS playlist?
+ if (payload && CONFIG.TRANSCODING.HLS.ENABLED) {
+ const hlsTranscodingPayload = {
+ videoUUID: payload.videoUUID,
+ resolution: payload.resolution,
+ isPortraitMode: payload.isPortraitMode,
+
+ generateHlsPlaylist: true
+ }
+
+ return JobQueue.Instance.createJob({ type: 'video-file', payload: hlsTranscodingPayload })
+ }
+}
import { AbstractScheduler } from './abstract-scheduler'
-import { CONFIG, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers'
+import { CONFIG, HLS_REDUNDANCY_DIRECTORY, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers'
import { logger } from '../../helpers/logger'
import { VideosRedundancy } from '../../../shared/models/redundancy'
import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
import { move } from 'fs-extra'
import { getServerActor } from '../../helpers/utils'
import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send'
-import { getVideoCacheFileActivityPubUrl } from '../activitypub/url'
+import { getVideoCacheFileActivityPubUrl, getVideoCacheStreamingPlaylistActivityPubUrl } from '../activitypub/url'
import { removeVideoRedundancy } from '../redundancy'
import { getOrCreateVideoAndAccountAndChannel } from '../activitypub'
+import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
+import { VideoModel } from '../../models/video/video'
+import { downloadPlaylistSegments } from '../hls'
+
+type CandidateToDuplicate = {
+ redundancy: VideosRedundancy,
+ video: VideoModel,
+ files: VideoFileModel[],
+ streamingPlaylists: VideoStreamingPlaylistModel[]
+}
export class VideosRedundancyScheduler extends AbstractScheduler {
}
protected async internalExecute () {
- for (const obj of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) {
- logger.info('Running redundancy scheduler for strategy %s.', obj.strategy)
+ for (const redundancyConfig of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) {
+ logger.info('Running redundancy scheduler for strategy %s.', redundancyConfig.strategy)
try {
- const videoToDuplicate = await this.findVideoToDuplicate(obj)
+ const videoToDuplicate = await this.findVideoToDuplicate(redundancyConfig)
if (!videoToDuplicate) continue
- const videoFiles = videoToDuplicate.VideoFiles
- videoFiles.forEach(f => f.Video = videoToDuplicate)
+ const candidateToDuplicate = {
+ video: videoToDuplicate,
+ redundancy: redundancyConfig,
+ files: videoToDuplicate.VideoFiles,
+ streamingPlaylists: videoToDuplicate.VideoStreamingPlaylists
+ }
- await this.purgeCacheIfNeeded(obj, videoFiles)
+ await this.purgeCacheIfNeeded(candidateToDuplicate)
- if (await this.isTooHeavy(obj, videoFiles)) {
+ if (await this.isTooHeavy(candidateToDuplicate)) {
logger.info('Video %s is too big for our cache, skipping.', videoToDuplicate.url)
continue
}
- logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, obj.strategy)
+ logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, redundancyConfig.strategy)
- await this.createVideoRedundancy(obj, videoFiles)
+ await this.createVideoRedundancies(candidateToDuplicate)
} catch (err) {
- logger.error('Cannot run videos redundancy %s.', obj.strategy, { err })
+ logger.error('Cannot run videos redundancy %s.', redundancyConfig.strategy, { err })
}
}
for (const redundancyModel of expired) {
try {
- await this.extendsOrDeleteRedundancy(redundancyModel)
+ const redundancyConfig = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
+ const candidate = {
+ redundancy: redundancyConfig,
+ video: null,
+ files: [],
+ streamingPlaylists: []
+ }
+
+ // If the administrator disabled the redundancy or decreased the cache size, remove this redundancy instead of extending it
+ if (!redundancyConfig || await this.isTooHeavy(candidate)) {
+ logger.info('Destroying redundancy %s because the cache size %s is too heavy.', redundancyModel.url, redundancyModel.strategy)
+ await removeVideoRedundancy(redundancyModel)
+ } else {
+ await this.extendsRedundancy(redundancyModel)
+ }
} catch (err) {
- logger.error('Cannot extend expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel))
+ logger.error(
+ 'Cannot extend or remove expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel),
+ { err }
+ )
}
}
}
- private async extendsOrDeleteRedundancy (redundancyModel: VideoRedundancyModel) {
- // Refresh the video, maybe it was deleted
- const video = await this.loadAndRefreshVideo(redundancyModel.VideoFile.Video.url)
-
- if (!video) {
- logger.info('Destroying existing redundancy %s, because the associated video does not exist anymore.', redundancyModel.url)
-
- await redundancyModel.destroy()
- return
- }
-
+ private async extendsRedundancy (redundancyModel: VideoRedundancyModel) {
const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
+ // Redundancy strategy disabled, remove our redundancy instead of extending expiration
+ if (!redundancy) await removeVideoRedundancy(redundancyModel)
+
await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime)
}
}
}
- private async createVideoRedundancy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) {
- const serverActor = await getServerActor()
+ private async createVideoRedundancies (data: CandidateToDuplicate) {
+ const video = await this.loadAndRefreshVideo(data.video.url)
+
+ if (!video) {
+ logger.info('Video %s we want to duplicate does not existing anymore, skipping.', data.video.url)
- for (const file of filesToDuplicate) {
- const video = await this.loadAndRefreshVideo(file.Video.url)
+ return
+ }
+ for (const file of data.files) {
const existingRedundancy = await VideoRedundancyModel.loadLocalByFileId(file.id)
if (existingRedundancy) {
- await this.extendsOrDeleteRedundancy(existingRedundancy)
+ await this.extendsRedundancy(existingRedundancy)
continue
}
- if (!video) {
- logger.info('Video %s we want to duplicate does not existing anymore, skipping.', file.Video.url)
+ await this.createVideoFileRedundancy(data.redundancy, video, file)
+ }
+
+ for (const streamingPlaylist of data.streamingPlaylists) {
+ const existingRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(streamingPlaylist.id)
+ if (existingRedundancy) {
+ await this.extendsRedundancy(existingRedundancy)
continue
}
- logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy)
+ await this.createStreamingPlaylistRedundancy(data.redundancy, video, streamingPlaylist)
+ }
+ }
- const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
- const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs)
+ private async createVideoFileRedundancy (redundancy: VideosRedundancy, video: VideoModel, file: VideoFileModel) {
+ file.Video = video
- const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT)
+ const serverActor = await getServerActor()
- const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file))
- await move(tmpPath, destPath)
+ logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy)
- const createdModel = await VideoRedundancyModel.create({
- expiresOn: this.buildNewExpiration(redundancy.minLifetime),
- url: getVideoCacheFileActivityPubUrl(file),
- fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL),
- strategy: redundancy.strategy,
- videoFileId: file.id,
- actorId: serverActor.id
- })
- createdModel.VideoFile = file
+ const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
+ const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs)
- await sendCreateCacheFile(serverActor, createdModel)
+ const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT)
- logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url)
- }
+ const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file))
+ await move(tmpPath, destPath)
+
+ const createdModel = await VideoRedundancyModel.create({
+ expiresOn: this.buildNewExpiration(redundancy.minLifetime),
+ url: getVideoCacheFileActivityPubUrl(file),
+ fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL),
+ strategy: redundancy.strategy,
+ videoFileId: file.id,
+ actorId: serverActor.id
+ })
+
+ createdModel.VideoFile = file
+
+ await sendCreateCacheFile(serverActor, video, createdModel)
+
+ logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url)
+ }
+
+ private async createStreamingPlaylistRedundancy (redundancy: VideosRedundancy, video: VideoModel, playlist: VideoStreamingPlaylistModel) {
+ playlist.Video = video
+
+ const serverActor = await getServerActor()
+
+ logger.info('Duplicating %s streaming playlist in videos redundancy with "%s" strategy.', video.url, redundancy.strategy)
+
+ const destDirectory = join(HLS_REDUNDANCY_DIRECTORY, video.uuid)
+ await downloadPlaylistSegments(playlist.playlistUrl, destDirectory, VIDEO_IMPORT_TIMEOUT)
+
+ const createdModel = await VideoRedundancyModel.create({
+ expiresOn: this.buildNewExpiration(redundancy.minLifetime),
+ url: getVideoCacheStreamingPlaylistActivityPubUrl(video, playlist),
+ fileUrl: playlist.getVideoRedundancyUrl(CONFIG.WEBSERVER.URL),
+ strategy: redundancy.strategy,
+ videoStreamingPlaylistId: playlist.id,
+ actorId: serverActor.id
+ })
+
+ createdModel.VideoStreamingPlaylist = playlist
+
+ await sendCreateCacheFile(serverActor, video, createdModel)
+
+ logger.info('Duplicated playlist %s -> %s.', playlist.playlistUrl, createdModel.url)
}
private async extendsExpirationOf (redundancy: VideoRedundancyModel, expiresAfterMs: number) {
await sendUpdateCacheFile(serverActor, redundancy)
}
- private async purgeCacheIfNeeded (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) {
- while (this.isTooHeavy(redundancy, filesToDuplicate)) {
+ private async purgeCacheIfNeeded (candidateToDuplicate: CandidateToDuplicate) {
+ while (this.isTooHeavy(candidateToDuplicate)) {
+ const redundancy = candidateToDuplicate.redundancy
const toDelete = await VideoRedundancyModel.loadOldestLocalThatAlreadyExpired(redundancy.strategy, redundancy.minLifetime)
if (!toDelete) return
}
}
- private async isTooHeavy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) {
- const maxSize = redundancy.size
+ private async isTooHeavy (candidateToDuplicate: CandidateToDuplicate) {
+ const maxSize = candidateToDuplicate.redundancy.size
- const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(redundancy.strategy)
- const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(filesToDuplicate)
+ const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(candidateToDuplicate.redundancy.strategy)
+ const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(candidateToDuplicate.files, candidateToDuplicate.streamingPlaylists)
return totalWillDuplicate > maxSize
}
}
private buildEntryLogId (object: VideoRedundancyModel) {
- return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}`
+ if (object.VideoFile) return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}`
+
+ return `${object.VideoStreamingPlaylist.playlistUrl}`
}
- private getTotalFileSizes (files: VideoFileModel[]) {
+ private getTotalFileSizes (files: VideoFileModel[], playlists: VideoStreamingPlaylistModel[]) {
const fileReducer = (previous: number, current: VideoFileModel) => previous + current.size
- return files.reduce(fileReducer, 0)
+ return files.reduce(fileReducer, 0) * playlists.length
}
private async loadAndRefreshVideo (videoUrl: string) {
-import { CONFIG } from '../initializers'
+import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
import { extname, join } from 'path'
import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils'
-import { copy, remove, move, stat } from 'fs-extra'
+import { copy, ensureDir, move, remove, stat } from 'fs-extra'
import { logger } from '../helpers/logger'
import { VideoResolution } from '../../shared/models/videos'
import { VideoFileModel } from '../models/video/video-file'
import { VideoModel } from '../models/video/video'
+import { updateMasterHLSPlaylist, updateSha256Segments } from './hls'
+import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
+import { VideoStreamingPlaylistType } from '../../shared/models/videos/video-streaming-playlist.type'
async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) {
const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
const transcodeOptions = {
inputPath: videoInputPath,
- outputPath: videoTranscodedPath
+ outputPath: videoTranscodedPath,
+ resolution: inputVideoFile.resolution
}
// Could be very long!
}
}
-async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
+async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortrait: boolean) {
const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
const extname = '.mp4'
size: 0,
videoId: video.id
})
- const videoOutputPath = join(videosDirectory, video.getVideoFilename(newVideoFile))
+ const videoOutputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(newVideoFile))
const transcodeOptions = {
inputPath: videoInputPath,
outputPath: videoOutputPath,
resolution,
- isPortraitMode
+ isPortraitMode: isPortrait
}
await transcode(transcodeOptions)
video.VideoFiles.push(newVideoFile)
}
+async function generateHlsPlaylist (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
+ const baseHlsDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
+ await ensureDir(join(HLS_PLAYLIST_DIRECTORY, video.uuid))
+
+ const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getOriginalFile()))
+ const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
+
+ const transcodeOptions = {
+ inputPath: videoInputPath,
+ outputPath,
+ resolution,
+ isPortraitMode,
+
+ hlsPlaylist: {
+ videoFilename: VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, resolution)
+ }
+ }
+
+ await transcode(transcodeOptions)
+
+ await updateMasterHLSPlaylist(video)
+ await updateSha256Segments(video)
+
+ const playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
+
+ await VideoStreamingPlaylistModel.upsert({
+ videoId: video.id,
+ playlistUrl,
+ segmentsSha256Url: CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid),
+ p2pMediaLoaderInfohashes: VideoStreamingPlaylistModel.buildP2PMediaLoaderInfoHashes(playlistUrl, video.VideoFiles),
+
+ type: VideoStreamingPlaylistType.HLS
+ })
+}
+
async function importVideoFile (video: VideoModel, inputFilePath: string) {
const { videoFileResolution } = await getVideoFileResolution(inputFilePath)
const { size } = await stat(inputFilePath)
}
export {
+ generateHlsPlaylist,
optimizeVideofile,
transcodeOriginalVideofile,
importVideoFile
baseUri: ["'self'"],
manifestSrc: ["'self'"],
frameSrc: ["'self'"], // instead of deprecated child-src / self because of test-embed
- workerSrc: ["'self'"] // instead of deprecated child-src
+ workerSrc: ["'self'", 'blob:'] // instead of deprecated child-src
},
CONFIG.SERVICES['CSP-LOGGER'] ? { reportUri: CONFIG.SERVICES['CSP-LOGGER'] } : {},
CONFIG.WEBSERVER.SCHEME === 'https' ? { upgradeInsecureRequests: true } : {}
import { SERVER_ACTOR_NAME } from '../../initializers'
import { ServerModel } from '../../models/server/server'
-const videoRedundancyGetValidator = [
+const videoFileRedundancyGetValidator = [
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
param('resolution')
.customSanitizer(toIntOrNull)
.custom(exists).withMessage('Should have a valid fps'),
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
- logger.debug('Checking videoRedundancyGetValidator parameters', { parameters: req.params })
+ logger.debug('Checking videoFileRedundancyGetValidator parameters', { parameters: req.params })
if (areValidationErrors(req, res)) return
if (!await isVideoExist(req.params.videoId, res)) return
res.locals.videoFile = videoFile
const videoRedundancy = await VideoRedundancyModel.loadLocalByFileId(videoFile.id)
- if (!videoRedundancy)return res.status(404).json({ error: 'Video redundancy not found.' })
+ if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
+ res.locals.videoRedundancy = videoRedundancy
+
+ return next()
+ }
+]
+
+const videoPlaylistRedundancyGetValidator = [
+ param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
+ param('streamingPlaylistType').custom(exists).withMessage('Should have a valid streaming playlist type'),
+
+ async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+ logger.debug('Checking videoPlaylistRedundancyGetValidator parameters', { parameters: req.params })
+
+ if (areValidationErrors(req, res)) return
+ if (!await isVideoExist(req.params.videoId, res)) return
+
+ const video: VideoModel = res.locals.video
+ const videoStreamingPlaylist = video.VideoStreamingPlaylists.find(p => p === req.params.streamingPlaylistType)
+
+ if (!videoStreamingPlaylist) return res.status(404).json({ error: 'Video playlist not found.' })
+ res.locals.videoStreamingPlaylist = videoStreamingPlaylist
+
+ const videoRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(videoStreamingPlaylist.id)
+ if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
res.locals.videoRedundancy = videoRedundancy
return next()
// ---------------------------------------------------------------------------
export {
- videoRedundancyGetValidator,
+ videoFileRedundancyGetValidator,
+ videoPlaylistRedundancyGetValidator,
updateServerRedundancyValidator
}
const usersUpdateValidator = [
param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
+ body('password').optional().custom(isUserPasswordValid).withMessage('Should have a valid password'),
body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
body('emailVerified').optional().isBoolean().withMessage('Should have a valid email verified attribute'),
body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'),
logger.debug('Checking usersAskResetPassword parameters', { parameters: req.body })
if (areValidationErrors(req, res)) return
+
const exists = await checkUserEmailExist(req.body.email, res, false)
if (!exists) {
logger.debug('User with email %s does not exist (asking reset password).', req.body.email)
import * as express from 'express'
import { body, param } from 'express-validator/check'
-import { isIdOrUUIDValid } from '../../../helpers/custom-validators/misc'
+import { isBooleanValid, isIdOrUUIDValid } from '../../../helpers/custom-validators/misc'
import { isVideoExist } from '../../../helpers/custom-validators/videos'
import { logger } from '../../../helpers/logger'
import { areValidationErrors } from '../utils'
import { isVideoBlacklistExist, isVideoBlacklistReasonValid } from '../../../helpers/custom-validators/video-blacklist'
+import { VideoModel } from '../../../models/video/video'
const videosBlacklistRemoveValidator = [
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
const videosBlacklistAddValidator = [
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
+ body('unfederate')
+ .optional()
+ .toBoolean()
+ .custom(isBooleanValid).withMessage('Should have a valid unfederate boolean'),
body('reason')
.optional()
.custom(isVideoBlacklistReasonValid).withMessage('Should have a valid reason'),
if (areValidationErrors(req, res)) return
if (!await isVideoExist(req.params.videoId, res)) return
+ const video: VideoModel = res.locals.video
+ if (req.body.unfederate === true && video.remote === true) {
+ return res
+ .status(409)
+ .send({ error: 'You cannot unfederate a remote video.' })
+ .end()
+ }
+
return next()
}
]
.optional()
.toBoolean()
.custom(isBooleanValid).withMessage('Should have comments enabled boolean'),
- body('originallyPublishedAt')
+ body('downloadEnabled')
.optional()
- .customSanitizer(toValueOrNull)
- .custom(isVideoOriginallyPublishedAtValid).withMessage('Should have a valid original publication date'),
-
+ .toBoolean()
+ .custom(isBooleanValid).withMessage('Should have downloading enabled boolean'),
+ body('originallyPublishedAt')
+ .optional()
+ .customSanitizer(toValueOrNull)
+ .custom(isVideoOriginallyPublishedAtValid).withMessage('Should have a valid original publication date'),
body('scheduleUpdate')
.optional()
.customSanitizer(toValueOrNull),
return this.Actor.isOwned()
}
+ isOutdated () {
+ return this.Actor.isOutdated()
+ }
+
getDisplayName () {
return this.name
}
import { VideoImportModel } from '../video/video-import'
import { ActorModel } from '../activitypub/actor'
import { ActorFollowModel } from '../activitypub/actor-follow'
+import { AvatarModel } from '../avatar/avatar'
+import { ServerModel } from '../server/server'
enum ScopeNames {
WITH_ALL = 'WITH_ALL'
}
+function buildActorWithAvatarInclude () {
+ return {
+ attributes: [ 'preferredUsername' ],
+ model: () => ActorModel.unscoped(),
+ required: true,
+ include: [
+ {
+ attributes: [ 'filename' ],
+ model: () => AvatarModel.unscoped(),
+ required: false
+ },
+ {
+ attributes: [ 'host' ],
+ model: () => ServerModel.unscoped(),
+ required: false
+ }
+ ]
+ }
+}
+
function buildVideoInclude (required: boolean) {
return {
attributes: [ 'id', 'uuid', 'name' ],
}
}
-function buildChannelInclude (required: boolean) {
+function buildChannelInclude (required: boolean, withActor = false) {
return {
required,
attributes: [ 'id', 'name' ],
- model: () => VideoChannelModel.unscoped()
+ model: () => VideoChannelModel.unscoped(),
+ include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
}
}
-function buildAccountInclude (required: boolean) {
+function buildAccountInclude (required: boolean, withActor = false) {
return {
required,
attributes: [ 'id', 'name' ],
- model: () => AccountModel.unscoped()
+ model: () => AccountModel.unscoped(),
+ include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
}
}
[ScopeNames.WITH_ALL]: {
include: [
Object.assign(buildVideoInclude(false), {
- include: [ buildChannelInclude(true) ]
+ include: [ buildChannelInclude(true, true) ]
}),
+
{
attributes: [ 'id', 'originCommentId' ],
model: () => VideoCommentModel.unscoped(),
required: false,
include: [
- buildAccountInclude(true),
+ buildAccountInclude(true, true),
buildVideoInclude(true)
]
},
+
{
attributes: [ 'id' ],
model: () => VideoAbuseModel.unscoped(),
required: false,
include: [ buildVideoInclude(true) ]
},
+
{
attributes: [ 'id' ],
model: () => VideoBlacklistModel.unscoped(),
required: false,
include: [ buildVideoInclude(true) ]
},
+
{
attributes: [ 'id', 'magnetUri', 'targetUrl', 'torrentName' ],
model: () => VideoImportModel.unscoped(),
required: false,
include: [ buildVideoInclude(false) ]
},
- {
- attributes: [ 'id', 'name' ],
- model: () => AccountModel.unscoped(),
- required: false,
- include: [
- {
- attributes: [ 'id', 'preferredUsername' ],
- model: () => ActorModel.unscoped(),
- required: true
- }
- ]
- },
+
{
attributes: [ 'id' ],
model: () => ActorFollowModel.unscoped(),
model: () => ActorModel.unscoped(),
required: true,
as: 'ActorFollower',
- include: [ buildAccountInclude(true) ]
+ include: [
+ {
+ attributes: [ 'id', 'name' ],
+ model: () => AccountModel.unscoped(),
+ required: true
+ },
+ {
+ attributes: [ 'filename' ],
+ model: () => AvatarModel.unscoped(),
+ required: false
+ },
+ {
+ attributes: [ 'host' ],
+ model: () => ServerModel.unscoped(),
+ required: false
+ }
+ ]
},
{
attributes: [ 'preferredUsername' ],
]
}
]
- }
+ },
+
+ buildAccountInclude(false, true)
]
}
})
tableName: 'userNotification',
indexes: [
{
- fields: [ 'videoId' ]
+ fields: [ 'userId' ]
+ },
+ {
+ fields: [ 'videoId' ],
+ where: {
+ videoId: {
+ [Op.ne]: null
+ }
+ }
},
{
- fields: [ 'commentId' ]
+ fields: [ 'commentId' ],
+ where: {
+ commentId: {
+ [Op.ne]: null
+ }
+ }
+ },
+ {
+ fields: [ 'videoAbuseId' ],
+ where: {
+ videoAbuseId: {
+ [Op.ne]: null
+ }
+ }
+ },
+ {
+ fields: [ 'videoBlacklistId' ],
+ where: {
+ videoBlacklistId: {
+ [Op.ne]: null
+ }
+ }
+ },
+ {
+ fields: [ 'videoImportId' ],
+ where: {
+ videoImportId: {
+ [Op.ne]: null
+ }
+ }
+ },
+ {
+ fields: [ 'accountId' ],
+ where: {
+ accountId: {
+ [Op.ne]: null
+ }
+ }
+ },
+ {
+ fields: [ 'actorFollowId' ],
+ where: {
+ actorFollowId: {
+ [Op.ne]: null
+ }
+ }
}
]
})
}
toFormattedJSON (): UserNotification {
- const video = this.Video ? Object.assign(this.formatVideo(this.Video), {
- channel: {
- id: this.Video.VideoChannel.id,
- displayName: this.Video.VideoChannel.getDisplayName()
- }
- }) : undefined
+ const video = this.Video
+ ? Object.assign(this.formatVideo(this.Video),{ channel: this.formatActor(this.Video.VideoChannel) })
+ : undefined
const videoImport = this.VideoImport ? {
id: this.VideoImport.id,
const comment = this.Comment ? {
id: this.Comment.id,
threadId: this.Comment.getThreadId(),
- account: {
- id: this.Comment.Account.id,
- displayName: this.Comment.Account.getDisplayName()
- },
+ account: this.formatActor(this.Comment.Account),
video: this.formatVideo(this.Comment.Video)
} : undefined
video: this.formatVideo(this.VideoBlacklist.Video)
} : undefined
- const account = this.Account ? {
- id: this.Account.id,
- displayName: this.Account.getDisplayName(),
- name: this.Account.Actor.preferredUsername
- } : undefined
+ const account = this.Account ? this.formatActor(this.Account) : undefined
const actorFollow = this.ActorFollow ? {
id: this.ActorFollow.id,
follower: {
+ id: this.ActorFollow.ActorFollower.Account.id,
displayName: this.ActorFollow.ActorFollower.Account.getDisplayName(),
- name: this.ActorFollow.ActorFollower.preferredUsername
+ name: this.ActorFollow.ActorFollower.preferredUsername,
+ avatar: this.ActorFollow.ActorFollower.Avatar ? { path: this.ActorFollow.ActorFollower.Avatar.getWebserverPath() } : undefined,
+ host: this.ActorFollow.ActorFollower.getHost()
},
following: {
type: this.ActorFollow.ActorFollowing.VideoChannel ? 'channel' as 'channel' : 'account' as 'account',
name: video.name
}
}
+
+ private formatActor (accountOrChannel: AccountModel | VideoChannelModel) {
+ const avatar = accountOrChannel.Actor.Avatar
+ ? { path: accountOrChannel.Actor.Avatar.getWebserverPath() }
+ : undefined
+
+ return {
+ id: accountOrChannel.id,
+ displayName: accountOrChannel.getDisplayName(),
+ name: accountOrChannel.Actor.preferredUsername,
+ host: accountOrChannel.Actor.getHost(),
+ avatar
+ }
+ }
}
import { isTestInstance } from '../../helpers/core-utils'
import * as Bluebird from 'bluebird'
import * as Sequelize from 'sequelize'
+import { VideoStreamingPlaylistModel } from '../video/video-streaming-playlist'
export enum ScopeNames {
WITH_VIDEO = 'WITH_VIDEO'
include: [
{
model: () => VideoFileModel,
- required: true,
+ required: false,
+ include: [
+ {
+ model: () => VideoModel,
+ required: true
+ }
+ ]
+ },
+ {
+ model: () => VideoStreamingPlaylistModel,
+ required: false,
include: [
{
model: () => VideoModel,
@BelongsTo(() => VideoFileModel, {
foreignKey: {
- allowNull: false
+ allowNull: true
},
onDelete: 'cascade'
})
VideoFile: VideoFileModel
+ @ForeignKey(() => VideoStreamingPlaylistModel)
+ @Column
+ videoStreamingPlaylistId: number
+
+ @BelongsTo(() => VideoStreamingPlaylistModel, {
+ foreignKey: {
+ allowNull: true
+ },
+ onDelete: 'cascade'
+ })
+ VideoStreamingPlaylist: VideoStreamingPlaylistModel
+
@ForeignKey(() => ActorModel)
@Column
actorId: number
static async removeFile (instance: VideoRedundancyModel) {
if (!instance.isOwned()) return
- const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId)
+ if (instance.videoFileId) {
+ const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId)
- const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}`
- logger.info('Removing duplicated video file %s.', logIdentifier)
+ const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}`
+ logger.info('Removing duplicated video file %s.', logIdentifier)
- videoFile.Video.removeFile(videoFile, true)
- .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err }))
+ videoFile.Video.removeFile(videoFile, true)
+ .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err }))
+ }
+
+ if (instance.videoStreamingPlaylistId) {
+ const videoStreamingPlaylist = await VideoStreamingPlaylistModel.loadWithVideo(instance.videoStreamingPlaylistId)
+
+ const videoUUID = videoStreamingPlaylist.Video.uuid
+ logger.info('Removing duplicated video streaming playlist %s.', videoUUID)
+
+ videoStreamingPlaylist.Video.removeStreamingPlaylist(true)
+ .catch(err => logger.error('Cannot delete video streaming playlist files of %s.', videoUUID, { err }))
+ }
return undefined
}
return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
}
+ static async loadLocalByStreamingPlaylistId (videoStreamingPlaylistId: number) {
+ const actor = await getServerActor()
+
+ const query = {
+ where: {
+ actorId: actor.id,
+ videoStreamingPlaylistId
+ }
+ }
+
+ return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
+ }
+
static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
const query = {
where: {
const ids = rows.map(r => r.id)
const id = sample(ids)
- return VideoModel.loadWithFile(id, undefined, !isTestInstance())
+ return VideoModel.loadWithFiles(id, undefined, !isTestInstance())
}
static async findMostViewToDuplicate (randomizedFactor: number) {
static async listLocalOfServer (serverId: number) {
const actor = await getServerActor()
-
- const query = {
- where: {
- actorId: actor.id
- },
+ const buildVideoInclude = () => ({
+ model: VideoModel,
+ required: true,
include: [
{
- model: VideoFileModel,
+ attributes: [],
+ model: VideoChannelModel.unscoped(),
required: true,
include: [
{
- model: VideoModel,
+ attributes: [],
+ model: ActorModel.unscoped(),
required: true,
- include: [
- {
- attributes: [],
- model: VideoChannelModel.unscoped(),
- required: true,
- include: [
- {
- attributes: [],
- model: ActorModel.unscoped(),
- required: true,
- where: {
- serverId
- }
- }
- ]
- }
- ]
+ where: {
+ serverId
+ }
}
]
}
]
+ })
+
+ const query = {
+ where: {
+ actorId: actor.id
+ },
+ include: [
+ {
+ model: VideoFileModel,
+ required: false,
+ include: [ buildVideoInclude() ]
+ },
+ {
+ model: VideoStreamingPlaylistModel,
+ required: false,
+ include: [ buildVideoInclude() ]
+ }
+ ]
}
return VideoRedundancyModel.findAll(query)
]
}
- return VideoRedundancyModel.find(query as any) // FIXME: typings
+ return VideoRedundancyModel.findOne(query as any) // FIXME: typings
.then((r: any) => ({
totalUsed: parseInt(r.totalUsed.toString(), 10),
totalVideos: r.totalVideos,
}))
}
+ getVideo () {
+ if (this.VideoFile) return this.VideoFile.Video
+
+ return this.VideoStreamingPlaylist.Video
+ }
+
isOwned () {
return !!this.strategy
}
toActivityPubObject (): CacheFileObject {
+ if (this.VideoStreamingPlaylist) {
+ return {
+ id: this.url,
+ type: 'CacheFile' as 'CacheFile',
+ object: this.VideoStreamingPlaylist.Video.url,
+ expires: this.expiresOn.toISOString(),
+ url: {
+ type: 'Link',
+ mimeType: 'application/x-mpegURL',
+ mediaType: 'application/x-mpegURL',
+ href: this.fileUrl
+ }
+ }
+ }
+
return {
id: this.url,
type: 'CacheFile' as 'CacheFile',
const notIn = Sequelize.literal(
'(' +
- `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id}` +
+ `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id} AND "videoFileId" IS NOT NULL` +
')'
)
-import {
- AfterCreate,
- AllowNull,
- BelongsTo,
- Column,
- CreatedAt,
- DataType,
- Default,
- ForeignKey,
- Is,
- Model,
- Table,
- UpdatedAt
-} from 'sequelize-typescript'
+import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
import { VideoAbuseObject } from '../../../shared/models/activitypub/objects'
import { VideoAbuse } from '../../../shared/models/videos'
import {
isVideoAbuseReasonValid,
isVideoAbuseStateValid
} from '../../helpers/custom-validators/video-abuses'
-import { Emailer } from '../../lib/emailer'
import { AccountModel } from '../account/account'
import { getSort, throwIfNotValid } from '../utils'
import { VideoModel } from './video'
export class VideoAbuseModel extends Model<VideoAbuseModel> {
@AllowNull(false)
+ @Default(null)
@Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason'))
- @Column
+ @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.REASON.max))
reason: string
@AllowNull(false)
-import {
- AfterCreate,
- AfterDestroy,
- AllowNull,
- BelongsTo,
- Column,
- CreatedAt,
- DataType,
- ForeignKey,
- Is,
- Model,
- Table,
- UpdatedAt
-} from 'sequelize-typescript'
+import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
import { getSortOnModel, SortType, throwIfNotValid } from '../utils'
import { VideoModel } from './video'
import { isVideoBlacklistReasonValid } from '../../helpers/custom-validators/video-blacklist'
-import { Emailer } from '../../lib/emailer'
import { VideoBlacklist } from '../../../shared/models/videos'
import { CONSTRAINTS_FIELDS } from '../../initializers'
@Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max))
reason: string
+ @AllowNull(false)
+ @Column
+ unfederated: boolean
+
@CreatedAt
createdAt: Date
createdAt: this.createdAt,
updatedAt: this.updatedAt,
reason: this.reason,
+ unfederated: this.unfederated,
video: {
id: video.id,
getDisplayName () {
return this.name
}
+
+ isOutdated () {
+ return this.Actor.isOutdated()
+ }
}
extname: string
@AllowNull(false)
- @Is('VideoFileSize', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash'))
+ @Is('VideoFileInfohash', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash'))
@Column
infoHash: string
@HasMany(() => VideoRedundancyModel, {
foreignKey: {
- allowNull: false
+ allowNull: true
},
onDelete: 'CASCADE',
hooks: true
})
RedundancyVideos: VideoRedundancyModel[]
- static isInfohashExists (infoHash: string) {
+ static doesInfohashExist (infoHash: string) {
const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1'
const options = {
type: Sequelize.QueryTypes.SELECT,
return VideoFileModel.findById(id, options)
}
+ static async getStats () {
+ let totalLocalVideoFilesSize = await VideoFileModel.sum('size', {
+ include: [
+ {
+ attributes: [],
+ model: VideoModel.unscoped(),
+ where: {
+ remote: false
+ }
+ }
+ ]
+ } as any)
+ // Sequelize could return null...
+ if (!totalLocalVideoFilesSize) totalLocalVideoFilesSize = 0
+
+ return {
+ totalLocalVideoFilesSize
+ }
+ }
+
hasSameUniqueKeysThan (other: VideoFileModel) {
return this.fps === other.fps &&
this.resolution === other.resolution &&
import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos'
import { VideoModel } from './video'
import { VideoFileModel } from './video-file'
-import { ActivityUrlObject, VideoTorrentObject } from '../../../shared/models/activitypub/objects'
+import {
+ ActivityPlaylistInfohashesObject,
+ ActivityPlaylistSegmentHashesObject,
+ ActivityUrlObject,
+ VideoTorrentObject
+} from '../../../shared/models/activitypub/objects'
import { CONFIG, MIMETYPES, THUMBNAILS_SIZE } from '../../initializers'
import { VideoCaptionModel } from './video-caption'
import {
getVideoSharesActivityPubUrl
} from '../../lib/activitypub'
import { isArray } from '../../helpers/custom-validators/misc'
+import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
+import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
export type VideoFormattingJSONOptions = {
completeDescription?: boolean
}
})
+ const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
+
const tags = video.Tags ? video.Tags.map(t => t.name) : []
+
+ const streamingPlaylists = streamingPlaylistsModelToFormattedJSON(video, video.VideoStreamingPlaylists)
+
const detailsJson = {
support: video.support,
descriptionPath: video.getDescriptionAPIPath(),
account: video.VideoChannel.Account.toFormattedJSON(),
tags,
commentsEnabled: video.commentsEnabled,
+ downloadEnabled: video.downloadEnabled,
waitTranscoding: video.waitTranscoding,
state: {
id: video.state,
label: VideoModel.getStateLabel(video.state)
},
- files: []
+
+ trackerUrls: video.getTrackerUrls(baseUrlHttp, baseUrlWs),
+
+ files: [],
+ streamingPlaylists
}
// Format and sort video files
return Object.assign(formattedJson, detailsJson)
}
+function streamingPlaylistsModelToFormattedJSON (video: VideoModel, playlists: VideoStreamingPlaylistModel[]): VideoStreamingPlaylist[] {
+ if (isArray(playlists) === false) return []
+
+ return playlists
+ .map(playlist => {
+ const redundancies = isArray(playlist.RedundancyVideos)
+ ? playlist.RedundancyVideos.map(r => ({ baseUrl: r.fileUrl }))
+ : []
+
+ return {
+ id: playlist.id,
+ type: playlist.type,
+ playlistUrl: playlist.playlistUrl,
+ segmentsSha256Url: playlist.segmentsSha256Url,
+ redundancies
+ } as VideoStreamingPlaylist
+ })
+}
+
function videoFilesModelToFormattedJSON (video: VideoModel, videoFiles: VideoFileModel[]): VideoFile[] {
const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
})
}
+ for (const playlist of (video.VideoStreamingPlaylists || [])) {
+ let tag: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
+
+ tag = playlist.p2pMediaLoaderInfohashes
+ .map(i => ({ type: 'Infohash' as 'Infohash', name: i }))
+ tag.push({
+ type: 'Link',
+ name: 'sha256',
+ mimeType: 'application/json' as 'application/json',
+ mediaType: 'application/json' as 'application/json',
+ href: playlist.segmentsSha256Url
+ })
+
+ url.push({
+ type: 'Link',
+ mimeType: 'application/x-mpegURL' as 'application/x-mpegURL',
+ mediaType: 'application/x-mpegURL' as 'application/x-mpegURL',
+ href: playlist.playlistUrl,
+ tag
+ })
+ }
+
// Add video url too
url.push({
type: 'Link',
waitTranscoding: video.waitTranscoding,
state: video.state,
commentsEnabled: video.commentsEnabled,
+ downloadEnabled: video.downloadEnabled,
published: video.publishedAt.toISOString(),
originallyPublishedAt: video.originallyPublishedAt ?
video.originallyPublishedAt.toISOString() :
--- /dev/null
+import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, HasMany, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
+import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
+import { throwIfNotValid } from '../utils'
+import { VideoModel } from './video'
+import * as Sequelize from 'sequelize'
+import { VideoRedundancyModel } from '../redundancy/video-redundancy'
+import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
+import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
+import { CONSTRAINTS_FIELDS, STATIC_PATHS } from '../../initializers'
+import { VideoFileModel } from './video-file'
+import { join } from 'path'
+import { sha1 } from '../../helpers/core-utils'
+import { isArrayOf } from '../../helpers/custom-validators/misc'
+
+@Table({
+ tableName: 'videoStreamingPlaylist',
+ indexes: [
+ {
+ fields: [ 'videoId' ]
+ },
+ {
+ fields: [ 'videoId', 'type' ],
+ unique: true
+ },
+ {
+ fields: [ 'p2pMediaLoaderInfohashes' ],
+ using: 'gin'
+ }
+ ]
+})
+export class VideoStreamingPlaylistModel extends Model<VideoStreamingPlaylistModel> {
+ @CreatedAt
+ createdAt: Date
+
+ @UpdatedAt
+ updatedAt: Date
+
+ @AllowNull(false)
+ @Column
+ type: VideoStreamingPlaylistType
+
+ @AllowNull(false)
+ @Is('PlaylistUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'playlist url'))
+ @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.URL.max))
+ playlistUrl: string
+
+ @AllowNull(false)
+ @Is('VideoStreamingPlaylistInfoHashes', value => throwIfNotValid(value, v => isArrayOf(v, isVideoFileInfoHashValid), 'info hashes'))
+ @Column(DataType.ARRAY(DataType.STRING))
+ p2pMediaLoaderInfohashes: string[]
+
+ @AllowNull(false)
+ @Is('VideoStreamingSegmentsSha256Url', value => throwIfNotValid(value, isActivityPubUrlValid, 'segments sha256 url'))
+ @Column
+ segmentsSha256Url: string
+
+ @ForeignKey(() => VideoModel)
+ @Column
+ videoId: number
+
+ @BelongsTo(() => VideoModel, {
+ foreignKey: {
+ allowNull: false
+ },
+ onDelete: 'CASCADE'
+ })
+ Video: VideoModel
+
+ @HasMany(() => VideoRedundancyModel, {
+ foreignKey: {
+ allowNull: false
+ },
+ onDelete: 'CASCADE',
+ hooks: true
+ })
+ RedundancyVideos: VideoRedundancyModel[]
+
+ static doesInfohashExist (infoHash: string) {
+ const query = 'SELECT 1 FROM "videoStreamingPlaylist" WHERE $infoHash = ANY("p2pMediaLoaderInfohashes") LIMIT 1'
+ const options = {
+ type: Sequelize.QueryTypes.SELECT,
+ bind: { infoHash },
+ raw: true
+ }
+
+ return VideoModel.sequelize.query(query, options)
+ .then(results => {
+ return results.length === 1
+ })
+ }
+
+ static buildP2PMediaLoaderInfoHashes (playlistUrl: string, videoFiles: VideoFileModel[]) {
+ const hashes: string[] = []
+
+ // https://github.com/Novage/p2p-media-loader/blob/master/p2p-media-loader-core/lib/p2p-media-manager.ts#L97
+ for (let i = 0; i < videoFiles.length; i++) {
+ hashes.push(sha1(`1${playlistUrl}+V${i}`))
+ }
+
+ return hashes
+ }
+
+ static loadWithVideo (id: number) {
+ const options = {
+ include: [
+ {
+ model: VideoModel.unscoped(),
+ required: true
+ }
+ ]
+ }
+
+ return VideoStreamingPlaylistModel.findById(id, options)
+ }
+
+ static getHlsPlaylistFilename (resolution: number) {
+ return resolution + '.m3u8'
+ }
+
+ static getMasterHlsPlaylistFilename () {
+ return 'master.m3u8'
+ }
+
+ static getHlsSha256SegmentsFilename () {
+ return 'segments-sha256.json'
+ }
+
+ static getHlsVideoName (uuid: string, resolution: number) {
+ return `${uuid}-${resolution}-fragmented.mp4`
+ }
+
+ static getHlsMasterPlaylistStaticPath (videoUUID: string) {
+ return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
+ }
+
+ static getHlsPlaylistStaticPath (videoUUID: string, resolution: number) {
+ return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
+ }
+
+ static getHlsSha256SegmentsStaticPath (videoUUID: string) {
+ return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
+ }
+
+ getStringType () {
+ if (this.type === VideoStreamingPlaylistType.HLS) return 'hls'
+
+ return 'unknown'
+ }
+
+ getVideoRedundancyUrl (baseUrlHttp: string) {
+ return baseUrlHttp + STATIC_PATHS.REDUNDANCY + this.getStringType() + '/' + this.Video.uuid
+ }
+
+ hasSameUniqueKeysThan (other: VideoStreamingPlaylistModel) {
+ return this.type === other.type &&
+ this.videoId === other.videoId
+ }
+}
ACTIVITY_PUB,
API_VERSION,
CONFIG,
- CONSTRAINTS_FIELDS,
+ CONSTRAINTS_FIELDS, HLS_PLAYLIST_DIRECTORY, HLS_REDUNDANCY_DIRECTORY,
PREVIEWS_SIZE,
REMOTE_SCHEME,
STATIC_DOWNLOAD_PATHS,
import { UserVideoHistoryModel } from '../account/user-video-history'
import { UserModel } from '../account/user'
import { VideoImportModel } from './video-import'
+import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation
const indexes: Sequelize.DefineIndexesOptions[] = [
WITH_FILES = 'WITH_FILES',
WITH_SCHEDULED_UPDATE = 'WITH_SCHEDULED_UPDATE',
WITH_BLACKLISTED = 'WITH_BLACKLISTED',
- WITH_USER_HISTORY = 'WITH_USER_HISTORY'
+ WITH_USER_HISTORY = 'WITH_USER_HISTORY',
+ WITH_STREAMING_PLAYLISTS = 'WITH_STREAMING_PLAYLISTS',
+ WITH_USER_ID = 'WITH_USER_ID'
}
type ForAPIOptions = {
return query
},
+ [ ScopeNames.WITH_USER_ID ]: {
+ include: [
+ {
+ attributes: [ 'accountId' ],
+ model: () => VideoChannelModel.unscoped(),
+ required: true,
+ include: [
+ {
+ attributes: [ 'userId' ],
+ model: () => AccountModel.unscoped(),
+ required: true
+ }
+ ]
+ }
+ ]
+ },
[ ScopeNames.WITH_ACCOUNT_DETAILS ]: {
include: [
{
}
]
},
- [ ScopeNames.WITH_FILES ]: {
- include: [
- {
- model: () => VideoFileModel.unscoped(),
- // FIXME: typings
- [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join
- required: false,
- include: [
- {
- attributes: [ 'fileUrl' ],
- model: () => VideoRedundancyModel.unscoped(),
- required: false
- }
- ]
- }
- ]
+ [ ScopeNames.WITH_FILES ]: (withRedundancies = false) => {
+ let subInclude: any[] = []
+
+ if (withRedundancies === true) {
+ subInclude = [
+ {
+ attributes: [ 'fileUrl' ],
+ model: VideoRedundancyModel.unscoped(),
+ required: false
+ }
+ ]
+ }
+
+ return {
+ include: [
+ {
+ model: VideoFileModel.unscoped(),
+ // FIXME: typings
+ [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join
+ required: false,
+ include: subInclude
+ }
+ ]
+ }
+ },
+ [ ScopeNames.WITH_STREAMING_PLAYLISTS ]: (withRedundancies = false) => {
+ let subInclude: any[] = []
+
+ if (withRedundancies === true) {
+ subInclude = [
+ {
+ attributes: [ 'fileUrl' ],
+ model: VideoRedundancyModel.unscoped(),
+ required: false
+ }
+ ]
+ }
+
+ return {
+ include: [
+ {
+ model: VideoStreamingPlaylistModel.unscoped(),
+ // FIXME: typings
+ [ 'separate' as any ]: true, // We may have multiple streaming playlists, having multiple redundancies so let's separate this join
+ required: false,
+ include: subInclude
+ }
+ ]
+ }
},
[ ScopeNames.WITH_SCHEDULED_UPDATE ]: {
include: [
@Column
commentsEnabled: boolean
+ @AllowNull(false)
+ @Column
+ downloadEnabled: boolean
+
@AllowNull(false)
@Column
waitTranscoding: boolean
})
VideoFiles: VideoFileModel[]
+ @HasMany(() => VideoStreamingPlaylistModel, {
+ foreignKey: {
+ name: 'videoId',
+ allowNull: false
+ },
+ hooks: true,
+ onDelete: 'cascade'
+ })
+ VideoStreamingPlaylists: VideoStreamingPlaylistModel[]
+
@HasMany(() => VideoShareModel, {
foreignKey: {
name: 'videoId',
tasks.push(instance.removeFile(file))
tasks.push(instance.removeTorrent(file))
})
+
+ // Remove playlists file
+ tasks.push(instance.removeStreamingPlaylist())
}
// Do not wait video deletion because we could be in a transaction
return undefined
}
- static list () {
- return VideoModel.scope(ScopeNames.WITH_FILES).findAll()
- }
-
static listLocal () {
const query = {
where: {
}
}
- return VideoModel.scope(ScopeNames.WITH_FILES).findAll(query)
+ return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ]).findAll(query)
}
static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) {
return VideoModel.findOne(options)
}
+ static loadWithRights (id: number | string, t?: Sequelize.Transaction) {
+ const where = VideoModel.buildWhereIdOrUUID(id)
+ const options = {
+ where,
+ transaction: t
+ }
+
+ return VideoModel.scope([ ScopeNames.WITH_BLACKLISTED, ScopeNames.WITH_USER_ID ]).findOne(options)
+ }
+
static loadOnlyId (id: number | string, t?: Sequelize.Transaction) {
const where = VideoModel.buildWhereIdOrUUID(id)
return VideoModel.findOne(options)
}
- static loadWithFile (id: number, t?: Sequelize.Transaction, logging?: boolean) {
- return VideoModel.scope(ScopeNames.WITH_FILES)
+ static loadWithFiles (id: number, t?: Sequelize.Transaction, logging?: boolean) {
+ return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ])
.findById(id, { transaction: t, logging })
}
}
}
- return VideoModel
- .scope([ ScopeNames.WITH_FILES ])
- .findOne(options)
+ return VideoModel.findOne(options)
}
static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
transaction
}
- return VideoModel.scope([ ScopeNames.WITH_ACCOUNT_DETAILS, ScopeNames.WITH_FILES ]).findOne(query)
+ return VideoModel.scope([
+ ScopeNames.WITH_ACCOUNT_DETAILS,
+ ScopeNames.WITH_FILES,
+ ScopeNames.WITH_STREAMING_PLAYLISTS
+ ]).findOne(query)
}
static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Sequelize.Transaction, userId?: number) {
const scopes = [
ScopeNames.WITH_TAGS,
ScopeNames.WITH_BLACKLISTED,
+ ScopeNames.WITH_ACCOUNT_DETAILS,
+ ScopeNames.WITH_SCHEDULED_UPDATE,
ScopeNames.WITH_FILES,
+ ScopeNames.WITH_STREAMING_PLAYLISTS
+ ]
+
+ if (userId) {
+ scopes.push({ method: [ ScopeNames.WITH_USER_HISTORY, userId ] } as any) // FIXME: typings
+ }
+
+ return VideoModel
+ .scope(scopes)
+ .findOne(options)
+ }
+
+ static loadForGetAPI (id: number | string, t?: Sequelize.Transaction, userId?: number) {
+ const where = VideoModel.buildWhereIdOrUUID(id)
+
+ const options = {
+ order: [ [ 'Tags', 'name', 'ASC' ] ],
+ where,
+ transaction: t
+ }
+
+ const scopes = [
+ ScopeNames.WITH_TAGS,
+ ScopeNames.WITH_BLACKLISTED,
ScopeNames.WITH_ACCOUNT_DETAILS,
- ScopeNames.WITH_SCHEDULED_UPDATE
+ ScopeNames.WITH_SCHEDULED_UPDATE,
+ { method: [ ScopeNames.WITH_FILES, true ] } as any, // FIXME: typings
+ { method: [ ScopeNames.WITH_STREAMING_PLAYLISTS, true ] } as any // FIXME: typings
]
if (userId) {
.catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err }))
}
+ removeStreamingPlaylist (isRedundancy = false) {
+ const baseDir = isRedundancy ? HLS_REDUNDANCY_DIRECTORY : HLS_PLAYLIST_DIRECTORY
+
+ const filePath = join(baseDir, this.uuid)
+ return remove(filePath)
+ .catch(err => logger.warn('Cannot delete playlist directory %s.', filePath, { err }))
+ }
+
isOutdated () {
if (this.isOwned()) return false
generateMagnetUri (videoFile: VideoFileModel, baseUrlHttp: string, baseUrlWs: string) {
const xs = this.getTorrentUrl(videoFile, baseUrlHttp)
- const announce = [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ]
+ const announce = this.getTrackerUrls(baseUrlHttp, baseUrlWs)
let urlList = [ this.getVideoFileUrl(videoFile, baseUrlHttp) ]
const redundancies = videoFile.RedundancyVideos
return magnetUtil.encode(magnetHash)
}
+ getTrackerUrls (baseUrlHttp: string, baseUrlWs: string) {
+ return [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ]
+ }
+
getThumbnailUrl (baseUrlHttp: string) {
return baseUrlHttp + STATIC_PATHS.THUMBNAILS + this.getThumbnailName()
}
getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) {
return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile)
}
+
+ getBandwidthBits (videoFile: VideoFileModel) {
+ return Math.ceil((videoFile.size * 8) / this.duration)
+ }
}
} from '../../../../shared/utils/requests/check-api-params'
import { getAccount } from '../../../../shared/utils/users/accounts'
-describe('Test users API validators', function () {
+describe('Test accounts API validators', function () {
const path = '/api/v1/accounts/'
let server: ServerInfo
'480p': true,
'720p': false,
'1080p': false
+ },
+ hls: {
+ enabled: false
}
},
import: {
})
it('Should not accept a contact form if it is disabled in the configuration', async function () {
+ this.timeout(10000)
+
killallServers([ server ])
// Contact form is disabled
})
it('Should not accept a contact form if from email is invalid', async function () {
+ this.timeout(10000)
+
killallServers([ server ])
// Email & contact form enabled
await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
})
+ it('Should fail with a too small password', async function () {
+ const fields = {
+ currentPassword: 'my super password',
+ password: 'bla'
+ }
+
+ await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
+ })
+
+ it('Should fail with a too long password', async function () {
+ const fields = {
+ currentPassword: 'my super password',
+ password: 'super'.repeat(61)
+ }
+
+ await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
+ })
+
it('Should fail with an non authenticated user', async function () {
const fields = {
videoQuota: 42
await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
})
- it('Should fail with a reason too big', async function () {
- const fields = { reason: 'super'.repeat(61) }
+ it('Should fail with a too big reason', async function () {
+ const fields = { reason: 'super'.repeat(605) }
await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
})
})
it('Should fail with a bad moderation comment', async function () {
- const body = { moderationComment: 'b'.repeat(305) }
+ const body = { moderationComment: 'b'.repeat(3001) }
await updateVideoAbuse(server.url, server.accessToken, server.video.uuid, videoAbuseId, body, 400)
})
import {
createUser,
+ doubleFollow,
+ flushAndRunMultipleServers,
flushTests,
- getBlacklistedVideosList, getVideo, getVideoWithToken,
+ getBlacklistedVideosList,
+ getVideo,
+ getVideoWithToken,
killallServers,
makePostBodyRequest,
makePutBodyRequest,
removeVideoFromBlacklist,
- runServer,
ServerInfo,
setAccessTokensToServers,
uploadVideo,
- userLogin
+ userLogin, waitJobs
} from '../../../../shared/utils'
import {
checkBadCountPagination,
import { expect } from 'chai'
describe('Test video blacklist API validators', function () {
- let server: ServerInfo
+ let servers: ServerInfo[]
let notBlacklistedVideoId: number
+ let remoteVideoUUID: string
let userAccessToken1 = ''
let userAccessToken2 = ''
this.timeout(120000)
await flushTests()
+ servers = await flushAndRunMultipleServers(2)
- server = await runServer(1)
-
- await setAccessTokensToServers([ server ])
+ await setAccessTokensToServers(servers)
+ await doubleFollow(servers[0], servers[1])
{
const username = 'user1'
const password = 'my super password'
- await createUser(server.url, server.accessToken, username, password)
- userAccessToken1 = await userLogin(server, { username, password })
+ await createUser(servers[0].url, servers[0].accessToken, username, password)
+ userAccessToken1 = await userLogin(servers[0], { username, password })
}
{
const username = 'user2'
const password = 'my super password'
- await createUser(server.url, server.accessToken, username, password)
- userAccessToken2 = await userLogin(server, { username, password })
+ await createUser(servers[0].url, servers[0].accessToken, username, password)
+ userAccessToken2 = await userLogin(servers[0], { username, password })
}
{
- const res = await uploadVideo(server.url, userAccessToken1, {})
- server.video = res.body.video
+ const res = await uploadVideo(servers[0].url, userAccessToken1, {})
+ servers[0].video = res.body.video
}
{
- const res = await uploadVideo(server.url, server.accessToken, {})
+ const res = await uploadVideo(servers[0].url, servers[0].accessToken, {})
notBlacklistedVideoId = res.body.video.uuid
}
+
+ {
+ const res = await uploadVideo(servers[1].url, servers[1].accessToken, {})
+ remoteVideoUUID = res.body.video.uuid
+ }
+
+ await waitJobs(servers)
})
describe('When adding a video in blacklist', function () {
const basePath = '/api/v1/videos/'
it('Should fail with nothing', async function () {
- const path = basePath + server.video + '/blacklist'
+ const path = basePath + servers[0].video + '/blacklist'
const fields = {}
- await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
+ await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
})
it('Should fail with a wrong video', async function () {
const wrongPath = '/api/v1/videos/blabla/blacklist'
const fields = {}
- await makePostBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields })
+ await makePostBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
})
it('Should fail with a non authenticated user', async function () {
- const path = basePath + server.video + '/blacklist'
+ const path = basePath + servers[0].video + '/blacklist'
const fields = {}
- await makePostBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 })
+ await makePostBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
})
it('Should fail with a non admin user', async function () {
- const path = basePath + server.video + '/blacklist'
+ const path = basePath + servers[0].video + '/blacklist'
const fields = {}
- await makePostBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
+ await makePostBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
})
it('Should fail with an invalid reason', async function () {
- const path = basePath + server.video.uuid + '/blacklist'
+ const path = basePath + servers[0].video.uuid + '/blacklist'
const fields = { reason: 'a'.repeat(305) }
- await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
+ await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
+ })
+
+ it('Should fail to unfederate a remote video', async function () {
+ const path = basePath + remoteVideoUUID + '/blacklist'
+ const fields = { unfederate: true }
+
+ await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 409 })
})
it('Should succeed with the correct params', async function () {
- const path = basePath + server.video.uuid + '/blacklist'
+ const path = basePath + servers[0].video.uuid + '/blacklist'
const fields = { }
- await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 })
+ await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
})
})
it('Should fail with a wrong video', async function () {
const wrongPath = '/api/v1/videos/blabla/blacklist'
const fields = {}
- await makePutBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields })
+ await makePutBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
})
it('Should fail with a video not blacklisted', async function () {
const path = '/api/v1/videos/' + notBlacklistedVideoId + '/blacklist'
const fields = {}
- await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 404 })
+ await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 404 })
})
it('Should fail with a non authenticated user', async function () {
- const path = basePath + server.video + '/blacklist'
+ const path = basePath + servers[0].video + '/blacklist'
const fields = {}
- await makePutBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 })
+ await makePutBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
})
it('Should fail with a non admin user', async function () {
- const path = basePath + server.video + '/blacklist'
+ const path = basePath + servers[0].video + '/blacklist'
const fields = {}
- await makePutBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
+ await makePutBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
})
it('Should fail with an invalid reason', async function () {
- const path = basePath + server.video.uuid + '/blacklist'
+ const path = basePath + servers[0].video.uuid + '/blacklist'
const fields = { reason: 'a'.repeat(305) }
- await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields })
+ await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
})
it('Should succeed with the correct params', async function () {
- const path = basePath + server.video.uuid + '/blacklist'
+ const path = basePath + servers[0].video.uuid + '/blacklist'
const fields = { reason: 'hello' }
- await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 })
+ await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
})
})
describe('When getting blacklisted video', function () {
it('Should fail with a non authenticated user', async function () {
- await getVideo(server.url, server.video.uuid, 401)
+ await getVideo(servers[0].url, servers[0].video.uuid, 401)
})
it('Should fail with another user', async function () {
- await getVideoWithToken(server.url, userAccessToken2, server.video.uuid, 403)
+ await getVideoWithToken(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
})
it('Should succeed with the owner authenticated user', async function () {
- const res = await getVideoWithToken(server.url, userAccessToken1, server.video.uuid, 200)
+ const res = await getVideoWithToken(servers[0].url, userAccessToken1, servers[0].video.uuid, 200)
const video: VideoDetails = res.body
expect(video.blacklisted).to.be.true
})
it('Should succeed with an admin', async function () {
- const res = await getVideoWithToken(server.url, server.accessToken, server.video.uuid, 200)
+ const res = await getVideoWithToken(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 200)
const video: VideoDetails = res.body
expect(video.blacklisted).to.be.true
describe('When removing a video in blacklist', function () {
it('Should fail with a non authenticated user', async function () {
- await removeVideoFromBlacklist(server.url, 'fake token', server.video.uuid, 401)
+ await removeVideoFromBlacklist(servers[0].url, 'fake token', servers[0].video.uuid, 401)
})
it('Should fail with a non admin user', async function () {
- await removeVideoFromBlacklist(server.url, userAccessToken2, server.video.uuid, 403)
+ await removeVideoFromBlacklist(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
})
it('Should fail with an incorrect id', async function () {
- await removeVideoFromBlacklist(server.url, server.accessToken, 'hello', 400)
+ await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, 'hello', 400)
})
it('Should fail with a not blacklisted video', async function () {
// The video was not added to the blacklist so it should fail
- await removeVideoFromBlacklist(server.url, server.accessToken, notBlacklistedVideoId, 404)
+ await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, notBlacklistedVideoId, 404)
})
it('Should succeed with the correct params', async function () {
- await removeVideoFromBlacklist(server.url, server.accessToken, server.video.uuid, 204)
+ await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 204)
})
})
const basePath = '/api/v1/videos/blacklist/'
it('Should fail with a non authenticated user', async function () {
- await getBlacklistedVideosList(server.url, 'fake token', 401)
+ await getBlacklistedVideosList(servers[0].url, 'fake token', 401)
})
it('Should fail with a non admin user', async function () {
- await getBlacklistedVideosList(server.url, userAccessToken2, 403)
+ await getBlacklistedVideosList(servers[0].url, userAccessToken2, 403)
})
it('Should fail with a bad start pagination', async function () {
- await checkBadStartPagination(server.url, basePath, server.accessToken)
+ await checkBadStartPagination(servers[0].url, basePath, servers[0].accessToken)
})
it('Should fail with a bad count pagination', async function () {
- await checkBadCountPagination(server.url, basePath, server.accessToken)
+ await checkBadCountPagination(servers[0].url, basePath, servers[0].accessToken)
})
it('Should fail with an incorrect sort', async function () {
- await checkBadSortPagination(server.url, basePath, server.accessToken)
+ await checkBadSortPagination(servers[0].url, basePath, servers[0].accessToken)
})
})
after(async function () {
- killallServers([ server ])
+ killallServers(servers)
// Keep the logs if the test failed
if (this['ok']) {
language: 'pt',
nsfw: false,
commentsEnabled: true,
+ downloadEnabled: true,
waitTranscoding: true,
description: 'my super description',
support: 'my super support text',
language: 'pt',
nsfw: false,
commentsEnabled: true,
+ downloadEnabled: true,
waitTranscoding: true,
description: 'my super description',
support: 'my super support text',
language: 'pt',
nsfw: false,
commentsEnabled: false,
+ downloadEnabled: false,
description: 'my super description',
privacy: VideoPrivacy.PUBLIC,
tags: [ 'tag1', 'tag2' ]
viewVideo,
wait,
waitUntilLog,
- checkVideoFilesWereRemoved, removeVideo, getVideoWithToken
+ checkVideoFilesWereRemoved, removeVideo, getVideoWithToken, reRunServer, checkSegmentHash
} from '../../../../shared/utils'
import { waitJobs } from '../../../../shared/utils/server/jobs'
async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
const config = {
+ transcoding: {
+ hls: {
+ enabled: true
+ }
+ },
redundancy: {
videos: {
check_interval: '5 seconds',
await waitJobs(servers)
}
-async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: string) {
+async function check1WebSeed (videoUUID?: string) {
if (!videoUUID) videoUUID = video1Server2UUID
const webseeds = [
]
for (const server of servers) {
- {
- // With token to avoid issues with video follow constraints
- const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
+ // With token to avoid issues with video follow constraints
+ const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
- const video: VideoDetails = res.body
- for (const f of video.files) {
- checkMagnetWebseeds(f, webseeds, server)
- }
+ const video: VideoDetails = res.body
+ for (const f of video.files) {
+ checkMagnetWebseeds(f, webseeds, server)
}
}
}
-async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
- const res = await getStats(servers[0].url)
- const data: ServerStats = res.body
-
- expect(data.videosRedundancy).to.have.lengthOf(1)
- const stat = data.videosRedundancy[0]
-
- expect(stat.strategy).to.equal(strategy)
- expect(stat.totalSize).to.equal(204800)
- expect(stat.totalUsed).to.be.at.least(1).and.below(204801)
- expect(stat.totalVideoFiles).to.equal(4)
- expect(stat.totalVideos).to.equal(1)
-}
-
-async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
- const res = await getStats(servers[0].url)
- const data: ServerStats = res.body
-
- expect(data.videosRedundancy).to.have.lengthOf(1)
-
- const stat = data.videosRedundancy[0]
- expect(stat.strategy).to.equal(strategy)
- expect(stat.totalSize).to.equal(204800)
- expect(stat.totalUsed).to.equal(0)
- expect(stat.totalVideoFiles).to.equal(0)
- expect(stat.totalVideos).to.equal(0)
-}
-
-async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: string) {
+async function check2Webseeds (videoUUID?: string) {
if (!videoUUID) videoUUID = video1Server2UUID
const webseeds = [
await makeGetRequest({
url: servers[1].url,
statusCodeExpected: 200,
- path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`,
+ path: `/static/webseed/${videoUUID}-${file.resolution.id}.mp4`,
contentType: null
})
}
}
}
+async function check0PlaylistRedundancies (videoUUID?: string) {
+ if (!videoUUID) videoUUID = video1Server2UUID
+
+ for (const server of servers) {
+ // With token to avoid issues with video follow constraints
+ const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
+ const video: VideoDetails = res.body
+
+ expect(video.streamingPlaylists).to.be.an('array')
+ expect(video.streamingPlaylists).to.have.lengthOf(1)
+ expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(0)
+ }
+}
+
+async function check1PlaylistRedundancies (videoUUID?: string) {
+ if (!videoUUID) videoUUID = video1Server2UUID
+
+ for (const server of servers) {
+ const res = await getVideo(server.url, videoUUID)
+ const video: VideoDetails = res.body
+
+ expect(video.streamingPlaylists).to.have.lengthOf(1)
+ expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(1)
+
+ const redundancy = video.streamingPlaylists[0].redundancies[0]
+
+ expect(redundancy.baseUrl).to.equal(servers[0].url + '/static/redundancy/hls/' + videoUUID)
+ }
+
+ const baseUrlPlaylist = servers[1].url + '/static/playlists/hls'
+ const baseUrlSegment = servers[0].url + '/static/redundancy/hls'
+
+ const res = await getVideo(servers[0].url, videoUUID)
+ const hlsPlaylist = (res.body as VideoDetails).streamingPlaylists[0]
+
+ for (const resolution of [ 240, 360, 480, 720 ]) {
+ await checkSegmentHash(baseUrlPlaylist, baseUrlSegment, videoUUID, resolution, hlsPlaylist)
+ }
+
+ for (const directory of [ 'test1/redundancy/hls', 'test2/playlists/hls' ]) {
+ const files = await readdir(join(root(), directory, videoUUID))
+ expect(files).to.have.length.at.least(4)
+
+ for (const resolution of [ 240, 360, 480, 720 ]) {
+ const filename = `${videoUUID}-${resolution}-fragmented.mp4`
+
+ expect(files.find(f => f === filename)).to.not.be.undefined
+ }
+ }
+}
+
+async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
+ const res = await getStats(servers[0].url)
+ const data: ServerStats = res.body
+
+ expect(data.videosRedundancy).to.have.lengthOf(1)
+ const stat = data.videosRedundancy[0]
+
+ expect(stat.strategy).to.equal(strategy)
+ expect(stat.totalSize).to.equal(204800)
+ expect(stat.totalUsed).to.be.at.least(1).and.below(204801)
+ expect(stat.totalVideoFiles).to.equal(4)
+ expect(stat.totalVideos).to.equal(1)
+}
+
+async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
+ const res = await getStats(servers[0].url)
+ const data: ServerStats = res.body
+
+ expect(data.videosRedundancy).to.have.lengthOf(1)
+
+ const stat = data.videosRedundancy[0]
+ expect(stat.strategy).to.equal(strategy)
+ expect(stat.totalSize).to.equal(204800)
+ expect(stat.totalUsed).to.equal(0)
+ expect(stat.totalVideoFiles).to.equal(0)
+ expect(stat.totalVideos).to.equal(0)
+}
+
async function enableRedundancyOnServer1 () {
await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true)
})
it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
await checkStatsWith1Webseed(strategy)
})
})
it('Should have 2 webseeds on the first video', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
+ await waitUntilLog(servers[0], 'Duplicated ', 5)
await waitJobs(servers)
- await check2Webseeds(strategy)
+ await check2Webseeds()
+ await check1PlaylistRedundancies()
await checkStatsWith2Webseed(strategy)
})
it('Should undo redundancy on server 1 and remove duplicated videos', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await disableRedundancyOnServer1()
await waitJobs(servers)
await wait(5000)
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
- await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
+ await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos', join('playlists', 'hls') ])
})
after(function () {
})
it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
await checkStatsWith1Webseed(strategy)
})
})
it('Should have 2 webseeds on the first video', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
+ await waitUntilLog(servers[0], 'Duplicated ', 5)
await waitJobs(servers)
- await check2Webseeds(strategy)
+ await check2Webseeds()
+ await check1PlaylistRedundancies()
await checkStatsWith2Webseed(strategy)
})
it('Should unfollow on server 1 and remove duplicated videos', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await unfollow(servers[0].url, servers[0].accessToken, servers[1])
await waitJobs(servers)
await wait(5000)
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
})
})
it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
await checkStatsWith1Webseed(strategy)
})
})
it('Should still have 1 webseed on the first video', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await waitJobs(servers)
await wait(15000)
await waitJobs(servers)
- await check1WebSeed(strategy)
+ await check1WebSeed()
+ await check0PlaylistRedundancies()
await checkStatsWith1Webseed(strategy)
})
it('Should view 2 times the first video to have > min_views config', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await viewVideo(servers[ 0 ].url, video1Server2UUID)
await viewVideo(servers[ 2 ].url, video1Server2UUID)
})
it('Should have 2 webseeds on the first video', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
+ await waitUntilLog(servers[0], 'Duplicated ', 5)
await waitJobs(servers)
- await check2Webseeds(strategy)
+ await check2Webseeds()
+ await check1PlaylistRedundancies()
await checkStatsWith2Webseed(strategy)
})
})
it('Should still have 2 webseeds after 10 seconds', async function () {
- this.timeout(40000)
+ this.timeout(80000)
await wait(10000)
})
it('Should stop server 1 and expire video redundancy', async function () {
- this.timeout(40000)
+ this.timeout(80000)
killallServers([ servers[0] ])
await enableRedundancyOnServer1()
await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
+ await waitUntilLog(servers[0], 'Duplicated ', 5)
await waitJobs(servers)
- await check2Webseeds(strategy)
+ await check2Webseeds()
+ await check1PlaylistRedundancies()
await checkStatsWith2Webseed(strategy)
const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
await wait(1000)
try {
- await check1WebSeed(strategy, video1Server2UUID)
- await check2Webseeds(strategy, video2Server2UUID)
+ await check1WebSeed(video1Server2UUID)
+ await check0PlaylistRedundancies(video1Server2UUID)
+ await check2Webseeds(video2Server2UUID)
+ await check1PlaylistRedundancies(video2Server2UUID)
checked = true
} catch {
}
})
+ it('Should disable strategy and remove redundancies', async function () {
+ this.timeout(80000)
+
+ await waitJobs(servers)
+
+ killallServers([ servers[ 0 ] ])
+ await reRunServer(servers[ 0 ], {
+ redundancy: {
+ videos: {
+ check_interval: '1 second',
+ strategies: []
+ }
+ }
+ })
+
+ await waitJobs(servers)
+
+ await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ])
+ })
+
after(function () {
return cleanServers()
})
expect(data.transcoding.resolutions['480p']).to.be.true
expect(data.transcoding.resolutions['720p']).to.be.true
expect(data.transcoding.resolutions['1080p']).to.be.true
+ expect(data.transcoding.hls.enabled).to.be.true
+
expect(data.import.videos.http.enabled).to.be.true
expect(data.import.videos.torrent.enabled).to.be.true
}
expect(data.transcoding.resolutions['480p']).to.be.true
expect(data.transcoding.resolutions['720p']).to.be.false
expect(data.transcoding.resolutions['1080p']).to.be.false
+ expect(data.transcoding.hls.enabled).to.be.false
expect(data.import.videos.http.enabled).to.be.false
expect(data.import.videos.torrent.enabled).to.be.false
'480p': true,
'720p': false,
'1080p': false
+ },
+ hls: {
+ enabled: false
}
},
import: {
},
isLocal,
commentsEnabled: true,
+ downloadEnabled: true,
duration: 5,
tags: [ 'tag1', 'tag2', 'tag3' ],
privacy: VideoPrivacy.PUBLIC,
tags: [ 'tag1p1', 'tag2p1' ],
privacy: VideoPrivacy.PUBLIC,
commentsEnabled: true,
+ downloadEnabled: true,
channel: {
name: 'root_channel',
displayName: 'Main root channel',
+++ /dev/null
-/* tslint:disable:no-unused-expression */
-
-import * as chai from 'chai'
-import 'mocha'
-import { VideoDetails } from '../../../../shared/models/videos'
-import {
- doubleFollow,
- flushAndRunMultipleServers,
- getFollowingListPaginationAndSort,
- getVideo,
- immutableAssign,
- killallServers, makeGetRequest,
- root,
- ServerInfo,
- setAccessTokensToServers, unfollow,
- uploadVideo,
- viewVideo,
- wait,
- waitUntilLog,
- checkVideoFilesWereRemoved, removeVideo
-} from '../../../../shared/utils'
-import { waitJobs } from '../../../../shared/utils/server/jobs'
-import * as magnetUtil from 'magnet-uri'
-import { updateRedundancy } from '../../../../shared/utils/server/redundancy'
-import { ActorFollow } from '../../../../shared/models/actors'
-import { readdir } from 'fs-extra'
-import { join } from 'path'
-import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy'
-import { getStats } from '../../../../shared/utils/server/stats'
-import { ServerStats } from '../../../../shared/models/server/server-stats.model'
-
-const expect = chai.expect
-
-let servers: ServerInfo[] = []
-let video1Server2UUID: string
-
-function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: number } }, baseWebseeds: string[], server: ServerInfo) {
- const parsed = magnetUtil.decode(file.magnetUri)
-
- for (const ws of baseWebseeds) {
- const found = parsed.urlList.find(url => url === `${ws}-${file.resolution.id}.mp4`)
- expect(found, `Webseed ${ws} not found in ${file.magnetUri} on server ${server.url}`).to.not.be.undefined
- }
-
- expect(parsed.urlList).to.have.lengthOf(baseWebseeds.length)
-}
-
-async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
- const config = {
- redundancy: {
- videos: {
- check_interval: '5 seconds',
- strategies: [
- immutableAssign({
- min_lifetime: '1 hour',
- strategy: strategy,
- size: '100KB'
- }, additionalParams)
- ]
- }
- }
- }
- servers = await flushAndRunMultipleServers(3, config)
-
- // Get the access tokens
- await setAccessTokensToServers(servers)
-
- {
- const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 1 server 2' })
- video1Server2UUID = res.body.video.uuid
-
- await viewVideo(servers[ 1 ].url, video1Server2UUID)
- }
-
- await waitJobs(servers)
-
- // Server 1 and server 2 follow each other
- await doubleFollow(servers[ 0 ], servers[ 1 ])
- // Server 1 and server 3 follow each other
- await doubleFollow(servers[ 0 ], servers[ 2 ])
- // Server 2 and server 3 follow each other
- await doubleFollow(servers[ 1 ], servers[ 2 ])
-
- await waitJobs(servers)
-}
-
-async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: string) {
- if (!videoUUID) videoUUID = video1Server2UUID
-
- const webseeds = [
- 'http://localhost:9002/static/webseed/' + videoUUID
- ]
-
- for (const server of servers) {
- {
- const res = await getVideo(server.url, videoUUID)
-
- const video: VideoDetails = res.body
- for (const f of video.files) {
- checkMagnetWebseeds(f, webseeds, server)
- }
- }
- }
-}
-
-async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
- const res = await getStats(servers[0].url)
- const data: ServerStats = res.body
-
- expect(data.videosRedundancy).to.have.lengthOf(1)
- const stat = data.videosRedundancy[0]
-
- expect(stat.strategy).to.equal(strategy)
- expect(stat.totalSize).to.equal(102400)
- expect(stat.totalUsed).to.be.at.least(1).and.below(102401)
- expect(stat.totalVideoFiles).to.equal(4)
- expect(stat.totalVideos).to.equal(1)
-}
-
-async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
- const res = await getStats(servers[0].url)
- const data: ServerStats = res.body
-
- expect(data.videosRedundancy).to.have.lengthOf(1)
-
- const stat = data.videosRedundancy[0]
- expect(stat.strategy).to.equal(strategy)
- expect(stat.totalSize).to.equal(102400)
- expect(stat.totalUsed).to.equal(0)
- expect(stat.totalVideoFiles).to.equal(0)
- expect(stat.totalVideos).to.equal(0)
-}
-
-async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: string) {
- if (!videoUUID) videoUUID = video1Server2UUID
-
- const webseeds = [
- 'http://localhost:9001/static/webseed/' + videoUUID,
- 'http://localhost:9002/static/webseed/' + videoUUID
- ]
-
- for (const server of servers) {
- const res = await getVideo(server.url, videoUUID)
-
- const video: VideoDetails = res.body
-
- for (const file of video.files) {
- checkMagnetWebseeds(file, webseeds, server)
-
- // Only servers 1 and 2 have the video
- if (server.serverNumber !== 3) {
- await makeGetRequest({
- url: server.url,
- statusCodeExpected: 200,
- path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`,
- contentType: null
- })
- }
- }
- }
-
- for (const directory of [ 'test1', 'test2' ]) {
- const files = await readdir(join(root(), directory, 'videos'))
- expect(files).to.have.length.at.least(4)
-
- for (const resolution of [ 240, 360, 480, 720 ]) {
- expect(files.find(f => f === `${videoUUID}-${resolution}.mp4`)).to.not.be.undefined
- }
- }
-}
-
-async function enableRedundancyOnServer1 () {
- await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true)
-
- const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 5, '-createdAt')
- const follows: ActorFollow[] = res.body.data
- const server2 = follows.find(f => f.following.host === 'localhost:9002')
- const server3 = follows.find(f => f.following.host === 'localhost:9003')
-
- expect(server3).to.not.be.undefined
- expect(server3.following.hostRedundancyAllowed).to.be.false
-
- expect(server2).to.not.be.undefined
- expect(server2.following.hostRedundancyAllowed).to.be.true
-}
-
-async function disableRedundancyOnServer1 () {
- await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, false)
-
- const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 5, '-createdAt')
- const follows: ActorFollow[] = res.body.data
- const server2 = follows.find(f => f.following.host === 'localhost:9002')
- const server3 = follows.find(f => f.following.host === 'localhost:9003')
-
- expect(server3).to.not.be.undefined
- expect(server3.following.hostRedundancyAllowed).to.be.false
-
- expect(server2).to.not.be.undefined
- expect(server2.following.hostRedundancyAllowed).to.be.false
-}
-
-async function cleanServers () {
- killallServers(servers)
-}
-
-describe('Test videos redundancy', function () {
-
- describe('With most-views strategy', function () {
- const strategy = 'most-views'
-
- before(function () {
- this.timeout(120000)
-
- return runServers(strategy)
- })
-
- it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
- await checkStatsWith1Webseed(strategy)
- })
-
- it('Should enable redundancy on server 1', function () {
- return enableRedundancyOnServer1()
- })
-
- it('Should have 2 webseed on the first video', async function () {
- this.timeout(40000)
-
- await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
- await waitJobs(servers)
-
- await check2Webseeds(strategy)
- await checkStatsWith2Webseed(strategy)
- })
-
- it('Should undo redundancy on server 1 and remove duplicated videos', async function () {
- this.timeout(40000)
-
- await disableRedundancyOnServer1()
-
- await waitJobs(servers)
- await wait(5000)
-
- await check1WebSeed(strategy)
-
- await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
- })
-
- after(function () {
- return cleanServers()
- })
- })
-
- describe('With trending strategy', function () {
- const strategy = 'trending'
-
- before(function () {
- this.timeout(120000)
-
- return runServers(strategy)
- })
-
- it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
- await checkStatsWith1Webseed(strategy)
- })
-
- it('Should enable redundancy on server 1', function () {
- return enableRedundancyOnServer1()
- })
-
- it('Should have 2 webseed on the first video', async function () {
- this.timeout(40000)
-
- await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
- await waitJobs(servers)
-
- await check2Webseeds(strategy)
- await checkStatsWith2Webseed(strategy)
- })
-
- it('Should unfollow on server 1 and remove duplicated videos', async function () {
- this.timeout(40000)
-
- await unfollow(servers[0].url, servers[0].accessToken, servers[1])
-
- await waitJobs(servers)
- await wait(5000)
-
- await check1WebSeed(strategy)
-
- await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
- })
-
- after(function () {
- return cleanServers()
- })
- })
-
- describe('With recently added strategy', function () {
- const strategy = 'recently-added'
-
- before(function () {
- this.timeout(120000)
-
- return runServers(strategy, { min_views: 3 })
- })
-
- it('Should have 1 webseed on the first video', async function () {
- await check1WebSeed(strategy)
- await checkStatsWith1Webseed(strategy)
- })
-
- it('Should enable redundancy on server 1', function () {
- return enableRedundancyOnServer1()
- })
-
- it('Should still have 1 webseed on the first video', async function () {
- this.timeout(40000)
-
- await waitJobs(servers)
- await wait(15000)
- await waitJobs(servers)
-
- await check1WebSeed(strategy)
- await checkStatsWith1Webseed(strategy)
- })
-
- it('Should view 2 times the first video to have > min_views config', async function () {
- this.timeout(40000)
-
- await viewVideo(servers[ 0 ].url, video1Server2UUID)
- await viewVideo(servers[ 2 ].url, video1Server2UUID)
-
- await wait(10000)
- await waitJobs(servers)
- })
-
- it('Should have 2 webseed on the first video', async function () {
- this.timeout(40000)
-
- await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
- await waitJobs(servers)
-
- await check2Webseeds(strategy)
- await checkStatsWith2Webseed(strategy)
- })
-
- it('Should remove the video and the redundancy files', async function () {
- this.timeout(20000)
-
- await removeVideo(servers[1].url, servers[1].accessToken, video1Server2UUID)
-
- await waitJobs(servers)
-
- for (const server of servers) {
- await checkVideoFilesWereRemoved(video1Server2UUID, server.serverNumber)
- }
- })
-
- after(function () {
- return cleanServers()
- })
- })
-
- describe('Test expiration', function () {
- const strategy = 'recently-added'
-
- async function checkContains (servers: ServerInfo[], str: string) {
- for (const server of servers) {
- const res = await getVideo(server.url, video1Server2UUID)
- const video: VideoDetails = res.body
-
- for (const f of video.files) {
- expect(f.magnetUri).to.contain(str)
- }
- }
- }
-
- async function checkNotContains (servers: ServerInfo[], str: string) {
- for (const server of servers) {
- const res = await getVideo(server.url, video1Server2UUID)
- const video: VideoDetails = res.body
-
- for (const f of video.files) {
- expect(f.magnetUri).to.not.contain(str)
- }
- }
- }
-
- before(async function () {
- this.timeout(120000)
-
- await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
-
- await enableRedundancyOnServer1()
- })
-
- it('Should still have 2 webseeds after 10 seconds', async function () {
- this.timeout(40000)
-
- await wait(10000)
-
- try {
- await checkContains(servers, 'http%3A%2F%2Flocalhost%3A9001')
- } catch {
- // Maybe a server deleted a redundancy in the scheduler
- await wait(2000)
-
- await checkContains(servers, 'http%3A%2F%2Flocalhost%3A9001')
- }
- })
-
- it('Should stop server 1 and expire video redundancy', async function () {
- this.timeout(40000)
-
- killallServers([ servers[0] ])
-
- await wait(15000)
-
- await checkNotContains([ servers[1], servers[2] ], 'http%3A%2F%2Flocalhost%3A9001')
- })
-
- after(function () {
- return killallServers([ servers[1], servers[2] ])
- })
- })
-
- describe('Test file replacement', function () {
- let video2Server2UUID: string
- const strategy = 'recently-added'
-
- before(async function () {
- this.timeout(120000)
-
- await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
-
- await enableRedundancyOnServer1()
-
- await waitJobs(servers)
- await waitUntilLog(servers[0], 'Duplicated ', 4)
- await waitJobs(servers)
-
- await check2Webseeds(strategy)
- await checkStatsWith2Webseed(strategy)
-
- const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
- video2Server2UUID = res.body.video.uuid
- })
-
- it('Should cache video 2 webseed on the first video', async function () {
- this.timeout(120000)
-
- await waitJobs(servers)
-
- let checked = false
-
- while (checked === false) {
- await wait(1000)
-
- try {
- await check1WebSeed(strategy, video1Server2UUID)
- await check2Webseeds(strategy, video2Server2UUID)
-
- checked = true
- } catch {
- checked = false
- }
- }
- })
-
- after(function () {
- return cleanServers()
- })
- })
-})
it('Should rate limit logins', async function () {
const user = { username: 'root', password: 'fail' }
- for (let i = 0; i < 14; i++) {
+ for (let i = 0; i < 19; i++) {
await userLogin(server, user, 400)
}
}
await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
- const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, {})
+ const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' })
const videoUUID = resVideo.body.video.uuid
await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment')
expect(data.totalLocalVideoComments).to.equal(1)
expect(data.totalLocalVideos).to.equal(1)
expect(data.totalLocalVideoViews).to.equal(1)
+ expect(data.totalLocalVideoFilesSize).to.equal(218910)
expect(data.totalUsers).to.equal(2)
expect(data.totalVideoComments).to.equal(1)
expect(data.totalVideos).to.equal(1)
expect(data.totalLocalVideoComments).to.equal(0)
expect(data.totalLocalVideos).to.equal(0)
expect(data.totalLocalVideoViews).to.equal(0)
+ expect(data.totalLocalVideoFilesSize).to.equal(0)
expect(data.totalUsers).to.equal(1)
expect(data.totalVideoComments).to.equal(1)
expect(data.totalVideos).to.equal(1)
})
it('Should not send notifications if the user does not follow the video publisher', async function () {
+ this.timeout(10000)
+
await uploadVideoByLocalAccount(servers)
const notification = await getLastNotification(servers[ 0 ].url, userAccessToken)
})
it('Should not send a notification if transcoding is not enabled', async function () {
+ this.timeout(10000)
+
const { name, uuid } = await uploadVideoByLocalAccount(servers)
await waitJobs(servers)
await wait(6000)
await checkVideoIsPublished(baseParams, name, uuid, 'presence')
})
+
+ it('Should not send a notification before the video is published', async function () {
+ this.timeout(20000)
+
+ let updateAt = new Date(new Date().getTime() + 100000)
+
+ const data = {
+ privacy: VideoPrivacy.PRIVATE,
+ scheduleUpdate: {
+ updateAt: updateAt.toISOString(),
+ privacy: VideoPrivacy.PUBLIC
+ }
+ }
+ const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
+
+ await wait(6000)
+ await checkVideoIsPublished(baseParams, name, uuid, 'absence')
+ })
})
describe('My video is imported', function () {
})
it('Should send a notification only to moderators when a user registers on the instance', async function () {
+ this.timeout(10000)
+
await registerUser(servers[0].url, 'user_45', 'password')
await waitJobs(servers)
})
it('Should notify when a local account is following one of our channel', async function () {
+ this.timeout(10000)
+
await addUserSubscription(servers[0].url, servers[0].accessToken, 'user_1@localhost:9001')
await waitJobs(servers)
})
it('Should notify when a remote account is following one of our channel', async function () {
+ this.timeout(10000)
+
await addUserSubscription(servers[1].url, servers[1].accessToken, 'user_1@localhost:9001')
await waitJobs(servers)
})
it('Should not have notifications', async function () {
+ this.timeout(10000)
+
await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
newVideoFromSubscription: UserNotificationSettingValue.NONE
}))
})
it('Should only have web notifications', async function () {
+ this.timeout(10000)
+
await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
newVideoFromSubscription: UserNotificationSettingValue.WEB
}))
})
it('Should only have mail notifications', async function () {
+ this.timeout(10000)
+
await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
newVideoFromSubscription: UserNotificationSettingValue.EMAIL
}))
})
it('Should have email and web notifications', async function () {
+ this.timeout(10000)
+
await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
}))
accessTokenUser = await userLogin(server, user)
})
+ it('Should be able to update another user password', async function () {
+ await updateUser({
+ url: server.url,
+ userId,
+ accessToken,
+ password: 'password updated'
+ })
+
+ await getMyUserVideoQuotaUsed(server.url, accessTokenUser, 401)
+
+ await userLogin(server, user, 400)
+
+ user.password = 'password updated'
+ accessTokenUser = await userLogin(server, user)
+ })
+
it('Should be able to list video blacklist by a moderator', async function () {
await getBlacklistedVideosList(server.url, accessTokenUser)
})
import './single-server'
import './video-abuse'
import './video-blacklist'
-import './video-blacklist-management'
import './video-captions'
import './video-change-ownership'
import './video-channels'
import './video-comments'
import './video-description'
+import './video-hls'
import './video-imports'
import './video-nsfw'
import './video-privacy'
tags: [ 'tag1p1', 'tag2p1' ],
privacy: VideoPrivacy.PUBLIC,
commentsEnabled: true,
+ downloadEnabled: true,
channel: {
displayName: 'my channel',
name: 'super_channel_name',
},
isLocal,
commentsEnabled: true,
+ downloadEnabled: true,
duration: 5,
tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ],
privacy: VideoPrivacy.PUBLIC,
isLocal,
duration: 5,
commentsEnabled: true,
+ downloadEnabled: true,
tags: [ 'tag1p3' ],
privacy: VideoPrivacy.PUBLIC,
channel: {
host: 'localhost:9003'
},
commentsEnabled: true,
+ downloadEnabled: true,
isLocal,
duration: 5,
tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ],
isLocal,
duration: 5,
commentsEnabled: true,
+ downloadEnabled: true,
tags: [ 'tag_up_1', 'tag_up_2' ],
privacy: VideoPrivacy.PUBLIC,
channel: {
}
})
- it('Should disable comments', async function () {
+ it('Should disable comments and download', async function () {
this.timeout(20000)
const attributes = {
- commentsEnabled: false
+ commentsEnabled: false,
+ downloadEnabled: false
}
await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, attributes)
for (const server of servers) {
const res = await getVideo(server.url, videoUUID)
expect(res.body.commentsEnabled).to.be.false
+ expect(res.body.downloadEnabled).to.be.false
const text = 'my super forbidden comment'
await addVideoCommentThread(server.url, server.accessToken, videoUUID, text, 409)
isLocal,
duration: 5,
commentsEnabled: false,
+ downloadEnabled: false,
tags: [ ],
privacy: VideoPrivacy.PUBLIC,
channel: {
tags: [ 'tag1', 'tag2', 'tag3' ],
privacy: VideoPrivacy.PUBLIC,
commentsEnabled: true,
+ downloadEnabled: true,
channel: {
displayName: 'Main root channel',
name: 'root_channel',
privacy: VideoPrivacy.PUBLIC,
duration: 5,
commentsEnabled: false,
+ downloadEnabled: false,
channel: {
name: 'root_channel',
displayName: 'Main root channel',
nsfw: false,
description: 'my super description updated',
commentsEnabled: false,
+ downloadEnabled: false,
tags: [ 'tagup1', 'tagup2' ]
}
await updateVideo(server.url, server.accessToken, videoId, attributes)
+++ /dev/null
-/* tslint:disable:no-unused-expression */
-
-import * as chai from 'chai'
-import { orderBy } from 'lodash'
-import 'mocha'
-import {
- addVideoToBlacklist,
- flushAndRunMultipleServers,
- getBlacklistedVideosList,
- getMyVideos,
- getSortedBlacklistedVideosList,
- getVideosList,
- killallServers,
- removeVideoFromBlacklist,
- ServerInfo,
- setAccessTokensToServers,
- updateVideoBlacklist,
- uploadVideo
-} from '../../../../shared/utils/index'
-import { doubleFollow } from '../../../../shared/utils/server/follows'
-import { waitJobs } from '../../../../shared/utils/server/jobs'
-import { VideoAbuse } from '../../../../shared/models/videos'
-
-const expect = chai.expect
-
-describe('Test video blacklist management', function () {
- let servers: ServerInfo[] = []
- let videoId: number
-
- async function blacklistVideosOnServer (server: ServerInfo) {
- const res = await getVideosList(server.url)
-
- const videos = res.body.data
- for (let video of videos) {
- await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
- }
- }
-
- before(async function () {
- this.timeout(50000)
-
- // Run servers
- servers = await flushAndRunMultipleServers(2)
-
- // Get the access tokens
- await setAccessTokensToServers(servers)
-
- // Server 1 and server 2 follow each other
- await doubleFollow(servers[0], servers[1])
-
- // Upload 2 videos on server 2
- await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
- await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
-
- // Wait videos propagation, server 2 has transcoding enabled
- await waitJobs(servers)
-
- // Blacklist the two videos on server 1
- await blacklistVideosOnServer(servers[0])
- })
-
- describe('When listing blacklisted videos', function () {
- it('Should display all the blacklisted videos', async function () {
- const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
-
- expect(res.body.total).to.equal(2)
-
- const blacklistedVideos = res.body.data
- expect(blacklistedVideos).to.be.an('array')
- expect(blacklistedVideos.length).to.equal(2)
-
- for (const blacklistedVideo of blacklistedVideos) {
- expect(blacklistedVideo.reason).to.equal('super reason')
- videoId = blacklistedVideo.video.id
- }
- })
-
- it('Should get the correct sort when sorting by descending id', async function () {
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
- expect(res.body.total).to.equal(2)
-
- const blacklistedVideos = res.body.data
- expect(blacklistedVideos).to.be.an('array')
- expect(blacklistedVideos.length).to.equal(2)
-
- const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
-
- expect(blacklistedVideos).to.deep.equal(result)
- })
-
- it('Should get the correct sort when sorting by descending video name', async function () {
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
- expect(res.body.total).to.equal(2)
-
- const blacklistedVideos = res.body.data
- expect(blacklistedVideos).to.be.an('array')
- expect(blacklistedVideos.length).to.equal(2)
-
- const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
-
- expect(blacklistedVideos).to.deep.equal(result)
- })
-
- it('Should get the correct sort when sorting by ascending creation date', async function () {
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
- expect(res.body.total).to.equal(2)
-
- const blacklistedVideos = res.body.data
- expect(blacklistedVideos).to.be.an('array')
- expect(blacklistedVideos.length).to.equal(2)
-
- const result = orderBy(res.body.data, [ 'createdAt' ])
-
- expect(blacklistedVideos).to.deep.equal(result)
- })
- })
-
- describe('When updating blacklisted videos', function () {
- it('Should change the reason', async function () {
- await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
-
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
- const video = res.body.data.find(b => b.video.id === videoId)
-
- expect(video.reason).to.equal('my super reason updated')
- })
- })
-
- describe('When listing my videos', function () {
- it('Should display blacklisted videos', async function () {
- await blacklistVideosOnServer(servers[1])
-
- const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
-
- expect(res.body.total).to.equal(2)
- expect(res.body.data).to.have.lengthOf(2)
-
- for (const video of res.body.data) {
- expect(video.blacklisted).to.be.true
- expect(video.blacklistedReason).to.equal('super reason')
- }
- })
- })
-
- describe('When removing a blacklisted video', function () {
- let videoToRemove: VideoAbuse
- let blacklist = []
-
- it('Should not have any video in videos list on server 1', async function () {
- const res = await getVideosList(servers[0].url)
- expect(res.body.total).to.equal(0)
- expect(res.body.data).to.be.an('array')
- expect(res.body.data.length).to.equal(0)
- })
-
- it('Should remove a video from the blacklist on server 1', async function () {
- // Get one video in the blacklist
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
- videoToRemove = res.body.data[0]
- blacklist = res.body.data.slice(1)
-
- // Remove it
- await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
- })
-
- it('Should have the ex-blacklisted video in videos list on server 1', async function () {
- const res = await getVideosList(servers[0].url)
- expect(res.body.total).to.equal(1)
-
- const videos = res.body.data
- expect(videos).to.be.an('array')
- expect(videos.length).to.equal(1)
-
- expect(videos[0].name).to.equal(videoToRemove.video.name)
- expect(videos[0].id).to.equal(videoToRemove.video.id)
- })
-
- it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
- const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
- expect(res.body.total).to.equal(1)
-
- const videos = res.body.data
- expect(videos).to.be.an('array')
- expect(videos.length).to.equal(1)
- expect(videos).to.deep.equal(blacklist)
- })
- })
-
- after(async function () {
- killallServers(servers)
- })
-})
/* tslint:disable:no-unused-expression */
import * as chai from 'chai'
+import { orderBy } from 'lodash'
import 'mocha'
import {
addVideoToBlacklist,
flushAndRunMultipleServers,
+ getBlacklistedVideosList,
+ getMyVideos,
+ getSortedBlacklistedVideosList,
getVideosList,
killallServers,
+ removeVideoFromBlacklist,
searchVideo,
ServerInfo,
setAccessTokensToServers,
- uploadVideo
+ updateVideo,
+ updateVideoBlacklist,
+ uploadVideo,
+ viewVideo
} from '../../../../shared/utils/index'
import { doubleFollow } from '../../../../shared/utils/server/follows'
import { waitJobs } from '../../../../shared/utils/server/jobs'
+import { VideoBlacklist } from '../../../../shared/models/videos'
const expect = chai.expect
-describe('Test video blacklists', function () {
+describe('Test video blacklist management', function () {
let servers: ServerInfo[] = []
+ let videoId: number
+
+ async function blacklistVideosOnServer (server: ServerInfo) {
+ const res = await getVideosList(server.url)
+
+ const videos = res.body.data
+ for (let video of videos) {
+ await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
+ }
+ }
before(async function () {
this.timeout(50000)
// Server 1 and server 2 follow each other
await doubleFollow(servers[0], servers[1])
- // Upload a video on server 2
- const videoAttributes = {
- name: 'my super name for server 2',
- description: 'my super description for server 2'
- }
- await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
+ // Upload 2 videos on server 2
+ await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
+ await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
// Wait videos propagation, server 2 has transcoding enabled
await waitJobs(servers)
- const res = await getVideosList(servers[0].url)
- const videos = res.body.data
+ // Blacklist the two videos on server 1
+ await blacklistVideosOnServer(servers[0])
+ })
+
+ describe('When listing/searching videos', function () {
- expect(videos.length).to.equal(1)
+ it('Should not have the video blacklisted in videos list/search on server 1', async function () {
+ {
+ const res = await getVideosList(servers[ 0 ].url)
- servers[0].remoteVideo = videos.find(video => video.name === 'my super name for server 2')
+ expect(res.body.total).to.equal(0)
+ expect(res.body.data).to.be.an('array')
+ expect(res.body.data.length).to.equal(0)
+ }
+
+ {
+ const res = await searchVideo(servers[ 0 ].url, 'name')
+
+ expect(res.body.total).to.equal(0)
+ expect(res.body.data).to.be.an('array')
+ expect(res.body.data.length).to.equal(0)
+ }
+ })
+
+ it('Should have the blacklisted video in videos list/search on server 2', async function () {
+ {
+ const res = await getVideosList(servers[ 1 ].url)
+
+ expect(res.body.total).to.equal(2)
+ expect(res.body.data).to.be.an('array')
+ expect(res.body.data.length).to.equal(2)
+ }
+
+ {
+ const res = await searchVideo(servers[ 1 ].url, 'video')
+
+ expect(res.body.total).to.equal(2)
+ expect(res.body.data).to.be.an('array')
+ expect(res.body.data.length).to.equal(2)
+ }
+ })
})
- it('Should blacklist a remote video on server 1', async function () {
- await addVideoToBlacklist(servers[0].url, servers[0].accessToken, servers[0].remoteVideo.id)
+ describe('When listing blacklisted videos', function () {
+ it('Should display all the blacklisted videos', async function () {
+ const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
+
+ expect(res.body.total).to.equal(2)
+
+ const blacklistedVideos = res.body.data
+ expect(blacklistedVideos).to.be.an('array')
+ expect(blacklistedVideos.length).to.equal(2)
+
+ for (const blacklistedVideo of blacklistedVideos) {
+ expect(blacklistedVideo.reason).to.equal('super reason')
+ videoId = blacklistedVideo.video.id
+ }
+ })
+
+ it('Should get the correct sort when sorting by descending id', async function () {
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
+ expect(res.body.total).to.equal(2)
+
+ const blacklistedVideos = res.body.data
+ expect(blacklistedVideos).to.be.an('array')
+ expect(blacklistedVideos.length).to.equal(2)
+
+ const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
+
+ expect(blacklistedVideos).to.deep.equal(result)
+ })
+
+ it('Should get the correct sort when sorting by descending video name', async function () {
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
+ expect(res.body.total).to.equal(2)
+
+ const blacklistedVideos = res.body.data
+ expect(blacklistedVideos).to.be.an('array')
+ expect(blacklistedVideos.length).to.equal(2)
+
+ const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
+
+ expect(blacklistedVideos).to.deep.equal(result)
+ })
+
+ it('Should get the correct sort when sorting by ascending creation date', async function () {
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
+ expect(res.body.total).to.equal(2)
+
+ const blacklistedVideos = res.body.data
+ expect(blacklistedVideos).to.be.an('array')
+ expect(blacklistedVideos.length).to.equal(2)
+
+ const result = orderBy(res.body.data, [ 'createdAt' ])
+
+ expect(blacklistedVideos).to.deep.equal(result)
+ })
})
- it('Should not have the video blacklisted in videos list on server 1', async function () {
- const res = await getVideosList(servers[0].url)
+ describe('When updating blacklisted videos', function () {
+ it('Should change the reason', async function () {
+ await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
+
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
+ const video = res.body.data.find(b => b.video.id === videoId)
- expect(res.body.total).to.equal(0)
- expect(res.body.data).to.be.an('array')
- expect(res.body.data.length).to.equal(0)
+ expect(video.reason).to.equal('my super reason updated')
+ })
})
- it('Should not have the video blacklisted in videos search on server 1', async function () {
- const res = await searchVideo(servers[0].url, 'name')
+ describe('When listing my videos', function () {
+ it('Should display blacklisted videos', async function () {
+ await blacklistVideosOnServer(servers[1])
+
+ const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
- expect(res.body.total).to.equal(0)
- expect(res.body.data).to.be.an('array')
- expect(res.body.data.length).to.equal(0)
+ expect(res.body.total).to.equal(2)
+ expect(res.body.data).to.have.lengthOf(2)
+
+ for (const video of res.body.data) {
+ expect(video.blacklisted).to.be.true
+ expect(video.blacklistedReason).to.equal('super reason')
+ }
+ })
})
- it('Should have the blacklisted video in videos list on server 2', async function () {
- const res = await getVideosList(servers[1].url)
+ describe('When removing a blacklisted video', function () {
+ let videoToRemove: VideoBlacklist
+ let blacklist = []
+
+ it('Should not have any video in videos list on server 1', async function () {
+ const res = await getVideosList(servers[0].url)
+ expect(res.body.total).to.equal(0)
+ expect(res.body.data).to.be.an('array')
+ expect(res.body.data.length).to.equal(0)
+ })
+
+ it('Should remove a video from the blacklist on server 1', async function () {
+ // Get one video in the blacklist
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
+ videoToRemove = res.body.data[0]
+ blacklist = res.body.data.slice(1)
+
+ // Remove it
+ await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
+ })
+
+ it('Should have the ex-blacklisted video in videos list on server 1', async function () {
+ const res = await getVideosList(servers[0].url)
+ expect(res.body.total).to.equal(1)
+
+ const videos = res.body.data
+ expect(videos).to.be.an('array')
+ expect(videos.length).to.equal(1)
+
+ expect(videos[0].name).to.equal(videoToRemove.video.name)
+ expect(videos[0].id).to.equal(videoToRemove.video.id)
+ })
+
+ it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
+ expect(res.body.total).to.equal(1)
- expect(res.body.total).to.equal(1)
- expect(res.body.data).to.be.an('array')
- expect(res.body.data.length).to.equal(1)
+ const videos = res.body.data
+ expect(videos).to.be.an('array')
+ expect(videos.length).to.equal(1)
+ expect(videos).to.deep.equal(blacklist)
+ })
})
- it('Should have the video blacklisted in videos search on server 2', async function () {
- const res = await searchVideo(servers[1].url, 'name')
+ describe('When blacklisting local videos', function () {
+ let video3UUID: string
+ let video4UUID: string
+
+ before(async function () {
+ this.timeout(10000)
+
+ {
+ const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'Video 3' })
+ video3UUID = res.body.video.uuid
+ }
+ {
+ const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'Video 4' })
+ video4UUID = res.body.video.uuid
+ }
+
+ await waitJobs(servers)
+ })
+
+ it('Should blacklist video 3 and keep it federated', async function () {
+ this.timeout(10000)
+
+ await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video3UUID, 'super reason', false)
+
+ await waitJobs(servers)
+
+ {
+ const res = await getVideosList(servers[ 0 ].url)
+ expect(res.body.data.find(v => v.uuid === video3UUID)).to.be.undefined
+ }
+
+ {
+ const res = await getVideosList(servers[ 1 ].url)
+ expect(res.body.data.find(v => v.uuid === video3UUID)).to.not.be.undefined
+ }
+ })
+
+ it('Should unfederate the video', async function () {
+ this.timeout(10000)
+
+ await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, 'super reason', true)
+
+ await waitJobs(servers)
+
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+ expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
+ }
+ })
+
+ it('Should have the video unfederated even after an Update AP message', async function () {
+ this.timeout(10000)
+
+ await updateVideo(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, { description: 'super description' })
+
+ await waitJobs(servers)
+
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+ expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
+ }
+ })
+
+ it('Should have the correct video blacklist unfederate attribute', async function () {
+ const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
+
+ const blacklistedVideos: VideoBlacklist[] = res.body.data
+ const video3Blacklisted = blacklistedVideos.find(b => b.video.uuid === video3UUID)
+ const video4Blacklisted = blacklistedVideos.find(b => b.video.uuid === video4UUID)
+
+ expect(video3Blacklisted.unfederated).to.be.false
+ expect(video4Blacklisted.unfederated).to.be.true
+ })
+
+ it('Should remove the video from blacklist and refederate the video', async function () {
+ this.timeout(10000)
+
+ await removeVideoFromBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID)
+
+ await waitJobs(servers)
+
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+ expect(res.body.data.find(v => v.uuid === video4UUID)).to.not.be.undefined
+ }
+ })
- expect(res.body.total).to.equal(1)
- expect(res.body.data).to.be.an('array')
- expect(res.body.data.length).to.equal(1)
})
after(async function () {
--- /dev/null
+/* tslint:disable:no-unused-expression */
+
+import * as chai from 'chai'
+import 'mocha'
+import {
+ checkDirectoryIsEmpty,
+ checkSegmentHash,
+ checkTmpIsEmpty,
+ doubleFollow,
+ flushAndRunMultipleServers,
+ flushTests,
+ getPlaylist,
+ getVideo,
+ killallServers,
+ removeVideo,
+ ServerInfo,
+ setAccessTokensToServers,
+ updateVideo,
+ uploadVideo,
+ waitJobs
+} from '../../../../shared/utils'
+import { VideoDetails } from '../../../../shared/models/videos'
+import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
+import { join } from 'path'
+
+const expect = chai.expect
+
+async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
+ const resolutions = [ 240, 360, 480, 720 ]
+
+ for (const server of servers) {
+ const res = await getVideo(server.url, videoUUID)
+ const videoDetails: VideoDetails = res.body
+
+ expect(videoDetails.streamingPlaylists).to.have.lengthOf(1)
+
+ const hlsPlaylist = videoDetails.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
+ expect(hlsPlaylist).to.not.be.undefined
+
+ {
+ const res2 = await getPlaylist(hlsPlaylist.playlistUrl)
+
+ const masterPlaylist = res2.text
+
+ expect(masterPlaylist).to.contain('#EXT-X-STREAM-INF:BANDWIDTH=55472,RESOLUTION=640x360,FRAME-RATE=25')
+
+ for (const resolution of resolutions) {
+ expect(masterPlaylist).to.contain(`${resolution}.m3u8`)
+ }
+ }
+
+ {
+ for (const resolution of resolutions) {
+ const res2 = await getPlaylist(`http://localhost:9001/static/playlists/hls/${videoUUID}/${resolution}.m3u8`)
+
+ const subPlaylist = res2.text
+ expect(subPlaylist).to.contain(`${videoUUID}-${resolution}-fragmented.mp4`)
+ }
+ }
+
+ {
+ const baseUrl = 'http://localhost:9001/static/playlists/hls'
+
+ for (const resolution of resolutions) {
+ await checkSegmentHash(baseUrl, baseUrl, videoUUID, resolution, hlsPlaylist)
+ }
+ }
+ }
+}
+
+describe('Test HLS videos', function () {
+ let servers: ServerInfo[] = []
+ let videoUUID = ''
+
+ before(async function () {
+ this.timeout(120000)
+
+ servers = await flushAndRunMultipleServers(2, { transcoding: { enabled: true, hls: { enabled: true } } })
+
+ // Get the access tokens
+ await setAccessTokensToServers(servers)
+
+ // Server 1 and server 2 follow each other
+ await doubleFollow(servers[0], servers[1])
+ })
+
+ it('Should upload a video and transcode it to HLS', async function () {
+ this.timeout(120000)
+
+ {
+ const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video 1', fixture: 'video_short.webm' })
+ videoUUID = res.body.video.uuid
+ }
+
+ await waitJobs(servers)
+
+ await checkHlsPlaylist(servers, videoUUID)
+ })
+
+ it('Should update the video', async function () {
+ await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, { name: 'video 1 updated' })
+
+ await waitJobs(servers)
+
+ await checkHlsPlaylist(servers, videoUUID)
+ })
+
+ it('Should delete the video', async function () {
+ await removeVideo(servers[0].url, servers[0].accessToken, videoUUID)
+
+ await waitJobs(servers)
+
+ for (const server of servers) {
+ await getVideo(server.url, videoUUID, 404)
+ }
+ })
+
+ it('Should have the playlists/segment deleted from the disk', async function () {
+ for (const server of servers) {
+ await checkDirectoryIsEmpty(server, 'videos')
+ await checkDirectoryIsEmpty(server, join('playlists', 'hls'))
+ }
+ })
+
+ it('Should have an empty tmp directory', async function () {
+ for (const server of servers) {
+ await checkTmpIsEmpty(server)
+ }
+ })
+
+ after(async function () {
+ killallServers(servers)
+
+ // Keep the logs if the test failed
+ if (this['ok']) {
+ await flushTests()
+ }
+ })
+})
const { body } = await makeActivityPubGetRequest(server.url, '/videos/watch/' + video.uuid)
expect(body.id).to.equal('http://localhost:9002/videos/watch/' + video.uuid)
+
+ const res = await getVideo(server.url, video.uuid)
+ const videoDetails: VideoDetails = res.body
+
+ expect(videoDetails.trackerUrls[0]).to.include(server.host)
+ expect(videoDetails.streamingPlaylists[0].playlistUrl).to.include(server.host)
+ expect(videoDetails.streamingPlaylists[0].segmentsSha256Url).to.include(server.host)
}
})
}
})
- it('Should have update accounts url', async function () {
+ it('Should have updated accounts url', async function () {
const res = await getAccountsList(server.url)
expect(res.body.total).to.equal(3)
}
})
- it('Should update torrent hosts', async function () {
+ it('Should have updated torrent hosts', async function () {
this.timeout(30000)
const res = await getVideosList(server.url)
password: program['password']
}
- run(user, program['url']).catch(err => console.error(err))
+ run(user, program['url'])
+ .catch(err => {
+ console.error(err)
+ process.exit(-1)
+ })
})
async function promptPassword () {
secret: res.body.client_secret
}
- const res2 = await login(url, client, user)
- accessToken = res2.body.access_token
+ try {
+ const res = await login(program[ 'url' ], client, user)
+ accessToken = res.body.access_token
+ } catch (err) {
+ throw new Error('Cannot authenticate. Please check your username/password.')
+ }
const youtubeDL = await safeGetYoutubeDL()
nsfw: isNSFW(videoInfo),
waitTranscoding: true,
commentsEnabled: true,
+ downloadEnabled: true,
description: videoInfo.description || undefined,
support: undefined,
tags,
if (!program['nsfw']) program['nsfw'] = false
if (!program['privacy']) program['privacy'] = VideoPrivacy.PUBLIC
if (!program['commentsEnabled']) program['commentsEnabled'] = false
+if (!program['downloadEnabled']) program['downloadEnabled'] = true
getSettings()
.then(settings => {
description: program['videoDescription'],
tags: program['tags'],
commentsEnabled: program['commentsEnabled'],
+ downloadEnabled: program['downloadEnabled'],
fixture: program['file'],
thumbnailfile: program['thumbnail'],
previewfile: program['preview'],
import { VideoAbuseObject } from './objects/video-abuse-object'
import { VideoCommentObject } from './objects/video-comment-object'
import { ViewObject } from './objects/view-object'
+import { APObject } from './objects/object.model'
export type Activity = ActivityCreate | ActivityUpdate |
ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce |
- ActivityUndo | ActivityLike | ActivityReject
+ ActivityUndo | ActivityLike | ActivityReject | ActivityView | ActivityDislike | ActivityFlag
-export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject'
+export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' |
+ 'View' | 'Dislike' | 'Flag'
export interface ActivityAudience {
to: string[]
export interface ActivityAnnounce extends BaseActivity {
type: 'Announce'
- object: string | { id: string }
+ object: APObject
}
export interface ActivityUndo extends BaseActivity {
type: 'Undo',
- object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce
+ object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce
}
export interface ActivityLike extends BaseActivity {
type: 'Like',
- object: string
+ object: APObject
+}
+
+export interface ActivityView extends BaseActivity {
+ type: 'View',
+ actor: string
+ object: APObject
+}
+
+export interface ActivityDislike extends BaseActivity {
+ id: string
+ type: 'Dislike'
+ actor: string
+ object: APObject
+}
+
+export interface ActivityFlag extends BaseActivity {
+ type: 'Flag',
+ content: string,
+ object: APObject
}
'@context': string[]
type: 'OrderedCollection' | 'OrderedCollectionPage'
totalItems: number
- partOf?: string
orderedItems: T[]
+
+ partOf?: string
+ next?: string
+ first?: string
}
-import { ActivityVideoUrlObject } from './common-objects'
+import { ActivityVideoUrlObject, ActivityPlaylistUrlObject } from './common-objects'
export interface CacheFileObject {
id: string
type: 'CacheFile',
object: string
expires: string
- url: ActivityVideoUrlObject
+ url: ActivityVideoUrlObject | ActivityPlaylistUrlObject
}
fps: number
}
-export type ActivityUrlObject =
- ActivityVideoUrlObject
- |
- {
- type: 'Link'
- // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
- mimeType?: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
- mediaType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
- href: string
- height: number
- }
- |
- {
- type: 'Link'
- // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
- mimeType?: 'text/html'
- mediaType: 'text/html'
- href: string
- }
+export type ActivityPlaylistSegmentHashesObject = {
+ type: 'Link'
+ name: 'sha256'
+ // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
+ mimeType?: 'application/json'
+ mediaType: 'application/json'
+ href: string
+}
+
+export type ActivityPlaylistInfohashesObject = {
+ type: 'Infohash'
+ name: string
+}
+
+export type ActivityPlaylistUrlObject = {
+ type: 'Link'
+ // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
+ mimeType?: 'application/x-mpegURL'
+ mediaType: 'application/x-mpegURL'
+ href: string
+ tag?: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
+}
+
+export type ActivityBitTorrentUrlObject = {
+ type: 'Link'
+ // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
+ mimeType?: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
+ mediaType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
+ href: string
+ height: number
+}
+
+export type ActivityHtmlUrlObject = {
+ type: 'Link'
+ // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
+ mimeType?: 'text/html'
+ mediaType: 'text/html'
+ href: string
+}
+
+export type ActivityUrlObject = ActivityVideoUrlObject | ActivityPlaylistUrlObject | ActivityBitTorrentUrlObject | ActivityHtmlUrlObject
export interface ActivityPubAttributedTo {
type: 'Group' | 'Person'
--- /dev/null
+export type APObject = string | { id: string }
subtitleLanguage: ActivityIdentifierObject[]
views: number
sensitive: boolean
- commentsEnabled: boolean
+ commentsEnabled: boolean,
+ downloadEnabled: boolean,
waitTranscoding: boolean
state: VideoState
published: string
followersCount: number
createdAt: Date | string
updatedAt: Date | string
- avatar: Avatar
+ avatar?: Avatar
}
'720p': boolean
'1080p': boolean
}
+ hls: {
+ enabled: boolean
+ }
}
import: {
signup: {
allowed: boolean,
- allowedForCurrentIP: boolean,
+ allowedForCurrentIP: boolean
requiresEmailVerification: boolean
}
transcoding: {
+ hls: {
+ enabled: boolean
+ }
+
enabledResolutions: number[]
}
file: {
size: {
max: number
- },
+ }
extensions: string[]
}
}
videoQuota: number
videoQuotaDaily: number
}
+
+ trending: {
+ videos: {
+ intervalDays: number
+ }
+ }
}
totalLocalVideos: number
totalLocalVideoViews: number
totalLocalVideoComments: number
+ totalLocalVideoFilesSize: number
totalVideos: number
totalVideoComments: number
name: string
}
+export interface ActorInfo {
+ id: number
+ displayName: string
+ name: string
+ host: string
+ avatar?: {
+ path: string
+ }
+}
+
export interface UserNotification {
id: number
type: UserNotificationType
read: boolean
video?: VideoInfo & {
- channel: {
- id: number
- displayName: string
- }
+ channel: ActorInfo
}
videoImport?: {
comment?: {
id: number
threadId: number
- account: {
- id: number
- displayName: string
- }
+ account: ActorInfo
video: VideoInfo
}
video: VideoInfo
}
- account?: {
- id: number
- displayName: string
- name: string
- }
+ account?: ActorInfo
actorFollow?: {
id: number
- follower: {
- name: string
- displayName: string
- }
+ follower: ActorInfo
following: {
type: 'account' | 'channel'
name: string
import { UserRole } from './user-role'
export interface UserUpdate {
+ password?: string
email?: string
emailVerified?: boolean
videoQuota?: number
export interface VideoBlacklistCreate {
reason?: string
+ unfederate?: boolean
}
id: number
createdAt: Date
updatedAt: Date
+ unfederated: boolean
reason?: string
video: {
name: string
tags?: string[]
commentsEnabled?: boolean
+ downloadEnabled?: boolean
privacy: VideoPrivacy
scheduleUpdate?: VideoScheduleUpdate
originallyPublishedAt: Date | string
--- /dev/null
+import { VideoStreamingPlaylistType } from './video-streaming-playlist.type'
+
+export class VideoStreamingPlaylist {
+ id: number
+ type: VideoStreamingPlaylistType
+ playlistUrl: string
+ segmentsSha256Url: string
+
+ redundancies: {
+ baseUrl: string
+ }[]
+}
--- /dev/null
+export enum VideoStreamingPlaylistType {
+ HLS = 1
+}
privacy?: VideoPrivacy
tags?: string[]
commentsEnabled?: boolean
+ downloadEnabled?: boolean
nsfw?: boolean
waitTranscoding?: boolean
channelId?: number
import { VideoPrivacy } from './video-privacy.enum'
import { VideoScheduleUpdate } from './video-schedule-update.model'
import { VideoConstant } from './video-constant.model'
+import { VideoStreamingPlaylist } from './video-streaming-playlist.model'
export interface VideoFile {
magnetUri: string
displayName: string
url: string
host: string
- avatar: Avatar
+ avatar?: Avatar
}
export interface AccountAttribute {
displayName: string
url: string
host: string
- avatar: Avatar
+ avatar?: Avatar
}
export interface Video {
files: VideoFile[]
account: Account
commentsEnabled: boolean
+ downloadEnabled: boolean
// Not optional in details (unlike in Video)
waitTranscoding: boolean
state: VideoConstant<VideoState>
+
+ trackerUrls: string[]
+
+ streamingPlaylists: VideoStreamingPlaylist[]
}
export * from './videos/video-abuses'
export * from './videos/video-blacklist'
export * from './videos/video-channels'
+export * from './videos/video-comments'
+export * from './videos/video-playlists'
export * from './videos/videos'
export * from './videos/video-change-ownership'
export * from './feeds/feeds'
import * as request from 'supertest'
import { buildAbsoluteFixturePath, root } from '../miscs/miscs'
import { isAbsolute, join } from 'path'
+import { parse } from 'url'
+
+function makeRawRequest (url: string, statusCodeExpected?: number, range?: string) {
+ const { host, protocol, pathname } = parse(url)
+
+ return makeGetRequest({ url: `${protocol}//${host}`, path: pathname, statusCodeExpected, range })
+}
function makeGetRequest (options: {
url: string,
- path: string,
+ path?: string,
query?: any,
token?: string,
statusCodeExpected?: number,
- contentType?: string
+ contentType?: string,
+ range?: string
}) {
if (!options.statusCodeExpected) options.statusCodeExpected = 400
if (options.contentType === undefined) options.contentType = 'application/json'
- const req = request(options.url)
- .get(options.path)
+ const req = request(options.url).get(options.path)
if (options.contentType) req.set('Accept', options.contentType)
if (options.token) req.set('Authorization', 'Bearer ' + options.token)
if (options.query) req.query(options.query)
+ if (options.range) req.set('Range', options.range)
return req.expect(options.statusCodeExpected)
}
makePostBodyRequest,
makePutBodyRequest,
makeDeleteRequest,
+ makeRawRequest,
updateAvatarRequest
}
'480p': true,
'720p': false,
'1080p': false
+ },
+ hls: {
+ enabled: false
}
},
import: {
if (dontContinue === true) return
server.app.stdout.removeListener('data', onStdout)
+
+ process.on('exit', () => {
+ try {
+ process.kill(server.app.pid)
+ } catch { /* empty */ }
+ })
+
res(server)
})
+
})
}
}
async function checkTmpIsEmpty (server: ServerInfo) {
+ return checkDirectoryIsEmpty(server, 'tmp')
+}
+
+async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) {
const testDirectory = 'test' + server.serverNumber
- const directoryPath = join(root(), testDirectory, 'tmp')
+ const directoryPath = join(root(), testDirectory, directory)
const directoryExists = existsSync(directoryPath)
expect(directoryExists).to.be.true
// ---------------------------------------------------------------------------
export {
+ checkDirectoryIsEmpty,
checkTmpIsEmpty,
ServerInfo,
flushAndRunMultipleServers,
function checkActor (actor: any) {
expect(actor.displayName).to.be.a('string')
expect(actor.displayName).to.not.be.empty
+ expect(actor.host).to.not.be.undefined
}
function checkComment (comment: any, commentId: number, threadId: number) {
checkActor(notification.actorFollow.follower)
expect(notification.actorFollow.follower.displayName).to.equal(followerDisplayName)
expect(notification.actorFollow.follower.name).to.equal(followerName)
+ expect(notification.actorFollow.follower.host).to.not.be.undefined
- checkActor(notification.actorFollow.following)
expect(notification.actorFollow.following.displayName).to.equal(followingDisplayName)
expect(notification.actorFollow.following.type).to.equal(followType)
} else {
emailVerified?: boolean,
videoQuota?: number,
videoQuotaDaily?: number,
+ password?: string,
role?: UserRole
}) {
const path = '/api/v1/users/' + options.userId
const toSend = {}
+ if (options.password !== undefined && options.password !== null) toSend['password'] = options.password
if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
import * as request from 'supertest'
-function addVideoToBlacklist (url: string, token: string, videoId: number | string, reason?: string, specialStatus = 204) {
+function addVideoToBlacklist (
+ url: string,
+ token: string,
+ videoId: number | string,
+ reason?: string,
+ unfederate?: boolean,
+ specialStatus = 204
+) {
const path = '/api/v1/videos/' + videoId + '/blacklist'
return request(url)
.post(path)
- .send({ reason })
+ .send({ reason, unfederate })
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + token)
.expect(specialStatus)
--- /dev/null
+import { makeRawRequest } from '../requests/requests'
+import { sha256 } from '../../../server/helpers/core-utils'
+import { VideoStreamingPlaylist } from '../../models/videos/video-streaming-playlist.model'
+import { expect } from 'chai'
+
+function getPlaylist (url: string, statusCodeExpected = 200) {
+ return makeRawRequest(url, statusCodeExpected)
+}
+
+function getSegment (url: string, statusCodeExpected = 200, range?: string) {
+ return makeRawRequest(url, statusCodeExpected, range)
+}
+
+function getSegmentSha256 (url: string, statusCodeExpected = 200) {
+ return makeRawRequest(url, statusCodeExpected)
+}
+
+async function checkSegmentHash (
+ baseUrlPlaylist: string,
+ baseUrlSegment: string,
+ videoUUID: string,
+ resolution: number,
+ hlsPlaylist: VideoStreamingPlaylist
+) {
+ const res = await getPlaylist(`${baseUrlPlaylist}/${videoUUID}/${resolution}.m3u8`)
+ const playlist = res.text
+
+ const videoName = `${videoUUID}-${resolution}-fragmented.mp4`
+
+ const matches = /#EXT-X-BYTERANGE:(\d+)@(\d+)/.exec(playlist)
+
+ const length = parseInt(matches[1], 10)
+ const offset = parseInt(matches[2], 10)
+ const range = `${offset}-${offset + length - 1}`
+
+ const res2 = await getSegment(`${baseUrlSegment}/${videoUUID}/${videoName}`, 206, `bytes=${range}`)
+
+ const resSha = await getSegmentSha256(hlsPlaylist.segmentsSha256Url)
+
+ const sha256Server = resSha.body[ videoName ][range]
+ expect(sha256(res2.body)).to.equal(sha256Server)
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ getPlaylist,
+ getSegment,
+ getSegmentSha256,
+ checkSegmentHash
+}
language?: string
nsfw?: boolean
commentsEnabled?: boolean
+ downloadEnabled?: boolean
waitTranscoding?: boolean
description?: string
tags?: string[]
async function checkVideoFilesWereRemoved (
videoUUID: string,
serverNumber: number,
- directories = [ 'redundancy', 'videos', 'thumbnails', 'torrents', 'previews', 'captions' ]
+ directories = [
+ 'redundancy',
+ 'videos',
+ 'thumbnails',
+ 'torrents',
+ 'previews',
+ 'captions',
+ join('playlists', 'hls'),
+ join('redundancy', 'hls')
+ ]
) {
const testDirectory = 'test' + serverNumber
const directoryPath = join(root(), testDirectory, directory)
const directoryExists = existsSync(directoryPath)
- expect(directoryExists).to.be.true
+ if (!directoryExists) continue
const files = await readdir(directoryPath)
for (const file of files) {
tags: [ 'tag' ],
privacy: VideoPrivacy.PUBLIC,
commentsEnabled: true,
+ downloadEnabled: true,
fixture: 'video_short.webm'
}, videoAttributesArg)
.field('name', attributes.name)
.field('nsfw', JSON.stringify(attributes.nsfw))
.field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
+ .field('downloadEnabled', JSON.stringify(attributes.downloadEnabled))
.field('waitTranscoding', JSON.stringify(attributes.waitTranscoding))
.field('privacy', attributes.privacy.toString())
.field('channelId', attributes.channelId)
if (attributes.language) body['language'] = attributes.language
if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
+ if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
if (attributes.description) body['description'] = attributes.description
if (attributes.tags) body['tags'] = attributes.tags
if (attributes.privacy) body['privacy'] = attributes.privacy
language: string
nsfw: boolean
commentsEnabled: boolean
+ downloadEnabled: boolean
description: string
publishedAt?: string
support: string
expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true
expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true
expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
+ expect(videoDetails.downloadEnabled).to.equal(attributes.downloadEnabled)
for (const attributeFile of attributes.files) {
const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution)
openapi: 3.0.0
info:
title: PeerTube
- version: 1.1.0
+ version: 1.2.0
contact:
name: PeerTube Community
url: 'https://joinpeertube.org'
### CLI wrapper
-The wrapper provides a convenient interface to the following scripts. You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="node /your/peertube/directory/dist/server/tools/peertube.js"`:
+The wrapper provides a convenient interface to the following scripts.
+You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="cd /your/peertube/directory/ && node ./dist/server/tools/peertube.js"` (you have to keep the `cd` command):
```
Usage: peertube [command] [options]
# Always copy default and custom env configuration file, in cases where new keys were added
cp /app/config/default.yaml /config
cp /app/support/docker/production/config/custom-environment-variables.yaml /config
-chown -R peertube:peertube /config
+find /config ! -user peertube -exec chown peertube:peertube {} \;
# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
# allow the container to be started with `--user`
if [ "$1" = 'npm' -a "$(id -u)" = '0' ]; then
- chown -R peertube:peertube /data
+ find /data ! -user peertube -exec chown peertube:peertube {} \;
exec gosu peertube "$0" "$@"
fi
# It might be nice to compress JSON, but leaving that out to protect against potential
# compression+encryption information leak attacks like BREACH.
gzip on;
- gzip_types text/css text/html application/javascript;
+ gzip_types text/css application/javascript;
gzip_vary on;
# Enable HSTS
proxy_set_header Host $host;
proxy_pass http://localhost:9000;
}
+
+ location /socket.io {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $host;
+
+ proxy_pass http://localhost:9000;
+
+ # enable WebSockets
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
}